Skip to main content

Official Model Context Protocol (MCP) server for the Omium platform.

Project description

Omium MCP Server

Official Model Context Protocol server for the Omium platform. Packaged as omium-mcp on PyPI and also runnable as a Docker container. Routes all tool calls through Kong using the caller's Omium API key for auth and tenant scoping.

Two transports from one package:

  • stdio (default) — for end-users installing locally via pip/uvx. Zero-config; the API key is read from $OMIUM_API_KEY.
  • Streamable HTTP (omium-mcp serve) — for self-hosted / team deployments. Per-request Authorization: Bearer ... header.

Naming note: the mcp-control-plane component inside Omium-platform/ is a Managed Control Plane (a Go service), unrelated to the Model Context Protocol. This project is the MCP-protocol flavor and lives outside the platform repo.

Quickstart

Get from pip install to a working integration in under 5 minutes.

Prerequisites

  • Python 3.10 or newer (python3 --version on macOS/Linux, python --version on Windows)
  • An Omium API key — copy it from your Omium dashboard

1. Install

macOS / Linux:

python3 -m venv ~/omium
~/omium/bin/pip install --upgrade pip
~/omium/bin/pip install omium-mcp
export PATH="$HOME/omium/bin:$PATH"

Windows (PowerShell):

python -m venv $HOME\omium
& "$HOME\omium\Scripts\pip" install --upgrade pip
& "$HOME\omium\Scripts\pip" install omium-mcp
$env:PATH = "$HOME\omium\Scripts;$env:PATH"

Tip: pip install omium (the SDK) bundles omium-mcp automatically — install either one.

2. Set your API key

macOS / Linux:

read -rs OMIUM_API_KEY && export OMIUM_API_KEY
echo "key length: ${#OMIUM_API_KEY}"   # sanity check; doesn't print the key

Windows (PowerShell):

$secure = Read-Host "OMIUM_API_KEY" -AsSecureString
$env:OMIUM_API_KEY = [System.Net.NetworkCredential]::new("", $secure).Password
"key length: $($env:OMIUM_API_KEY.Length)"

3. Wire it into your AI client

Claude Code

macOS / Linux:

claude mcp add omium omium-mcp --env OMIUM_API_KEY="$OMIUM_API_KEY"
claude mcp list   # should show "omium"

Windows (PowerShell):

claude mcp add omium omium-mcp --env "OMIUM_API_KEY=$env:OMIUM_API_KEY"
claude mcp list

Inside Claude Code, ask: "Show me my Omium workflows and dashboard metrics." Claude will pick the right tool and render the result.

Claude Desktop

Edit your Claude Desktop config:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "omium": {
      "command": "omium-mcp",
      "env": {
        "OMIUM_API_KEY": "omium_..."
      }
    }
  }
}

Replace omium_... with your actual key, then fully restart Claude Desktop.

Cursor

Add an MCP server in Cursor's settings: command omium-mcp, env var OMIUM_API_KEY. Exact UI varies by Cursor version — see Cursor's MCP docs.

