Use this skill to delegate work to A2A agents hosted by SAM mesh peers. The
bridge exposes three tools; everything else (auth, routing, the labels
gate) happens inside the local sam-node.
Pick the path that matches the need:
- The tools are not callable yet: Set Up The Bridge.
- Before sending data or files, check what the agent accepts: Check Agent Capabilities.
- The task needs a remote agent to do something: Send A Task.
- A previous send returned a non-terminal state: Poll A Task.
- The conversation with the agent continues: Multi-Turn.
- A call failed: Interpret Errors.
Set Up The Bridge
The bridge is a stdio MCP server that talks to the local sam-node sidecar.
Propose each shell command and let the user approve it before running anything.
- A running, enrolled
sam-nodeis required first. If its sidecar does not answer onhttp://localhost:8080, use thesam-meshskill's bootstrap path before continuing. - Build the bridge (own Go module; the Makefile pins the Go toolchain the
module needs, so a stale system Go still works):
make -C <sam-repo>/cmd/sam-a2a-bridge build - Register it with the harness, passing the sidecar URL and its API token:
claude mcp add sam-a2a-bridge -- <sam-repo>/bin/sam-a2a-bridge -url http://localhost:8080 -token <sidecar-token>(Agent-returned files land in~/.sam/a2a-downloadsby default, auto-created; pass-download-dirto change it — you must create that directory yourself. No auto-cleanup; prune manually.) - Restart the harness session; the three tools appear.
Check Agent Capabilities
get_agent_card(peer, service)
Call this before composing structured data or file attachments to verify what the agent accepts. Returns a trimmed card including:
- Registered skills with examples
default_input_modes— accepted MIME types for structured data (e.g.,application/json)default_output_modes— MIME types the agent can return- Whether the agent supports streaming
Use the capabilities to shape your data (JSON object matching the agent's
input schema) and file_path attachments appropriately.
Send A Task
send_agent_task(peer, service, message?, data?, file_path?, file_name?, required_labels?, context_id?, task_id?)
peeris the provider node's peer ID;serviceis the a2a service name it registered. If unknown, discover them with thesam-nodeMCP tooldiscover_remote_serviceswithtype: a2a, or ask the user.- At least one of
message,data, orfile_pathis required. All are combinable.messageis plain text.datais a JSON object; it becomes a DataPart and routes to the agent's structured-input handler. Checkdefault_input_modesfirst.file_pathattaches a local file (up to 5 MB);file_nameoptionally renames what the agent sees (default: the file's base name).
- The call returns immediately with
{"task_id", "context_id", "state", "text", "data"?, "files"?}— it never blocks on the agent.data(optional) contains structured JSON returned inline.files(optional) is a list of paths where agent-returned files are saved under the download directory.
- Data residency: when the task involves data that must stay in a region or
jurisdiction, set
required_labels(comma-separatedkey=value, e.g.region=eu-west-1). The local node then refuses fail-closed before any data leaves it unless the peer's control-plane-attested labels match. Never drop or weakenrequired_labelsto make a refused call succeed without the user's explicit approval — the refusal is the feature.
Poll A Task
If state is not terminal (completed, failed, canceled, rejected),
poll with get_agent_task(peer, service, task_id) until it is. Space polls a
few seconds apart; agent tasks can be slow. text carries the agent's status
message while running and its answer or artifacts when completed. data and
files appear only when present.
Multi-Turn
- Follow-up question in the same conversation: pass the returned
context_idon the nextsend_agent_task. Without it every message is a cold start. - The task is in state
input-required(the agent asked something): answer by passing BOTHtask_idandcontext_id— that routes the reply into the waiting task so it can finish. Terminal tasks cannot receive messages.
Interpret Errors
403: Required labels not attested by provider— the label gate refused before egress. Expected for non-matching regions; report it to the user, do not retry with weaker labels on your own.400: Invalid X-Sam-Required-Labels header ...— malformed labels; fix thekey=value,key=valuesyntax.404/Service not found— the peer has no a2a service by that name; re-discover or check the name with the user.- Connection refused / timeout — the local sidecar URL or token is wrong, or the node is down; go to Set Up The Bridge.
- Interop note: the remote agent must run a2a-go v2.x; older A2A stacks speak a different JSON-RPC dialect and will not answer.