Let AI agents place real phone calls from your verified number, with transcripts and recordings.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Give your AI agent a phone.
Open-source connector for DialMCP β the hosted MCP server that lets AI agents place real phone calls from your own verified number.
DialMCP is a remote MCP server at https://mcp.dialmcp.com/mcp. Any client that speaks
Streamable HTTP with OAuth can connect to
it directly β no install, no API keys. You do not need this package for those clients.
This repository exists for two reasons:
dialmcp-connector launches a local stdio server that proxies to the hosted endpoint and
handles the OAuth browser flow for you.server.json registry manifest, and the safety model β in one auditable place.The hosted calling service itself is closed-source. This connector is MIT-licensed and contains no proprietary logic: it is a thin transport shim over a public endpoint.
If your client supports remote MCP servers, skip this package entirely:
~/.codex/config.tomlSettings β Connectors β Add custom connector β paste https://mcp.dialmcp.com/mcp.
Settings β Connectors β Add MCP server β paste the URL (HTTP / OAuth) β complete SMS verification.
On first connect a browser window opens for sign-in. Verify your phone number with an SMS code β that number becomes your caller ID.
Or in an MCP client config:
See examples/ for ready-to-paste configs.
| Tool | Description |
|---|---|
place_call | Start an outbound phone call to a US or Canadian number with a stated objective. Returns immediately with a call ID β the call runs asynchronously. |
get_call | Fetch the current state of a call: status, live progress, and once finished the transcript, recording link, and structured resolution. Poll this after place_call. |
end_call | Hang up an in-progress call immediately. |
list_calls | List recent calls for the authenticated user with their statuses and outcomes. |
The API is async by design: place_call returns instantly with a call ID and your agent polls
get_call, so a multi-minute call never trips a client's tool timeout.
When a call completes, get_call returns a structured resolution β achieved, partially_achieved, or
not_achieved β with a summary, any commitments the other party made, suggested follow-ups, a
turn-by-turn transcript, and a signed link to the audio recording.
During the call the service presses keys through automated phone trees, waits silently through hold music, and detects voicemail β hanging up rather than leaving a message.
Every protection is enforced server-side, not as model instructions the agent could talk itself out of.
Full detail: https://dialmcp.com/safety.html
Every release publishes to two places: npm (dialmcp-connector) and the
official MCP Registry (com.dialmcp/dialmcp). Both are
automated by .github/workflows/release.yml.
version in both package.json and server.json β npm run validate:manifest fails if they
disagree, and CI runs it on every push.main.dry_run left checked) and let
it go green. This packs the tarball and validates server.json against the live registry schema without
publishing anything.vX.Y.Z. The tag must match package.json or the workflow stops before
publishing.Step 3 is worth the two minutes: registry versions are immutable and cannot be unpublished. A bad version can only be superseded by a higher one or marked deprecated.
| Job | Runs on | Steps |
|---|---|---|
publish | releases and manual dry runs | typecheck β validate manifest β build β smoke test β tag/version match β npm publish --provenance β mcp-publisher validate |
registry | releases only | wait for npm propagation β mcp-publisher login dns β mcp-publisher publish |
--provenance attaches a signed attestation linking the tarball back to the commit and workflow run that
built it, which is why the job needs id-token: write.
The registry publish is a separate job for two reasons. It has to wait for npm: the registry proves
ownership by fetching the freshly published version and reading its mcpName field, which 404s until npm
propagates (the job retries for ~2.5 minutes). And it holds the signing key, which is scoped to the whole
com.dialmcp namespace rather than this one package β so it lives in a protected environment. Keeping that
environment off the publish job is deliberate: its branch policy only admits v* tags, and applying it
job-wide would block manual dry runs from main outright.
| What | Where | Why |
|---|---|---|
NPM_TOKEN | repository secret | automation token with publish rights on dialmcp-connector |
MCP_REGISTRY_PRIVATE_KEY | secret on the release environment | Ed25519 key, base64; authenticates the registry publish |
release environment | deployment branch policy β tags β v* | keeps the namespace key off untagged runs |
v=MCPv1; k=ed25519; p=<public key> | TXT record on the apex of dialmcp.com | how the registry verifies domain ownership |
The TXT record goes on the bare domain, SPF-style β a _mcp. selector is not read and fails with an opaque
signature error. Signatures carry a Β±15s timestamp window, so the runner's clock must be accurate.
Issues and pull requests are welcome for the connector, docs, and client configs. Bugs in the hosted service itself are best sent to support@dialmcp.com. Please read SECURITY.md before reporting anything security-related.
MIT Β© Datawizz Inc. See LICENSE.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/dialmcp)<a href="https://allmcps.com/mcp/dialmcp"><img src="https://allmcps.com/api/badge/dialmcp?style=directory" alt="DialMCP on AllMCPs" /></a>