Skip to content

For A2A Developers

All four protocols use the standard A2A capabilities.extensions mechanism. An agent that supports all four declares them in a single array:

{
"name": "service-provider-agent",
"version": "1.0",
"capabilities": {
"extensions": [
{
"uri": "https://ravikiran438.github.io/agent-consent-protocol/v1",
"description": "ACAP: usage-policy consent and per-action adherence.",
"required": true
},
{
"uri": "https://ravikiran438.github.io/phala-protocol/v1",
"description": "Phala: principal-declared welfare feedback.",
"required": false
},
{
"uri": "https://ravikiran438.github.io/pratyahara-nerve/v1",
"description": "NERVE: behavioral integrity monitoring.",
"required": true
},
{
"uri": "https://ravikiran438.github.io/sauvidya-pace/v1",
"description": "PACE: principal accessibility and capacity.",
"required": true
}
]
}
}
ProtocolDefaultReason
ACAPtrueCallee wants callers to accept usage policy before invoking skills
PhalafalseWelfare feedback is advisory (BU-3: agents MAY ignore BeliefUpdates)
NERVEtrueSecurity layer: callee expects callers to participate in the trust envelope
PACEtrueAgents serving principals with registered PCPs MUST adapt interaction

An agent can declare any subset. A deployment that only needs consent:

{
"capabilities": {
"extensions": [
{
"uri": "https://ravikiran438.github.io/agent-consent-protocol/v1",
"description": "ACAP: usage-policy consent and per-action adherence.",
"required": true
}
]
}
}

Agents that do not understand an extension ignore the entry. No error, no failure, no negotiation. The extensions are additive.

Advertising Protocol Support in an MCP Handshake

Section titled “Advertising Protocol Support in an MCP Handshake”

For MCP tool servers whose agent supports one or more of the four protocols, each protocol registers as a custom server capability in the serverCapabilities object during the initialize handshake, keyed by the same extension URI used on the A2A AgentCard:

{
"serverCapabilities": {
"tools": {},
"https://ravikiran438.github.io/pratyahara-nerve/v1": {
"neuron_type": "processing",
"behavioral_fingerprint": "sha256:...",
"trust_score": 0.88
},
"https://ravikiran438.github.io/sauvidya-pace/v1": {
"supported_modalities": ["voice", "text"],
"supported_languages": ["en", "te", "hi"]
}
}
}

Each protocol ships a reference Model Context Protocol server that exposes its validators as MCP tools. All four use stdio transport and work with any MCP-compatible client; the configuration below uses VSCode’s native MCP settings, and the same console script binds to any stdio-capable host. The pattern is identical across repos; each stays independently installable with no shared package.

ProtocolConsole scriptTools exposedPurpose
ACAPacap-mcp9Core validators + one primary entry point per extension (governance tiering, category preferences, regulatory context, audit projection), plus validate_usage_policy_ref for AgentCard payload validation.
Phalaphala-mcp12Six Core validators (five primitives + BU-Privacy) plus five welfare_detectors extension validators: TypedBeliefUpdate structural check, WD-1 typed composition, WD-2 arbitration, WD-3 horizon, WD-4 provenance. Plus validate_phala_service_ref for AgentCard payload validation. BU-2 (per-agent uniqueness) and BU-4 (TTL expiry) are runtime-enforced and not exposed via MCP — they require state (a set of updates) or wall-clock time that an MCP tool boundary doesn’t naturally carry.
NERVEnerve-mcp13Seven Core safety invariants (N-1, N-3, N-4, N-5, N-9, N-14, N-15) plus three Yathartha extension invariants (N-16, N-17, N-18) for capability-surface integrity. Plus three AgentCard / wire validators: validate_neural_posture_ref, validate_nerve_envelope, validate_behavioral_fingerprint.
PACEpace-mcp16Seven Core validators: PCP structural check plus six named accessibility invariants (IM-1, IM-2, CCC-1, CCC-2, AIC-1, AIC-2). Plus four augmentation_profile extension validators (AUG-1 reversibility, AUG-3 identity, AUG-4 skill maintenance, AUG-5 emergency boundary). Plus five wire validators introduced in PACE v3: validate_accessibility_service_ref, validate_active_challenge, validate_pace_consent_annotation, validate_pace_violation_notice, compute_ccc_trend. AUG-2 is omitted because audit decomposition is enforced at type construction by the Mediation enum, leaving no separate runtime check to expose.

Two paths depending on whether you are consuming or contributing.

For end users (no clone, ephemeral with uvx):

Terminal window
uvx --from 'acap[mcp] @ git+https://github.com/ravikiran438/agent-consent-protocol.git@v0.1.0' acap-mcp
uvx --from 'phala[mcp] @ git+https://github.com/ravikiran438/phala-protocol.git@v0.1.0' phala-mcp
uvx --from 'nerve[mcp] @ git+https://github.com/ravikiran438/pratyahara-nerve.git@v0.1.0' nerve-mcp
uvx --from 'pace[mcp] @ git+https://github.com/ravikiran438/sauvidya-pace.git@v0.1.0' pace-mcp

For end users (persistent, into an existing venv):

Terminal window
pip install 'acap[mcp] @ git+https://github.com/ravikiran438/agent-consent-protocol.git@v0.1.0'
# substitute phala/nerve/pace as needed

For contributors (clone + editable install):

Terminal window
git clone https://github.com/ravikiran438/agent-consent-protocol.git
cd agent-consent-protocol
pip install -e '.[mcp]'

Any of the three paths registers the appropriate <name>-mcp console script in the active Python environment.

Add this to .vscode/mcp.json at your workspace root (or configure globally via your VSCode user settings, under the MCP section). Only include the servers you need.

Option A — uvx from git URLs (no persistent install required):

{
"servers": {
"acap": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"acap[mcp] @ git+https://github.com/ravikiran438/agent-consent-protocol.git@v0.1.0",
"acap-mcp"
]
},
"phala": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"phala[mcp] @ git+https://github.com/ravikiran438/phala-protocol.git@v0.1.0",
"phala-mcp"
]
},
"nerve": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"nerve[mcp] @ git+https://github.com/ravikiran438/pratyahara-nerve.git@v0.1.0",
"nerve-mcp"
]
},
"pace": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"pace[mcp] @ git+https://github.com/ravikiran438/sauvidya-pace.git@v0.1.0",
"pace-mcp"
]
}
}
}

Option B — absolute paths to pre-installed binaries:

{
"servers": {
"acap": {
"type": "stdio",
"command": "/absolute/path/to/agent-consent-protocol/.venv/bin/acap-mcp"
},
"phala": {
"type": "stdio",
"command": "/absolute/path/to/phala-protocol/.venv/bin/phala-mcp"
},
"nerve": {
"type": "stdio",
"command": "/absolute/path/to/pratyahara-nerve/.venv/bin/nerve-mcp"
},
"pace": {
"type": "stdio",
"command": "/absolute/path/to/sauvidya-pace/.venv/bin/pace-mcp"
}
}
}

Reload the workspace. The tools appear in any MCP-aware VSCode extension grouped by server name. Other MCP hosts accept the same console-script paths under their own configuration conventions.

Every tool is named validate_<invariant> and takes a JSON payload of the primitive(s) it operates on. Output is a JSON object with {"ok": true, ...} on success or {"ok": false, "error": "..."} on invariant failure. A malformed input (not a structural invariant failure) surfaces as an MCP protocol error rather than an ok=false response.

See each server’s src/<package>/mcp_server/README.md for the full tool schema and per-tool examples.

ProtocolPackageTestsTLA+
ACAPagent-consent-protocol128 (Core + 4 extensions + MCP)Full state machine
Phalaphala-protocol68 (Core + welfare_detectors + MCP)Core skeleton + welfare_detectors spec
NERVEpratyahara-nerve94 (Core + Yathartha + MCP)Full state machine (Core + Yathartha)
PACEsauvidya-pace96 (Core + augmentation_profile + MCP)Full state machine + augmentation_profile spec

Total: 386 tests across the stack.

ProtocolDOI
Anumati / ACAParXiv:2604.16524 · Zenodo 10.5281/zenodo.19606339
Phala10.5281/zenodo.19625612
Pratyahara / NERVE10.5281/zenodo.19628589
Sauvidya / PACE10.5281/zenodo.19633139
Yathartha (NERVE extension)10.5281/zenodo.19659633