Hezo's MCP server
Hezo ships its own MCP (Model Context Protocol) server. Any MCP-capable agent or client - Claude Code, Cursor, Claude Desktop, your own scripts - can connect to it and manage your Hezo workspace: create and update projects, file and work tasks, post comments, inspect agents, and more.
It's the same interface Hezo's own agents use internally, exposed for you to plug your tools into.
Connection details
- Base URL: your instance's address. Running locally with default settings that's
http://localhost:3100; a deployed instance is its HTTPS URL - its own domain behind the TLS reverse proxy, not necessarily port 3100. (The port Hezo itself listens on is set by--port/HEZO_PORT, default3100.) - Endpoint:
POST <base-url>/mcp - Transport: Streamable HTTP
- Authentication: an
Authorization: Bearer <token>header, where the token is a Hezo API key (it starts withhezo_).
Get an API key
Create an API key under Settings → API keys in the web app. Copy the key when it's
shown - it isn't displayed again. It starts with hezo_ and goes in the
Authorization: Bearer header on every request. An API key has global access:
pass a project slug to project-scoped tools (use list_projects to discover them).
Revoke a key at any time from the same page, which disables it immediately.
Connecting an external agent (self-registration)
Instead of pasting a key, an external agent can self-register and have an admin approve it - useful for agents that connect on their own initiative. Registration is pending and grants no access until a human admin approves it.
The flow:
- Register. Call the
registertool over MCP (no token required), orPOST /api/api-keys/registerwith{ "name": "<your agent>" }. You receive a token, shown once. - Set the token as your
Authorization: Bearer <token>header. - Get approved. A Hezo admin approves the request under Settings → API keys. Until then the token is inert.
- Poll the
connection_statustool (orGET /api/api-keys/statuswith the token) until it returns{ "status": "approved" }. - Use it. The same token now authorizes
POST /mcpwith global access. Pass aprojectslug to project-scoped tools - uselist_projectsto discover them across the whole instance.
An admin can revoke an agent's access at any time from the same page, which disables its token immediately.
Hezo also serves a generated
/SKILL.md(the full, live tool list plus these connection instructions) and a minimal/llms.txtthat points to it - handy for agents that consume the llmstxt.org convention.
Add it to an agent
Claude Code
claude mcp add --transport http hezo http://localhost:3100/mcp \
--header "Authorization: Bearer hezo_your_api_key"Any MCP client (config file)
Most clients (Cursor, Claude Desktop, and others) take an HTTP MCP server as JSON. Point
it at the /mcp endpoint and pass your key in the Authorization header:
{
"mcpServers": {
"hezo": {
"type": "http",
"url": "http://localhost:3100/mcp",
"headers": {
"Authorization": "Bearer hezo_your_api_key"
}
}
}
}If your Hezo runs on a remote server, replace http://localhost:3100 with its HTTPS
base URL - a remote instance sits behind a TLS reverse proxy on its own domain (see
Serve it over HTTPS). The API key travels
in the header, so never call a remote instance over plain HTTP. See
Secure remote access.
What you can do with it
Once connected, your agent can manage work in Hezo the way a teammate would - for example list and create projects, create and update tasks (including their rules and progress summaries), comment on tasks, and inspect the team's agents. The connected client discovers the full, current tool list automatically on connect.
For a complete, tool-by-tool description of every parameter and return value, see the MCP API reference.
File uploads
A binary file (an image, a PDF, …) can't ride inside a JSON-RPC tool call. To upload one,
POST it as multipart/form-data to /mcp/assets with the same Authorization: Bearer
header and a file field. Optional fields:
path- the full destination path (folders + basename, up to two levels, e.g.launch/images/hero.png); its folders are preserved. A folder embedded in the file part'sfilename=is honoured the same way when nopathfield is sent.overwrite-truereplaces an existing asset at the path in place, keeping the reference stable (the same behaviour as re-saving throughwrite_project_asset); otherwise a colliding name is auto-suffixed.project- name the project when you're acting across projects.folder- legacy: place the basename inside a library folder (up to two levels). Ignored whenpathis given.
curl -X POST http://localhost:3100/mcp/assets \
-H "Authorization: Bearer hezo_your_api_key" \
-F file=@diagram.png \
-F path=launch/images/diagram.png \
-F overwrite=trueThe response returns the stored asset (including its byte_size, so you can confirm the
full file landed) and a signed read URL, and the file then shows up in the
list_project_assets and read_project_asset tools under its full path
(launch/images/diagram.png).
Prefer this streaming endpoint for any large binary: base64 in a write_project_asset
call can be silently cut short by a runtime's tool-call argument-size cap. If you do write
a binary through write_project_asset, pass byte_size (the file's exact byte length) so
a truncated content is rejected instead of stored corrupt.