This profile defines a small, testable baseline for agent runtimes that collaborate through open standards. It is a profile of A2A and MCP, not a separate protocol. If this document conflicts with either specification, the upstream specification is authoritative.
The profile has two surfaces:
| Need | Standard | Public object |
|---|---|---|
| Discover an agent and exchange durable work | A2A v1 | Agent Card, Message, Task, Artifact |
| Expose tools, data, or devices to an agent runtime | MCP | Remote Streamable HTTP server |
An A2A Task is the durable work record. An MCP tool invocation is a capability call made while work is being performed. An implementation must not make an MCP tool invocation the only durable record of cross-agent work.
The words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are used as described by BCP 14 when written in capitals.
- A conforming agent MUST publish an A2A v1 Agent Card at
/.well-known/agent-card.json. - The card MUST contain at least one
supportedInterfacesentry with:- an absolute HTTPS
urlin production; protocolBindingequal toJSONRPC;- a
protocolVersionin the A2A1.xseries.
- an absolute HTTPS
- The card MUST truthfully describe input/output media types, skills, security requirements, and optional capabilities.
- The card MUST NOT disclose secrets, prompts, model routing, private topology, or credentials.
- Clients MUST treat the card as untrusted until they have established origin trust and applied local policy. A signature can strengthen provenance but does not grant authorization.
The minimum JSON-RPC operations are:
SendMessageto create or continue work;GetTaskto read durable status and artifacts;CancelTaskto request cancellation.
A sender MUST provide a unique messageId. A server SHOULD use it for idempotency according to the A2A specification. The baseline accepts text/plain; implementations MAY advertise additional standard media types.
When work cannot complete within the request, SendMessage SHOULD use configuration.returnImmediately: true and return a Task in TASK_STATE_SUBMITTED or TASK_STATE_WORKING. A server MUST make later status available through GetTask unless it advertises and implements another A2A update mechanism.
Terminal outcomes are represented as:
TASK_STATE_COMPLETED, with output in one or more Artifacts;TASK_STATE_FAILED, with a safe failure status message;TASK_STATE_CANCELEDafter successful cancellation;TASK_STATE_REJECTEDwhen work is intentionally not accepted.
An implementation MUST NOT report TASK_STATE_COMPLETED before the requested work has produced its final outcome. Internal queue, worker, model, or deployment states MUST remain private; they are projected into the A2A task states.
Authentication MUST use a standard scheme declared in the Agent Card. Authorization is evaluated per request and MUST scope access to the caller, target agent, organization/workspace, task, and operation. Possession of a valid credential does not imply access to every agent or task.
Multi-tenant services SHOULD use the A2A tenant mechanisms when applicable and MUST enforce tenant isolation even if a tenant identifier is omitted from the public URL. Servers SHOULD return indistinguishable not-found responses where revealing resource existence would cross an authorization boundary.
Streaming, push notifications, extended Agent Cards, files, additional bindings, and extensions are outside the minimum profile. They MAY be used only when truthfully advertised and implemented according to A2A v1.
The preferred MCP surface is the 2026-07-28 specification over remote Streamable HTTP.
A conforming modern endpoint MUST:
- expose a single authenticated HTTPS MCP endpoint in production;
- implement
server/discover; - carry protocol version, client information, and client capabilities in request
_metaas defined by MCP; - require the
MCP-Protocol-VersionandMcp-Methodheaders on modern HTTP requests, plusMcp-Namewhen the operation addresses a named tool, prompt, resource, or task subject; - declare and implement
toolsif it exposes tools; - return deterministic tool ordering and the required cache metadata on list responses;
- validate
Origin, authenticate requests, authorize each exposed capability, and avoid transport-session authority.
The current MCP core is stateless. Application state uses explicit, scoped handles in ordinary tool arguments or an applicable standard extension. A hidden transport session MUST NOT be the sole authority for organizational work.
Many deployed hosts still speak the initialization-based 2025-11-25 era. A production endpoint SHOULD be dual-era during the transition when its client population requires it. Dual-era support follows MCP's standard detection and fallback rules; it MUST NOT create a different OpenAgent-only handshake.
The included modern fixtures use server/discover. The legacy fixtures demonstrate the earlier initialize request only so implementers can test compatibility. New clients SHOULD prefer the modern era.
Tools and physical devices are both capabilities from the agent's perspective. A robot, browser, terminal, sensor, calendar, or file store SHOULD be exposed through MCP tools/resources appropriate to its behavior. Device-specific safety, admission, emergency stop, rate limits, and physical authorization remain mandatory application controls.
An implementation MUST NOT infer that a successful MCP connection authorizes every tool. Tool descriptions and annotations are untrusted input, and consequential tool calls require the authority appropriate to their effects.
The profile does not depend on a model vendor, agent framework, programming language, or hosting platform.
A Codex-, Gemini-, or Claude-style host can use OpenAgent tools when it can connect to the remote MCP endpoint. Native A2A support is not assumed. A host without A2A can participate through an adapter that:
- receives a standard A2A Message;
- creates a durable A2A Task before starting runtime execution;
- supplies the message content to the runtime without losing identity or authorization scope;
- projects progress into truthful A2A task states;
- writes final output to A2A Artifacts;
- propagates cancellation to the runtime and reports the real result.
The adapter MUST NOT expose provider prompts, model selection, private runtime identifiers, or internal scheduling in the Agent Card.
Protocol identifiers do not replace organizational identity. Implementations SHOULD maintain one persistent agent identity across work, mail, calendar, and other productivity surfaces while granting protocol credentials separately and revocably.
Every accepted task and consequential tool effect SHOULD remain attributable to the initiating identity, executing agent, applied authority, and resulting artifact or side effect. Raw model reasoning is not required and SHOULD NOT be treated as the audit record.
An implementation validates the published baseline schemas and passes the local fixture suite.
An implementation passes the read-only probe for:
- an A2A Agent Card with an A2A v1 JSON-RPC interface; and/or
- an MCP
server/discoverresponse supporting2026-07-28.
End-to-end conformance additionally requires an authenticated test that proves:
SendMessagedelivers the input to the selected runtime;GetTaskexposes durable, monotonic task status;- completed output appears in an Artifact;
CancelTaskreaches the underlying execution and reports the actual cancellation outcome;- the runtime can list and call only its authorized MCP tools;
- cross-tenant reads and writes fail without leaking resource existence.
The included CLI intentionally does not perform these side-effecting tests.
Profile versions follow semantic versioning. A new protocol revision may require a new profile minor or major version. Implementations should advertise A2A and MCP versions using their standard fields, never by overloading the OpenAgent profile version.