OpenClaw
Connect Runstack MCP in OpenClaw — ~/.openclaw/openclaw.json mcp.servers with Streamable HTTP or stdio, or Control UI Settings → MCP.
Source: https://runstack.engineer/docs/mcp-openclaw
openclaw
OpenClaw is a gateway + agent runtime that consumes MCP servers via mcp.servers in ~/.openclaw/openclaw.json (JSON5, hot-reloaded). Wire it to Runstack's MCP tools at https://app.runstack.engineer/mcp with Authorization: Bearer rnsk_…. Get a key at API Keys.
Add via Control UI (easiest)
- Open Control UI → Settings → MCP → Add server.
- Name:
runstack, Transport: Streamable HTTP (orSSEfallback), URL:https://app.runstack.engineer/mcp. - Expand advanced editor → add header
Authorization: Bearer rnsk_YOUR_API_KEY. - Add server → probe below.
Probe (reachability ≠ saved):
openclaw mcp doctor runstack --probe
# or status only:
openclaw mcp status --verbose
Composer also allows + → Connectors → Add MCP server… (scope: This session vs Everywhere).
Add via CLI
Remote (Streamable HTTP) — recommended:
openclaw mcp add runstack \
--url https://app.runstack.engineer/mcp \
--transport streamable-http \
--header "Authorization: Bearer rnsk_YOUR_API_KEY"
openclaw mcp doctor runstack --probe
Expose only selected tools:
openclaw mcp add runstack --url https://app.runstack.engineer/mcp --transport streamable-http --include 'search_tools,execute_tool' --header "Authorization: Bearer rnsk_..."
Local (stdio) — via @rnsk/mcp:
openclaw mcp add runstack --command npx --arg "-y" --arg "@rnsk/mcp" --env RUNSTACK_API_KEY=rnsk_YOUR_API_KEY
Or openclaw mcp add local-tools --command node --arg ./dist/mcp-server.js --cwd /srv/....
Other useful commands: openclaw mcp status|show|probe|login|logout|reload|unset, openclaw mcp login runstack for OAuth servers (not needed for Runstack Bearer).
Manual JSON (direct edit)
~/.openclaw/openclaw.json (JSON5, Gateway watches file, hot reload → next turn uses new tools; set OPENCLAW_CONFIG_PATH if outside default):
{
mcp: {
servers: {
runstack: {
url: "https://app.runstack.engineer/mcp",
transport: "streamable-http",
enabled: true,
connectionTimeoutMs: 5000,
requestTimeoutMs: 20000,
headers: {
Authorization: "Bearer rnsk_YOUR_API_KEY"
},
// optional: scoped tool filter
toolFilter: { include: ["search_tools", "check_authentication", "initiate_connection", "execute_tool"] }
}
}
}
}
Stdio variant:
{
mcp: {
servers: {
runstack: {
command: "npx",
args: ["-y", "@rnsk/mcp"],
env: { RUNSTACK_API_KEY: "rnsk_YOUR_API_KEY" },
enabled: true
}
}
}
}
Rules: enabled: false keeps definition without connecting; name __proto__ is reserved; keep credentials out of literals → use secret refs (${VAR} / env:) via Environment variables. Unknown keys or malformed types refuse Gateway startup — run openclaw doctor --fix to repair.
Opposite direction: expose OpenClaw as MCP server
To let external clients (Codex, Claude Code) read/send OpenClaw channel conversations:
openclaw mcp serve # OpenClaw is the MCP server (bridge → Gateway)
This is the reverse of the above (OpenClaw as client registry). Not needed for Runstack consumption.
Troubleshooting
| Symptom | Fix |
|---|---|
| Server saved but no tools | openclaw mcp doctor runstack --probe checks live connection; inspect toolFilter.include/exclude |
| Stdio won't start | Verify command in Gateway env, cwd exists, transport: "stdio" requires non-empty command; bundle-mcp:<name>: prefixes stderr |
| HTTP needs auth | For Runstack Bearer, use headers.Authorization; for OAuth servers use auth: "oauth" + openclaw mcp login … |
| Changes not in active agent | openclaw mcp reload refreshes CLI-process runtimes; remote Gateway needs its own reload/restart |
Verify
In an OpenClaw agent turn: “Use Runstack to search for Gmail tools”. Confirm search_tools is discovered and execute_tool respects workspace auth via check_authentication.