A2APeer
A2APeer (maqpna.com/v1alpha1): every field, type, default and validation rule, generated from the CRD schema.
A2APeer is a remote A2A agent that local agents may call through the gateway (F-15).
At a glance#
| Property | Value |
|---|---|
| API version | maqpna.com/v1alpha1 |
| Kind | A2APeer |
| Scope | Namespaced |
| Plural | a2apeers |
| Short names | a2ap, peer |
| Categories | maqpna |
| Status subresource | yes |
kubectl get a2apeers -A
kubectl get a2ap <name> -o yaml
kubectl explain a2apeers.spec
Columns in kubectl get#
| Column | Type | From |
|---|---|---|
| URL | string | .spec.url |
| Trust | string | .spec.trust |
| Ready | string | .status.conditions[?(@.type=="Ready")].status |
| Age | date | .metadata.creationTimestamp |
Example#
From config/samples/a2apeer-partner.yaml:
# A remote A2A v1.0 agent that agents in team-a may call through the gateway
# (POST /a2a/team-a/partner-reviewer; F-15). Its Agent Card must be signed
# (JWS over RFC 8785) by a pinned key and list spec.url; calls fail closed
# otherwise. Answers of untrusted peers taint the caller's session.
apiVersion: maqpna.com/v1alpha1
kind: A2APeer
metadata:
name: partner-reviewer
namespace: team-a
spec:
url: https://agents.partner.acme.eu/a2a/v1
jurisdiction: EU-DE
trust: untrusted
cardKeys:
jwksConfigMapRef: {name: partner-reviewer-card-keys, key: jwks.json}
allowedCallers: ["coder"] # team-a/coder only
skills: ["code-review"]
auth:
type: tokenExchange # identity headers / Txn-Tokens never leave the trust domain
tokenExchange: {audience: partner-reviewer}
Spec fields#
A2APeerSpec describes a remote A2A agent reachable through the gateway.
| Field | Type | Required | Description |
|---|---|---|---|
allowedCallers |
[]string | allowedCallers: " |
|
auth |
object | auth presented to the peer (identity headers and Txn-Tokens never leave the trust domain). Rule: tokenExchange requires tokenExchange. | |
auth.tokenExchange |
object | MCPTokenExchange configures a per-session RFC 8693 exchange at the MAQPNA identity broker: the upstream receives a down-scoped token carrying act.sub. | |
auth.tokenExchange.audience |
string | yes | audience must be allowlisted in the broker's -exchange-config. Min length: 1. |
auth.type |
string | yes | One of: none, tokenExchange. |
caBundleRef |
object | caBundleRef selects a PEM CA bundle for the peer's TLS. | |
caBundleRef.key |
string | yes | Min length: 1. |
caBundleRef.name |
string | yes | Min length: 1. |
cardKeys |
object | cardKeys pins the card signing keys. | |
cardKeys.jwks |
string | jwks is an inline JWKS document (JSON). | |
cardKeys.jwksConfigMapRef |
object | jwksConfigMapRef selects a JWKS document in a ConfigMap of the A2APeer's namespace. | |
cardKeys.jwksConfigMapRef.key |
string | yes | Min length: 1. |
cardKeys.jwksConfigMapRef.name |
string | yes | Min length: 1. |
cardKeys.jwksURL |
string | jwksURL is fetched by the gateway (residency-checked) when no inline keys are given. Weaker than pinning: it trusts the URL's TLS. Pattern: ^https://. |
|
cardURL |
string | cardURL defaults to ^https?://. |
|
jurisdiction |
string | jurisdiction of the peer, checked against the SovereigntyPolicy. | |
requireSignedCard |
boolean | requireSignedCard (default true) fails every call closed unless the fetched card verifies with a pinned key and lists url. | |
skills |
[]string | skills restricts callable skill ids (empty = any skill on the verified card). | |
timeoutSeconds |
integer (int32) | Minimum: 0. Maximum: 3600. |
|
trust |
string | trust (default untrusted): answers of untrusted peers taint the caller's session (label untrusted-input). One of: trusted, untrusted. |
|
url |
string | yes | url is the peer's A2A JSON-RPC endpoint. Pattern: ^https?://. |
- Rule on
spec: requireSignedCard needs cardKeys
Status fields#
A2APeerStatus is the observed state of an A2APeer.
The operator writes status; do not set it yourself.
| Field | Type | Required | Description |
|---|---|---|---|
conditions |
[]object | ||
conditions[].lastTransitionTime |
string (date-time) | yes | lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. |
conditions[].message |
string | yes | message is a human readable message indicating details about the transition. This may be an empty string. Max length: 32768. |
conditions[].observedGeneration |
integer (int64) | observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. Minimum: 0. |
|
conditions[].reason |
string | yes | reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. Min length: 1. Max length: 1024. Pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$. |
conditions[].status |
string | yes | status of the condition, one of True, False, Unknown. One of: True, False, Unknown. |
conditions[].type |
string | yes | type of condition in CamelCase or in foo.example.com/CamelCase. Max length: 316. Pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$. |
gatewayPath |
string | gatewayPath is the path agents call: /a2a/ |
|
observedGeneration |
integer (int64) |