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.
~/.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.
- Devin Local (the default for new tabs). This is the same agent harness as Devin CLI. You manage its servers on the Customize page, under MCPs. Its files are
~/.config/devin/mcp_config.jsonfor you and.devin/mcp_config.jsonfor a project, and a remote server uses aurlfield. Go to Devin Local setup. - Cascade (legacy). This is the agent Windsurf has had since 2024. You open its MCPs icon at the top right of the Cascade panel, or go to Devin Settings → Cascade → MCP Servers. Its file is
~/.codeium/windsurf/mcp_config.json, and a remote server usesserverUrl. Go to Cascade setup.
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
- A current Devin Desktop or Windsurf build. Cognition treats every release but the latest as deprecated. If the menus below don't match yours, update first.
- MCP allowed for your team. On Enterprise plans, MCP has to be turned on in settings first, and an admin has to enable Devin Local for members. Admins can also restrict servers with an allowlist or a private MCP registry. See troubleshooting.
- A browser on the same machine. The sign-in opens in your default browser.
- A US or Canadian mobile number. DialMCP verifies it by SMS and uses it as your caller ID. See OAuth and phone verification.
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
- Click the MCPs icon at the top right of the Cascade panel, or open Devin Settings → Cascade → MCP Servers.
- DialMCP is a custom server, so open the raw
mcp_config.jsonfrom that screen. You can also edit~/.codeium/windsurf/mcp_config.jsondirectly. The directory is~/.codeium/windsurf/, not~/.windsurf/. - 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:
- Enter a US or Canadian number that can receive SMS. That number is your account, and calls go out from it.
- Type the SMS code.
- On first sign-up, enter the first name the assistant should use on calls ("calling on behalf of …").
- 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
- The server never appears. Check that you edited the right file for the agent you are using:
~/.codeium/windsurf/mcp_config.jsonfor Cascade, and~/.config/devin/mcp_config.jsonfor Devin Local. Check that the root key ismcpServers. A trailing comma makes the whole file invalid. Then refresh the MCP list. - A config pasted from Cursor or Claude Code doesn't load in Cascade. Use
serverUrland drop"type": "http". Neither Cascade nor Devin documents that field. Devin's files useurl, with an optionaltransport. - "Needs auth", "Auth required" or a sign-in loop. In Devin Local, click Authenticate, which clears the stored credentials and reruns the browser flow. In a terminal, run
devin mcp logout dialmcpand thendevin mcp login dialmcp. Start the sign-in from the editor, not from browser history. The SMS step expires after 10 minutes. - Opening the URL in a browser shows
invalid_token. That is expected. DialMCP answers unauthenticated requests with HTTP 401 and aWWW-Authenticateheader that points the client to its OAuth metadata. It does not mean the server is down. - Don't set
"transport": "sse"or use an/sseURL. DialMCP has no legacy SSE endpoint, and/ssereturns 404. Devin only falls back to SSE on a non-auth 4xx, and DialMCP's 401 isn't one, so the default is right. - You don't need
oauthClientIdoroauthResource. Those Devin fields are for servers without dynamic client registration, or for servers that reject theresourceparameter. DialMCP supports registration and accepts the default. - MCP is missing, or DialMCP is blocked. Your admin turned MCP off, or added an allowlist. Once a team allowlists any server, every other server is blocked. For Cascade, the allowlist's Server ID has to match your config key exactly, and it is case-sensitive, so ask for
dialmcpwith the URLhttps://mcp.dialmcp.com/mcp. Teams using a private registry instead need DialMCP added to it. DialMCP is listed in the Official MCP Registry. - The tools are switched off or missing in Cascade. Check the per-tool toggles on DialMCP's settings page, and the 100-tool limit if you run many servers.
- You need logs. In Devin Local, each MCP server writes to its own MCP: dialmcp output channel in the Output panel.
- The call was refused. That comes from DialMCP's policy, not from your setup.
place_callreturns a code such asoutside_calling_hoursorrate_limited(3 calls per hour, 10 per day). The full list is on client setup.
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.