opencode-mcp
An MCP server that enables discovery and interaction with multiple OpenCode instances across different machines using SSH reverse tunnels. It provides tools for listing instances, managing chat sessions, and sending messages to remote coding environments.
README
opencode-mcp
An MCP server that discovers, monitors, and drives multiple OpenCode instances running across personal machines. Uses SSH reverse tunnels through a central relay for discovery and transport. Pluggable transport layer supports future backends (Tailscale, Cloudflare Tunnels, mDNS).
Quick Start (local testing)
# 1. Install
npm install && npm run build
# 2. Start opencode with HTTP side-car (in a separate terminal)
# opencode-connected picks a random port and writes a registration file
ln -s ~/prg/opencode-mcp/scripts/opencode-connected ~/bin/opencode-connected
opencode-connected
# 3. Run with MCP inspector (in another terminal)
npx @modelcontextprotocol/inspector tsx src/index.ts
# Or run directly (stdio MCP server)
node dist/index.js
Both opencode-connected and the MCP server default to /tmp/opencode-relay
for the registry directory — no configuration needed for local testing.
Architecture
┌──────────────────────────────────────────────┐
│ Relay machine (GCE / VPS / etc.) │
│ │
│ mcp-gateway ──── opencode-mcp (stdio) │
│ │ │ │
│ │ reads /tmp/opencode-relay/ │
│ │ or RELAY_REGISTRY_DIR │
│ │ │ │
│ OAuth localhost:10001 ──┐ │
│ front localhost:10002 ──┤ opencode│
│ localhost:10003 ──┘ APIs │
│ │
│ sshd: accepts reverse tunnels │
└──────▲──────────▲───────────▲────────────────┘
│ │ │
ssh -R ssh -R ssh -R
│ │ │
laptop desktop laptop
(oc:4823) (oc:4567) (oc:4901)
The MCP server runs on the same machine that accepts SSH reverse tunnels.
It reads registration JSON files from a directory, health-checks each
registered port on localhost, and creates OpenCode SDK clients for healthy
instances. All OpenCode API calls go through localhost:{tunnel_port}.
OpenCode binds to 127.0.0.1 (default) — the SSH tunnel is the auth
boundary. No passwords needed.
MCP Tools
| Tool | Input | Description |
|---|---|---|
list_instances |
— | List all discovered opencode instances |
refresh_instances |
— | Re-scan registry, health-check, return updated list |
list_sessions |
instance |
List sessions with ID, title, status |
get_session |
instance, session_id, message_limit? |
Session details + last N messages |
create_session |
instance, title? |
Create a new chat session |
send_message |
instance, session_id, message, async? |
Send a prompt (sync or async) |
get_status |
instance |
Status of all sessions (idle/busy/retry) |
abort_session |
instance, session_id |
Abort a running session |
Instance names support fuzzy substring matching (e.g. "laptop" matches
"laptop-myproject"). Session IDs accept prefixes (e.g. "ses_3149").
Environment Variables
MCP server
| Variable | Default | Description |
|---|---|---|
RELAY_REGISTRY_DIR |
/tmp/opencode-relay |
Directory containing registration JSON files |
DISCOVERY_INTERVAL_MS |
30000 |
How often to refresh instance list (ms) |
HEALTH_CHECK_TIMEOUT_MS |
3000 |
Timeout for health-checking each instance (ms) |
TRANSPORT |
local-relay |
Transport backend (local-relay, future: tailscale) |
opencode-connected script
| Variable | Default | Description |
|---|---|---|
RELAY_SSH_CMD |
— | SSH command to reach relay. If unset, local only. |
RELAY_REGISTRY_DIR |
/tmp/opencode-relay |
Registry directory (local or on relay) |
INSTANCE_NAME |
$(hostname)-$(basename $PWD) |
Instance name for registration |
Registration File Format
Each file in RELAY_REGISTRY_DIR is a JSON file named {instance-name}.json:
{
"name": "laptop-myproject",
"hostname": "laptop",
"port": 10042,
"localPort": 4823,
"cwd": "/home/user/projects/myproject",
"connectedAt": "2026-03-14T10:30:00Z"
}
Files are written by opencode-connected (locally or on the relay via SSH).
The MCP server prunes files whose ports fail health checks.
Connecting an OpenCode Instance
Use opencode-connected instead of bare opencode to start the TUI with
an HTTP side-car:
# Install (symlink)
ln -s ~/prg/opencode-mcp/scripts/opencode-connected ~/bin/opencode-connected
# Local only (no tunnel, writes registration to /tmp/opencode-relay/)
opencode-connected
# With relay (set RELAY_SSH_CMD in your shell profile)
export RELAY_SSH_CMD="gcloud compute ssh mcp-gateway --zone=us-central1-a --project=my-project --"
opencode-connected
# Or with direct SSH
export RELAY_SSH_CMD="ssh user@relay.example.com"
opencode-connected
# Pass extra args to opencode (after --)
opencode-connected -- -d
The script:
- Picks a random available local port (4096-5095)
- Starts opencode TUI with
--port(enables HTTP side-car on127.0.0.1) - If
RELAY_SSH_CMDis set: establishes SSH reverse tunnel with auto-retry - Registers the instance (lazily creates the registry directory)
- Cleans up the registration file on exit
Note: opencode without --port does not start an HTTP server.
The --port flag is what enables the HTTP side-car alongside the TUI.
For work machines with different MCP configs, set OPENCODE_CONFIG in your
shell profile — the script does not handle config selection.
Integration with mcp-gateway (Docker)
To add opencode-mcp to an existing mcp-gateway Docker deployment:
1. Install from npm
npx -y opencode-mcp # or add to gateway's SERVERS dict
2. Docker configuration
# docker run additions:
--network=host # reach SSH tunnel ports on host's localhost
-v /tmp/opencode-relay:/tmp/opencode-relay:ro # read registration files
-e RELAY_REGISTRY_DIR=/tmp/opencode-relay
--network=host is required because SSH reverse tunnels bind on the
host's localhost. The container needs to reach those ports directly.
3. MCP server config in mcp-gateway
Add to the gateway's server configuration:
{
"mcpServers": {
"opencode": {
"command": "npx",
"args": ["-y", "opencode-mcp"],
"transport": "stdio",
"env": {
"RELAY_REGISTRY_DIR": "/tmp/opencode-relay"
}
}
}
}
4. Verify
# On a client machine:
export RELAY_SSH_CMD="gcloud compute ssh mcp-gateway --zone=us-central1-a --project=my-project --"
opencode-connected
# From the chat interface, the LLM can now call:
# list_instances → sees the connected instance
# list_sessions → sees its sessions
# send_message → interacts with it
Project Structure
opencode-mcp/
├── src/
│ ├── index.ts # MCP server entry + transport factory
│ ├── types.ts # RegistrationFile, OpenCodeInstance
│ ├── registry.ts # Instance cache + OpenCode SDK client mgmt
│ ├── transport/
│ │ ├── interface.ts # Abstract Transport interface
│ │ └── local-relay.ts # File-based registry + localhost health checks
│ └── tools/
│ ├── instances.ts # list_instances, refresh_instances
│ ├── sessions.ts # list_sessions, get_session, create_session
│ └── messages.ts # send_message, get_status, abort_session
├── scripts/
│ └── opencode-connected # Client: random port + tunnel + exec opencode TUI
├── plans/
│ └── architecture.md # Design doc + future work
├── package.json
├── tsconfig.json
└── .env.example
Development
npm install
npm run dev # run with tsx (no build step)
npm run build # compile TypeScript
npm start # run compiled output
Security
- SSH tunnels: the auth boundary — standard SSH key or gcloud auth
- Tunnel ports: bound to host's localhost only, not externally accessible
- OpenCode binding:
127.0.0.1by default — not network-accessible - MCP transport: stdio (no network exposure); OAuth via mcp-gateway
- Registration files: contain only name, hostname, port, cwd — no credentials
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。