Catalog PyPI
PACKAGE EXPLORERView in registry

aaep-mcp-bridge

PyPI

Bidirectional bridge between the Model Context Protocol (MCP) and AAEP

aaepaccessibilityanthropicbridgemcpmodel-context-protocol
Versions collected1
Direct dependencies7From release 1.0.0
Last observed20 Oct, 16:54 UTC

README

Version 1.0.0 documentation

MCP ↔ AAEP Bridge

A bidirectional bridge between the Model Context Protocol (MCP) and the Agent Accessibility Event Protocol (AAEP). Demonstrates that the two protocols address orthogonal concerns and compose cleanly.

If you build agents that use MCP for tool integration and want them to also speak AAEP for accessibility, this bridge shows how.


Why this bridge exists

MCP and AAEP solve different problems:

ProtocolAddressesStandardizes
MCPAgent ↔ Tool/ResourceTool discovery, invocation, resources, prompts
AAEPAgent ↔ Assistive TechnologyLifecycle events, safety gating, output streaming for AT

They are complementary, not competing. An agent using MCP for tool integration can simultaneously use AAEP for accessibility announcements; the two protocols address orthogonal concerns and do not conflict.

This bridge makes their cooperation concrete. It runs between an MCP-aware agent and an AAEP-aware AT, translating relevant signals in both directions.


What the bridge does

The bridge is a small process that:

  1. Wraps an MCP client that connects to MCP servers exposing tools the agent uses
  2. Embeds an AAEP producer that emits events to AT subscribers
  3. Observes MCP traffic as the agent calls tools, and translates the relevant traffic into AAEP events

Specifically:

MCP eventAAEP event emitted
tools/list returns server capabilities(no emission; metadata only)
tools/call request (before execution)aaep:agent.tool.invoked
tools/call request, irreversible flaggedaaep:agent.awaiting.confirmation BEFORE the MCP call
tools/call response successaaep:agent.tool.completed (status=success)
tools/call response erroraaep:agent.tool.completed (status=error)
tools/call request times outaaep:agent.tool.completed (status=timeout)
MCP server disconnectsaaep:agent.session.errored (error_category=network)
resources/read(optional; emitted as state.changed to reading_resource)
prompts/get(optional; emitted as state.changed to loading_prompt)

The bridge also supports the reverse direction:

AAEP signalMCP action
confirmation.reply decision=rejectCancel pending tools/call request, return error to MCP client
confirmation.reply decision=acceptAllow tools/call request to proceed to the MCP server
clarification.reply responseForward as additional context to the MCP server (advisory)

Installation

cd examples/bridges/mcp-aaep-bridge
pip install -e .

Requires Python 3.10 or newer. The bridge depends on:

  • aaep-minimal-producer>=1.0.0 (reuses the emitter)
  • mcp>=1.0.0 (the official MCP Python SDK)
  • aiohttp>=3.9.0 (HTTP/SSE transport for AAEP subscribers)

Quick start

1. Configure your MCP server

The bridge connects to an MCP server you've already set up. For example, if you have an MCP filesystem server:

# In one terminal: an MCP server
npx -y @modelcontextprotocol/server-filesystem /path/to/workspace

2. Start the bridge

aaep-mcp-bridge \
    --mcp-server "npx -y @modelcontextprotocol/server-filesystem /path/to/workspace" \
    --aaep-port 8090

This starts a bridge that:

  • Connects to the MCP filesystem server via stdio JSON-RPC
  • Exposes an AAEP /events SSE endpoint on http://localhost:8090
  • Translates every MCP tool call into the appropriate AAEP events

3. Connect an AT subscriber

In another terminal:

aaep-listen --endpoint http://localhost:8090

4. Drive the agent through the bridge

In a third terminal, send an MCP request through the bridge (or have your agent connect to the bridge as if it were the MCP server directly):

# Example: list available tools (simple MCP request)
curl -X POST http://localhost:8090/mcp \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'

# Example: call a tool
curl -X POST http://localhost:8090/mcp \
    -H "Content-Type: application/json" \
    -d '{
        "jsonrpc": "2.0",
        "id": 2,
        "method": "tools/call",
        "params": {
            "name": "read_file",
            "arguments": {"path": "/etc/hostname"}
        }
    }'

