Skip to content

A2A server ignores the profile's input member, so 3.2 JS clients' requests arrive empty (9.6.1, and next) #1887

Open

Description

@bokelley

Observed

On adcp 9.6.1, the A2A executor reads an invocation DataPart's parameters member only (a2a_server.py, the data.get("parameters", {}) calls in the skill parser and _parse_skill_from_message). A client that follows the AdCP v3 A2A profile sends { "skill": ..., "input": { ... } }, so the task handler receives {}.

@adcp/sdk 16.7.0 (the adcp-3.2 dist-tag) sends input whenever the agent card's A2A protocolVersion is not 0.x. Against a 9.6.1 server, every A2A call from that client loses its request:

  • get_adcp_capabilities succeeds but doesn't echo context, so the storyboard capability_discovery steps fail with "Response echoes back the context object at /context".
  • Versioned tools fail with VERSION_UNSUPPORTED: adcp_version is required, because adcp_version was in the dropped input.

The same calls over MCP pass.

Expected

The A2A profile (docs/building/by-layer/L0/a2a-profile-extension.mdx) defines input as the required member: "parameters is not an alias for input in this profile". A 3.2-line server should dispatch input to the handler and echo its context.

10.0.0b13 lists input in _DATA_MEMBERS, but its default parser still reads parameters (lines 626, 640 and 1137). #1659's description notes the gap: "The default parser reads parameters but not the A2A profile's input member. This is a separate issue." This is that issue.

Ask

  1. Read input in the default A2A parser on next.
  2. Backport to 9.x so 3.2 servers interoperate with the 3.2 JS client.

Accepting parameters from clients that don't activate the profile (A2A 0.x) keeps older callers working.

Reproduction

Serve any DecisioningPlatform with 9.6.1 over A2A, then:

npx -y @adcp/sdk@16.7.0 storyboard run http://localhost:8000/ --protocol a2a (storyboard capability_discovery)

Impact

The embedded sales agent (scope3data/embedded-sales-agent) can't move its blocking storyboard gate off @adcp/sdk 12.1.1 (AdCP 3.1) once it stops serving 3.1. Our 3.1 removal is waiting on this.

Activity

  1. bokelley commented on Nov 9, 2026

    @bokelley
    ContributorAuthor

    The fix is in review on both lines:

    Both read the profile's input member. A request that does not activate the AdCP A2A profile keeps working with parameters; when it carries both members, parameters wins and they are never merged.

    For a request that activates the profile (A2A-Extensions: https://adcontextprotocol.org/extensions/adcp/v3):

    • 10.x follows the profile strictly. parameters (alone or beside input), a missing or non-object input, or a DataPart count other than one is refused with INVALID_REQUEST.
    • 9.x stays non-breaking. It refuses only an invocation carrying both members. Every other non-conforming shape is still dispatched as before, and a deprecation warning is logged.

    Reproduction: @adcp/sdk@16.7.0 storyboard run <agent> capability_discovery --protocol a2a. It fails on unfixed 9.x with the context echo error and passes 2/2 on both branches. media_buy_seller over A2A also passes on both, with 56 steps passed and 0 failed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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