Install DialMCP.
Updated October 16, 2026
There are two ways to install DialMCP, and most people should use the first. If your MCP client accepts a server URL, connect it to the hosted endpoint and there is nothing to install. If your client can only launch local commands, run the small npx stdio bridge, which needs Node.js 20.18.1 or newer. Either way you end up on the same hosted service, signed in with the same phone number.
What that URL is, versus npx: hosted MCP server endpoint. ChatGPT is remote-only: add DialMCP as a ChatGPT MCP connector. Building your own server instead? Read how to build an MCP server. Packaging that server as a container is deploy an MCP server with Docker.
Which one to use
- Remote URL (recommended). Use it when your client has a place to add a remote, custom or HTTP MCP server. That covers Claude Code, Claude.ai and Claude Desktop custom connectors, ChatGPT developer mode, Codex, Cursor, VS Code, Windsurf and Gamut. No Node.js, no local process, and the client handles sign-in and token refresh.
- Stdio bridge. Use it only when the client's configuration takes a
commandandargsand nothing else. The bridge runs on your machine and turns the hosted endpoint into a local stdio server.
If a client supports both, pick the URL. The bridge adds a Node.js dependency and a local credential store that you have to manage yourself.
Before you start
- A US or Canadian phone number that receives SMS. It becomes your account and the caller ID on calls you authorize. See OAuth and phone verification.
- A browser on the same machine as the client. Sign-in happens in a browser window. With the bridge, the browser has to be able to reach a callback on
localhost. - For the bridge only: Node.js 20.18.1 or newer, with
npxon the path the client uses.
Option 1: connect directly
Point your MCP client at this endpoint:
URL: https://mcp.dialmcp.com/mcp
Transport: Streamable HTTP
Auth: OAuth 2.1There is no API key to copy. On first connection, DialMCP opens a browser sign-in flow. Verify your phone number by SMS, then return to your client.
In Claude Code it is one command:
claude mcp add --transport http dialmcp https://mcp.dialmcp.com/mcpIn Cursor's .cursor/mcp.json the entry looks like this:
{
"mcpServers": {
"dialmcp": {
"url": "https://mcp.dialmcp.com/mcp"
}
}
}The key names differ between clients. VS Code uses servers with "type": "http", a Claude Code project .mcp.json also needs "type": "http", Windsurf uses serverUrl, and Codex uses [mcp_servers.dialmcp] in config.toml. Exact snippets and click paths for each client are on client setup, and which file each client reads is on MCP server configuration examples.
Opening the URL in a browser tab shows {"error":"invalid_token","error_description":"Missing or invalid access token"} with HTTP 401. That is expected. It is the signal an MCP client uses to start the sign-in. It does not mean the server is down. The endpoint only speaks Streamable HTTP. There is no legacy /sse endpoint, and that path returns 404.
Option 2: use the stdio bridge
The bridge is for clients that cannot connect to a remote MCP server. It runs locally and proxies requests to the hosted endpoint.
1. Check your Node.js version
node --versionYou need v20.18.1 or newer. Current LTS releases are fine. On Node 18 the bridge exits as soon as it starts, with an error like this in the client's MCP log:
ReferenceError: File is not defined
at Object.<anonymous> (.../node_modules/undici/lib/web/webidl/index.js:537:48)The cause is a dependency. The bridge runs mcp-remote 0.1.49, which uses undici 7, and undici 7 requires Node 20.18.1 or newer. Just before the crash, npx usually prints an EBADENGINE warning naming undici. Upgrading Node fixes it.
Desktop apps don't always see the Node your terminal uses, for example one installed with nvm. If the client log shows spawn npx ENOENT, set command to the full path of a Node 20.18.1+ npx (run which npx on macOS or Linux, where npx on Windows). If it shows an old Node version, that is not enough on its own: npx starts whichever node comes first on the PATH. Also put that Node's bin folder first on the PATH in the server's env, for example "PATH": "/Users/you/.nvm/versions/node/v22.x/bin:/usr/bin:/bin".
2. Add the bridge to your client
Any client that accepts an MCP server configuration with a command:
{
"mcpServers": {
"dialmcp": {
"command": "npx",
"args": ["-y", "dialmcp-connector"]
}
}
}The -y lets npx download the package without stopping for a prompt that the client can't answer. For Claude Desktop, this goes in ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows. Fully quit and reopen the client after saving.
To try the bridge by hand first, run npx dialmcp-connector in a terminal. It starts the browser sign-in straight away and prints its progress. Once you are signed in it waits quietly for MCP messages on stdin, which is normal. Press Ctrl+C to stop it.
3. Sign in on first run
The first time the client starts the bridge, it finds DialMCP's authorization server, registers itself, and opens your browser. The client's MCP log shows lines like these:
Using automatically selected callback port: 36396
Discovering OAuth server configuration...
Discovered authorization server: https://mcp.dialmcp.com
Using transport strategy: http-first
Please authorize this client by visiting:
https://mcp.dialmcp.com/authorize?response_type=code&client_id=...
Browser opened automatically.
Authentication required. Waiting for authorization...Complete the phone sign-in in that window. The browser then returns to http://localhost:36396/oauth/callback, and the bridge picks up the code. If no browser opens, which happens on remote shells and some locked-down machines, copy the authorize URL from the log into a browser on the same machine. The port is worked out from the server URL, so it is normally 36396 every time. If that port is busy, the bridge picks a free one and registers again.
What the bridge actually runs
dialmcp-connector is open source (MIT, SkillfulAgents/dialmcp-connector). It is one short script. It starts mcp-remote with https://mcp.dialmcp.com/mcp filled in and passes any extra arguments through. mcp-remote handles the OAuth browser flow, token refresh and the HTTP connection. The package declares mcp-remote ^0.1.38, so npx installs the newest 0.1.x release (0.1.49 today), not mcp-remote's newer 0.2+ releases. There is no calling logic in it. The tools, guardrails, recordings and transcripts all live on the hosted server.
Where the bridge keeps your sign-in
mcp-remote stores the client registration and your tokens as plain files in your home directory:
~/.mcp-auth/mcp-remote-0.1.49/<hash>_client_info.json
~/.mcp-auth/mcp-remote-0.1.49/<hash>_tokens.jsonThe folder name follows the installed mcp-remote version. Set MCP_REMOTE_CONFIG_DIR in the server's env to use a different base folder instead of ~/.mcp-auth. The versioned subfolder is still created inside it. For the default DialMCP URL, <hash> is always 8125827467b6fb29878fbd22aa698420. Treat these files like a password. Access tokens last an hour, but tokens.json also holds a refresh token, which the bridge uses to get new ones on its own. Anyone who copies it can keep placing calls from your number.
Useful options
Add options after the package name in args. They are handed to mcp-remote:
"--debug"writes a timestamped log of discovery, sign-in and refreshes to~/.mcp-auth/mcp-remote-0.1.49/<hash>_debug.log. Start here when sign-in loops."--enable-proxy"sends traffic through the proxy inHTTPS_PROXY,HTTP_PROXYandNO_PROXY, for corporate networks.NODE_EXTRA_CA_CERTS(inenv, notargs) points Node at your company's CA certificate when a VPN or TLS-inspecting proxy causes certificate errors.
{
"mcpServers": {
"dialmcp": {
"command": "npx",
"args": ["-y", "dialmcp-connector", "--debug"],
"env": { "NODE_EXTRA_CA_CERTS": "/path/to/company-ca.pem" }
}
}
}
Sign in and check the connection
- Complete OAuth sign-in in the browser.
- Verify a US or Canadian mobile number by SMS. The first time, also enter the first name the assistant should use on calls.
- Review the consent screen and click Allow. Your verified number becomes the caller ID for calls you authorize.
- Ask your agent: “List my recent DialMCP calls.” That runs
list_calls, which is read-only, so it checks the install without dialing anyone. An empty list on a new account is a pass. - Ask your agent to use
place_call, then poll the returned call ID withget_call. The client issues those astools/callJSON-RPC methods; you do not type them.
The exact wording of every sign-in error is listed on client setup.
Install problems
ReferenceError: File is not definedat startup. The bridge is running on Node 18 or older. Install Node 20.18.1 or newer and make sure the client uses it.spawn npx ENOENTor “command not found”. The client can't findnpx. Use its full path ascommand.- The tools never appear. Fully quit and reopen the client after editing its config, then check its MCP log. A JSON syntax error in the config file can stop the client from loading any server in it.
- The browser never opens. Copy the
authorizeURL from the log. With the remote URL, use the client's own sign-in control instead (for example/mcpin Claude Code). - The browser says it can't reach
localhostafter sign-in. The bridge stopped before you finished, or the browser is on another machine. Restart the client and finish sign-in within a few minutes, on the same machine. The sign-in link expires after 10 minutes. - It keeps asking you to sign in, or says “Unknown client”. Quit the client, delete the
~/.mcp-auth/mcp-remote-*/8125827467b6fb29878fbd22aa698420_*files, which are DialMCP's (or the whole folder if DialMCP is your only bridged server), and start again. For the remote URL, remove the server from the client and add it back. - Certificate or connection errors on a work network. Add
"--enable-proxy"and, if needed,NODE_EXTRA_CA_CERTSas shown above. - 404 from the server. Check that the URL ends in
/mcp, not/sseor a bare domain.
Update or remove DialMCP
The remote connection has nothing to update. The server changes on DialMCP's side and your client sees the current tools the next time it lists them. The bridge is fetched by npx, which may reuse a cached copy. To force the newest release, use "args": ["-y", "dialmcp-connector@latest"]. When the bundled mcp-remote version changes, its credentials folder name changes too, so expect to sign in once more.
To remove DialMCP, delete it from the client. That throws away the client's tokens, so it can no longer place calls. With the bridge, also delete its files under ~/.mcp-auth/. Removing it from the client does not revoke the grant on DialMCP's side. Your account and call history stay, and signing in again with the same number picks them back up.
FAQ
Do I need to install anything to use DialMCP?
Not if your client accepts a remote MCP server URL. Add https://mcp.dialmcp.com/mcp and sign in in the browser. Only clients that can launch nothing but local commands need the npx stdio bridge, and that needs Node.js.
Which Node.js version does the stdio bridge need?
Node.js 20.18.1 or newer. The bridge runs mcp-remote 0.1.x, whose HTTP library requires it. On Node 18 the bridge exits at startup with ReferenceError: File is not defined. The remote URL needs no Node.js at all.
Does the bridge contain the calling service?
No. dialmcp-connector is a few dozen lines that start mcp-remote with the DialMCP URL filled in. Calls, guardrails and recordings all run on DialMCP's hosted server. The bridge forwards MCP messages and stores your OAuth tokens on your machine.
Can I connect DialMCP to more than one client?
Yes. Sign in with the same phone number in each client and they share one account, so call history and rate limits are the same everywhere. Each client keeps its own sign-in.
For ready-to-paste configurations, continue to client setup. For which file each client actually reads (mcp.json, .vscode/mcp.json, config.toml), see MCP server configuration examples. For the authentication details, read OAuth and phone verification. For every tool argument and response, see the tool reference.