The AAEP subscriber (terminal with aaep-listen) will show:

[12:34:56.789] aaep:agent.tool.invoked           Calling read_file via MCP.
                  tool: read_file
                  risk_level: low
                  irreversible: false
                  args_summary: path=/etc/hostname

[12:34:56.823] aaep:agent.tool.completed         myhost.local
                  tool: read_file
                  status: success

For tools flagged as irreversible (configurable; see §"Risk Configuration" below), the bridge inserts an awaiting.confirmation event before the MCP call and blocks until the AT subscriber replies.


Architecture

   AT Subscriber                                              MCP Server
        ↑                                                          ↑
        │ SSE /events                                              │ stdio
        │ POST /messages                                           │ JSON-RPC
        │                                                          │
        ▼                                                          ▼
   ┌────────────────────────────────────────────────────────────────┐
   │                  aaep-mcp-bridge process                       │
   │                                                                │
   │  ┌──────────────┐   translation   ┌──────────────┐            │
   │  │ AAEP         │ ───────────────▶│ MCP Client   │            │
   │  │ Producer     │                  │ (stdio)      │            │
   │  └──────────────┘                  └──────────────┘            │
   │      ▲                                    │                    │
   │      │                                    │                    │
   │      │ confirmation reply                 │ tool/call          │
   │      │ (accept/reject)                    │ response           │
   │      │                                    ▼                    │
   │  ┌──────────────────────────────────────────┐                 │
   │  │  HTTP server: /mcp /events /messages     │                 │
   │  └──────────────────────────────────────────┘                 │
   │      ▲                                                         │
   │      │ JSON-RPC                                                │
   │      │ HTTP                                                    │
   └──────┼─────────────────────────────────────────────────────────┘
          │
          │
   Agent (any LLM with MCP support)

The agent talks to the bridge as if it were the MCP server. The MCP server is unchanged. The AT is unchanged. The bridge is the glue.


Risk configuration

By default, the bridge uses heuristics matching the python-minimal example to classify tool risk:

  • Tool names containing send_, delete_, transfer_, write_, execute_, publish_, make_payment → high-risk irreversible
  • All other tools → low-risk

To override, provide a --risk-config JSON file:

{
  "tool_overrides": {
    "read_file": {"risk_level": "low", "irreversible": false},
    "write_file": {"risk_level": "high", "irreversible": true},
    "execute_command": {"risk_level": "high", "irreversible": true}
  },
  "default": {"risk_level": "low", "irreversible": false}
}

The bridge consults this map for every tools/call before deciding whether to emit awaiting.confirmation.


Project layout

mcp-aaep-bridge/
├── README.md
├── pyproject.toml
├── aaep_mcp_bridge/
│   ├── __init__.py
│   ├── bridge.py            # MCPToAAEPBridge — the core translator
│   ├── risk.py              # Risk classification + override config
│   └── server.py            # HTTP server combining /mcp + AAEP /events
└── tests/
    └── test_bridge.py

Limitations and known issues

