Rymi Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Rymi Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center">
Point Claude Desktop, Claude Code, Cursor, or a Rymi voice agent at this server and manage your entire voice-agent fleet — agents, calls, numbers, knowledge, and usage — without writing a line of HTTP code.
Documentation · Dashboard · Node SDK · Python SDK
</div>
Add https://mcp.rymi.live/mcp as a custom connector and sign in. In Claude: Settings → Connectors → Add custom connector. Paste the URL exactly — no trailing slash, since OAuth identifies the server by that string.
Signing in grants the connector everything you can do in Rymi, acting as you. Revoke any time from Settings.
Clients without OAuth (and CI) can pass a secret key against the same host instead:
{
"mcpServers": {
"rymi": {
"type": "http",
"url": "https://mcp.rymi.live/",
"headers": {
"Authorization": "Bearer rymi_your_secret_key"
}
}
}
}Run the server on your own machine — it speaks stdio by default and talks to the Rymi REST API directly. The key is read from the RYMI_API_KEY environment variable.
{
"mcpServers": {
"rymi": {
"command": "npx",
"args": ["-y", "@rymi/mcp"],
"env": {
"RYMI_API_KEY": "rymi_your_secret_key"
}
}
}
}Options:RYMI_MCP_READONLY=1hides every mutating tool (includingcreate_call,batch_call,publish_agent).RYMI_WORKSPACEmakes the local server act in that workspace (sent as theRymi-Workspaceheader). On the hosted endpoint, send theRymi-Workspaceheader on the HTTP request instead. Every tool also takes an optionalworkspaceargument, so one connection can act in any workspace it can reach, such as an agency's client workspaces.
>
This package speaks stdio only. --transport http was removed in 2.0.0. Use the hosted endpoint above. The local server has no OAuth. It does filter tools by the key's scopes.<table> <tr><th>Group</th><th>Tools</th></tr> <tr> <td><b>Agents</b></td> <td><code>list_agents</code> · <code>get_agent</code> · <code>create_agent</code> · <code>update_agent</code> · <code>delete_agent</code> · <code>clone_agent</code> · <code>apply_agent_changes</code> · <code>generate_agent_draft</code> · <code>enrich_company</code> · <code>validate_agent_publish</code> · <code>preview_stack</code> · <code>publish_agent</code></td> </tr> <tr> <td><b>Agent tools & secrets</b></td> <td><code>set_agent_tools</code> · <code>list_agent_tools</code> · <code>add_agent_tool</code> · <code>update_agent_tool</code> · <code>remove_agent_tool</code> · <code>list_tool_secrets</code> · <code>set_tool_secret</code></td> </tr> <tr> <td><b>Share link</b></td> <td><code>get_share_link</code> · <code>set_share_link</code> · <code>regenerate_share_link</code></td> </tr> <tr> <td><b>Discovery</b></td> <td><code>list_llm_options</code> · <code>list_voices</code></td> </tr> <tr> <td><b>Knowledge & history</b></td> <td><code>list_knowledge_sources</code> · <code>add_knowledge_source</code> · <code>delete_knowledge_source</code> · <code>list_agent_changes</code> · <code>undo_agent_change</code></td> </tr> <tr> <td><b>Insight</b></td> <td><code>get_usage_summary</code> (minutes-based) · <code>list_agent_templates</code> · <code>run_evals</code> · <code>run_eval_suite</code> · <code>list_eval_runs</code> · <code>get_eval_run</code></td> </tr> <tr> <td><b>Calls</b> <sub>(read-only)</sub></td> <td><code>list_calls</code> · <code>list_active_calls</code> · <code>get_call</code> · <code>get_call_summary</code> · <code>get_call_transcript</code> · <code>get_call_recording</code> · <code>get_call_queue_stats</code> · <code>reprocess_call</code> · <code>list_calls_for_agent</code></td> </tr> <tr> <td><b>Call control</b></td> <td><code>create_call</code> · <code>batch_call</code> · <code>end_call</code> · <code>add_call_participant</code></td> </tr> <tr> <td><b>Task calls</b></td> <td><code>place_task_call</code> · <code>wait_for_call</code></td> </tr> <tr> <td><b>Numbers</b></td> <td><code>list_numbers</code> · <code>register_number</code> · <code>attach_number</code> · <code>remove_number</code></td> </tr> <tr> <td><b>Telephony</b> <sub>(read-only)</sub></td> <td><code>telephony_status</code> · <code>list_telephony_numbers</code></td> </tr> <tr> <td><b>Keys</b> <sub>(read-only)</sub></td> <td><code>list_publishable_keys</code></td> </tr> <tr> <td><b>Campaigns</b></td> <td><code>list_campaigns</code> · <code>get_campaign</code> · <code>get_campaign_report</code> · <code>list_campaign_attempts</code> · <code>list_campaign_suggestions</code> · <code>list_contacts</code> · <code>create_campaign</code> · <code>import_campaign_contacts</code> · <code>launch_campaign</code> · <code>pause_campaign</code> · <code>resume_campaign</code> · <code>accept_campaign_suggestion</code></td> </tr> <tr> <td><b>Lead intake</b></td> <td><code>get_campaign_intake</code> · <code>set_campaign_intake</code> · <code>rotate_campaign_intake</code> · <code>disable_campaign_intake</code></td> </tr> <tr> <td><b>Do-Not-Call</b></td> <td><code>list_dnc</code> · <code>check_dnc</code> · <code>add_dnc</code> · <code>add_dnc_batch</code> · <code>remove_dnc</code></td> </tr> <tr> <td><b>Webhooks</b></td> <td><code>list_webhooks</code> · <code>create_webhook</code> · <code>update_webhook</code> · <code>delete_webhook</code></td> </tr> <tr> <td><b>Billing & cost</b></td> <td><code>estimate_call_cost</code> · <code>set_auto_recharge</code> · <code>set_spend_alerts</code></td> </tr> <tr> <td><b>Accounts</b></td> <td><code>list_accounts</code> · <code>list_account_members</code> · <code>add_account_member</code> · <code>remove_account_member</code></td> </tr> <tr> <td><b>Workspaces</b></td> <td><code>list_workspaces</code> · <code>create_workspace</code> · <code>update_workspace</code> · <code>delete_workspace</code> · <code>get_workspace_usage</code> · <code>list_workspace_members</code> · <code>add_workspace_member</code> · <code>remove_workspace_member</code></td> </tr> <tr> <td><b>Compliance settings</b></td> <td><code>get_compliance_settings</code> · <code>update_compliance_settings</code></td> </tr> </table>
place_task_call, create_call and batch_call place real, billable outbound calls; publish_agent flips an agent live to end users.
What restrains them depends on which server you're talking to.
mcp.rymi.live over OAuth: tools are filtered by role. Account Owner is owner. Account Admin and workspace Admin are admin. Anyone else is member. An owner/admin sees every tool. A member gets agent-scoped tools only, with account-scoped writes (billing, keys, numbers, DNC) left out. RYMI_MCP_READONLY does not apply there.GET /v1/keys/self once and lists tools whose scope the key holds. A legacy key lists every tool. A billing write from that list still returns scope_missing.@rymi/mcp: no OAuth role filter. RYMI_MCP_READONLY=1 hides every mutating tool on top of the key's scopes. That flag is set by whoever starts the server.Either way, role filtering bounds the tool surface, not the credential: a key or token stays valid against the REST API directly. Treat MCP access as equivalent to handing over your own account access.
Carrier connect/disconnect and publishable-key creation/revocation are intentionally not exposed over MCP (they enter credentials and change standing configuration) — do those from the dashboard.
create_agent and update_agent accept the full agent configuration surface. Always call list_llm_options first to get valid model and voice IDs.
<details> <summary><b>Configuration reference</b></summary>
<br>
Agents created over MCP are custom agents — you choose the model stack and they're billed at component cost + a flat $0.02/min platform fee. (Managed "Rymi-Curated" SKUs are picked from the dashboard.)
supported_languages to every BCP-47 tag the agent should handle, e.g. ["hi-IN","en-US"]. The primary language is merged in automatically. The server resolves the per-language model stack for you; some languages may fall back to a different provider.llm_provider + llm_model, and optionally stt_provider/stt_model and tts_provider/tts_model. Realtime LLMs (and Deepgram TTS) carry their own voice, so leave voice empty for those.llm_fallback_*, stt_fallback_*, tts_fallback_* set a secondary provider/model per channel. Pass null to clear.custom_llm_url, custom_voice_url (+ custom_voice_mode), custom_transcriber_url. https:// or wss:// only; null clears.callerPersonas entries are objects of shape { type, approach, detectedWhen }, not plain strings.provider_config is server-derived (recomputed from the resolved stack + supported languages on every write) and is not accepted as an input.
</details>
Full reference and guides: docs.rymi.live/api/mcp
MIT © Rymi
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.