Agent-to-Agent (A2A) is a lightweight, extensible protocol and framework for orchestrating tasks and exchanging structured content between autonomous agents using JSON-RPC 2.0.
- a2a-net.Core
 Contains the core abstractions, models, contracts, and data types shared across both clients and servers.
 This package is dependency-free and safe to use in any environment.
- 
a2a-net.Client.Abstractions
 Contains core interfaces and contracts for implementing A2A clients.
- 
a2a-net.Client
 Includes client-side functionality for A2A agent discovery and metadata resolution.
- 
a2a-net.Client.Http
 Implements the HTTP transport forIA2AProtocolClientAllows establishing persistent agent-to-agent communication over HTTP connections.
- 
a2a-net.Client.WebSocket
 Implements the WebSocket transport forIA2AProtocolClientAllows establishing persistent agent-to-agent communication over WebSocket connections.
- 
a2a-net.Server
 Core components for building A2A-compatible agents.
 Includes task execution, state management, event streaming, and runtime integration.
- 
a2a-net.Server.AspNetCore
 ASP.NET Core integration layer that allows hosting A2A endpoints over WebSocket using JSON-RPC.
 Provides middleware, routing, and server bootstrap extensions.
- 
a2a-net.Server.Infrastructure.Abstractions
 Defines abstractions for task persistence, event streaming, and other infrastructure concerns.
 Enables support for custom and pluggable storage/event backends.
- 
a2a-net.Server.Infrastructure.DistributedCache
 Distributed cache–based implementation of A2A task storage usingIDistributedCache.
 Useful for scenarios that require scalable, lightweight task state persistence.
dotnet add package a2a-net.Client
dotnet add package a2a-net.Client.Http
dotnet add package a2a-net.Client.WebSocket
dotnet add package a2a-net.Server.Infrastructure.DistributedCache
dotnet add package a2a-net.Server.AspNetCore
 var discoveryDocument = await httpClient.GetA2ADiscoveryDocumentAsync(new Uri("http://localhost"));services.AddA2ProtocolHttpClient(options => 
{
    options.Endpoint = new("http://localhost/a2a");
});services.AddA2ProtocolWebSocketClient(options => 
{
    options.Endpoint = new("ws://localhost/a2a");
});var request = new SendTaskRequest()
{
    Params = new()
    {
        Message = new()
        {
            Role = MessageRole.User,
            Parts =
            [
                new TextPart("tell me a joke")
            ]
        }
    }
};
var response = await Client.SendTaskAsync(request);services.AddDistributedMemoryCache();
services.AddA2AProtocolServer(builder =>
{
    builder
        .SupportsStreaming()
        .SupportsPushNotifications()
        .SupportsStateTransitionHistory()
        .UseAgentRuntime<MockAgentRuntime>()
        .UseDistributedCacheTaskRepository();
});app.MapA2AAgentHttpEndpoint("/a2a");
app.MapA2AAgentWebSocketEndpoint("/a2a/ws")For a full overview of the A2A protocol, see google.github.io/A2A
Explore sample projects demonstrating how to use the a2a-net solution:
- Semantic Kernel: Demonstrates how to build and host an A2A-compatible agent using Microsoft's Semantic Kernel and OpenAI. Includes both a server that exposes the agent and a client that interacts with it over HTTP using the JSON-RPC protocol.
This project is licensed under the Apache-2.0 License.
Contributions are welcome! Please open issues and PRs to help improve the ecosystem.
See contribution guidelines for more information on how to contribute.