built by the makers of Gamut
Client recipe

Add DialMCP to Windsurf.

Updated November 1, 2026

Windsurf connects to remote MCP servers directly, so DialMCP needs no package, no local process and no API key. You add one URL, https://mcp.dialmcp.com/mcp, sign in once in the browser, and the agent in your editor can place a real phone call from your own verified number. Windsurf now ships as Devin Desktop and has two agents that keep MCP servers in different places. This page covers both, plus the errors you're most likely to hit. The shorter multi-client version is on client setup.

Windsurf is now Devin Desktop. Cognition renamed the IDE on June 2, 2026, as an over-the-air update. Plans, settings and the editor carried over. New agent tabs now open with Devin Local, which reads MCP servers from Devin CLI config files. The older Cascade agent is still there, marked legacy, and still reads ~/.codeium/windsurf/mcp_config.json. This page was checked against Cognition's Devin Desktop, Devin CLI and Cascade MCP docs on November 1, 2026.

Which agent are you using?

Look at the agent selector in the bottom-right corner of the agent panel. The setup steps depend on which agent it shows.

If you aren't sure, set up Cascade's file first. Devin's shared agent harness imports MCP servers from Windsurf's mcp_config.json by default (see one entry for both agents), so a single entry there often covers both.

What you need

1. Devin Local: add the server

DialMCP probably won't appear under Available on the Customize page. That list comes from your MCP registries, and a company registry may not include it. Add it as a custom server instead. Devin Local uses the Devin CLI file format, so use any of these three routes.

Edit the user config file. Open Customize → MCPs, set Install MCPs for to This computer, and open the config file from there. Or edit ~/.config/devin/mcp_config.json (Windows: %APPDATA%\devin\mcp_config.json) directly:

{
  "mcpServers": {
    "dialmcp": {
      "url": "https://mcp.dialmcp.com/mcp"
    }
  }
}

transport is optional. A URL entry defaults to "http", which means Streamable HTTP. That is what DialMCP speaks. Note that the field is url, not Cascade's serverUrl.

Use Devin CLI, if you have it installed. It writes the same files:

devin mcp add -s user dialmcp https://mcp.dialmcp.com/mcp
devin mcp login dialmcp

Without -s user, the server is saved to .devin/mcp_config.local.json in the current project, which is gitignored. Use -s project to write .devin/mcp_config.json and share it with your team. Neither scope needs secrets, because the entry has none.

Using an older build? Before Devin CLI v3000.3, MCP servers lived under an mcpServers key in ~/.config/devin/config.json and .devin/config.json, and some Desktop pages still list those paths. Newer versions move any entries they find there into the dedicated mcp_config.json files on startup. You don't have to move them yourself.

Sign in. The first time the agent uses the server, it prompts you to authenticate. Before that, DialMCP shows Needs auth in the This computer list. Click Authenticate to open the browser flow (see step 3).

2. Cascade (legacy): add the server

  1. Click the MCPs icon at the top right of the Cascade panel, or open Devin Settings → Cascade → MCP Servers.
  2. DialMCP is a custom server, so open the raw mcp_config.json from that screen. You can also edit ~/.codeium/windsurf/mcp_config.json directly. The directory is ~/.codeium/windsurf/, not ~/.windsurf/.
  3. Add the entry and save:
{
  "mcpServers": {
    "dialmcp": {
      "serverUrl": "https://mcp.dialmcp.com/mcp"
    }
  }
}

Cascade's docs accept serverUrl or url for remote HTTP servers. Their examples use serverUrl, so we use it too. Leave out headers. Cascade's docs show them for servers that take a static API key. DialMCP uses OAuth instead, so there is no key to send. If the file already has other servers, add "dialmcp" next to them inside the existing mcpServers object. Don't paste a second top-level object.

Back on the MCPs screen, refresh. Recent builds start the OAuth sign-in on their own when you add an HTTP server. If yours doesn't, open the DialMCP entry and sign in from there. On the server's settings page you can switch individual tools on and off. Cascade can use at most 100 MCP tools at a time across all servers, and DialMCP adds four.

Preview channels keep their own folder. Windsurf Next uses ~/.codeium/windsurf-next/ and Insiders uses ~/.codeium/windsurf-insiders/, so an entry in the stable file won't show up there.

3. Sign in and check the connection

