a2acli a2aproject
winget install --id=a2aproject.a2acli -e Standalone A2A CLI client
winget install --id=a2aproject.a2acli -e Standalone A2A CLI client
a2a-rs is a Rust workspace for the A2A v1 protocol. It includes core protocol
types, async client and server libraries, protobuf definitions, and gRPC
bindings for building interoperable A2A agents and clients.
The workspace supports:
tonicslim_bindings| Crate | Purpose |
|---|---|
a2a | Core A2A types, errors, events, JSON-RPC types, and wire-compatible serde behavior |
a2a-client | Async A2A client with transport abstraction and protocol negotiation from agent cards |
a2a-server | Async server framework with REST and JSON-RPC bindings built on axum |
a2a-pb | Protobuf schema, generated types, ProtoJSON-capable generated types, and native <-> protobuf conversion helpers |
a2a-grpc | gRPC client and server bindings built on tonic |
a2a-slimrpc | SLIMRPC client and server bindings built on slim_bindings |
a2acli | Standalone A2A client CLI, published as a2a-cli, for inspecting agent cards, sending messages, managing tasks, and handling push configs |
examples/helloworld | Minimal runnable example agent |
| Binding | Client | Server |
|---|---|---|
| JSON-RPC | a2a-client | a2a-server |
| HTTP+JSON / REST | a2a-client | a2a-server |
| gRPC | a2a-grpc | a2a-grpc |
| SLIMRPC | a2a-slimrpc | a2a-slimrpc |
The gRPC support uses the schema in a2a-pb/proto/a2a.proto. The REST and
JSON-RPC bindings are intended to stay wire-compatible with other A2A SDKs,
including Go and C# implementations.
rustup toolchain is recommendedjust is optional but useful for common development commandscargo-llvm-cov is optional if you want HTML coverage reportscargo build --workspace
cargo test --workspace
Common project commands are also available through just:
just build
just test
just lint
just fmt-check
just ci
Install cargo-llvm-cov once:
cargo install cargo-llvm-cov
Then run:
just coverage
This writes the HTML report to target/llvm-cov/html/index.html.
The hello world example exposes an echo-style agent over REST and JSON-RPC.
cargo run -p helloworld
When the example starts, the following endpoints are available:
http://localhost:3000/.well-known/agent-card.jsonhttp://localhost:3000/jsonrpchttp://localhost:3000/restThe example does not start a gRPC server, but the a2a-grpc crate provides the
client and server bindings needed to add one.
Pre-built binaries are available for macOS (arm64, x86_64), Linux (x86_64, aarch64), and Windows (x86_64).
macOS — Homebrew:
brew tap a2aproject/a2a-rs https://github.com/a2aproject/a2a-rs
brew trust a2aproject/a2a-rs
brew install a2acli
Linux — install script:
curl -fsSL https://raw.githubusercontent.com/a2aproject/a2a-rs/main/install.sh | bash
Installs to /usr/local/bin as root or ~/.local/bin otherwise. Override with A2A_CLI_INSTALL_DIR.
Windows — WinGet:
winget install a2aproject.a2acli
From source — via crates.io:
cargo install a2a-cli
The workspace includes a standalone CLI client built on a2a-client. It
resolves the public agent card from a base URL, negotiates JSON-RPC or
HTTP+JSON, prints responses as JSON, and manages task push notification
configs.
cargo run --bin a2acli -- card
cargo run --bin a2acli -- send "hello from rust"
cargo run --bin a2acli -- stream "hello from rust"
cargo run --bin a2acli -- list-tasks
cargo run --bin a2acli -- push-config list task-123
By default the CLI targets http://localhost:3000, which matches the bundled
hello world server. Override the target with --base-url https://host for any
compatible A2A server, use --binding jsonrpc or --binding http-json to pin
transport selection, and pass --bearer-token or repeated --header Name:Value
arguments when the server requires authentication.
The crates are published on crates.io. To depend on the latest development version directly from Git:
[dependencies]
a2a = { package = "a2a-lf", git = "https://github.com/a2aproject/a2a-rs.git" }
a2a-client = { package = "a2a-client-lf", git = "https://github.com/a2aproject/a2a-rs.git" }
a2a-server = { package = "a2a-server-lf", git = "https://github.com/a2aproject/a2a-rs.git" }
a2a-pb = { package = "a2a-pb", git = "https://github.com/a2aproject/a2a-rs.git" }
a2a-grpc = { package = "a2a-grpc", git = "https://github.com/a2aproject/a2a-rs.git" }
a2a-slimrpc = { package = "a2a-slimrpc", git = "https://github.com/a2aproject/a2a-rs.git" }
Typical usage is:
a2a for protocol types and serde modelsa2a-client for clients that negotiate REST or JSON-RPC from an agent carda2a-server for agent implementations on axuma2a-grpc when you need gRPC transport supporta2a-slimrpc when you need SLIMRPC transport supporta2a-pb when you need direct access to protobuf messages or conversion helpersa2a/: core protocol cratea2a-client/: client transports and factorya2a-server/: request handler, routers, streaming, and storesa2a-pb/: protobuf schema and conversion layera2a-grpc/: tonic-based bindingsa2a-slimrpc/: SLIMRPC bindingsa2acli/: standalone A2A client CLI and published binary packageexamples/helloworld/: runnable sample agentSee CONTRIBUTING.md for contribution guidelines, SECURITY.md for security
reporting, and CODE_OF_CONDUCT.md for community expectations.
Apache-2.0. See LICENSE.md.