Relay
Adds a human-in-the-loop checkpoint to MCP-capable AI coding agents, enabling them to pause and request user feedback before executing actions.
README
<div align="center">
<br/>
<img src="src-tauri/icons/source/relay-icon.svg" alt="Relay" width="120" height="120"/>
Relay
The missing human checkpoint for AI coding agents.
Give your AI agent a "pause & ask" button — review, correct, or enrich every step before it runs.
<p align="center"> <a href="https://github.com/andeya/ide-relay-mcp/releases/latest"><img src="https://img.shields.io/badge/platform-Win%20%7C%20Mac%20%7C%20Linux-888888?style=flat-square" alt="Platform"/></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-6366f1?style=flat-square" alt="License"/></a> <a href="https://tauri.app/"><img src="https://img.shields.io/badge/Tauri-2-24adc8?style=flat-square&logo=tauri&logoColor=white" alt="Tauri 2"/></a> <a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/Rust-MCP%20%2B%20HTTP-000000?style=flat-square&logo=rust&logoColor=white" alt="Rust"/></a> <a href="https://vuejs.org/"><img src="https://img.shields.io/badge/Vue-3-42b883?style=flat-square&logo=vuedotjs&logoColor=white" alt="Vue 3"/></a> </p>
Author: andeya · andeyalee@outlook.com
<br/>
</div>
<p align="center"> <img src="docs/ScreenShot_1.png" alt="Relay MCP hub next to Cursor IDE" width="920" style="max-width:100%; height:auto;" /> </p> <p align="center"><sub><strong>Relay</strong> beside your IDE — the agent pauses, you review & answer, it continues. All in one <code>tools/call</code>.</sub></p>
Why Relay?
AI coding agents are powerful — but blindly autonomous agents are risky and wasteful. Without a checkpoint, agents go on tangents, make mistakes that cascade into multiple correction rounds, and burn through your precious plan quota on wasted requests.
Relay adds a human-in-the-loop (HITL) checkpoint to any MCP-capable agent. The agent calls one tool — relay_interactive_feedback — and blocks until you submit your Answer (text, images, files). The result returns on the same JSON-RPC round trip. You catch issues early, guide accurately, and make every request count — no cloud dashboards, no extra SaaS, just a native desktop window beside your IDE.
Key advantages
| Works with any MCP IDE | First-class support for Cursor, Claude Code, Windsurf, and a generic mode for others. |
| 100% local | All data stays on your machine — loopback HTTP only, zero telemetry, no phone-home. |
| One resident GUI | A single persistent window (not a popup per request) with multi-tab session management. |
| No ARG_MAX limits | retell travels as HTTP JSON body (up to 16 MiB), not shell argv. |
| Session continuity | relay_mcp_session_id links turns into coherent sessions with MM-DD HH:mm:ss tab labels. |
| Rich feedback | Text, screenshots, file attachments — everything the agent needs in one round trip. |
| Save your plan quota | Catch mistakes early and guide precisely — no more wasted correction rounds burning through premium requests. |
Multi-IDE support
Launch Relay and pick your IDE. Each mode unlocks IDE-specific features — one-click MCP injection, tailored rule prompts, and (for Cursor) real-time usage monitoring.
<p align="center"> <img src="docs/ScreenShot_0.png" alt="Relay IDE selection page" width="520" style="max-width:100%; height:auto;" /> </p> <p align="center"><sub>Click a card to enter that IDE mode — all settings, CLI commands, and MCP config adapt automatically.</sub></p>
| IDE | MCP injection | Rule prompts | Usage monitoring |
|---|---|---|---|
| Cursor | ✅ | ✅ | ✅ |
| Claude Code | ✅ | ✅ | — |
| Windsurf | ✅ | — | — |
| Other | manual | — | — |
Quick start
1. Install — Grab the latest release (macOS, Linux, Windows) or build from source.
macOS — Gatekeeper / quarantine: CI-built .app bundles are not Apple-notarized (that requires a paid Developer ID certificate). Downloads from the browser get the com.apple.quarantine attribute, which can trigger “can’t be opened” or “damaged” warnings. Without a paid cert there is no fully automatic fix for all users; options are:
- Recommended: In Finder, Control-click (or right-click) the app → Open and confirm once (stores an exception for that app).
- CLI (one-time): clear quarantine after copying the app to
Applications(adjust the path if yours differs):
xattr -dr com.apple.quarantine "/Applications/Relay.app"
2. Launch & choose IDE — Run relay and click your IDE card, or go directly:
relay gui-cursor # Cursor mode
relay gui-claudecode # Claude Code mode
relay gui-windsurf # Windsurf mode
3. Wire MCP — Point your IDE at the Relay binary. Example for Cursor:
{
"mcpServers": {
"relay-mcp": {
"command": "/path/to/relay",
"args": ["mcp-cursor"],
"autoApprove": ["relay_interactive_feedback"]
}
}
}
Cursor uses
.cursor/mcp.json(per-repo, merged with~/.cursor/mcp.json). For WSL agent + Windowsrelay.exe, add--exe_in_wsl:["mcp-cursor", "--exe_in_wsl"]. See docs/HTTP_IPC.md for details.
Or use Settings → Environment & MCP inside Relay for one-click setup and to copy the MCP JSON directly:
<p align="center"> <img src="docs/ScreenShot_3.png" alt="Relay Settings Environment and MCP" width="440" style="max-width:100%; height:auto;" /> </p> <p align="center"><sub><strong>Settings → Environment & MCP</strong> — PATH detection, one-click MCP injection, copy JSON, pause MCP.</sub></p>
4. Install rule prompts — Go to Settings → Rule prompts and install with one click. This teaches the agent to call relay_interactive_feedback every turn and maintain relay_mcp_session_id.
<p align="center"> <img src="docs/ScreenShot_4.png" alt="Relay Settings Rule prompts" width="440" style="max-width:100%; height:auto;" /> </p> <p align="center"><sub><strong>Settings → Rule prompts</strong> — one-click install into your IDE's rule configuration.</sub></p>
Cursor rule file — One-click install writes relay-interactive-feedback.mdc under user ~/.cursor/rules/ (Windows: %USERPROFILE%\.cursor\rules\). That path is separate from a repo’s .cursor/rules/; copy or symlink there if you only use project rules.
Agent still skips relay_interactive_feedback? Ensure MCP server relay-mcp is enabled; approve the tool when prompted (or set "autoApprove": ["relay_interactive_feedback"]); reload Cursor after editing the rule file on disk. Rule files guide the model — they are not hard guarantees.
Relay human-in-the-loop (end-to-end)
After Quick start steps 2–4, each turn follows this path (transport detail: docs/HTTP_IPC.md; vocabulary: docs/TERMINOLOGY.md):
sequenceDiagram
participant Agent
participant Mcp as relay_mcp-ide
participant Http as GUI_HTTP_127.0.0.1
participant You
Agent->>Mcp: tools/call relay_interactive_feedback (retell, session, commands/skills…)
Mcp->>Http: POST /v1/feedback → request_id
Http->>You: tab shows retell
You->>Http: Answer / dismiss / idle cutoff
Http-->>Mcp: GET …/wait → JSON result
Mcp-->>Agent: same tools/call response
- MCP runs — The IDE launches
relay mcp-<cli_id>(stdio), e.g.mcp-cursor. The matching GUI isrelay gui-<cli_id>(often already open). - Agent calls the tool — Non-empty
retell. New session: omitrelay_mcp_session_id(or empty) and sendcommandsandskills(each may be[]only if the host truly exposes nothing). Continue: pass therelay_mcp_session_idfrom the previous result. - MCP reaches the GUI — Reads
gui_endpoint_<cli_id>.jsonin your Configuration & paths directory (e.g.gui_endpoint_cursor.json), or spawnsrelay gui-<cli_id>and waits ≤ ~45 s. ThenPOST /v1/feedbackand blocks onGET /v1/feedback/wait/:iduntil the tab completes. - You interact — Submit Answer, attach files, dismiss, or let the ~60 min idle cleanup return empty
human(same as dismiss from the agent’s perspective). - Same JSON-RPC returns — Body includes
relay_mcp_session_id,human,cmd_skill_count, optionalattachments. The next turn must send thatrelay_mcp_session_idunless starting a new tab.
Rules vs MCP: Step 4’s rule prompt install writes relay-interactive-feedback.mdc under user ~/.cursor/rules/ (Cursor only). Rules encourage the loop; relay-mcp in MCP settings executes it.
Architecture
flowchart LR
IDE[IDE / Agent] -->|stdio JSON-RPC| MCP["relay mcp-{ide}"]
MCP -->|read or spawn| GUI["relay gui-{ide}"]
MCP <-->|127.0.0.1 Bearer| HTTP[Tauri HTTP API]
HTTP <--> UI[Vue tabs]
UI --- User((You))
MCP -->|JSON result| IDE
relay mcp-{ide}— Stdio MCP server (clap). Handlesinitialize,tools/list,tools/call. Concurrent human rounds on one connection. Optional auto-reply rules.relay/relay gui-<cli_id>— Tauri app + HTTP on127.0.0.1:0. Writesgui_endpoint_<cli_id>.json(e.g.gui_endpoint_cursor.json) with{ port, token, pid }; cleans up on exit.- Bridge — MCP reads the endpoint file; if missing, spawns
gui-{ide}and polls up to ~45 s. ThenPOST /v1/feedback→GET /v1/feedback/wait/:id. The wait resolves on submit, dismiss, supersede, or ~60 min idle.
MCP tool: relay_interactive_feedback
| Argument | Required | Meaning |
|---|---|---|
retell |
yes (non-empty) | This turn's user-visible assistant reply, verbatim. |
relay_mcp_session_id |
if you have one | Continue the same session; returned in the JSON result. |
commands |
new tab: required | Array of IDE commands for slash-completion. [] only if the host truly has none. |
skills |
same as commands | Array of IDE skills. Same merge/dedupe rules. |
Pause MCP (Settings): sentinel <<<RELAY_MCP_PAUSED>>> — do not call again until resumed.
<p align="center"> <img src="docs/ScreenShot_2.png" alt="Relay composer slash menu" width="440" style="max-width:100%; height:auto;" /> </p> <p align="center"><sub><strong>Slash completion</strong> — <code>commands</code> and <code>skills</code> populate the palette with optional category badges.</sub></p>
Features at a glance
- Multi-tab hub — Each request opens or refreshes a tab.
relay_mcp_session_idmerges streams. Labels show MM-DD HH:mm:ss with turn-status color indicators. - Rich composer — Enter to submit, Shift+Enter for newline, ⌘/Ctrl+Enter to submit & close. Paste images, attach files — they appear as
attachmentsin the tool result. - Cursor Usage monitoring — Auto-detect your Cursor token (cross-platform decryption), view plan quotas, request history, and predicted quota exhaustion in a live popover.
- Auto-reply —
auto_reply_oneshot.txt/auto_reply_loop.txtfor instant0|replyresponses without opening the UI. - Local storage —
feedback_log.txt,qa_archive/<session_id>.jsonl, configurable attachment retention (default 30 days). - CLI —
relay feedback --retell "…"prints JSON on stdout;--timeoutfor CI/automation.
<p align="center"> <img src="docs/ScreenShot_5.png" alt="Relay Settings Cache" width="440" style="max-width:100%; height:auto;" /> </p> <p align="center"><sub><strong>Settings → Cache</strong> — attachment + log usage, open folder, auto-clean.</sub></p>
CLI reference
| Command | Role |
|---|---|
relay |
Open IDE selection page |
relay gui-cursor |
Launch GUI in Cursor mode |
relay gui-claudecode |
Launch GUI in Claude Code mode |
relay gui-windsurf |
Launch GUI in Windsurf mode |
relay mcp-cursor |
MCP stdio server for Cursor (what the IDE runs) |
relay mcp-claudecode |
MCP stdio server for Claude Code |
relay mcp-windsurf |
MCP stdio server for Windsurf |
relay feedback --retell "…" |
Terminal tryout; --timeout, --relay-mcp-session-id |
Only one GUI process per IDE mode is allowed; bare relay (no mode) can run multiple instances.
Configuration & paths
Data lives under your OS application-data directory (directories::ProjectDirs → config_dir()):
| OS | Path |
|---|---|
| macOS | ~/Library/Application Support/com.relay.relay-mcp/ |
| Linux | ~/.config/relay-mcp/ |
| Windows | %APPDATA%\relay\relay-mcp\config\ |
Key files: feedback_log.txt, qa_archive/*.jsonl, ui_locale.json, gui_endpoint_<cli_id>.json (e.g. gui_endpoint_cursor.json), relay_gui_<cli_id>_alive.marker, mcp_pause.json, attachment_retention.json, auto_reply_*.txt, legacy gui_endpoint.json when applicable.
Build
npm install
npm run build # Vite frontend
cargo build --manifest-path src-tauri/Cargo.toml --release
npm run tauri build # installers / .app / etc.
Develop:
npm run lint && npm run typecheck
npm run tauri:dev
Icons (from src-tauri/icons/source/relay-icon.svg):
npm run icons:build
CI: lint, typecheck, Vite, cargo fmt, clippy -D warnings, cargo test — see docs/RELEASING.md.
Documentation
| Doc | Content |
|---|---|
| docs/HTTP_IPC.md | HTTP API, timeouts, WSL path rewrite |
| docs/RELAY_MCP_SESSION_ID.md | Session ID & tab labels |
| docs/TERMINOLOGY.md | Vocabulary + binaries / endpoint files |
| docs/RELEASING.md | Releases & CI |
Privacy
Data stays on device. All answers, logs, attachments, and settings are written only under your OS user paths. The GUI and MCP process communicate over 127.0.0.1 — nothing leaves your machine.
No telemetry. Relay ships no analytics SDKs, crash reporters, or remote instrumentation. Local files like feedback_log.txt may contain sensitive content — handle them accordingly.
Acknowledgements
Inspired by interactive-feedback-mcp. Relay replaces per-request subprocess UIs with a resident GUI and a Bearer-authenticated local HTTP layer.
License
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.