How to Connect to the OmniRoute MCP Server: 3 Transport Methods Explained

You can connect to the OmniRoute MCP server via stdio (local CLI), HTTP SSE (streaming events), or HTTP Stream (request/response) on port 20128 after starting it with omniroute --mcp or by setting OMNIROUTE_MCP_HTTP=true.

The OmniRoute repository (diegosouzapw/OmniRoute) ships a built-in MCP (Multi-tool Control Protocol) server that exposes 87 tools—including memory, skills, provider catalog, routing, compression, and audit capabilities—over multiple transport families. This guide covers how to start the server and connect from Python, Node.js, and custom stdio clients.


Starting the OmniRoute MCP Server

Before connecting, you must start the MCP server using one of two methods.

Method 1: Stdio Transport (Local Desktop Clients)

For AI desktop clients like Claude Desktop, Cursor, or VS Code Copilot that spawn the server as a child process:

omniroute --mcp

This command prints a startup message and runs the proxy core. The server communicates over the stdio pipe, accepting JSON requests via stdin and returning responses via stdout.

Method 2: HTTP Transports (Network Access)

To expose HTTP endpoints for remote or programmatic access:

export OMNIROUTE_MCP_HTTP="true"
export OMNIROUTE_MCP_HTTP_PORT="20128"  # Optional, defaults to 20128

omniroute

This enables both /api/mcp/sse (Server-Sent Events) and /api/mcp/stream (plain JSON stream) on the specified port.


Transport Options and Use Cases

OmniRoute supports three transport families, each suited to different integration patterns:

Transport Best For Endpoint/Command
stdio Desktop AI agents spawning child processes omniroute --mcp
HTTP SSE Browser-based clients, event-driven architectures http://localhost:20128/api/mcp/sse
HTTP Stream CI scripts, Python/Node SDKs, simple HTTP clients http://localhost:20128/api/mcp/stream

All transports share the same tool registry defined in open-sse/mcp-server/server.ts. Scope enforcement, audit logging, and description compression are handled centrally in open-sse/mcp-server/scopeEnforcement.ts and open-sse/mcp-server/httpTransport.ts.


Connecting from Python (Official MCP SDK)

The Python SDK provides the simplest HTTP Stream integration. Install it via pip and instantiate the client with the stream endpoint:


# pip install omniroute-mcp

from omniroute_mcp import MCPClient

# Connect via HTTP Stream for simple request/response

client = MCPClient(base_url="http://localhost:20128/api/mcp/stream")

# List available tools (requires read:tools scope)

resp = client.call("list_tools")
print(resp["tools"])

The SDK automatically injects required headers including mcp-session-id (for audit logging) and Authorization (if OMNIROUTE_MCP_API_KEY is configured).


Connecting from Node.js (HTTP SSE)

For streaming, event-driven tool output, use the SSE endpoint with the eventsource package:

import { EventSource } from "eventsource";

const sse = new EventSource("http://localhost:20128/api/mcp/sse");

// Subscribe to tool-specific events
sse.addEventListener("tool_result", (e) => {
  const data = JSON.parse(e.data);
  console.log("Tool output:", data);
});

// Send requests via the companion HTTP endpoint
await fetch("http://localhost:20128/api/mcp/stream", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    method: "list_cache",
    params: {}
  })
});

SSE delivers incremental tool_result events as the server produces output, making it ideal for long-running operations or real-time monitoring.


Connecting via Stdio (Direct Child Process)

For custom integrations or compatibility with MCP-compatible desktop agents, spawn the process directly and handle JSON lines:

import { spawn } from "node:child_process";
import { createInterface } from "node:readline";

const mcp = spawn("omniroute", ["--mcp"]);

const rl = createInterface({ input: mcp.stdout });
rl.on("line", (line) => {
  // Each line is a JSON-encoded MCP response
  const msg = JSON.parse(line);
  console.log("MCP:", msg);
});

// Send requests via stdin (must end with newline)
mcp.stdin.write(
  JSON.stringify({ method: "list_memory", params: {} }) + "\n"
);

