DOCS · MCP

Connect an AI agent

Cue speaks the Model Context Protocol. Point an agent at your private endpoint and it gets one tool - request_decision - that blocks until you approve or decline in Cue.

Your endpoint

Every workspace has one MCP endpoint, shared across all your agents. It is the same URL for everyone - your bearer token is what scopes a session to your inbox.

ENDPOINT
https://api.attentioncue.com/mcp

Authentication

The transport is Streamable HTTP (JSON-RPC over POST) authenticated with a bearer token. Mint a token in Settings → API tokens and send it on every request:

HEADER
Authorization: Bearer cue_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Client configuration

Add Cue as an MCP server in your agent or client. Most clients accept a JSON config like this - drop in the endpoint and your token:

mcp.json
{
  "mcpServers": {
    "cue": {
      "url": "https://api.attentioncue.com/mcp",
      "headers": {
        "Authorization": "Bearer cue_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

The request_decision tool

This is the whole point. When your agent reaches a step that needs a human - deleting data, spending money, shipping to production - it calls request_decision. Cue raises a blocking agent request in the chosen stream, notifies you, and parks the call until you decide. The tool then returns approved, declined, or expired as its text content.

INPUTS
titlestringREQUIRED

Short, scannable summary of the decision. This is the headline of the agent request card.

contextstringREQUIRED

What the human needs to know to decide: what, why, and the stakes.

affectedarray

Concrete things this decision touches, as { label, meta? } entries. Rendered as a reviewable list in the detail panel.

streamstring

Slug of the stream (inbox lane) to raise this in. Defaults to "agents" - an agent lane is created if it does not exist yet.

expiresInSecondsnumber

Seconds before the request auto-expires and the tool returns "expired". Defaults to 86400 (24 hours).

Example call

A raw JSON-RPC tool call your client sends to the endpoint:

REQUEST
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "request_decision",
    "arguments": {
      "title": "Delete 4 stale branches?",
      "context": "Found 4 branches with no commits in 3 weeks and no open PRs. main and release/* are protected.",
      "affected": [
        { "label": "feature/old-onboarding", "meta": "no PR · 3 weeks ago" },
        { "label": "fix/legacy-auth", "meta": "no PR · 1 month ago" }
      ],
      "stream": "web-app",
      "expiresInSeconds": 86400
    }
  }
}

The response does not return until you act in Cue. Once you approve, the call resolves:

RESPONSE
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "approved" }]
  }
}

What you see in Cue

Each request_decision call becomes an agent request - a raised card in its stream, marked with the amber needs-you dot. Open it to read the context and the list of affected items, then Approve or Decline. The instant you decide, the agent unblocks and continues. Nothing else in the inbox wears amber, so a glance tells you whether anything is waiting.

To drive the same flow from your own backend instead of an agent client, see the REST API reference.