This article covers Devin Desktop (formerly Windsurf), Cline, Zed, JetBrains IDEs and Goose. All of them can reach the Functionize MCP server; most connect natively, and one needs a small bridge.
Cursor, VS Code, Gemini CLI, Claude Code, Claude Desktop and ChatGPT each have their own article.
Before you start: the endpoint
Every tool below needs the same value:
https://mcp.functionize.com/mcp
Sign-in is always with the same account you use for Functionize Studio, or your organisation's SSO. There is no separate MCP account.
The config key names differ between tools. That is the main hazard when copying a snippet from elsewhere — each section below gives the correct shape.
Devin Desktop (formerly Windsurf)
Windsurf was renamed Devin Desktop in June 2026, and the old documentation URLs now redirect. If you are following an older guide, the paths in it are out of date.
Config file:
| macOS and Linux | ~/.config/devin/mcp_config.json |
| Windows | %APPDATA%\devin\mcp_config.json |
You can open it from the Cascade panel: the … actions menu, top right, then Open MCP config file.
{
"mcpServers": {
"functionize": {
"serverUrl": "https://mcp.functionize.com/mcp",
"headers": {
"X-Functionize-Team-Id": "12345"
}
}
}
}
Note serverUrl, not url. Devin Desktop is the only
tool in this set that uses that key. There is no type or transport
field.
OAuth is handled natively — authorisation opens your provider directly in the browser.
Two things that catch people out. Cascade has a ceiling of 100 tools available
at once, so if you already run several MCP servers, Functionize's tools can be crowded out without
an obvious error. And on enterprise plans, admins can allowlist approved MCP servers — once any
server is allowlisted, every server that is not on the list is blocked. If nothing connects and
you are on an enterprise plan, ask your admin to allow
https://mcp.functionize.com/mcp.
Cline
Use the interface rather than editing files — Cline does not publish the config path for the VS Code extension, and it varies by VS Code flavour.
Open the Cline panel, click the MCP Servers icon in the top toolbar, choose the Remote Servers tab, and fill in:
- Server Name: functionize
- Server URL:
https://mcp.functionize.com/mcp - Transport Type: Streamable HTTP
If you do edit the JSON directly, through the Configure tab:
{
"mcpServers": {
"functionize": {
"type": "streamableHttp",
"url": "https://mcp.functionize.com/mcp",
"headers": {
"X-Functionize-Team-Id": "12345"
},
"disabled": false,
"autoApprove": []
}
}
}
"type": "streamableHttp" is not optional here. Cline defaults to
legacy SSE when the type is missing, for backwards compatibility. A snippet copied from another
tool — where no type key is needed — will silently connect the wrong way.
On OAuth: Cline's documentation covers static headers only and does not describe an OAuth flow, although its changelog suggests one exists. Try the native configuration first. If sign-in never happens, use the bridge described at the end of this article.
Zed
Zed calls MCP servers "context servers", and they live in your settings file rather than a dedicated one.
| macOS and Linux | ~/.config/zed/settings.json |
| Windows | %APPDATA%\Zed\settings.json |
On macOS that is ~/.config/zed/, not Application Support — which surprises
people. The safest route is the zed: open settings file command, or
Settings → AI → MCP Servers → Add Server → Add Remote Server.
{
"context_servers": {
"functionize": {
"url": "https://mcp.functionize.com/mcp"
}
}
}
The top-level key is context_servers, not
mcpServers. There is no type or transport field.
Zed's OAuth behaviour is worth understanding: when a remote server has no
Authorization header configured, Zed prompts you to authenticate using the standard
MCP OAuth flow. Setting an Authorization header suppresses that prompt. Our team
header is X-Functionize-Team-Id, not Authorization, so you can add it
without disabling sign-in:
{
"context_servers": {
"functionize": {
"url": "https://mcp.functionize.com/mcp",
"headers": {
"X-Functionize-Team-Id": "12345"
}
}
}
}
If you see a settings-migration prompt after adding a server with only a url,
update Zed — that was a known bug fixed in September 2026.
JetBrains IDEs
JetBrains ships two different MCP clients, and they behave differently. Check which you are using.
Junie — connects natively
Config file, same on macOS and Windows:
- Project:
.junie/mcp/mcp.jsonin the project root - You, everywhere:
~/.junie/mcp/mcp.json
{
"mcpServers": {
"functionize": {
"url": "https://mcp.functionize.com/mcp",
"headers": {
"X-Functionize-Team-Id": "12345"
}
}
}
}
Servers needing sign-in show as Authorization required. Open the MCP
Installation Assistant, select the server, choose Authorize, and complete the
login in the browser page that opens. The status changes to Active. Manage it
afterwards with the /mcp command.
AI Assistant — needs the bridge
JetBrains AI Assistant does not support OAuth for MCP servers. It is an open, unresolved feature request on their own issue tracker — there is currently no way for it to start an authorization flow or store the resulting token. It therefore needs the bridge below.
Add it through Settings | Tools | AI Assistant | Model Context Protocol (MCP), using the bridged configuration from the last section of this article. Use the Settings screen rather than looking for a file — JetBrains does not document where AI Assistant stores this on either operating system.
Goose
Goose uses YAML, and calls MCP servers "extensions".
| macOS and Linux | ~/.config/goose/config.yaml |
| Windows | %APPDATA%\Block\goose\config\config.yaml |
The easiest route is goose configure → Add Extension →
Remote Extension (Streamable HTTP), then paste the URL. Note that this flow does
not prompt for custom headers, so add those by editing the file afterwards.
extensions:
functionize:
type: streamable_http
name: functionize
enabled: true
uri: "https://mcp.functionize.com/mcp"
headers:
X-Functionize-Team-Id: "12345"
timeout: 300
Note uri, not url, and that timeout is in
seconds — other tools use milliseconds for the same field. SSE is no longer supported by
Goose; streamable_http is correct for our server.
OAuth is native, using a loopback callback on 127.0.0.1 with a random port. If you
ever need that port fixed, set the GOOSE_OAUTH_CALLBACK_PORT environment variable.
The bridge, for anything that cannot do OAuth
If a client only speaks stdio, or cannot complete an OAuth flow, a small program called
mcp-remote runs locally and presents our remote server as a local one. It needs
Node.js 18 or newer.
{
"mcpServers": {
"functionize": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://mcp.functionize.com/mcp",
"--transport", "http-only",
"--header", "X-Functionize-Team-Id:12345"
]
}
}
}
Write the header with no space after the colon. Several clients have a bug where spaces inside arguments are not escaped correctly, and the header is silently dropped. This is the most common bridge failure.
--transport http-only tells the bridge not to waste a round trip probing for SSE,
which our server does not use.
Tokens are cached in ~/.mcp-auth, or
%USERPROFILE%\.mcp-auth on Windows. Deleting that directory forces a fresh sign-in.
Note that it clears cached tokens for every bridged server, not only ours.
To test the bridge outside your editor, which gives much clearer error messages:
npx -p mcp-remote@latest mcp-remote-client https://mcp.functionize.com/mcp
Checking any of them worked
Ask the tool to list your Functionize agent sessions. If your team's sessions come back, you are connected. The list is team-wide, so on a shared team you will see colleagues' sessions too.
One caveat about team pinning
No MCP client vendor documents whether a static custom header is still sent once an OAuth token
is attached. The configuration format supports it everywhere above, but if the pinned team does
not take effect, confirm the connection works without the header first and then raise it with us.
Use list_agent_teams to see which team a connection is actually acting as.