Passenger

For coding agents

An MCP server that gives your agent a whole C# IDE

Connect Claude Code, Codex, OpenCode or any MCP agent to Passenger, and it works through the IDE, not only your files: it asks the language server rather than guessing from the text, and checks what it changed by building, testing, running and debugging it, as you would.

A coding agent in Passenger's terminal driving the Avalonia app it builds over MCP: it starts the app under the debugger, finds its Water button, clicks it and reads the plants' moisture back, while the Live Visual Tree shows the button it clicked

What it can do

It tries the app it builds

When the program is an Avalonia app, or a WPF app on Windows, the agent sees it as a person testing it would: a picture of each window, the tree of its controls with their text and state, and clicks, typing, keys and scrolling sent to the window, which never takes your focus or moves your pointer. It reads the app's binding errors and can break on a property's change.

It works as you do

It finds where things are declared and used, reads the warnings, renames, fixes and formats code as the IDE does, in C#, Razor, XAML, the web languages and project files alike. It builds, runs and tests, sets breakpoints, steps, reads and changes variables, applies Hot Reload and profiles a run. It searches and replaces across files, commits, resolves conflicts, adds packages and types into the terminal.

Code
Diagnostics, hovers, declarations, usages, hierarchies, rename, code actions, refactorings and formatting, each file through its own language.
Build, run and test
Builds and publishes with their errors, what Problems lists, runs and their output, Hot Reload, and the unit tests listed and run.
Debug and profile
Breakpoints, launch or attach, several sessions, steps, evaluation, values set, the program's console, and a profile's hot spots and memory.
Services
A compose service or an Aspire resource run, debugged, profiled or stopped, its log, its logs and traces, and the containers' actions.
Web apps and data
A web app's routes, its live requests and their SQL, and the EF Core migrations' actions and fixes.
The app
Its windows, controls and their details, pictures, clicks, typing, keys, scrolling and binding errors.
Files, Git and NuGet
Find and Replace in Files, Local History, status, diffs, the log, commits, checkout, stashes, conflicts, and packages searched, installed and removed.
The IDE
Passenger's own windows pictured, any action by its name, the settings, and the terminal.

Your window, or one of its own

--mcp-attach: your window

The agent joins the Passenger window you have open over the folder it works in. Its breakpoints and stops show in your editor, its runs in your Run window, and the status bar names what it is doing. Set it up before Passenger is even running: the agent has its tools from the start, and its first call opens the folder in Passenger, starting it if need be. It never joins a window on another folder.

The window asks before it lets an agent in, through a socket in your own user's folder: Allow, Don't allow, or Always for this folder (or turn on Settings › MCP Server › Enable MCP Server). Either way, the first time an agent uses a tool that changes anything, runs code in a paused program or opens another folder in your window, Passenger asks you. A question nobody answers closes after two minutes, and the agent is told so.

--mcp FOLDER: one of its own

The agent starts a Passenger of its own with no window, over a folder or solution, for work it does alone. It asks nothing, so it suits an agent you leave to work while you're away.

Long calls

A call that takes a while (a build, a test run, a debug session waiting for a stop) tells the agent what it is doing every 10 seconds when the agent asks for progress, so an agent that gives up on a silent call waits on.

For the whole team

A .mcp.json committed to your repository gives everyone who works there with Claude Code Passenger's tools.

Set it up

The quickest way in: Passenger's Settings › MCP Server shows each agent's setup with your copy's own path filled in, each with a Copy button. The agent starts Passenger from where it is installed:

  • macOS/Applications/Passenger.app/Contents/MacOS/Passenger
  • Windows%LOCALAPPDATA%\PassengerIDE\current\Passenger.exe
  • Linux~/.local/bin/passenger

Installed for everyone on Linux, it is /usr/local/bin/passenger. Any other agent that can add an MCP server connects the same way: the command, then --mcp-attach.

Claude Code
claude mcp add passenger -- \
    /Applications/Passenger.app/Contents/MacOS/Passenger \
    --mcp-attach

Or for everyone working in a repository, in its .mcp.json:

{
  "mcpServers": {
    "passenger": {
      "command": "/Applications/Passenger.app/Contents/MacOS/Passenger",
      "args": ["--mcp-attach"]
    }
  }
}
Claude Desktop

In Settings › Developer, choose Edit Config, add Passenger, then restart Claude. Claude Desktop starts it in no folder of yours, so name the one to work in after --mcp-attach:

{
  "mcpServers": {
    "passenger": {
      "command": "/Applications/Passenger.app/Contents/MacOS/Passenger",
      "args": ["--mcp-attach", "/Users/you/src/app"]
    }
  }
}

On Windows the command is Passenger.exe's full path, each \ written \\.

Codex CLI
codex mcp add passenger -- \
    /Applications/Passenger.app/Contents/MacOS/Passenger \
    --mcp-attach

Or in ~/.codex/config.toml:

[mcp_servers.passenger]
command = "/Applications/Passenger.app/Contents/MacOS/Passenger"
args = ["--mcp-attach"]
Codex desktop app

In Settings › MCP servers, choose Add server, name it passenger, choose STDIO, give Passenger's path as the command and --mcp-attach as its argument, then save and choose Restart. The app and the Codex CLI share their settings, so adding it in one adds it to both.

OpenCode

In opencode.json, at your project's root or in ~/.config/opencode/ for every project, with a timeout of 10 minutes on a call:

{
  "mcp": {
    "passenger": {
      "type": "local",
      "command": ["/Applications/Passenger.app/Contents/MacOS/Passenger", "--mcp-attach"],
      "enabled": true,
      "timeout": 600000
    }
  }
}
OpenCode 2

OpenCode 2 lists its servers under mcp.servers. Turn Code Mode off for Passenger, so OpenCode calls its tools itself, and give a call 30 minutes, since OpenCode 2 counts a call's whole time whatever progress it hears:

{
  "mcp": {
    "servers": {
      "passenger": {
        "type": "local",
        "command": ["/Applications/Passenger.app/Contents/MacOS/Passenger", "--mcp-attach"],
        "codemode": false,
        "timeout": { "execution": 1800000 }
      }
    }
  }
}