Both agents register themselves with DialMCP automatically, using OAuth dynamic client registration, so there is no client ID to paste. The browser flow is the same as in every other client:

  1. Enter a US or Canadian number that can receive SMS. That number is your account, and calls go out from it.
  2. Type the SMS code.
  3. On first sign-up, enter the first name the assistant should use on calls ("calling on behalf of …").
  4. Review the consent screen: place phone calls as your number, and view call status, transcripts and recordings. Click Allow and go back to the editor.

Devin's docs say each MCP client (they name Windsurf, Claude Code and Devin CLI) keeps its own OAuth session. Being signed in from Claude Code or Cursor doesn't carry over, and you should expect to sign in separately in Cascade and Devin Local. Use the same phone number each time, and your call history follows you.

To check the connection without calling anyone, ask the agent: "List my recent DialMCP calls." That runs list_calls, which is read-only. On a new account, an empty list means it works. An authentication error means the sign-in did not finish. The flow step by step is on client setup, and the four tools are on the tool reference.

Tool approvals

Devin Local asks before it calls any MCP tool. At the prompt you can allow one tool or every tool on the server, for this session or permanently. The server-wide option is convenient for read-only servers, but DialMCP's place_call starts a real phone call. Approve list_calls and get_call permanently if you want, and keep place_call on ask. The same rules can go in Devin's settings file, ~/.config/devin/config.json (or .devin/config.json for a project):

{
  "permissions": {
    "allow": ["mcp__dialmcp__list_calls", "mcp__dialmcp__get_call"],
    "ask": ["mcp__dialmcp__place_call", "mcp__dialmcp__end_call"]
  }
}

The tool names follow the server key, so this only matches if you named the server dialmcp. Whatever the client allows, DialMCP's own limits still apply. Calls go out only between 8:00 and 21:00 in the destination's local time, the agent discloses that it is an AI, and opted-out numbers stay blocked. See safety.

One entry for both agents

According to Devin's configuration-import docs, the Devin CLI harness reads MCP servers from Windsurf's ~/.codeium/windsurf/mcp_config.json by default. It also reads Cursor's .cursor/mcp.json and several Claude Code files. Devin Local runs on that harness and inherits your Windsurf settings, so the Cascade entry above usually appears in Devin Local's This computer list too. It still needs its own sign-in.

If the server shows up twice, or you want Devin Local to ignore your Cascade servers, turn off the import in ~/.config/devin/config.json:

{
  "read_config_from": {
    "windsurf": false
  }
}

That also stops Devin from importing Windsurf rules and skills. To keep those, leave the import on and remove the duplicate entry from one file instead.

Troubleshooting

Do you need the stdio bridge?

Almost never. Both agents connect to remote servers directly. The bridge, npx -y dialmcp-connector, is for hosts that can only launch local commands. You might need it behind a proxy that only a local process can get through. It requires Node.js 20.18.1 or later. In Cascade's file:

{
  "mcpServers": {
    "dialmcp": {
      "command": "npx",
      "args": ["-y", "dialmcp-connector"]
    }
  }
}

The Node check, proxy flags and where the bridge stores credentials are on install. For why a hosted URL is simpler than a local process, see remote MCP servers explained.

FAQ

Is Windsurf the same as Devin Desktop?

Yes. Cognition renamed Windsurf to Devin Desktop on June 2, 2026. It is the same editor, with your settings and plan carried over. The Windsurf JetBrains plugin is a separate product and is now in maintenance mode.

Where is the Windsurf MCP config file?

For the Cascade agent, it's ~/.codeium/windsurf/mcp_config.json (on Windows, the same path under your user folder). For the Devin Local agent, use ~/.config/devin/mcp_config.json for your user, or .devin/mcp_config.json in a project. Devin Local also imports the Cascade file by default.

Do I need an API key to use DialMCP in Windsurf?

No. The entry is just the URL. The editor registers itself with DialMCP and opens a browser sign-in, where you verify your phone number by SMS. Don't add headers or a token.

Why doesn't my Cascade server show up in Devin Local?

It is probably there but not signed in, because each agent keeps its own OAuth session. Look for Needs auth under Customize → MCPs → This computer. If it is missing entirely, check that read_config_from.windsurf isn't false, or add the url entry to Devin's own file.

Every client's file path in one place: MCP server configuration examples. Using another editor? See VS Code, Claude, Codex and Cursor, ChatGPT, or the Claude Code MCP setup. Back to the docs hub.