This is a reference bridge, not production code. Specifically:

  • stdio transport only. The bridge speaks JSON-RPC over stdio to the MCP server. HTTP/SSE-transported MCP servers will need adaptation. The MCP SDK supports both.
  • One MCP server per bridge instance. Multi-server MCP setups need to run one bridge per server (or extend this code).
  • No streaming response support yet. MCP doesn't currently stream tools/call responses; if/when it does, this bridge will need updating.
  • Resources and prompts are minimal. This bridge focuses on tools/*. Resources and prompts emit state.changed only.
  • No authentication relay. If your MCP server requires authentication, you'll need to configure it before the bridge starts; this code doesn't proxy credentials.

For production deployments, consider these as starting points to extend, not finished features to rely on.


See also

Downloads & popularity

2downloads
1-day window · source-reported counts19 Oct 2026
199.50
2026-07-22: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-07-22–2026-07-222026-07-23: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-07-23–2026-07-232026-07-24: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-07-24–2026-07-242026-07-27: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-07-27–2026-07-272026-07-28: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-07-28–2026-07-282026-07-29: 11 · observed 2026-10-20T18:37:02.2632937Z · period 2026-07-29–2026-07-292026-08-01: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-01–2026-08-012026-08-02: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-02–2026-08-022026-08-03: 6 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-03–2026-08-032026-08-04: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-04–2026-08-042026-08-06: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-06–2026-08-062026-08-08: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-08–2026-08-082026-08-09: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-09–2026-08-092026-08-11: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-11–2026-08-112026-08-13: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-13–2026-08-132026-08-14: 8 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-14–2026-08-142026-08-15: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-15–2026-08-152026-08-17: 4 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-17–2026-08-172026-08-18: 19 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-18–2026-08-182026-08-20: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-20–2026-08-202026-08-21: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-21–2026-08-212026-08-23: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-23–2026-08-232026-08-24: 9 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-24–2026-08-242026-08-26: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-26–2026-08-262026-08-27: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-27–2026-08-272026-08-28: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-28–2026-08-282026-08-30: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-30–2026-08-302026-08-31: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-08-31–2026-08-312026-09-01: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-01–2026-09-012026-09-02: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-02–2026-09-022026-09-03: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-03–2026-09-032026-09-04: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-04–2026-09-042026-09-05: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-05–2026-09-052026-09-07: 4 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-07–2026-09-072026-09-09: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-10–2026-09-102026-09-12: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-12–2026-09-122026-09-17: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-17–2026-09-172026-09-18: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-18–2026-09-182026-09-23: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-23–2026-09-232026-09-24: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-24–2026-09-242026-09-25: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-25–2026-09-252026-09-26: 5 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-26–2026-09-262026-09-27: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-27–2026-09-272026-09-29: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-29–2026-09-292026-09-30: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-09-30–2026-09-302026-10-01: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-01–2026-10-012026-10-03: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-03–2026-10-032026-10-05: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-05–2026-10-052026-10-06: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-06–2026-10-062026-10-07: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-07–2026-10-072026-10-08: 6 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-08–2026-10-082026-10-09: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-09–2026-10-092026-10-10: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-10–2026-10-102026-10-11: 6 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-11–2026-10-112026-10-12: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-12–2026-10-122026-10-13: 3 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-13–2026-10-132026-10-15: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-15–2026-10-152026-10-16: 5 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-16–2026-10-162026-10-17: 1 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-17–2026-10-172026-10-18: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-18–2026-10-182026-10-19: 2 · observed 2026-10-20T18:37:02.2632937Z · period 2026-10-19–2026-10-19
22 Jul19 Oct

pypistats · 62 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-19 – 2026-10-1922026-10-20T18:37:02.2632937Z
2026-10-18 – 2026-10-1822026-10-20T18:37:02.2632937Z
2026-10-17 – 2026-10-1712026-10-20T18:37:02.2632937Z
2026-10-16 – 2026-10-1652026-10-20T18:37:02.2632937Z
2026-10-15 – 2026-10-1512026-10-20T18:37:02.2632937Z
2026-10-13 – 2026-10-1332026-10-20T18:37:02.2632937Z
2026-10-12 – 2026-10-1232026-10-20T18:37:02.2632937Z
2026-10-11 – 2026-10-1162026-10-20T18:37:02.2632937Z
2026-10-10 – 2026-10-1012026-10-20T18:37:02.2632937Z
2026-10-09 – 2026-10-0912026-10-20T18:37:02.2632937Z
2026-10-08 – 2026-10-0862026-10-20T18:37:02.2632937Z
2026-10-07 – 2026-10-0712026-10-20T18:37:02.2632937Z
2026-10-06 – 2026-10-0612026-10-20T18:37:02.2632937Z
2026-10-05 – 2026-10-0512026-10-20T18:37:02.2632937Z
2026-10-03 – 2026-10-0312026-10-20T18:37:02.2632937Z
2026-10-01 – 2026-10-0122026-10-20T18:37:02.2632937Z
2026-09-30 – 2026-09-3032026-10-20T18:37:02.2632937Z
2026-09-29 – 2026-09-2912026-10-20T18:37:02.2632937Z
2026-09-27 – 2026-09-2712026-10-20T18:37:02.2632937Z
2026-09-26 – 2026-09-2652026-10-20T18:37:02.2632937Z
2026-09-25 – 2026-09-2532026-10-20T18:37:02.2632937Z
2026-09-24 – 2026-09-2412026-10-20T18:37:02.2632937Z
2026-09-23 – 2026-09-2312026-10-20T18:37:02.2632937Z
2026-09-18 – 2026-09-1822026-10-20T18:37:02.2632937Z
2026-09-17 – 2026-09-1712026-10-20T18:37:02.2632937Z
2026-09-12 – 2026-09-1232026-10-20T18:37:02.2632937Z
2026-09-10 – 2026-09-1012026-10-20T18:37:02.2632937Z
2026-09-09 – 2026-09-0922026-10-20T18:37:02.2632937Z
2026-09-07 – 2026-09-0742026-10-20T18:37:02.2632937Z
2026-09-05 – 2026-09-0522026-10-20T18:37:02.2632937Z
2026-09-04 – 2026-09-0422026-10-20T18:37:02.2632937Z
2026-09-03 – 2026-09-0312026-10-20T18:37:02.2632937Z
2026-09-02 – 2026-09-0212026-10-20T18:37:02.2632937Z
2026-09-01 – 2026-09-0112026-10-20T18:37:02.2632937Z
2026-08-31 – 2026-08-3132026-10-20T18:37:02.2632937Z
2026-08-30 – 2026-08-3012026-10-20T18:37:02.2632937Z
2026-08-28 – 2026-08-2812026-10-20T18:37:02.2632937Z
2026-08-27 – 2026-08-2712026-10-20T18:37:02.2632937Z
2026-08-26 – 2026-08-2612026-10-20T18:37:02.2632937Z
2026-08-24 – 2026-08-2492026-10-20T18:37:02.2632937Z
2026-08-23 – 2026-08-2332026-10-20T18:37:02.2632937Z
2026-08-21 – 2026-08-2112026-10-20T18:37:02.2632937Z
2026-08-20 – 2026-08-2012026-10-20T18:37:02.2632937Z
2026-08-18 – 2026-08-18192026-10-20T18:37:02.2632937Z
2026-08-17 – 2026-08-1742026-10-20T18:37:02.2632937Z
2026-08-15 – 2026-08-1512026-10-20T18:37:02.2632937Z
2026-08-14 – 2026-08-1482026-10-20T18:37:02.2632937Z
2026-08-13 – 2026-08-1322026-10-20T18:37:02.2632937Z
2026-08-11 – 2026-08-1122026-10-20T18:37:02.2632937Z
2026-08-09 – 2026-08-0922026-10-20T18:37:02.2632937Z
2026-08-08 – 2026-08-0822026-10-20T18:37:02.2632937Z
2026-08-06 – 2026-08-0612026-10-20T18:37:02.2632937Z
2026-08-04 – 2026-08-0432026-10-20T18:37:02.2632937Z
2026-08-03 – 2026-08-0362026-10-20T18:37:02.2632937Z
2026-08-02 – 2026-08-0212026-10-20T18:37:02.2632937Z
2026-08-01 – 2026-08-0112026-10-20T18:37:02.2632937Z
2026-07-29 – 2026-07-29112026-10-20T18:37:02.2632937Z
2026-07-28 – 2026-07-2812026-10-20T18:37:02.2632937Z
2026-07-27 – 2026-07-2732026-10-20T18:37:02.2632937Z
2026-07-24 – 2026-07-2412026-10-20T18:37:02.2632937Z
2026-07-23 – 2026-07-2322026-10-20T18:37:02.2632937Z
2026-07-22 – 2026-07-2222026-10-20T18:37:02.2632937Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
1.0.03 Jun 20267

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
ramseyxlil/aaep

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 16:54 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:1f059f638a4bc12026803b3cceb87e00a8d6e2a0567c930b11855298a4b74f8b