LABSCO SUMMARY
Aggregation plus the two things aggregation usually lacks: sequencing and a schedule.
Combining MCP servers is common; chaining their tools into a named sequence with explicit output mapping is not, and it turns a five-call dance into one tool the model can invoke. The cron mode is the other half — the same chain can run every thirty seconds and push the result to your desktop or a phone, without an agent in the loop at all.
What it is
An MCP launcher and router. It reads a mcp.json in the same shape Cursor uses, connects to the backends listed there over SSE or stdio, and re-exposes the combined tools. On top of that it adds tool chains, a plugin mechanism for tools you write yourself, cron scheduling, and a WebSocket client mode.
What you get
- Several MCP services combined behind one endpoint, with
toolsacting as an allow-list andnamespacesetting the separator that keeps names distinct — an emptytoolsarray means no filtering - Tool chains: a named sequence of steps where each step can take its arguments from an earlier step's output through
outputMappingandfromStep, andoutput.stepspicks which step's result is returned - Custom tools, resources and prompts defined in a JavaScript file loaded with
--mcp-js, exportingconfigureMcp - Scheduled execution with
--cronjob:listToolsandcallTooloperations run once at startup and then on the schedule, with results pushed to a desktop notification, an email, or ntfy - Auto-reload — changes to the file passed as
--mcp-configor--mcp-jsrestart the service so the new config takes effect - WebSocket client mode with
--ws, aimed at connecting your combined MCP services to a WebSocket-enabled service such as xiaozhi.me, with automatic reconnection - A stable library export,
McpRouterServer, so the same routing can be embedded in a Node application instead of run as a CLI - Packaged executables for Windows and macOS if you would rather double-click than install anything
Requirements
Node with npx, or one of the packaged binaries. Run it as npx mcp_exe --mcp-config ./examples/mcp.json (package mcp_exe, 0.12.0). Defaults: port 3000, SSE transport with a GET on / establishing a session and a POST to /sessions?sessionId=... carrying messages; --transport set to stdio switches modes, and --ws takes priority over both. --log-level controls output from TRACE through FATAL. Notification transports need their own settings — email needs to and subject, ntfy needs url, topic, tags and priority, and desktop notifications need a local desktop environment. Licensed MIT.
Setup effort
One command — npx mcp_exe --mcp-config ./examples/mcp.json
USE CASES
Turning a repeated multi-tool dance into one call
Define the steps as a chain, map each step's output into the next one's arguments, and return only the step that matters.
Running several MCP servers behind one client entry
Reuse your existing Cursor-shaped mcp.json and let the router namespace the combined tool names.
Getting a result pushed to you on a schedule
Schedule a callTool operation with cron syntax and route the output to a desktop bubble, an email or ntfy.
Adding a tool that does not exist yet
Write it in a JavaScript config exporting configureMcp; edits reload automatically.
Embedding the router in your own app
Import McpRouterServer, load the config object, and start it with the transport you want.
BEFORE YOU INSTALL
What to know first
Requires
npx on PATH
INSTALLATION
Connect your client
Server setup
Configuration file
{
"mcpServers": {
"mcp_exe": {
"command": "npx",
"args": [
"mcp_exe",
"--transport",
"stdio",
"--mcp-config",
"<YOUR_PATH_TO_MCP>"
]
}
}
}--transport stdio is what lets a client talk to it over stdio (the default is an SSE server on port 3000). <YOUR_PATH_TO_MCP> is the full path of your own mcp.json, in the same format as Cursor's, listing the servers to combine — ./examples/mcp.json in the one-line command is the sample inside the repository.
npx
npx mcp_exe --mcp-config ./examples/mcp.json