Your AI agents can't talk to each other.
As organizations begin to run a growing roster of AI agents, the need for interoperability continues to grow. One qualifies sales leads. One reconciles invoices. One flags suspicious transactions. Each was built for a single job, often by a different team on a different framework, with its own conventions for messages, tasks, and results. With no common way to communicate between agents, every handoff needs its own hand-built bridge, and each new agent multiplies the bridges you have to build and maintain.
The Agent2Agent (A2A) protocol is an open standard removes that barrier by allowing AI agents from different platforms to securely communicate and collaborate. It lets agents discover one another's capabilities, pass well-defined requests and results back and forth, and cooperate safely using whatever platform each one runs on. For .NET teams, the remaining question is how to adopt it without writing the protocol layer from scratch.
Verified against the A2A-SDK.
DelegateQ is tested against the official Python a2a-sdk[signing] and official JavaScript @a2a-js/sdk in both directions: their client drives DelegateQ agents, their parser validates every wire type DelegateQ emits, and their server hosts agents that the DelegateQ client drives. This ensures compatibility by removing implementation specific errors and proving out interoperability.
1. Discovery
The process begins when a client agent identifies a remote agent capable of handling a specific task. It does this by referencing the agent card, which, outlines capabilities, access requirements, and connection details that allows the client to select an agent based on advertised skills.
2. Authentication and authorisation
Before work begins, the remote agent verifies that the client agent meets its security requirements. A2A supports widely adopted standards such as OAuth 2.0, allowing agents to confirm identity and permissions before exchanging sensitive information.
3. Communication and execution
Once authenticated, agents exchange structured messages within the scope of a task. Some interactions are synchronous and return immediate results while others are asynchronous, using event streams or webhooks to provide updates for longer-running work. Since each task maintains state, both agents retain context across multiple exchanges.
Three transports, one dispatcher.
DeletegateQ supports JSON-RPC 2.0, HTTP+JSON, and gRPC as underlying communication protocols, and all three sit all sit behind a single dispatcher.
Implementation via the single dispatcher method means continuity of the wire format is preserved regardlesss of the transport method.
app.MapA2AJsonRpc(); app.MapA2ARest(); app.MapA2AGrpc();
What you get.
Agent Cards & Signing
Cards signed with ES256 over RFC 8785 canonicalization. JWK Set publishing and jku resolution included.
Task Lifecycle
Full A2A task state machine. Every error code from -32001 through -32009 is implemented.
Streaming
Server-sent events for SendStreamingMessage and SubscribeToTask. No polling required.
Push Notifications
Signed push notifications verifiable by the receiver. Destination policy checked at registration and at delivery.
Storage
In-memory, file-system, and SQLite storage. ListTasks filtering and paging run in SQL with the SQLite provider.
Security
API key, Bearer/OAuth2/OIDC, and mutual TLS for caller authentication. No runtime licence mechanism.
Three Transports
JSON-RPC 2.0, HTTP+JSON, and gRPC behind one dispatcher means continuity via a single wire-format implementation.
Diagnostics
PDBs ship inside the packages. Stack traces carry file names and line numbers with no symbol server.
Sample code that works.
Signed card, discovery endpoint, JSON-RPC endpoint, and a skill.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDelegateQ(options =>
{
options.Card = new AgentCard
{
Name = "greeter",
Description = "Returns a greeting.",
Url = "https://example.com/a2a",
Skills = [new AgentSkill { Id = "greet",
Name = "Greet" }],
};
options.SigningKey = SigningKey.Generate();
});
var app = builder.Build();
app.MapA2ADiscovery(); // GET /.well-known/agent.json
app.MapA2AJsonRpc(); // POST /a2a
app.MapA2ASkill("greet", async (ctx, ct) =>
{
var name = ctx.Message.Parts
.OfType<TextPart>().FirstOrDefault()?.Text
?? "world";
await ctx.ReplyAsync($"Hello, {name}.", ct);
});
await app.RunAsync();Licence terms that make deployment easy.
Per developer
Licences are per named developer. Build systems — CI servers, build agents — are free and unlimited.
Royalty-free redistribution
Built assemblies inside your own product carry no per-copy, per-seat, per-server, per-core, or per-end-user fee.
Perpetual
Versions released while your maintenance was current keep building indefinitely, whether or not you renew.
No runtime mechanism
The licence check runs at build time only. There is no licence server, no activation, or network call that can interfere with a running agent.
Source tier available
A source licence tier is available for customers whose procurement requires source review or escrow.
Digital delivery
Everything you need to get up and running quickly: packages, licence file, setup instructions, and a SHA-256 manifest.
Provenance and trust.
Assemblies are Authenticode-signed, builds are deterministic, and third-party components are disclosed. PDBs ship inside the packages, so stack traces carry file names and line numbers with no symbol server.
Scoped conformance.
Developed and tested for protocol conformance with a published “Verified against” list for each release.
Get set up in minutes.
Included samples let you see and debug working applications to help shorten the learning curve.
Extract the files
The installation file contains the packages, your licence file, setup instructions, and a SHA-256 manifest.
Point a package source at it
Add the extracted folder as a local NuGet source in your nuget.config or IDE settings.
Reference the packages
Add DelegateQ.A2A and whichever host packages you need — AspNetCore, Sqlite, Grpc — to your project.
Common questions.
Request an evaluation of DelegateQ 2.1.0.
Click the button below to request an evaluation.
Request an evaluationPurchase