octoport

octoport

A self-hosted MCP hub that unifies multiple MCP server configurations behind a single local endpoint, with a web dashboard for management, live tool-call logging, and per-person access tokens.

Category
Visit Server

README

šŸ™ octoport

One local MCP endpoint for every AI coding tool. 8 arms, 1 port.

Your MCP servers are configured in four different places — Claude Code, Cursor, Claude Desktop, Windsurf — each with its own copy of the same JSON, the same API keys, the same drift. octoport is a tiny self-hosted hub that pulls them all behind one endpoint: run one command, and manage everything else from the web dashboard.

Claude Code ─┐
Cursor      ─┼──▶  http://127.0.0.1:6286/mcp  ──▶  all your MCP servers
Windsurf    ā”€ā”˜         (octoport)

Quickstart — one command, then it's all web

npx octoport up --open

The dashboard walks you through the rest:

  1. Import — octoport scans your Claude Code / Claude Desktop / Cursor / Windsurf / VS Code configs and shows every MCP server it found. Pick and import.
  2. Connect — copy one snippet per client (shown in the wizard).
  3. Clean up — remove the now-duplicate direct entries from your client configs. A timestamped backup of every file is written first, and the octoport connection itself is never touched. Restart running clients after.

From then on: add/edit/toggle servers, watch the live tool-call log, create per-person access tokens, and export JSONL — all in the dashboard. New servers propagate to every connected client live (tools/list_changed), no restarts.

Until the npm package is published, run from source: git clone https://github.com/nullarch/octoport && cd octoport && npm install && npm run build && node dist/cli.js up --open

Start at login:

octoport autostart          # launchd (macOS) / systemd --user (Linux)
octoport autostart --remove

Port 6286 is "OCTO" on a phone keypad. Change it with octoport up --port <n>.

What you get

  • One endpoint — N clients Ɨ M servers becomes 1 Ɨ M.
  • Live call log — exactly which tools your agents called, with what, how long it took, and which token (person/machine) made the call. SQLite under the hood, JSONL export.
  • Named access tokens — one per person or machine. Revoking a token kills its live sessions on the spot.
  • Process supervision — stdio servers run as child processes with crash isolation and backoff restart, plus a restart button in the dashboard.
  • Local security by default — 127.0.0.1 binding, Host/Origin validation (DNS-rebinding protection), and a per-install bearer token baked into every connection snippet. The MCP Inspector RCE (CVE-2025-49596) happened because a localhost tool skipped exactly these three.

Remote access (optional, explicit)

octoport never exposes itself beyond loopback unless you say so, twice.

Recommended: Tailscale. Keep the default loopback bind on the machine that runs octoport, or bind the tailnet address; either way nothing touches the public internet:

octoport up --host 100.x.y.z --allow-host hub.tailnet-name.ts.net --behind-proxy

Reverse proxy (Caddy) with a real domain. octoport does not terminate TLS — your proxy does:

# Caddyfile
hub.example.com {
  reverse_proxy 127.0.0.1:6286
}
octoport up --allow-host hub.example.com --behind-proxy

Then connect clients with https://hub.example.com/mcp and a token from the dashboard. Rules enforced at startup: a non-loopback bind refuses to start without at least one --allow-host and --behind-proxy. X-Forwarded-Host is deliberately ignored — the allowlist matches the real Host header.

Small team setup: run octoport on a shared box behind Tailscale, create one named token per teammate in Settings, and the call log becomes a team-level "which agent did what" record.

Honest scope: every token is full-admin. Any token opens the dashboard, reads server configs (including env secrets), and can create or revoke other tokens. Token names exist for log attribution, not access control — hand one out exactly like you'd hand out SSH access to the box.

Commands

Command What it does
octoport up [--open] [--port <n>] [--host <addr>] [--allow-host <h>] [--behind-proxy] Start the hub
octoport autostart [--remove] Start at login (launchd/systemd)
octoport import [--dry-run] CLI import (the wizard does this too)
octoport connect [client] Print connection snippets
octoport logs [--limit <n>] [--jsonl [file]] Inspect or export the call log
octoport token [--rotate] List tokens / rotate the default token

What octoport is not

  • Not an enterprise governance product. No SSO, no SCIM, no compliance claims. It's a personal/small-team tool; the log is yours.
  • Not a context optimizer for Claude Code. Claude Code ships native MCP tool search; octoport doesn't compete with it.
  • Not magic. Tool names are namespaced server__tool (capped at 48 chars with deterministic hashing) and routed through a mapping table — never string-parsed back.

Known limitations (v0.2)

  • Tools only: resources and prompts are not yet aggregated.
  • Legacy bidirectional flows (old-spec sampling/elicitation initiated by a downstream server) fail with a clear error instead of being relayed.
  • autostart requires a permanent install (npm i -g octoport or a repo checkout) — refuses to point launchd at an ephemeral npx cache.
  • Windows: hub works, autostart not yet.

Maintenance firewall

MIT-licensed, provided as is. No support guarantees, no response-time promises, PRs may or may not be merged, and the project may be archived at any time. If it's useful, use it; if you need guarantees, fork it.

Development

npm install
npm test          # 47 tests: unit + E2E (client → hub → fixture stdio server)
npm run build
node dist/cli.js up --open

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured