Before
Credentials live in client configs
API keys and SSH secrets get pasted into every developer's local MCP config, then forgotten.
Self-hosted MCP aggregator
Orcorus puts all of your Model Context Protocol servers behind a single gateway your agents, IDEs, and chat clients can connect to. Each tool runs in an isolated Docker container, every call passes deny-first policies and per-group budgets, and credentials never leave the vault.
The problem with MCP sprawl
MCP made it easy to give models tools. It did nothing to help a team manage them. Orcorus replaces per-user server sprawl with a single governed hub that is shared, observed, and enforced.
Before
API keys and SSH secrets get pasted into every developer's local MCP config, then forgotten.
Before
Once a server is running, every model call can invoke every tool. There is no policy layer.
Before
Tool calls burn compute and third-party quotas with no attribution and no ceiling.
Architecture
Clients speak MCP to Orcorus. Orcorus discovers every tool a user can reach, namespaces it as
integration/tool_name, and routes the call to
the right backend after policy, quota, and budget checks pass.
Platform
Discovery, execution, governance, and a marketplace, shipped as a single FastAPI service you own.
Aggregates a user's own integrations and group-shared integrations into 1 tool list, namespaced and routed to the right backend.
Each template declares an image, tool manifest, environment schema, and transport. Containers launch with memory and CPU limits and network isolation.
JSON policies evaluated by priority with deny-first semantics. Target users or groups, integrations or tools, with time and IP conditions.
Rate limits, daily invocation caps, concurrency ceilings, and spend budgets applied per group and checked on every call.
Credentials live in HashiCorp Vault KV v2. The database stores only the path. Values are resolved and injected at execution time, then gone.
Groups are the unit of control. Member and admin roles, shared integrations, budgets, and quotas all attach to the group.
Browse integration templates, inspect tool manifests, and connect with 1 click. Admins publish and manage templates for the whole org.
Every execution records its cost against a per-invocation plus per-second pricing model, so budgets reflect real usage.
A built-in dashboard for integrations, marketplace, groups, policies, secrets, governance, and administration. No extra frontend to deploy.
Connect
Point any MCP client at the gateway and it sees every tool you are allowed to use. Automation that does not speak MCP can use the REST wrapper instead.
The native protocol: initialize, tools/list, tools/call.
POST /mcp
List and call tools from scripts, CI jobs, and webhooks.
GET /mcp/tools · POST /mcp/tools/call
Legacy transport with keep-alive for older clients.
GET /sse
// Claude Desktop, Claude Code, Cursor, or any MCP client { "mcpServers": { "orcorus": { "url": "https://orcorus.internal/mcp", "headers": { "Authorization": "Bearer <your-token>" } } } } // Every tool you can reach shows up namespaced: // ssh/run_command ping/ping whois/lookup ...
# List every tool the caller is allowed to use $ curl -s https://orcorus.internal/mcp/tools \ -H "Authorization: Bearer $ORCORUS_TOKEN" # Call one. Policy, quota, budget and Vault all run first. $ curl -s -X POST https://orcorus.internal/mcp/tools/call \ -H "Authorization: Bearer $ORCORUS_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"whois/lookup","arguments":{"query":"example.com"}}'
// POST /mcp (MCP streamable HTTP) { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "ping/ping", "arguments": { "host": "10.0.0.1", "count": 3 } } } // Also supported: initialize, tools/list
// Deny-first. Higher priority wins. Conditions are extensible. { "name": "contractors-no-ssh-after-hours", "effect": "deny", "priority": 100, "subjects": { "groups": ["contractors"] }, "resources": { "integrations": ["ssh"] }, "conditions": { "time_range": { "start": "18:00", "end": "08:00" } } }
Execution pipeline
No tool call skips the line. Each step in the orchestrated pipeline can stop the call, and every completed call leaves a cost record behind.
Governance
4 independent controls are enforced on every call. Set them once on a group and every member inherits them.
Concurrent and short-window limits smooth bursts before they reach a backend.
A hard ceiling on calls per group per day. Resets automatically.
Bound the number of containers a group can have running at once.
Daily, weekly, or monthly spend limits checked against the cost model before execution.
Integrations
3 integrations ship with the platform. Any MCP server that can run in a container, or is reachable over HTTP, can be added as a template.
Execute commands on remote hosts over SSH, with keys resolved from Vault.
orcorus-ssh:latest
Check network connectivity and latency to any host from an isolated container.
orcorus-ping:latest
Look up WHOIS records for domains and IP addresses.
orcorus-whois:latest
Declare an image, tools manifest, env schema, and transport. Publish it to the marketplace.
stdio · http · sse
Quick start
Orcorus ships with a Docker Compose file that brings up the gateway, its database, and Vault.
Everything is configured through environment variables prefixed with ORCORUS_.
Docker and Docker Compose are the only prerequisites.
Open the dashboard on port 8000 with the admin credentials from your compose file.
Pick an integration in the marketplace, add its secret to Vault, click Connect.
Create a group, set a budget, and share the integration with your team.
$ git clone https://github.com/ceilingduster/orcorus.git $ cd orcorus $ docker compose up --build -d # run migrations $ docker compose run --rm -e PYTHONPATH=/app orcorus \ alembic upgrade head # dashboard → http://localhost:8000
| Variable | Purpose |
|---|---|
ORCORUS_DATABASE_URL | Async DB URL. SQLite for dev, PostgreSQL for prod. |
ORCORUS_VAULT_ADDR / _TOKEN | Where secrets live. |
ORCORUS_CONTAINER_TIMEOUT | Execution timeout per call. Default 300s. |
ORCORUS_CONTAINER_MEMORY_LIMIT | Per-container memory cap. Default 256m. |
ORCORUS_CONTAINER_CPU_LIMIT | Per-container CPU cap. Default 0.5. |
ORCORUS_DOCKER_NETWORK | Isolated network for tool containers. |
Built on
Get Orcorus
Self-hosted, source available, and free for personal, educational, and non-commercial use. Commercial licenses are available from the author.
Non-Commercial Use License · Copyright © 2026 Ian Redden