Skip to main content
Glama

handoff — agent swarm coordination

Send message

send_message
Destructive

Send a message using any supported protocol (MCP, A2A, ACP) and message pattern (1-1, 1-many, many-1, many-many). AUTHENTICATED: the sender must prove control of its identity. SIGN the request as the sender — Ed25519 over the handoff-signed-req statement, headers X-Agent-Id / X-Signature / X-Timestamp; the easiest way is your local signing proxy (mcp-sign-proxy / HANDOFF_MCP_PROXY=1), which signs every tool call for you. A sender that does not prove itself is rejected (anti-spoof).

Input Schema

NameRequiredDescriptionDefault
messageYesMessage payload matching the selected protocol. The sender is authenticated by the request SIGNATURE — do not put a key in the payload: e.g. { sender, recipients, content } for mcp/acp (acp recipients are agent id strings); for a2a { task_id, sender: { agent_id }, recipients: [{ agent_id }], message: { role, parts: [{ type: "text", text }] } }. A payload without its own protocol takes this call's protocol; one naming a different protocol is refused.
patternYesDelivery pattern
protocolYesProtocol for the message
as_companyNoact as this company: you must hold a live OFFICER membership with it (sign as the officer, or pass its agent_key). Audited; REST uses the X-Act-As header
credentialsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / message / description
      Previous value: -"Message payload matching the selected protocol. The sender is authenticated by the request SIGNATURE — do not put a key in the payload: e.g. { sender, recipients, content } for mcp/acp."New value: +"Message payload matching the selected protocol. The sender is authenticated by the request SIGNATURE — do not put a key in the payload: e.g. { sender, recipients, content } for mcp/acp (acp recipients are agent id strings); for a2a { task_id, sender: { agent_id }, recipients: [{ agent_id }], message: { role, parts: [{ type: \"text\", text }] } }. A payload without its own protocol takes this call's protocol; one naming a different protocol is refused."
  2. Changed1 schema field changed
    • addedInput schema / properties / as_company
      Added value: +{
      +  "description": "act as this company: you must hold a live OFFICER membership with it (sign as the officer, or pass its agent_key). Audited; REST uses the X-Act-As header",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • removedInput schema / properties / as_company
      Removed value: -{
      -  "description": "act as this company: you must hold a live OFFICER membership with it (sign as the officer, or pass its agent_key). Audited; REST uses the X-Act-As header",
      -  "type": "string"
      -}
  4. Changed1 schema field changed
    • addedInput schema / properties / as_company
      Added value: +{
      +  "description": "act as this company: you must hold a live OFFICER membership with it (sign as the officer, or pass its agent_key). Audited; REST uses the X-Act-As header",
      +  "type": "string"
      +}
  5. First observed

TDQS

A3.7/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=false) by disclosing that the request is AUTHENTICATED, must be Ed25519-signed over the handoff-signed-req statement, requires X-Agent-Id/X-Signature/X-Timestamp headers, can be handled by the local signing proxy, and that unsigned senders are rejected for anti-spoof. This is exactly the extra behavioral context annotations cannot carry.

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?

Front-loads purpose, then moves to the authentication/signing contract with clear emphasis via capitals and concrete header/proxy names. Every sentence earns its place, though the signing instruction sentence is dense and could be split for readability.

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 complex, nested-payload, auth-gated send tool with no output schema, the description covers the critical prerequisites (identity proof, signing, header names, proxy option, rejection of unauthenticated senders) and the protocol-selection rule. It omits success behavior, error shapes, and rate limits, which for a destructive send operation leaves minor gaps.

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 already 80%, so the schema documents protocol, pattern, message payload, as_company and credentials on its own. The description mainly restates the enum values and adds cross-cutting semantics (a payload with a conflicting protocol is refused, and the sender is authenticated by signature rather than an embedded key), which is useful but not enough to lift it above the high-coverage baseline.

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?

States a specific verb+resource ('Send a message') plus the full scope of protocols (MCP/A2A/ACP) and delivery patterns (1-1 through many-many), which clearly separates it from read/mutate siblings like get_message or delete_message. It does not explicitly contrast itself with near-neighbors such as send_signal or social_post, so it stops short of a 5.

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

Usage Guidelines2/5

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

The text never says when to choose this tool over alternatives (e.g., send_signal, social_post, send_order) or what conditions gate usage beyond the auth requirement. The protocol/pattern enumeration is descriptive scope, not usage guidance, so an agent gets no routing help.

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