Spaces:
Sleeping
Sleeping
Update server.py
Browse files
server.py
CHANGED
|
@@ -18,8 +18,9 @@ app = FastAPI()
|
|
| 18 |
server = Server(name="airtable-mcp")
|
| 19 |
transport = SseServerTransport("/airtable/mcp")
|
| 20 |
|
| 21 |
-
# Store write streams for each session ID
|
| 22 |
write_streams = {}
|
|
|
|
| 23 |
|
| 24 |
# Configure environment variables (for logging purposes)
|
| 25 |
token = os.getenv("AIRTABLE_API_TOKEN")
|
|
@@ -37,7 +38,6 @@ async def handle_sse(request: Request):
|
|
| 37 |
endpoint_data = f"/airtable/mcp?session_id={{session_id}}"
|
| 38 |
await sse_stream_writer.send({"event": "endpoint", "data": endpoint_data})
|
| 39 |
async for session_message in write_stream_reader:
|
| 40 |
-
# Handle both dict and SessionMessage objects
|
| 41 |
if isinstance(session_message, dict):
|
| 42 |
event = session_message.get("event", "message")
|
| 43 |
data = session_message.get("data", json.dumps(session_message))
|
|
@@ -52,6 +52,7 @@ async def handle_sse(request: Request):
|
|
| 52 |
placeholder_id = f"placeholder_{id(write_stream)}"
|
| 53 |
if placeholder_id in write_streams:
|
| 54 |
write_streams[session_id] = write_streams.pop(placeholder_id)
|
|
|
|
| 55 |
logger.info(f"Updated placeholder {placeholder_id} to session_id {session_id}")
|
| 56 |
await sse_stream_writer.send({"event": event, "data": data})
|
| 57 |
|
|
@@ -78,16 +79,18 @@ async def handle_post(request: Request):
|
|
| 78 |
|
| 79 |
# Try to find the write_stream, including checking for placeholder IDs
|
| 80 |
write_stream = write_streams.get(session_id)
|
|
|
|
| 81 |
if not write_stream:
|
| 82 |
for sid, ws in list(write_streams.items()):
|
| 83 |
if sid.startswith("placeholder_"):
|
| 84 |
write_streams[session_id] = ws
|
| 85 |
write_streams.pop(sid)
|
| 86 |
write_stream = ws
|
|
|
|
| 87 |
logger.info(f"Associated placeholder {sid} with session_id {session_id}")
|
| 88 |
break
|
| 89 |
|
| 90 |
-
if message.get("method") == "tools/list" and write_stream:
|
| 91 |
response = {
|
| 92 |
"jsonrpc": "2.0",
|
| 93 |
"id": message.get("id"),
|
|
@@ -100,12 +103,12 @@ async def handle_post(request: Request):
|
|
| 100 |
}
|
| 101 |
}
|
| 102 |
response_data = json.dumps(response)
|
| 103 |
-
await
|
| 104 |
-
logger.info(f"Sent tools/list response for session {session_id}")
|
| 105 |
return Response(status_code=202)
|
| 106 |
|
| 107 |
-
if not write_stream:
|
| 108 |
-
logger.error(f"No write_stream found for session_id: {session_id}")
|
| 109 |
return Response(status_code=202)
|
| 110 |
|
| 111 |
await transport.handle_post_message(request.scope, request.receive, request._send)
|
|
|
|
| 18 |
server = Server(name="airtable-mcp")
|
| 19 |
transport = SseServerTransport("/airtable/mcp")
|
| 20 |
|
| 21 |
+
# Store write streams and SSE writers for each session ID
|
| 22 |
write_streams = {}
|
| 23 |
+
sse_writers = {}
|
| 24 |
|
| 25 |
# Configure environment variables (for logging purposes)
|
| 26 |
token = os.getenv("AIRTABLE_API_TOKEN")
|
|
|
|
| 38 |
endpoint_data = f"/airtable/mcp?session_id={{session_id}}"
|
| 39 |
await sse_stream_writer.send({"event": "endpoint", "data": endpoint_data})
|
| 40 |
async for session_message in write_stream_reader:
|
|
|
|
| 41 |
if isinstance(session_message, dict):
|
| 42 |
event = session_message.get("event", "message")
|
| 43 |
data = session_message.get("data", json.dumps(session_message))
|
|
|
|
| 52 |
placeholder_id = f"placeholder_{id(write_stream)}"
|
| 53 |
if placeholder_id in write_streams:
|
| 54 |
write_streams[session_id] = write_streams.pop(placeholder_id)
|
| 55 |
+
sse_writers[session_id] = sse_stream_writer
|
| 56 |
logger.info(f"Updated placeholder {placeholder_id} to session_id {session_id}")
|
| 57 |
await sse_stream_writer.send({"event": event, "data": data})
|
| 58 |
|
|
|
|
| 79 |
|
| 80 |
# Try to find the write_stream, including checking for placeholder IDs
|
| 81 |
write_stream = write_streams.get(session_id)
|
| 82 |
+
sse_writer = sse_writers.get(session_id)
|
| 83 |
if not write_stream:
|
| 84 |
for sid, ws in list(write_streams.items()):
|
| 85 |
if sid.startswith("placeholder_"):
|
| 86 |
write_streams[session_id] = ws
|
| 87 |
write_streams.pop(sid)
|
| 88 |
write_stream = ws
|
| 89 |
+
sse_writers[session_id] = sse_writers.get(sid)
|
| 90 |
logger.info(f"Associated placeholder {sid} with session_id {session_id}")
|
| 91 |
break
|
| 92 |
|
| 93 |
+
if message.get("method") == "tools/list" and write_stream and sse_writer:
|
| 94 |
response = {
|
| 95 |
"jsonrpc": "2.0",
|
| 96 |
"id": message.get("id"),
|
|
|
|
| 103 |
}
|
| 104 |
}
|
| 105 |
response_data = json.dumps(response)
|
| 106 |
+
await sse_writer.send({"event": "message", "data": response_data})
|
| 107 |
+
logger.info(f"Sent tools/list response for session {session_id} via SSE")
|
| 108 |
return Response(status_code=202)
|
| 109 |
|
| 110 |
+
if not write_stream or not sse_writer:
|
| 111 |
+
logger.error(f"No write_stream or SSE writer found for session_id: {session_id}")
|
| 112 |
return Response(status_code=202)
|
| 113 |
|
| 114 |
await transport.handle_post_message(request.scope, request.receive, request._send)
|