mentionable.dev

A2A Tool Events Extension v0.1

Status: v0.1 implemented Extension URI: https://mentionable.dev/ns/a2a-tool-events/v0.1 Deprecated alias: https://mentionable.dev/spec/a2a-tool-events/v0.1 (accepted on inbound only during the transition window — see ../wiki/url-scheme.md and issue #503; outbound emit MUST use the canonical /ns/ URI). Last updated: 2026-05-05

1. Purpose

A2A standardizes tasks, messages, artifacts, and structured DataParts. It does not define a first-class wire shape for an agent’s internal tool calls. Mentionable agents still need a common way to surface visible tool execution to clients such as Slack without each client guessing from provider-specific traces.

This extension defines that shape. It uses A2A DataPart as the carrier and AI SDK-style tool event fields as the payload vocabulary.

Agents advertise support with:

{
  "uri": "https://mentionable.dev/ns/a2a-tool-events/v0.1",
  "description": "Visible tool execution events carried as A2A DataParts."
}

inside AgentCard.a2a.capabilities.extensions[].

2. Carrier

Tool events MUST be emitted as A2A DataParts:

{
  "kind": "data",
  "data": {
    "type": "tool-call",
    "toolCallId": "toolu_01",
    "toolName": "execute_graphql",
    "input": { "query": "{ posts { title } }" }
  }
}

Mentionable producers SHOULD NOT use TextPart.metadata for new tool-call payloads. Receivers MAY keep accepting legacy metadata sidecars while older deployments roll forward.

Raw AI SDK line protocols such as 9:{...} and a:{...} are not this extension. Bridges MAY decode those at the edge for compatibility, but they SHOULD normalize to this DataPart shape before forwarding over A2A.

3. Payloads

The canonical payload fields are:

FieldRequiredMeaning
typeyesTool lifecycle event type.
toolCallIdyesStable id for this tool call within the response stream.
toolNamerequired on call/input events, optional on result-only eventsTool name as exposed to the model.
inputoptionalJSON-serializable tool input.
outputoptionalJSON-serializable successful tool output.
erroroptionalTool failure. String or { "message": string }.
durationMsoptionalObserved call duration.
startedAtoptionalISO 8601 start timestamp.

Canonical event types:

TypeNormalized mapping
tool-calltool_call with args = input; no result or error.
tool-resulttool_call with args = input and result = output.
tool-errortool_call with args = input and error.message.

Receivers SHOULD also accept AI SDK aliases:

AliasEquivalent
tool-call-streaming-startin-flight tool_call with empty args.
tool-call-deltain-flight tool_call; input may be partial text.
tool-input-startin-flight tool_call with empty args.
tool-input-deltain-flight tool_call; input may be partial text.
tool-input-availablesame as tool-call.
tool-output-availablesame as tool-result.
tool-output-errorsame as tool-error.

4. Normalized Shape

Mentionable decodes these payloads into the core ToolCallPart:

type ToolCallPart = {
  kind: 'tool_call'
  id: string
  name: string
  args: unknown
  result?: unknown
  error?: { message: string }
  duration_ms?: number
  started_at?: string
}

Streaming receivers merge events by id. A later result event may omit toolName or input; receivers SHOULD preserve the earlier name and args when they already saw them.