---
title: "Windsurf and the iOS simulator: MCP setup | Mobster"
description: "Windsurf is now Devin Desktop, and its MCP config moved. Add Mobster for Cascade and Devin Local in one file, and let it check your iOS app on a simulator."
canonical: "https://mobster.dev/connectors/windsurf"
last-updated: "2026-10-08"
---

Windsurf is now Devin Desktop, and its MCP config moved. Add Mobster for Cascade and Devin Local in one file, and let it check your iOS app on a simulator.

# Windsurf (Devin Desktop) and the iOS simulator: MCP setup

Windsurf is now Devin Desktop, and its MCP config moved. Add Mobster for Cascade and Devin Local in one file, and let it check your iOS app on a simulator.

## The short version, with Mobster for Mac in Applications

```
devin mcp add -s user mobster -- /Applications/Mobster.app/Contents/MacOS/mobster-agent mcp
```

Config file: ~/.config/devin/mcp_config.json

**Windsurf (Devin Desktop)** by Cognition

Status From Cognition’s docs, read 8 October 2026

Setup One command

Docs [Cognition’s MCP docs](https://docs.devin.ai/desktop/cascade/mcp)

Download for Mac

See pricing

On this page

1. [Install Mobster for Mac](#install-mobster-for-mac)
2. [Add the server](#add-the-server)
3. [Check it’s connected](#check-its-connected)
4. [A first check: a lesson screen](#a-first-check-a-lesson-screen)
5. [Put the rule in AGENTS.md](#put-the-rule-in-agentsmd)
6. [Use a real iPhone](#use-a-real-iphone)
7. [Troubleshooting](#troubleshooting)
8. [Questions](#questions)
9. [Sources](#sources)

*A check file open in a code editor, the coding agent running it through Mobster: verify start, tap Check, verify finish. Failed, 2 of 3 passed. On the iPhone, the app's streak screen still shows 3 days, not 4.*

What Windsurf (Devin Desktop) gets back from mobster verify on your app: the lesson and its “Great job!” pass, but the streak stays at 3, so the check fails.

Windsurf has become Devin Desktop. Its Linux package repositories still say `windsurf`, the package is now `devin-desktop`, the docs moved to docs.devin.ai, and Devin’s MCP docs give a new path for the MCP config file. Whichever agent you use there, Devin Local or the Cascade agent, Mobster gives it the same thing: an iOS app running on a headless simulator Mobster manages, screens read as lists of controls by name, and a verdict of passed or failed from assertions on the accessibility tree. The same server can drive a real iPhone over USB.

You need an Apple silicon Mac with macOS 15 or later and Xcode with an iOS Simulator runtime. A real iPhone also needs Developer Mode and the WebDriverAgent runner, set up in Mobster for Mac ([Device setup](https://docs.mobster.dev/device-setup)).

## Install Mobster for Mac

[Get Mobster for Mac](https://mobster.dev/download), drag it to Applications and open it. Its MCP server is the agent inside the app, so the command every client starts is this path, with `mcp`:

```
/Applications/Mobster.app/Contents/MacOS/mobster-agent
```

The first check creates Mobster’s own simulator, boots it headless and builds WebDriverAgent, once per Xcode version. Mobster never touches your own simulators: each one it creates has a name that starts with “Mobster”.

## Add the server

Devin Desktop has two agents. Devin Local, the default for new tabs, reads its MCP servers from the Devin CLI’s config files. Cascade, now the legacy agent, reads `mcp_config.json`. At user scope they share one file, so this command covers both:

```
devin mcp add -s user mobster -- /Applications/Mobster.app/Contents/MacOS/mobster-agent mcp
```

Without `-s`, `devin mcp add` writes to the project’s `.devin/mcp_config.local.json`, which is git-ignored; `-s project` writes `.devin/mcp_config.json` for the team. The user file is `~/.config/devin/mcp_config.json`, or the same path under `$XDG_CONFIG_HOME` when that is set. To write it by hand, open it from Cascade: the `…` menu at the top right of the Cascade panel, then Open MCP config file.

```
{  "mcpServers": {    "mobster": {      "command": "/Applications/Mobster.app/Contents/MacOS/mobster-agent",      "args": ["mcp"]    }  }}
```

Keep the full path: a desktop app may not see your shell’s `PATH`. Cascade has no MCP marketplace or one-click install, so the file is the way in.

Key-less checks need no key: the agent drives with its own model, and Mobster judges. For Smart, where Mobster runs the steps itself on your OpenAI or Anthropic key, add `"--env-file", "~/.config/mobster/agent.env"` after `"mcp"` in `args`. Mobster expands the `~` itself, and the key never sits in the config.

Devin’s MCP pages don’t state a tool-call timeout. Mobster keeps calls short: each returns within 45 seconds and `wait` within 50. The first simulator boot and Smart runs continue under a `run_id` that the agent polls with `wait`.

## Check it’s connected

```
devin mcp listdevin mcp get mobster
```

Then ask the agent:

```
Call mobster's status tool and tell me what it says.
```

## A first check: a lesson screen

Say your app’s lesson screen has three answers, each with an accessibility identifier: `answer_livre`, `answer_cafe` and `answer_chien`. Start with a launch-only smoke check of that screen: no steps, one expectation.

```
Build my app for the simulator. Launch it with -SkipOnboarding YES, open yourapp://lesson,and verify the answer_cafe button is on screen. No steps.
```

The agent calls `verify_start` with the absolute `app_path`, the launch arguments, the deep link and the expectation, then `verify_finish`:

```
{"tool": "verify_start", "arguments": {  "app_path": "/abs/path/YourApp/.mobster/build/Build/Products/Debug-iphonesimulator/YourApp.app",  "launch_args": ["-SkipOnboarding", "YES"], "open_url": "yourapp://lesson",  "steps": [], "expect": [{"visible": {"id": "answer_cafe"}}]}}{"tool": "verify_finish", "arguments": {"run_id": "…"}}
```

Mobster installs the app, opens the deep link through WebDriverAgent, and decides on one settled read. The next step checks the behaviour as well as the screen: pick the answer, tap Check, tap Continue until the lesson ends, and expect `{"value": {"id": "streak_days"}, "equals": 4}`. When the streak doesn’t go up, it fails with `value id=streak_days == 4 failed: was "3 days"`.

## Put the rule in AGENTS.md

Devin Desktop’s docs treat an `AGENTS.md` at the repository root as an always-on rule for Cascade. Add:

```
## Verifying UI changesAfter you change a screen in this iOS app, verify it before you say it works.1. Build for the simulator:   xcodebuild -scheme <Scheme> -destination 'generic/platform=iOS Simulator' -derivedDataPath .mobster/build CODE_SIGNING_ALLOWED=NO build2. Call mobster's verify_start with app_path set to the absolute path of   .mobster/build/Build/Products/Debug-iphonesimulator/<App>.app, the steps in plain English, and expect:   what must be true when the steps are done.3. Drive with screen, tap, type_text and swipe, then call verify_finish.4. If the verdict is failed, fix the code and verify again. Report the verdict and the report path.
```

## Use a real iPhone

`list_devices` names every device Mobster can use. With a USB iPhone’s name as `device` and no `run_id`, `screen`, `tap`, `type_text`, `swipe`, `alert`, `open_url`, `launch_app` and `home` act on the phone directly. Mobster holds the phone’s lock until `stop` with the `device`, or 90 idle seconds.

Devin Local uses the Devin CLI’s permission modes, which can be scoped to MCP tools. Whatever you allow covers a tool, not a device: allowing `tap` for simulator work allows it on your phone. Keep the server to the phones you choose:

```
"args": ["mcp", "--allow-device", "Test iPhone"]
```

Any other real device is listed as `not_allowed` and refused. `disabledTools` in the server’s entry can remove tools you never want called, such as `install_app`. Mobster’s MCP annotations mark `status`, `screen`, `list_devices`, `wait`, `wait_for`, `read_notifications` and `unlock_status` as read-only, and its instructions tell the agent to ask you before anything that sends, buys, posts or deletes on a real iPhone. A locked phone stops the call at once with “Your iPhone is locked. Unlock it and try again. No action was taken.”

## Troubleshooting

| Symptom | Fix |
|---|---|
| mobster doesn’t appear after you edit a config file | Use the file Devin’s MCP docs name, `~/.config/devin/mcp_config.json`, or add the server with `devin mcp add -s user` |
| Cascade says it has too many tools | Cascade allows 100 tools across all servers. Add the ones you don’t need to `disabledTools` |
| mobster doesn’t start | Use the full path `/Applications/Mobster.app/Contents/MacOS/mobster-agent` in `command`, and check that Mobster is in Applications |
| The first `verify_start` returns `status: "preparing"` | The simulator is booting and WebDriverAgent is building. The agent calls `wait` |
| `couldnt_run`, or no `verify` tool | `reason.fix` in the result says what to do. `status` says why Smart is off |

The [MCP reference](https://docs.mobster.dev/mcp-server) lists every tool and argument.

## Questions

- ### Where is Windsurf's mcp_config.json now?
  Windsurf is now Devin Desktop, and its MCP docs give ~/.config/devin/mcp_config.json on macOS, or the same path under XDG_CONFIG_HOME when that's set. devin mcp add -s user writes that file for you.
- ### Does Mobster count against Cascade's tool limit?
  Yes. Cascade can use at most 100 tools across all servers, and Mobster offers about two dozen. If you hit the limit, list the ones you don't need in the server's disabledTools.
- ### Does the same config work for Devin Local and Cascade?
  Yes, at user scope. devin mcp add -s user writes ~/.config/devin/mcp_config.json, the file Cascade's MCP settings also read. Devin Local is the default agent for new tabs, and Cascade is now the legacy agent.

## Sources

We read each of these on 8 October 2026. Reviewed by Andy Guo on 8 October 2026. Corrections are welcome at the [GitHub repo](https://github.com/RadishSoftware/mobster/issues).

- [Devin docs: Cascade MCP configuration](https://docs.devin.ai/desktop/cascade/mcp)
- [Devin docs: Devin CLI MCP configuration](https://docs.devin.ai/cli/extensibility/mcp/configuration)
- [Devin docs: Devin Local agent](https://docs.devin.ai/desktop/devin-local)
- [Devin docs: install Devin Desktop](https://docs.devin.ai/desktop/getting-started)
- [Devin docs: Devin Desktop FAQ](https://docs.devin.ai/desktop/devin-desktop-faq)
- [Devin docs: AGENTS.md](https://docs.devin.ai/desktop/cascade/agents-md)
- [MCP specification: ToolAnnotations (readOnlyHint)](https://modelcontextprotocol.io/specification/2025-11-25/schema)
- [Mobster docs: MCP server](https://docs.mobster.dev/mcp-server)
- [Mobster docs: device setup](https://docs.mobster.dev/device-setup)

Windsurf (Devin Desktop)’s logo is a trademark of Cognition, shown only to name the product. Mobster isn’t affiliated with or endorsed by Cognition.

## Read next

- [Every MCP tool, in the reference](https://docs.mobster.dev/mcp-server)
- [Getting started with verify](https://docs.mobster.dev/verify)

## Other agents

- [Claude Code](https://mobster.dev/connectors/claude-code)
- [Codex](https://mobster.dev/connectors/codex)
- [Cursor](https://mobster.dev/connectors/cursor)
- [VS Code](https://mobster.dev/connectors/vs-code)
- [Claude Desktop](https://mobster.dev/connectors/claude-desktop)
- [Gemini CLI](https://mobster.dev/connectors/gemini-cli)
- [opencode](https://mobster.dev/connectors/opencode)
