Devin was called Windsurf until recently. Same editor, same Cascade agent. Current builds read MCP servers from ~/.config/devin/mcp_config.json; Windsurf-era builds used ~/.codeium/windsurf/mcp_config.json.

Devin's Cascade agent is one of the most aggressive MCP consumers around. It treats every registered tool as fair game during a conversation, which makes ToolPiper a significant capability bump, within Cascade's tool limit. The setup is a single JSON edit.

Why connect Devin to ToolPiper?

Devin's Cascade agent can already edit your codebase. ToolPiper adds the rest of your Mac: screen capture, audio transcription, browser automation, system control, web scraping, local LLM chat. Cascade gets to call any of those during an agent task, all running on your hardware.

The combination is unusually capable. Cascade can write code, then run a browser test against the result through browser_connect and browser_action, read the page with browser_snapshot, and patch the code. End to end in one task without leaving the editor.

How do I add ToolPiper to Devin?

Edit ~/.config/devin/mcp_config.json. Add a toolpiper entry under mcpServers whose serverUrl is ToolPiper's MCP endpoint with a profile, such as http://127.0.0.1:9998/mcp?profile=automation. Restart Devin.

The JSON:

{
  "mcpServers": {
    "toolpiper": {
      "serverUrl": "http://127.0.0.1:9998/mcp?profile=automation"
    }
  }
}

Devin names the field serverUrl for Streamable HTTP servers, not url; the shape is in Devin's MCP documentation. Windsurf-era builds read the same file from ~/.codeium/windsurf/mcp_config.json.

Why the profile in the URL?

Cascade caps the tools it can use at 100 at any given time, counted across every MCP server you register, and ToolPiper advertises more than 420. A profile trims what ToolPiper advertises to a set that fits. Without one, Cascade does not get the whole catalog.

Four profiles exist: inference (core inference only), automation (core, browser and testing), creative (core, video, media and outreach) and full (everything). automation suits most coding work. You can also filter by a single category with ?category=, for example ?category=browser. Leave room for any other MCP servers you use, since Cascade's limit is shared across servers.

Steps:

  1. Locate the config file. ~/.config/devin/mcp_config.json. If it isn't there, create it with the JSON above.
  2. Add the entry. If other MCP servers are already registered, add toolpiper alongside them.
  3. Restart Devin. Quit and relaunch. Devin reads MCP config at startup.

How does Devin decide when to call ToolPiper tools?

Cascade picks tools based on the conversation and the tool descriptions. ToolPiper's tools have descriptive names like browser_snapshot, browser_action, and audio_transcribe that map cleanly to natural-language requests. Cascade rarely needs explicit prompting once the registration is live.

If Cascade is hesitant to call a tool you'd expect it to use, name the tool in your prompt directly: "use browser_snapshot to read the page". After one or two explicit calls, Cascade tends to discover the tool's usefulness for related prompts.

How do I verify Devin sees ToolPiper?

Open Devin's MCP settings (Settings -> MCP). ToolPiper should appear with a connection indicator. Or start a Cascade session and prompt it to do something only ToolPiper can do.

Devin's settings UI lists registered MCP servers with their connection status. Green or check means the handshake worked. Red means Devin couldn't reach the server (usually ToolPiper isn't running).

End-to-end test from Cascade with a free tool: "Check ToolPiper's system status and tell me which models are loaded." If Cascade invokes system_status and reports back, the setup is correct.

Is the connection secured?

There's nothing to paste. Because Devin reaches ToolPiper over loopback, ToolPiper mints a short-lived bearer token at ~/Library/Application Support/ToolPiper/.toolpiper-token (mode 0600, rotated every launch) and trusts the loopback socket directly, so Cascade just connects. Off-machine clients (a LAN device or a PiperMesh peer) must send a scoped Bearer tp_<64 hex> token instead.

Every connected client shows up in ToolPiper's Connected Apps pane, where you can label it, see its tool-access state, and revoke it in one click (revoked rows stay visible, never hidden). A restrict-only tool governance overlay lets you deny specific tools (say system_run_command) for every client or lock the built-in tool marketplace to an allow-list. Today that overlay is per-device and locally edited; the same policy shape is built so an organization can push it later. There's no enterprise admin console yet, but the controls are real now.

What if Devin can't see ToolPiper?

Four checks. ToolPiper is running. JSON is valid. Devin was restarted. The endpoint actually responds. The order matters because each later check assumes the earlier ones passed.

  1. ToolPiper running. Menu bar icon visible, or curl http://127.0.0.1:9998/health returns JSON with "status": "ok".
  2. JSON valid. Validate mcp_config.json through python3 -m json.tool. Trailing commas and stray quotes are the usual culprits.
  3. Devin restarted. Full quit, then relaunch. Window close isn't enough.
  4. Endpoint reachable. curl http://127.0.0.1:9998/mcp. If the response is connection refused, ToolPiper isn't actually running.

If all four pass and Cascade still doesn't see ToolPiper, check Devin's developer console for MCP discovery errors. The settings UI sometimes shows a server as connected before tool discovery completes, which can mask edge cases.

For setup on other editors, see MCP Setup on Mac.