Agentphone Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Agentphone 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.
Give AI agents real phone numbers, SMS, and voice calls via the Model Context Protocol.
AgentPhone lets your AI agent buy phone numbers, send/receive SMS, and place voice calls — all through natural language in Cursor, Claude Desktop, or any MCP-compatible client.
Agents are the core concept — each agent gets its own phone numbers, voice personality, system prompt, and webhook. Think of an agent as a virtual team member with its own phone line. You can create agents for different purposes (support, sales, scheduling) and configure how they sound and behave on calls.
Sign up at agentphone.ai and create an API key from Settings.
Option A: Remote server (recommended)
Point your MCP client at the hosted endpoint — no install needed:
{
"mcpServers": {
"agentphone": {
"type": "streamable-http",
"url": "https://mcp.agentphone.ai/mcp",
"headers": {
"Authorization": "Bearer your_api_key_here"
}
}
}
}Works with any MCP client that supports Streamable HTTP transport (Switchboard, remote agent platforms, etc.).
Option B: Local server (stdio)
Runs locally via npx — works with Cursor, Claude Desktop, Windsurf, and Claude Code:
Cursor: Settings > MCP or ~/.cursor/mcp.json Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"agentphone": {
"command": "npx",
"args": ["-y", "agentphone-mcp"],
"env": {
"AGENTPHONE_API_KEY": "your_api_key_here"
}
}
}
}Option C: Self-hosted HTTP server
Run your own HTTP MCP endpoint:
PORT=3000 npx agentphone-mcp --httpThen connect to http://localhost:3000/mcp and configure your MCP client to send Authorization: Bearer <your AgentPhone API key> with each request. A server-side AGENTPHONE_API_KEY alone does not authorize HTTP callers.
Warning: AGENTPHONE_ALLOW_ANONYMOUS=true opts into using the server's AGENTPHONE_API_KEY for requests with no Authorization header, only when OAuth is off. Anyone who can reach that endpoint can act as the account: only enable this behind your own authentication. Malformed headers are rejected, and a caller's supplied bearer is never replaced by the server key.
Once configured, just ask your AI agent things like:
The server is built on the mcp-use server framework, which owns the HTTP layer: Streamable HTTP, the SSE stream, session management, and the OAuth discovery endpoints. npm start (or the Docker image) runs it as an HTTP server on PORT (default 3000), reachable at /mcp.
https://mcp.agentphone.ai/mcpPORT=3000 npm start → http://localhost:3000/mcpAuthorization Code + PKCE flow to the AgentPhone authorization server, so the client opens a browser to sign in at agentphone.ai — no key to paste. Enable it by setting MCP_OAUTH_CLIENT_ID (a client pre-registered with the AgentPhone AS). MCP_OAUTH_CLIENT_SECRET is optional: set it to run the gateway as a confidential client, or leave it unset to run as a public client (the gateway must then be registered with token_endpoint_auth_method=none). Public mode advertises none to downstream clients, which strict OAuth clients require.
Authorization: Bearer <your API key>. The server-side AGENTPHONE_API_KEY is only used for callers that send nothing, and only when AGENTPHONE_ALLOW_ANONYMOUS=true. Without that flag an unauthenticated call is rejected, so an exposed port cannot act as your account.
With OAuth enabled, bearer tokens are verified through the backend’s /auth/me; the anonymous opt-in does not bypass that verification.
The caller’s credential is forwarded to the AgentPhone REST API for validation. The optional anonymous mode instead uses the configured server API key.
| Var | Purpose |
|---|---|
PORT | HTTP port (default 3000) |
AGENTPHONE_API_KEY | Fallback API key when OAuth is off. Only used for callers that send no Authorization header when AGENTPHONE_ALLOW_ANONYMOUS=true |
AGENTPHONE_ALLOW_ANONYMOUS | Default off; ignored when OAuth is enabled. Set to true to let requests with no Authorization header act with the server's AGENTPHONE_API_KEY. Anyone who can reach the port then controls the account: put the server behind your own auth first |
MCP_OAUTH_CLIENT_ID | Enable OAuth; a gateway client pre-registered with the AgentPhone AS |
MCP_OAUTH_CLIENT_SECRET | Optional. Set = confidential gateway; unset = public client (gateway registered with token_endpoint_auth_method=none, advertises none downstream) |
AGENTPHONE_BASE_URL | API base (default https://api.agentphone.ai) |
AGENTPHONE_OAUTH_AUTHORIZE | Override authorize/consent URL (default https://agentphone.ai/oauth/authorize) |
| Tool | Description |
|---|---|
account_overview | Get a full snapshot of your account — agents, numbers, webhook, and usage |
get_usage | Get usage stats — number usage, billed SMS segments, and message/call/webhook volume. Use breakdown for daily or monthly time-series. |
| Tool | Description |
|---|---|
list_numbers | List all phone numbers in your account |
buy_number | Purchase a new phone number with optional area_code and agent_id |
| Tool | Description |
|---|---|
send_message | Send SMS or iMessage. Supports media, threaded replies (reply_to_message_id), iMessage send effects (send_style), and group chats |
get_messages | Get messages for a specific number |
list_conversations | List SMS conversations. Pass agent_id to filter by agent. |
get_conversation | Get a conversation with full message history |
update_conversation | Set metadata on a conversation |
| Tool | Description |
|---|---|
list_contacts | List saved contacts (address book). Filter with a search term. |
manage_contact | Create, update, or delete a contact (set action) |
| Tool | Description |
|---|---|
list_calls | List calls. Filter by agent_id, number_id, status, direction, or keyword. |
get_call | Get call details and transcript |
make_call | Place an outbound call (webhook-driven) |
make_conversation_call | Place a call with built-in AI conversation — no webhook needed |
| Tool | Description |
|---|---|
list_agents | List all agents with their numbers and voice config |
create_agent | Create an agent with voice, system prompt, call transfer, voicemail, and voice tuning (speed, interruption sensitivity, backchannel, language, and more) |
update_agent | Update an agent's configuration |
delete_agent | Delete an agent (numbers are kept but unassigned) |
get_agent | Get agent details including phone numbers and voice config |
attach_number | Assign a phone number to an agent |
detach_number | Remove a phone number from an agent |
list_voices | List available voices for agents |
All webhook tools accept an optional agent_id — pass it to manage an agent-specific webhook, omit it for the project-level default. Agent webhooks take priority over project-level.
| Tool | Description |
|---|---|
get_webhook | Get webhook configuration |
set_webhook | Set a webhook URL for inbound messages and call events |
delete_webhook | Remove a webhook |
test_webhook | Send a test event to verify your webhook works |
list_webhook_deliveries | View delivery history for debugging |
get_webhook and set_webhook mask signing secrets by default, for both scopes. Retrieve the secret from the dashboard when possible. Passing reveal_secret: true includes it in tool output, exposing it to model context, transcripts and client logs. This prevents accidental disclosure; it is not an authorization boundary against a model that deliberately requests the secret.
| Variable | Required | Description |
|---|---|---|
AGENTPHONE_API_KEY | stdio: yes; HTTP anonymous mode: yes | In HTTP mode, used only with AGENTPHONE_ALLOW_ANONYMOUS=true, OAuth off, and no caller Authorization header |
AGENTPHONE_ALLOW_ANONYMOUS | No | Explicit HTTP server-key fallback; default off, ignored when OAuth is enabled. See the self-hosting warning above |
AGENTPHONE_BASE_URL | No | Override the API base URL (defaults to https://api.agentphone.ai) |
PORT | No | Port for HTTP mode (defaults to 3000; set with PORT) |
git clone https://github.com/AgentPhone-AI/agentphone-mcp.git
cd agentphone-mcp
npm install
npm run dev # Run with tsx (hot reload)
npm run build # Compile TypeScript
npm start # Run compiled JS (stdio)This MCP server connects your AI assistant to the AgentPhone API. Your assistant talks to the MCP server, which calls the AgentPhone API, which talks to the phone network.
Your AI Assistant <--> agentphone-mcp <--> AgentPhone API <--> Phone NetworkOutbound: your assistant places calls and sends texts through AgentPhone's API.
Inbound: when someone calls or texts your number, AgentPhone sends a webhook event to your server — you can then respond programmatically or let your agent's built-in AI handle it.
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.