Skip to content

[Bug]: Server does not validate A2A-Version header — missing VersionNotSupportedError for unsupported versions #856

@jmesnil

Description

@jmesnil

What happened?

Server does not validate A2A-Version header — missing VersionNotSupportedError for unsupported versions

Summary

The a2a-python SDK server does not validate the A2A-Version request header. Requests with unsupported versions (e.g., 99.0) are processed normally instead of returning a VersionNotSupportedError, failing on both JSON-RPC and HTTP+JSON transports.

Requirement

Specification

Agents MUST process requests using the semantics of the requested A2A-Version (matching Major.Minor). If the version is not supported by the interface, agents MUST return a VersionNotSupportedError.

Expected behavior

When a request includes A2A-Version: 99.0, the server should reject it with a VersionNotSupportedError:

  • JSON-RPC: error response with code -32009
  • HTTP+JSON: HTTP 400 Bad Request

Actual behavior

The server ignores the A2A-Version header entirely and processes the request normally, returning a successful result (HTTP 200) on both transports. The SDK defines VersionNotSupportedError and its error code mappings (src/a2a/utils/errors.py) but the server request handlers (jsonrpc_handler.py, rest_handler.py) never read or validate the header.

Reproducer

# 1. Verify the agent is running
curl -s http://localhost:9999/.well-known/agent-card.json | jq '.supportedInterfaces'

# 2. JSON-RPC: Send a request with unsupported A2A-Version 99.0
#    Expected: JSON-RPC error with code -32009
#    Actual: successful result with task data
curl -s -X POST http://localhost:9999 \
  -H "Content-Type: application/json" \
  -H "A2A-Version: 99.0" \
  -d '{"jsonrpc":"2.0","id":1,"method":"SendMessage","params":{"message":{"role":"ROLE_USER","parts":[{"text":"version test"}],"messageId":"ver-repro-001"}}}' | jq .

# 3. HTTP+JSON: Send a request with unsupported A2A-Version 99.0
#    Expected: HTTP 400 with VersionNotSupportedError
#    Actual: HTTP 200 with successful task result
curl -s -w "\nHTTP_STATUS: %{http_code}\n" -X POST http://localhost:9999/a2a/rest/message:send \
  -H "Content-Type: application/json" \
  -H "A2A-Version: 99.0" \
  -d '{"message":{"role":"ROLE_USER","parts":[{"text":"version test"}],"messageId":"ver-repro-002"}}'

TCK test

tests/compatibility/core_operations/test_error_handling.py::TestVersionErrors::test_unsupported_version_returns_error_jsonrpc
tests/compatibility/core_operations/test_error_handling.py::TestVersionErrors::test_unsupported_version_returns_error_rest

Relevant log output

Code of Conduct

  • I agree to follow this project's Code of Conduct

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions