Skip to main content
Mirrors hosts an MCP server, so there’s nothing to install or run yourself. Point any MCP client at the hosted endpoint; on first use the client opens your browser to sign in and approve access (standard MCP OAuth, no API keys to paste).
Use the URL without a trailing slash (…/mcp). It must match the OAuth resource the server advertises, and some clients (Cursor) strip a trailing slash before comparing, so a /mcp/ config fails its token exchange. Both forms are served on the wire, but configure the slashless one.
The server exposes the full Mirrors surface, the same operations as the CLI and the web app, so an AI client never has to touch the UI: list_mirrors / get_schema / get_drift, build_mirror / ingest_mirror, list_tools / get_tool, container_start, add_context / distill_summary, generate_proposal / accept_proposal, and more. This server is for MANAGING mirrors, not for calling their tools. An agent that wants to run against a twin uses the tool plane, which is a different surface for a different job.

How do I connect Claude Code, Cursor, or VS Code?

Point the client at https://api.runmirrors.com/mcp as a streamable-HTTP MCP server, then complete the browser sign-in the client prompts for. Claude Code and Codex take a single terminal command, Cursor takes four lines in ~/.cursor/mcp.json, and VS Code takes code --add-mcp.
Run in your terminal:
Then run /mcpmirrorsAuthenticate via browser.

Does Mirrors work with other MCP clients?

Yes. The server is a standard MCP OAuth remote, so any client that speaks streamable HTTP works (Zed, Warp, Goose, Amp, opencode, Cline, LM Studio, Raycast, Windsurf, …):
For stdio-only clients (e.g. JetBrains AI Assistant), bridge via mcp-remote:

How do I use the MCP server in CI or headless?

Skip the browser flow by sending a key instead: mint a workspace key in the web app (Settings → API keys) and pass it as an Authorization header. Every request is scoped to the authenticated workspace:
Most clients disable the OAuth sign-in fallback the moment headers.Authorization is set, so a placeholder value means the connection fails until you replace it with a real key.