Troubleshooting

  • pip install fails with Requires-Python >=3.10 — Python 3.10+ is required because the upstream Anthropic mcp package needs 3.10+. Install via pyenv / uv / your OS package manager.
  • All tool calls return 401OMIUM_API_KEY is wrong or unset. Confirm with echo "len: ${#OMIUM_API_KEY}" (macOS/Linux) — should be > 30.
  • Pointing at a non-prod backend — set OMIUM_API_BASE (e.g. http://localhost:8000) before starting the MCP.
  • AI client doesn't see Omium tools — fully restart the client after editing config (not just close the window).

Self-hosted (Streamable HTTP / Docker)

For team deployments behind a load balancer:

cd /path/to/omium-MCP
docker compose up -d --build

Server listens on http://localhost:9100/mcp. Wire into Claude Code:

claude mcp add --transport http omium http://localhost:9100/mcp \
  --header "Authorization: Bearer omium_YOUR_KEY_HERE"

Tools

The MCP exposes every Kong-reachable Omium endpoint that accepts X-API-Key (~84 tools). JWT-only endpoints (dashboard login/signup, invitations, Slack OAuth, Stripe webhooks) are intentionally excluded — an MCP client only holds an API key. All tools forward the caller's bearer token to Kong as X-API-Key; tenant scope is derived server-side so no tenant_id argument is ever accepted.

The complete client-facing endpoint list is maintained in ../Kong-Client-Facing-APIs.md.

Categories

Category Example tools Upstream service
Identity verify_api_key auth-service
Workflows list_workflows, get_workflows, list_workflow_versions auth-service
Executions list_executions, create_execution, execute_execution, replay_execution, rollback_execution, apply_fix_to_execution, compare_executions, delete_execution, update_execution_status, get_apply_to_repo_payload execution-engine
Checkpoints list_checkpoints, list_all_checkpoints, get_checkpoint, create_checkpoint execution-engine
Failures list_failures, get_failures_stats, get_failures_time_series, create_failure_event execution-engine
Scores create_score, list_scores, get_scores_stats auth-service
Traces ingest_trace, list_traces, get_trace, list_trace_failures, list_trace_projects auth-service
Projects create_project, list_projects, connect_project_git, list_project_files, save_project_file, commit_project_git auth-service
GitHub github_status, github_setup, github_update_repo, github_disconnect, github_create_fix_pr auth-service
Recovery list_recovery_failures, trigger_recovery, create_recovery_command, list_recovery_commands, get_recovery_command, update_recovery_command_status, redeliver_recovery_command recovery-orchestrator
Replay get_replay_state, get_replay_step, get_replay_consensus, get_replay_diff, restart_replay recovery-orchestrator
Analytics get_usage_summary, get_dashboard_metrics, get_recent_activity, get_performance_metrics, get_performance_time_series, get_performance_agents, get_workflow_performance, get_workflow_cost, get_system_metrics analytics-engine
Audit list_audit_logs, search_audit_logs, get_audit_log audit-logger
Billing get_billing_balance, get_billing_usage, create_billing_topup, list_billing_transactions, get_subscription_status, estimate_execution_cost, get_cost_breakdown, get_quotas, get_billing_forecast, get_billing_recommendations, get_cost_analytics, list_billing_alerts, … billing-service

Notable conveniences

  • create_execution auto-fills agent_id as mcp-default-<tenant-slug> when omitted.
  • execute_execution auto-resolves workflow_type and workflow_definition from the execution's workflow_id.
  • Tools that take complex bodies (replay_execution, rollback_execution, apply_fix_to_execution, compare_executions, project/recovery writes, billing checkouts, ingest_trace, audit creation, etc.) accept a pass-through body: dict — the docstring enumerates typical fields. This keeps the MCP layer useful while upstream schemas stabilize.
  • Non-JSON upstream responses are wrapped as {"ok": true, "text": "..."}.
  • On non-2xx upstream responses, tools raise Omium API <METHOD> <path> -> <status>: <body> so the upstream error is visible to the LLM.

Auth model

Both transports populate the same _api_key ContextVar; tools read it and forward the value as X-API-Key to Kong.

Transport How the key is bound
stdio $OMIUM_API_KEY read once at process start (init_from_env)
HTTP Authorization: Bearer ... extracted per request by BearerAuthMiddleware

Missing / non-bearer auth on HTTP returns 401. Missing $OMIUM_API_KEY for stdio raises a clear startup error.

Architecture

  Claude Code / Desktop
        │
        │  stdio (subprocess)  OR  HTTP (Bearer header)
        ▼
  omium-mcp  (package: omium_mcp)
        │  HTTP  (X-API-Key: omium_...)
        ▼
    Kong  (api.omium.ai  or  http://kong:8000 in Docker)
        │
        ▼
  workflow-manager / execution-engine / auth-service / ...

Stop with:

docker compose down

Smoke-test

Reject missing auth:

curl -i http://localhost:9100/mcp
# HTTP/1.1 401 Unauthorized

Full MCP round-trip (uses the Python MCP client from .venv):

python - <<'PY'
import asyncio, json
from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamablehttp_client

KEY = "omium_..."  # any seeded key from .mcp-test-keys.txt

async def main():
    headers = {"Authorization": f"Bearer {KEY}"}
    async with streamablehttp_client("http://localhost:9100/mcp", headers=headers) as (r, w, _):
        async with ClientSession(r, w) as s:
            await s.initialize()
            print([t.name for t in (await s.list_tools()).tools])
            res = await s.call_tool("list_workflows", {})
            print(res.content[0].text[:200])

asyncio.run(main())
PY

Wire into Claude Code

claude mcp add --transport http omium http://localhost:9100/mcp \
  --header "Authorization: Bearer omium_YOUR_KEY_HERE"

Then /mcp in Claude Code lists the server and the two tools are callable.

Wire into Claude Desktop

Edit ~/.config/Claude/claude_desktop_config.json (Linux):

{
  "mcpServers": {
    "omium": {
      "type": "http",
      "url": "http://localhost:9100/mcp",
      "headers": {
        "Authorization": "Bearer omium_YOUR_KEY_HERE"
      }
    }
  }
}

Restart Claude Desktop.

Configuration

Env var Default Purpose
OMIUM_API_KEY Required for stdio transport. Ignored by HTTP (per-request bearer).
OMIUM_API_BASE https://api.omium.ai Upstream Kong base URL. Overridden to http://kong:8000 in Docker.
MCP_HOST 0.0.0.0 Bind address for HTTP transport.
MCP_PORT 9100 Bind port for HTTP transport.

Package layout

omium_mcp/
├── __init__.py
├── config.py          # env vars
├── auth.py            # ContextVar, BearerAuthMiddleware, init_from_env()
├── http.py            # omium_get / omium_post / omium_patch / omium_delete + _parse()
├── tenant.py          # tenant-slug cache (for agent_id defaulting)
├── mcp_instance.py    # FastMCP("omium-mcp") singleton
├── cli.py             # entry point — stdio (default) or `serve` for HTTP
└── tools/             # 14 modules, one per API category
    ├── identity.py
    ├── workflows.py
    ├── executions.py
    ├── checkpoints.py
    ├── failures.py
    ├── scores.py
    ├── traces.py
    ├── projects.py
    ├── github.py
    ├── recovery.py
    ├── replay.py
    ├── analytics.py
    ├── audit.py
    └── billing.py

Adding a new tool

  1. Pick the right omium_mcp/tools/<category>.py (or add a new one and import it from tools/__init__.py).
  2. Write an async def decorated with @mcp.tool(). The docstring becomes the tool description the LLM reads — keep it accurate.
  3. Call the appropriate helper:
    • omium_get(path, params=...) for GET
    • omium_post(path, json_body=..., params=...) for POST
    • omium_patch(path, json_body=..., params=...) for PATCH
    • omium_delete(path) for DELETE (handles 204 No Content)
  4. Rebuild:
    • Docker (HTTP): docker compose up -d --build
    • Local stdio test: .venv/bin/python -m omium_mcp.cli (reads $OMIUM_API_KEY)
  5. Test via the harness: .venv/bin/python scripts/test_all_tools.py.

Publishing to PyPI

.venv/bin/python -m build          # writes dist/omium_mcp-X.Y.Z-py3-none-any.whl + tar.gz
.venv/bin/twine upload dist/*      # needs PyPI credentials

Users can then install with pip install omium-mcp or run without installing via uvx omium-mcp.

Docs

  • docs/transport.md — why this MCP uses HTTP instead of stdio, and what that implies for configuration.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

omium_mcp-0.1.1.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

omium_mcp-0.1.1-py3-none-any.whl (23.5 kB view details)

Uploaded Python 3

File details

Details for the file omium_mcp-0.1.1.tar.gz.

File metadata

  • Download URL: omium_mcp-0.1.1.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for omium_mcp-0.1.1.tar.gz
Algorithm Hash digest
SHA256 87d8c9b2a7914d48f3ceee46a5a29458663d8a5f4924a2662ca2451dab82f83c
MD5 b75b24c8775a385c45b7072ad08677da
BLAKE2b-256 93d35b42c017401f86489082bb2a7296180a3db71564fefe582ae2af37d6fe1d

See more details on using hashes here.

File details

Details for the file omium_mcp-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: omium_mcp-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 23.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for omium_mcp-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0ba8a3ec08d2861613616f6a634c9fcfceb3b075b369b330c46a562d2e9bfb80
MD5 2880cd61b0b4b1c9296b0892cf552c2a
BLAKE2b-256 ba22127e6601f5c708144b8578d9390ce450e6e8b7fca908a8c4cbe177394f83

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page