hatchet-ops-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hatchet-ops-mcpshow me failed runs in the last hour"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hatchet-ops-mcp
A small, read-only MCP server that exposes Hatchet client / REST observability APIs to coding agents — across multiple environments from one process.
Hatchet itself does not ship an official ops MCP. This project is a thin
wrapper around the official Python hatchet-sdk:
each tool call picks an env, resolves that environment's Hatchet JWT from
envs.yaml, uses a cached Hatchet client, and returns the SDK response as
structured MCP output.
The default transport is local stdio (no host / API key). For a shared process on a trusted network, streamable HTTP (and legacy SSE) are also available.
Why this exists
Hatchet's official agent integrations today are mainly docs MCP, CLI skills, and SDK helpers that turn your workflows/tasks into agent tools. None of those is a multi-tenant ops console for listing runs, workers, and queue metrics.
This server fills that gap by mapping read-only hatchet-sdk feature clients
(workflows, runs, workers, metrics, logs, …) to MCP tools, with one
extra capability: explicit env routing so one MCP process can talk to several
Hatchet tenants/instances.
Related MCP server: poly-observability-mcp
Requirements
Python 3.12 or newer
A Hatchet API token (JWT) for each environment you want to query
Docker and Docker Compose (optional, for HTTP deployment)
Setup
git clone <repository-url>
cd hatchet-ops-mcp
cp envs.example.yaml envs.yaml
uv syncEdit envs.yaml. Each environment has its own Hatchet JWT (token). Entries
left as TODO remain visible in list_envs, but cannot be queried until a
token is provided.
envs:
development:
description: "Development"
token: "eyJ..." # Hatchet API JWT for this env
server_url: "http://localhost:8080"
tls_strategy: "none"
production:
description: "Production"
token: "TODO"
server_url: "https://hatchet.example.com"server_url and tls_strategy are optional. When server_url is omitted,
Hatchet resolves it from the JWT.
Note:
envs.yamltokenis the Hatchet credential. The MCP HTTP Bearer key is separate: setHATCHET_OPS_MCP_API_KEY(only needed for streamable-http / sse).
Local use (stdio)
This is the usual path for Cursor / Claude Code on your laptop — no bind address, no API key:
uv run hatchet-ops-mcpSet HATCHET_OPS_MCP_ENVS when the config is outside the current checkout:
HATCHET_OPS_MCP_ENVS=/absolute/path/to/envs.yaml uv run hatchet-ops-mcpMCP client configuration:
{
"mcpServers": {
"hatchet-ops": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/hatchet-ops-mcp",
"run",
"hatchet-ops-mcp"
],
"env": {
"HATCHET_OPS_MCP_ENVS": "/absolute/path/to/hatchet-ops-mcp/envs.yaml"
}
}
}
}Shared HTTP (trusted network)
For one process that several clients hit on a LAN / VPN. Auth is a single shared Bearer API key checked by middleware — not OAuth.
HTTP refuses to start without an API key unless you pass --allow-insecure
(trusted network only). Default bind is 127.0.0.1; only override --host
when something other than this machine must connect (Docker Compose already
sets 0.0.0.0).
export HATCHET_OPS_MCP_API_KEY='replace-with-a-strong-random-value'
uv run hatchet-ops-mcp --transport streamable-http
# optional: --port 8765
# Docker / LAN only: --host 0.0.0.0Endpoints: /mcp (MCP), /health (no auth).
Docker Compose mounts local envs.yaml and binds 0.0.0.0 for you:
export HATCHET_OPS_MCP_API_KEY='replace-with-a-strong-random-value'
docker compose up --buildRemote MCP client example:
{
"mcpServers": {
"hatchet-ops": {
"url": "http://hatchet-ops.internal:8765/mcp",
"headers": {
"Authorization": "Bearer replace-with-the-shared-api-key"
}
}
}
}Environment variable | Purpose |
| Path to |
|
|
| HTTP port (default |
| HTTP bind address (default |
| Shared Bearer key for MCP HTTP (not a Hatchet JWT) |
| Allow HTTP with no API key |
Tools
Tool | Purpose |
| List environment names and configuration status without secrets |
| List workflow definitions (optional |
| Get one workflow definition by ID |
| List recent workflow or task runs (status / name / metadata / worker filters) |
| Get one workflow run (status, tasks; payloads opt-in) |
| Get lifecycle events for one workflow run |
| Get logs for one task or merged logs for a whole workflow run |
| List workers and their status |
| Get one worker by ID |
| Inspect current queue backlog depth |
| Task counts by status over a time window |
| Per-task-name statistics for the tenant |
All tools except list_envs require env.
Debug playbook
Typical failed / stuck run investigation:
list_runswithstatuses,workflow_name(exact name), and/oradditional_metadataget_runfor status and per-task summaries (include_payloads=truefor I/O)get_run_eventsfor QUEUED / STARTED / FAILED / CANCELLED timelineget_run_logswithworkflow_run_idfor merged application logs (newest lines kept)If stuck QUEUED:
list_workers/get_workerFor environment health:
get_queue_metrics,get_task_metrics,get_task_stats
list_runs / get_run omit payloads by default. include_payloads=true on
list_runs also disables minimal_output.
Security
envs.yamlis ignored by Git. Never commit real Hatchet tokens.Prefer stdio on developer machines; treat shared HTTP as an internal service.
HTTP refuses to start without a Bearer API key unless
--allow-insecureis set.Prefer read-only Hatchet tokens when the deployment supports scoped tokens.
Tool results may contain workflow inputs, outputs, errors, or logs. Treat MCP output according to the sensitivity of the underlying environment.
The server intentionally exposes no mutating Hatchet operations.
Development
uv sync
uv run pytest
uv buildLicense
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityCmaintenanceA read-only MCP server for OpenObserve Community Edition that works over the REST API. Provides tools for searching logs, traces, stream schemas, and dashboards - no Enterprise license required.Last updated816GPL 3.0
- Alicense-qualityCmaintenanceUnified MCP server for observability and monitoring, providing tools to query metrics, logs, and traces through Prometheus, Grafana, Loki, and Jaeger.Last updated2Mozilla Public 2.0
- Alicense-qualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.Last updated52MIT
- Alicense-qualityBmaintenanceA read-only MCP server that exposes Quickwit log search and aggregations to LLM clients, enabling natural language log investigation.Last updatedApache 2.0
Related MCP Connectors
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TavenYin/hatchet-ops-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server