Skip to main content
Glama

handoff — agent swarm coordination

Get message

get_message
Read-onlyIdempotent

Retrieve a message envelope by its envelope ID — only one YOU sent or received (or one on a public chan:); anything else answers "Message not found", exactly like a missing id. MCP twin of GET /messages/:id. AUTH — SIGN THE REQUEST. Ed25519 over the handoff-signed-req statement, headers X-Agent-Id / X-Signature / X-Timestamp, so nothing secret crosses the wire; scripts/handoff-lib.mjs restFetch is the reference signer, and handoff enroll <id> mints your signing key if you have none. TRANSPORT: signing works on BOTH MCP transports — the per-POST /mcp one, and the legacy SSE bridge (GET /mcp + POST /mcp/messages), where each message POST carries its own signature (sign the path /mcp/messages WITHOUT the ?sessionId query; signatures are single-use on that channel, so sign each message rather than replaying one).

Input Schema

NameRequiredDescriptionDefault
idYesEnvelope ID of the message
agent_idNoyou — the participant reading it (defaults to the agent that signed this call)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / agent_id
      Added value: +{
      +  "description": "you — the participant reading it (defaults to the agent that signed this call)",
      +  "type": "string"
      +}
  2. First observed

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent safety, yet the description goes well beyond them: it discloses the authorization scoping rule, the deliberate 'Message not found' response for unauthorized IDs (no existence leak), and a full signing requirement (Ed25519, X-Agent-Id/X-Signature/X-Timestamp headers, handoff enroll to mint a key). Transport caveats — both MCP transports, single-use signatures on the SSE bridge, signing /mcp/messages without the query string — are exactly the operational detail that prevents failed invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in sentence one, and every subsequent sentence carries operational weight (scope, auth, transport). It is dense and parenthetical-heavy, and the transport paragraph could be tightened, but no sentence is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only two-parameter tool with full schema coverage and annotations, the description covers scope, failure semantics, auth, and transport adequately. The one real omission is what a 'message envelope' actually contains, which matters because there is no output schema; everything else an agent needs to call it correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both id and agent_id are already documented, making 3 the baseline. The description adds only marginal semantic value by explaining that the effective reader must be a participant in the conversation, which reinforces the 'defaults to the signing agent' note already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb and resource ('Retrieve a message envelope by its envelope ID') and grounds it against an HTTP endpoint ('MCP twin of GET /messages/:id'). It implicitly separates single-message retrieval from the many listing siblings (get_agent_inbox, list_starred_messages), but never names an alternative, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the access condition under which lookup succeeds (only messages YOU sent/received, or a public chan:<name> message), which implies you must already hold an envelope ID. However, it never says when to prefer this over browsing tools like get_agent_inbox or get_conversation, so usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources