a2a-wrapper logoa2a-wrapper
Help & Knowledge Base

Frequently asked questions

Everything people ask about a2a-wrapper, the A2A protocol and MCP, grouped by topic, with authoritative references. Can't find your answer? Search the docs or open an issue on GitHub.

General

What a2a-wrapper is and who it is for.

What is a2a-wrapper?

a2a-wrapper is a set of Node.js packages that expose Claude, OpenAI Codex, GitHub Copilot, OpenCode and Google Antigravity as standalone agents over the open A2A (Agent2Agent) protocol. You write a JSON config file and get a spec-compliant A2A server that any A2A client can discover and call.

How is A2A different from MCP?

MCP standardizes how an AI application connects to external tools, data and workflows. A2A standardizes how independent agents communicate and collaborate as peers. The A2A project describes the two as complementary: MCP gives each agent depth, and A2A gives a system of agents reach.

Do I need to write code to use it?

No. A JSON config file and one command start a server. You only write code to call the agent (any HTTP client works) or if you want to build a new wrapper for another backend.

Who is it for?

Developers who want to combine coding agents into workflows: for example Claude implementing a feature while Codex writes the tests, coordinated by an orchestrator. It is also useful if you already run an A2A orchestrator and want real coding agents as execution nodes.

Is a2a-wrapper affiliated with Anthropic, OpenAI, GitHub or Google?

No. It is an independent open-source project. Claude, Codex, GitHub Copilot and Google Antigravity are products of their respective owners, and you need your own access to each backend you wrap.

What does it cost, and what is the license?

a2a-wrapper is free and MIT licensed. You pay only for whatever backend you connect to, such as your Copilot plan, Anthropic or OpenAI usage, or nothing extra if you use a local model.

Getting started

Installing, running and checking your first agent.

What do I need to get started?

Node.js 20 or newer, and credentials for the backend you want to wrap: a GitHub account with Copilot access for a2a-copilot, an Anthropic key for a2a-claude, an OpenAI key or codex login for a2a-codex, and so on.

How do I install a wrapper?

Install the package globally with npm, for example "npm install -g a2a-copilot", then start it with "a2a-copilot --config ./config.json". You can also run it without installing through npx. The five packages are a2a-copilot, a2a-claude, a2a-codex, a2a-opencode and a2a-antigravity.

How do I check that my agent is running?

Fetch the agent card at /.well-known/agent-card.json, and the health endpoint at /health. If both respond, send a message/send request to /a2a/jsonrpc to get a real answer.

Which wrapper should I start with?

If you have GitHub Copilot, a2a-copilot is the quickest to try. If you want the most capable multi-step coding agent, use a2a-claude. If you want a sandboxed repository agent, use a2a-codex. If you want to choose among many model providers, use a2a-opencode.

Can I try the multi-agent demo without API keys?

Yes. The software-engineering-crew example has a --mock mode that starts stand-in agents, so you can see the planner delegate work without any model calls or credentials.

Protocol and compatibility

Versions, transports, streaming and standards.

Which A2A protocol versions are supported?

A2A v1.0 natively, with backward compatibility for v0.3.x clients. The A2A specification lists 1.0.0 as the latest released version, with 0.3.0 among the earlier ones. The server negotiates per request, so old and new clients both work with no configuration.

Do I have to choose a protocol version?

No. Clients that send the A2A-Version header get the matching shape, and clients that send nothing get a v0.3-style agent card. The protocolVersion field in the config is informational only.

Which transports do the agents speak?

The A2A specification defines JSON-RPC, gRPC and HTTP+JSON/REST protocol bindings. a2a-wrapper agents serve JSON-RPC (at /a2a/jsonrpc) and HTTP+JSON/REST (under /a2a/rest), plus the agent card at /.well-known/agent-card.json.

Does streaming work?

Yes. A2A supports request/response with polling, streaming over Server-Sent Events, and push notifications. a2a-wrapper agents advertise and support streaming: use message/stream for a stream of status updates and artifact chunks, or message/send with blocking enabled to wait for the final result. By default artifacts are buffered into one complete artifact for maximum client compatibility; you can enable incremental chunks if your client supports them.

What states can a task be in?

The specification defines these task states: submitted, working, input-required, auth-required, completed, failed, canceled and rejected (written TASK_STATE_* in v1.0). Completed, failed, canceled and rejected are terminal; input-required and auth-required mean the task is waiting on the caller.

Can agent cards be signed?

Yes, as an opt-in. A2A v1.0 JWS-signed agent cards (RFC 7515) are supported: configure signing with a private key read from an environment variable and the card is signed automatically. Unsigned cards are the default.

Security

Exposing agents safely.

Is it safe to expose an agent on a network?

Not by default. The A2A endpoint has no built-in authentication, the default bind address is 0.0.0.0, and the agents can edit files and run commands. The A2A project says a server must authenticate every request and use HTTPS in production, so bind to 127.0.0.1 for local use, run in a container with a scratch workspace, and put an authenticating, TLS-terminating proxy in front of anything shared.

Does a2a-wrapper provide authentication?

Not for the inbound A2A endpoint today. Outbound calls to other agents and MCP servers support bearer tokens, API keys and custom headers read from environment variables. To protect the endpoint itself, use a reverse proxy or gateway that enforces authentication, as the A2A guidance expects of a production server.

How do I limit what an agent can do?

Use the backend controls: permissionMode in a2a-claude (plan for read-only), sandboxMode in a2a-codex (read-only or workspace-write), Antigravity policies, and a container with a scratch workspace for any wrapper. Avoid bypassPermissions and danger-full-access outside an isolated environment.

Where should I keep API keys?

In environment variables, never in config.json. Config fields that need a secret use ${ENV_VAR} substitution, and unset variables are left visible so a misconfiguration is obvious.

Is prompt injection a risk?

Yes. An agent that reads untrusted files, web pages or issue text can be steered by that content, and with shell access that matters. Do not give an agent with write access untrusted input and anything valuable to damage.

How do I report a vulnerability?

Privately, through GitHub Security Advisories on the repository. Please do not open a public issue for a security problem.

Backends and models

Which agents and models you can use.

Which agents are supported?

GitHub Copilot (a2a-copilot), Claude (a2a-claude), OpenAI Codex (a2a-codex), OpenCode (a2a-opencode) and Google Antigravity (a2a-antigravity). All are built on the shared @a2a-wrapper/core package.

Can I use local or self-hosted models?

Yes. a2a-copilot supports bring-your-own-key providers such as Ollama, vLLM, OpenAI, Anthropic and Azure, and a2a-opencode is multi-provider. The model must support native tool calling; some small local models print tool calls as plain text and will not work.

Can I use Claude through Bedrock or Vertex?

Yes. a2a-claude passes the Bedrock and Vertex authentication environment variables through to the Claude Agent SDK untouched, so set whichever your deployment needs.

Why is a2a-antigravity a Node package that runs Python?

Google Antigravity's SDK is Python. The wrapper keeps the public A2A server in Node, for the same surface as the other wrappers, and runs the SDK in a private managed Python subprocess. Run "a2a-antigravity setup" once to create the Python environment.

I get "Model is not available". What do I do?

The model you configured is not enabled for your account. Set the model to "auto" for a2a-copilot so Copilot chooses one your plan includes, or pick a model your plan has.

Multi-agent workflows

Making agents work together.

Can agents call each other?

Yes, in two ways. An external orchestrator can call several agents, as the crew example does. Or a wrapper agent can declare sub-agents so its own model calls other A2A agents as tools.

How do sub-agents work?

You list remote A2A agents under subAgents in the config. The wrapper starts the a2a-mcp-skillmap bridge as an MCP server, and each remote skill appears to the model as a tool named {name}__{skillId}.

Does it work with LangGraph, Google ADK, CrewAI or Microsoft Agent Framework?

It complements them. Use the framework for orchestration, state and memory, and call the wrappers as A2A execution nodes. Any orchestrator that can make HTTP calls, or that has an A2A client, can drive a wrapper.

Can two agents edit the same repository?

They can, but give each agent its own workspace or branch when they work in parallel to avoid conflicting changes. The crew example uses one shared scratch repository deliberately, because the agents work one after the other.

Running in production

Sessions, Docker, observability and releases.

How do agents remember a conversation?

Each A2A contextId maps to a persistent backend session. Send the same contextId on every message in a conversation. An optional TTL can expire sessions; when one expires the next turn starts fresh.

Can I run the agents in Docker?

Yes. a2a-copilot, a2a-claude, a2a-codex and a2a-opencode ship Dockerfiles, built from the monorepo root. Codex needs extra privileges inside a container for its shell sandbox, and a2a-antigravity has no published image yet.

How do I see what an agent did?

Enable sideband events. Wrappers emit tool calls, reasoning summaries, file changes and usage as A2A trace artifacts, or send them to an HTTP collector or a custom sink such as Kafka.

Can I cancel a running task, and how long can tasks run?

Yes, tasks can be cancelled with tasks/cancel (CancelTask in v1.0), and cancellation is idempotent. The maximum time for one prompt is set with timeouts.prompt in milliseconds; use streaming for long-running work. A2A is designed for tasks that range from quick requests to work that takes hours or days.

What is the difference between stable and canary releases?

Stable releases are reviewed and approved manually and are what npm install gives you. Canary releases are published automatically after every merge to main that passes CI; they are unreviewed and meant for trying a fix early, not for production.

Project and community

Contributing, support and the docs themselves.

How do I contribute?

Read the contributing guide, then open an issue or a pull request on GitHub. Adding a wrapper for a new backend is a well-trodden path because the shared core handles the protocol.

Where do I report a bug or ask a question?

On GitHub: open an issue with the package and version, your Node version, a redacted config and the logs. Discussions are enabled for questions and ideas.

Can my AI assistant read these docs?

Yes. The site publishes llms.txt and llms-full.txt, serves every page as Markdown (append .md or send Accept: text/markdown), and runs a read-only docs MCP server at /mcp with search and page-reading tools.

References

The answers above are based on these primary sources: the A2A project's own specification and documentation, the Linux Foundation and Google announcements, the MCP documentation, and this project's own docs.

This page is also available as Markdown for AI assistants.

On this page