Skip to content

Align JSON-RPC and agent-card parsing with cross-SDK interoperability expectations #18

@muscariello

Description

@muscariello

Summary

CSIT Rust <-> Go interoperability work surfaced two upstream compatibility gaps in a2a-rs that currently require test-side shims to get clean cross-SDK interop.

Context

Observed while implementing agntcy/csit#163 for Rust <-> Go interoperability validation.

Gaps

1. JSON-RPC method name mismatch

The current Rust JSON-RPC transport/router uses dotted method names such as:

  • message.send
  • message.stream
  • tasks.get
  • tasks.list
  • tasks.cancel
  • tasks.resubscribe

The Go SDK currently emits/specifies CamelCase method names such as:

  • SendMessage
  • SendStreamingMessage
  • GetTask
  • ListTasks
  • CancelTask
  • SubscribeToTask

In practice, Go -> Rust JSON-RPC calls fail with method not found unless the Rust side is wrapped in a compatibility shim.

2. Strict agent card parsing

The Rust AgentCard type currently expects a concrete Vec<AgentSkill> for skills, while Go agent cards may serialize skills: null.

That causes strict Rust deserialization of otherwise usable cross-SDK agent cards to fail, even when the Rust client only needs the JSON-RPC interface URL.

Expected behavior

a2a-rs should interoperate cleanly with other A2A SDKs without requiring CSIT-specific protocol shims for basic JSON-RPC and agent-card exchange.

Suggested scope

  • Decide and document the canonical JSON-RPC method names for A2A v1.
  • Update the Rust JSON-RPC server/client edges to support the interoperable method names.
  • If compatibility matters, consider accepting both the existing dotted names and the spec-style CamelCase names.
  • Relax agent card deserialization so skills: null is handled equivalently to an empty list, or otherwise make incoming card parsing tolerant where the field is optional in practice.
  • Add regression coverage for cross-SDK cards and JSON-RPC requests.

Impact

This currently blocks clean Rust <-> Go interoperability without fixture-specific compatibility code, and will likely affect broader multi-SDK CSIT work as more languages are added.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions