airbytehq / airbytehq/PyAirbyte

bug(mcp): Safe mode GUID tracking leaks across sessions in HTTP server mode

Ouverte
#950 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
bug
Langage dominant
Python
Étoiles
344
Forks
77
Merge moyen
1 j 11 h
PR mergées (30 j)
35

Description

## Summary

Safe mode in the MCP server uses a module-level global variable to track GUIDs of resources created during a session. This works correctly in stdio mode (each invocation is a new process), but in HTTP server mode, multiple requests share the same Python process and therefore share the same GUID tracking set.

**Reported by:** @aaronsteers (AJ Steers)

## Current Implementation

```python
# airbyte/mcp/_tool_utils.py
_GUIDS_CREATED_IN_SESSION: set[str] = set()
```

## The Bug

1. **In stdio mode (CLI)**: Each invocation is a new process, so the set is fresh each time. Works correctly.
2. **In HTTP server mode**: The server runs as a single long-lived process. Multiple HTTP requests (from different users/sessions) share the same `_GUIDS_CREATED_IN_SESSION` set.

**Impact**: User B could delete resources created by User A because the GUID was added to the shared set, defeating the purpose of safe mode protection.

## Potential Solutions

### Option 1: Session ID Header (Recommended)
Require clients to send a session ID header (e.g., `X-Airbyte-Session-Id`), then maintain `{session_id: set[guid]}` with TTL cleanup. This requires client cooperation but provides true session isolation.

We already have the `MCPServerConfigArg` infrastructure for HTTP headers, so this would be consistent with the existing pattern.

### Option 2: Per-Request Context
Use FastMCP's `Context` object to store created GUIDs. However, this only works within a single request - multi-request sessions would still need client-side session tracking.

### Option 3: Connection-Scoped State (SSE only)
For SSE transport, the connection is persistent, so we could track GUIDs per-connection. But this doesn't help HTTP transport which is stateless.

### Option 4: Disable Safe Mode in HTTP Mode
Simple but loses the protection. Could document that safe mode only works in stdio mode.

## Related

- airbytehq/PyAirbyte#949: Migration to fastmcp-extensions library
- Safe mode is controlled by `AIRBYTE_CLOUD_MCP_SAFE_MODE` environment variable (default: enabled)

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.