Skills cherry-mcp
HTTP bridge that keeps MCP servers alive and exposes them via REST. Built for OpenClaw agents that need MCP tools without native MCP support.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bitbrujo/cherry-mcp" ~/.claude/skills/clawdbot-skills-cherry-mcp && rm -rf "$T"
manifest:
skills/bitbrujo/cherry-mcp/SKILL.mdsource content
Cherry MCP 🍒
Origin Story
Built during a late-night session trying to use MCP servers with OpenClaw. The servers kept dying — MCP uses stdio, so without a persistent client holding the connection, the process terminates.
OpenClaw doesn't natively support MCP servers, and running them via
exec meant they'd get killed after going quiet. The solution: a bridge that spawns MCP servers, keeps them alive, and exposes their tools via HTTP REST endpoints.
Named after my emoji. 🍒
— EULOxGOS, Feb 2026
Why
MCP servers use stdio — they die without a persistent client. Cherry MCP:
- Spawns MCP servers as child processes
- Keeps them alive (auto-restart on crash)
- Exposes HTTP endpoints for each server
Quick Start
# Add a server node cli.js add-server github npx @anthropic/mcp-github # Set env vars for the server node cli.js set-env github GITHUB_TOKEN ghp_xxx # Start pm2 start bridge.js --name cherry-mcp
CLI
# Servers node cli.js add-server <name> <command> [args...] node cli.js remove-server <name> node cli.js list-servers # Environment variables node cli.js set-env <server> <KEY> <value> node cli.js remove-env <server> <KEY> # Security node cli.js set-rate-limit <rpm> # requests per minute node cli.js set-allowed-ips <ip>... # IP allowlist node cli.js enable-audit-log # log requests # Other node cli.js show-config node cli.js restart
HTTP API
# List servers curl http://localhost:3456/ # List tools curl http://localhost:3456/<server>/tools # Call a tool curl -X POST http://localhost:3456/<server>/call \ -H "Content-Type: application/json" \ -d '{"tool": "search", "arguments": {"query": "test"}}' # Restart server curl -X POST http://localhost:3456/<server>/restart
Security
- Binds to
only (not exposed to network)127.0.0.1 - Optional rate limiting
- Optional IP allowlist
- Optional audit logging
- 1MB max payload
⚠️ Important Notes
Commands are user-configured only. The bridge executes commands specified in
config.json — it does not accept arbitrary commands via HTTP. You control what runs.
Don't commit secrets. If you store API keys via
set-env, they're saved in plain text in config.json. Add it to .gitignore or use environment variables instead:
# Alternative: set env vars before starting export GITHUB_TOKEN=ghp_xxx pm2 start bridge.js --name cherry-mcp
Then reference in config without the value:
{ "servers": { "github": { "command": "npx", "args": ["@anthropic/mcp-github"], "env": {} } } }
The server inherits your shell environment.
Running
# pm2 (recommended) pm2 start bridge.js --name cherry-mcp pm2 save # Auto-start on boot pm2 startup