Critical requirement: Every JSON request must terminate with a newline (\n) character. Without this delimiter, the server will hang waiting for input completion.


Authentication and Scope Enforcement

Management-level tools (e.g., write:combos) require authentication and explicit permission scopes.

API Key Configuration

Set the environment variable or pass the Authorization: Bearer <key> header:

export OMNIROUTE_MCP_API_KEY="your-secret-key"

Scope Configuration

Scope enforcement is declarative and configurable via environment variables:

export OMNIROUTE_MCP_ENFORCE_SCOPES="true"  # Enable enforcement

export OMNIROUTE_MCP_SCOPES="read:tools,read:cache,execute:completions"

The open-sse/mcp-server/scopeEnforcement.ts file handles validation against these scopes. Common scopes include read:tools, read:cache, write:combos, and execute:completions.


Troubleshooting Common Connection Issues

Symptom Root Cause Solution
GET /api/mcp/sse returns 404 HTTP transport not enabled Set OMNIROUTE_MCP_HTTP=true before starting
"Missing mcp-session-id header" Client omitted required audit header Add mcp-session-id: <uuid> or use the SDK
"Scope write:combos denied" Insufficient permissions Provide valid API key or expand OMNIROUTE_MCP_SCOPES
Stdio client hangs after request Missing newline terminator Ensure each JSON line ends with \n

Quick Reference: Transport Cheat Sheet

Transport Start Command URL Primary Use
stdio omniroute --mcp Desktop AI agents (Claude Desktop, Cursor)
HTTP SSE OMNIROUTE_MCP_HTTP=true omniroute http://localhost:20128/api/mcp/sse Real-time streaming, browsers
HTTP Stream Same as SSE http://localhost:20128/api/mcp/stream SDKs, scripts, simple HTTP clients

Key Source Files:


Summary

To connect to the OmniRoute MCP server, choose your transport based on your integration needs:

  • Use stdio (omniroute --mcp) for desktop AI agents that spawn the server as a child process
  • Use HTTP SSE (http://localhost:20128/api/mcp/sse) for real-time, event-driven streaming from browsers or Node.js applications
  • Use HTTP Stream (http://localhost:20128/api/mcp/stream) for simple request/response patterns in Python, CI scripts, or HTTP clients

Enable HTTP transports by setting OMNIROUTE_MCP_HTTP=true, configure authentication via OMNIROUTE_MCP_API_KEY, and control access through OMNIROUTE_MCP_SCOPES. All 87 tools are registered in open-sse/mcp-server/server.ts and accessible through any transport once the server is running on port 20128.


Frequently Asked Questions

What is the default port for the OmniRoute MCP server?

The default port is 20128. You can customize it by setting the OMNIROUTE_MCP_HTTP_PORT environment variable before starting the server. Both HTTP SSE and HTTP Stream endpoints are served on this port when OMNIROUTE_MCP_HTTP is enabled.

How do I enable the HTTP transport for the OmniRoute MCP server?

Set the environment variable OMNIROUTE_MCP_HTTP="true" before running the omniroute command. This exposes both /api/mcp/sse and /api/mcp/stream endpoints. Without this variable, the HTTP transport remains disabled and requests to these endpoints will return 404 errors.

Why does my stdio client hang when sending requests?

Stdio transport requires each JSON request to terminate with a newline character (\n). The server in open-sse/mcp-server/server.ts reads lines from stdin, so if your client omits the newline, the server waits indefinitely for the message to complete. Always append \n to your JSON strings when writing to mcp.stdin.

Which tools require an API key and special scopes?

Tools that modify state—such as those requiring write:combos or management-level operations—require both an API key (set via OMNIROUTE_MCP_API_KEY) and explicit scopes in OMNIROUTE_MCP_SCOPES. Read-only operations like list_tools or list_cache typically only need basic read:tools or read:cache scopes. The open-sse/mcp-server/scopeEnforcement.ts file validates these permissions centrally for all transports.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →