API reference
MCP server
Ask Agentower from Claude, Cursor or any MCP client — which agents need someone, look one up, export data or report a status.
The Agentower MCP server lets any MCP client ask "which of our agents need someone?", list or look up agents, export your data, and report a status for a tool that has no hooks. It can't approve, deny, reply to or message agents — that stays in the app, behind sign-in. Scope: mcp.
#Set it up
On Keys & connections, open MCP server (the sections there start closed) and create an MCP key. The address is Agentower's address plus /mcp.
Claude Code:
claude mcp add --transport http agentower https://ingest.agentower.com/mcp \
--header "Authorization: Bearer at_live_your_mcp_key"Other MCP clients (JSON settings):
{
"mcpServers": {
"agentower": {
"type": "http",
"url": "https://ingest.agentower.com/mcp",
"headers": { "Authorization": "Bearer at_live_your_mcp_key" }
}
}
}Then ask your assistant something like "Which of our agents need someone?" or "What is BIL-02 doing?".
#Tools
| Tool | Arguments | Returns |
|---|---|---|
agents_needing_someone | none | Agents waiting for a person or that failed, longest wait first |
list_agents | state (starting, working, needs_you, idle, failed), project — both optional | Open agents across the team |
get_agent | id — a short ID such as BIL-02, or the name of an open agent such as Sarah | One agent |
list_datasets | none | The datasets this key may export, with their columns |
export_data | dataset (required), from, to, limit (1–500), offset | Rows of one dataset — see Export API |
report_status | session_id, event (required); tool, project, reason | Records a status, like POST /v1/events |
Every agent comes back in the same shape:
{
"id": "BIL-02",
"name": "Sarah",
"project": "Billing API",
"person": "Maya",
"tool": "claude-code",
"model": "Opus 5.5",
"state": "needs_you",
"reason": "Needs your permission to use Bash",
"guardrail": null,
"minutesInState": 6,
"startedAt": "2026-09-30T08:47:00.000Z",
"tokens": 148000,
"subagents": [],
"link": "https://agentower.com/agents?agent=…"
}Tool results carry the data both as text (pretty-printed JSON, for the model) and as structuredContent (lists come as { "agents": [...] }). export_data and list_datasets follow the role of the key's creator, as the Export API does. The datasets are the same: agents, state_changes, work (the work record) and work_summary (the work record by stream and week) — in both, names, instructions and the agent's summaries only for projects with Work details on that the key's creator may approve — audit, usage_daily, projects, members, guardrails, channels, routines (never the brief), routine_runs, computers and keys (the key's person's own; an owner's key gets everyone's; never the key itself), my_data and plan_accounts (plan limits per account and window: the key's person's own; an owner's key gets everyone's).
Each tools/call counts as one API call, except report_status, which is free like any other way of reporting your agents; initialize, tools/list and notifications are free — see API pricing.
#The protocol
The server speaks MCP over Streamable HTTP, answering each request with a single JSON response (no event stream), and keeps no session between requests. It supports protocol versions 2025-06-18, 2025-03-26 and 2024-11-05. Only POST is accepted; notifications get 202 with no body.
These raw requests are what an MCP client sends for you.
curl -X POST "$AGENTOWER_URL/mcp" \
-H "authorization: Bearer $AGENTOWER_MCP_KEY" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"example","version":"1.0"}}}'{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": { "tools": { "listChanged": false } },
"serverInfo": { "name": "agentower", "title": "Agentower", "version": "0.1.0" },
"instructions": "Agentower shows which of a team's coding agents need someone. Use agents_needing_someone first. For history and reports use list_datasets, then export_data. Read-only apart from report_status; answering agents happens in the Agentower app."
}
}curl -X POST "$AGENTOWER_URL/mcp" \
-H "authorization: Bearer $AGENTOWER_MCP_KEY" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "agents_needing_someone",
"title": "Agents that need someone",
"description": "Agents waiting for a person (a question, a permission, a plan review, a guardrail) or that failed, longest wait first.",
"inputSchema": { "type": "object", "properties": {}, "additionalProperties": false },
"annotations": { "readOnlyHint": true }
}
]
}
}curl -X POST "$AGENTOWER_URL/mcp" \
-H "authorization: Bearer $AGENTOWER_MCP_KEY" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"agents_needing_someone","arguments":{}}}'{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [{ "type": "text", "text": "[\n {\n \"id\": \"BIL-02\", …" }],
"structuredContent": {
"agents": [
{ "id": "BIL-02", "name": "Sarah", "project": "Billing API", "person": "Maya", "tool": "claude-code", "model": "Opus 5.5", "state": "needs_you", "background": false, "reason": "Needs your permission to use Bash", "guardrail": null, "minutesInState": 6, "startedAt": "2026-09-30T08:47:00.000Z", "tokens": 148000, "subagents": [], "link": "https://agentower.com/agents?agent=…" }
]
}
}
}curl -X POST "$AGENTOWER_URL/mcp" \
-H "authorization: Bearer $AGENTOWER_MCP_KEY" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"report_status","arguments":{"session_id":"review-bot-17","tool":"review-bot","project":"docs-site","event":"hold","reason":"Waiting for a review"}}}'{ "jsonrpc": "2.0", "id": 4, "result": { "content": [{ "type": "text", "text": "Recorded: hold for session review-bot-17." }] } }#Errors
| When | Answer |
|---|---|
| No key, or not an MCP key | HTTP 401, JSON-RPC error -32001 |
| Body isn't JSON, or over 64 kB | HTTP 400, -32700 "Parse error" |
| Not a JSON-RPC 2.0 request | -32600 "Invalid request" |
| Unknown method | -32601 "Method not found" |
| Unknown tool | -32602 "Unknown tool" |
| Solo's monthly API calls used up, or the monthly cap on per-call charges reached ($250 by default; Enterprise owners can raise it) | -32002 — upgrade, raise the cap on Enterprise, or wait for the 1st (see API pricing) |
More than 60 tools/call a minute with this key | HTTP 429, -32003 — wait a minute (retry-after: 60) |
| A tool couldn't do it (e.g. no such agent) | A normal result with "isError": true and a message |
curl -X POST "$AGENTOWER_URL/mcp" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":5,"method":"tools/list"}'{ "jsonrpc": "2.0", "id": null, "error": { "code": -32001, "message": "Unauthorized: send an Agentower MCP key as Authorization: Bearer at_…" } }