Beta

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:

Terminal
claude mcp add --transport http agentower https://ingest.agentower.com/mcp \
  --header "Authorization: Bearer at_live_your_mcp_key"

Other MCP clients (JSON settings):

MCP 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

ToolArgumentsReturns
agents_needing_someonenoneAgents waiting for a person or that failed, longest wait first
list_agentsstate (starting, working, needs_you, idle, failed), project — both optionalOpen agents across the team
get_agentid — a short ID such as BIL-02, or the name of an open agent such as SarahOne agent
list_datasetsnoneThe datasets this key may export, with their columns
export_datadataset (required), from, to, limit (1–500), offsetRows of one dataset — see Export API
report_statussession_id, event (required); tool, project, reasonRecords a status, like POST /v1/events

Every agent comes back in the same shape:

json
{
  "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.

initialize
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"}}}'
Response · 200
{
  "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."
  }
}
tools/list
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"}'
Response · 200
{
  "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 }
      }
    ]
  }
}
tools/call
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":{}}}'
Response · 200
{
  "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=…" }
      ]
    }
  }
}
report_status
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"}}}'
Response · 200
{ "jsonrpc": "2.0", "id": 4, "result": { "content": [{ "type": "text", "text": "Recorded: hold for session review-bot-17." }] } }

#Errors

WhenAnswer
No key, or not an MCP keyHTTP 401, JSON-RPC error -32001
Body isn't JSON, or over 64 kBHTTP 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 keyHTTP 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
Without a key
curl -X POST "$AGENTOWER_URL/mcp" \
  -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":5,"method":"tools/list"}'
Response · 401
{ "jsonrpc": "2.0", "id": null, "error": { "code": -32001, "message": "Unauthorized: send an Agentower MCP key as Authorization: Bearer at_…" } }