built by the makers of Gamut
Getting started

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

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

Option 1: connect directly

Point your MCP client at this endpoint:

URL:        https://mcp.dialmcp.com/mcp
Transport:  Streamable HTTP
Auth:       OAuth 2.1

There 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/mcp

In 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 --version

You 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.json

The 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:

{
  "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

  1. Complete OAuth sign-in in the browser.
  2. Verify a US or Canadian mobile number by SMS. The first time, also enter the first name the assistant should use on calls.
  3. Review the consent screen and click Allow. Your verified number becomes the caller ID for calls you authorize.
  4. 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.
  5. Ask your agent to use place_call, then poll the returned call ID with get_call. The client issues those as tools/call JSON-RPC methods; you do not type them.

The exact wording of every sign-in error is listed on client setup.

Important: DialMCP is designed for individual, objective-driven calls. Bulk calling, telemarketing, surveys, lead generation, debt collection, and political outreach are prohibited. See the safety page.

Install problems

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.