Spaces:
Sleeping
Sleeping
Update server.py
Browse files
server.py
CHANGED
|
@@ -18,9 +18,8 @@ app = FastAPI()
|
|
| 18 |
server = Server(name="airtable-mcp")
|
| 19 |
transport = SseServerTransport("/airtable/mcp")
|
| 20 |
|
| 21 |
-
# Store write streams
|
| 22 |
write_streams = {}
|
| 23 |
-
sse_writers = {}
|
| 24 |
|
| 25 |
# Configure environment variables (for logging purposes)
|
| 26 |
token = os.getenv("AIRTABLE_API_TOKEN")
|
|
@@ -52,7 +51,6 @@ 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 |
-
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 |
|
|
@@ -61,7 +59,6 @@ async def handle_sse(request: Request):
|
|
| 61 |
write_stream_reader = write_stream
|
| 62 |
placeholder_id = f"placeholder_{id(write_stream)}"
|
| 63 |
write_streams[placeholder_id] = write_stream
|
| 64 |
-
sse_writers[placeholder_id] = sse_stream_writer
|
| 65 |
logger.info("Starting MCP server with streams")
|
| 66 |
await server.run(read_stream, write_stream, server.create_initialization_options())
|
| 67 |
logger.info("MCP server running")
|
|
@@ -78,21 +75,18 @@ async def handle_post(request: Request):
|
|
| 78 |
session_id = request.query_params.get("session_id")
|
| 79 |
logger.info(f"Received POST with session_id: {session_id}, message: {message}")
|
| 80 |
|
| 81 |
-
# Try to find the write_stream
|
| 82 |
write_stream = write_streams.get(session_id)
|
| 83 |
-
|
| 84 |
-
if not write_stream or not sse_writer:
|
| 85 |
for sid, ws in list(write_streams.items()):
|
| 86 |
if sid.startswith("placeholder_"):
|
| 87 |
write_streams[session_id] = ws
|
| 88 |
-
sse_writers[session_id] = sse_writers.pop(sid, None)
|
| 89 |
write_streams.pop(sid)
|
| 90 |
write_stream = write_streams[session_id]
|
| 91 |
-
sse_writer = sse_writers[session_id]
|
| 92 |
logger.info(f"Associated placeholder {sid} with session_id {session_id}")
|
| 93 |
break
|
| 94 |
|
| 95 |
-
if message.get("method") == "tools/list" and write_stream
|
| 96 |
response = {
|
| 97 |
"jsonrpc": "2.0",
|
| 98 |
"id": message.get("id"),
|
|
@@ -106,26 +100,15 @@ async def handle_post(request: Request):
|
|
| 106 |
}
|
| 107 |
response_data = json.dumps(response)
|
| 108 |
try:
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
await sse_writer.send({"event": "message", "data": response_data})
|
| 112 |
-
logger.info(f"Successfully sent tools/list response for session {session_id} via SSE")
|
| 113 |
-
except anyio.get_cancelled_exc_class():
|
| 114 |
-
logger.error(f"Timeout while sending SSE response for session {session_id}")
|
| 115 |
-
return Response(status_code=202)
|
| 116 |
except Exception as e:
|
| 117 |
-
logger.error(f"Failed to send
|
| 118 |
-
|
| 119 |
-
try:
|
| 120 |
-
await write_stream.send({"event": "message", "data": response_data})
|
| 121 |
-
logger.info(f"Fallback: Successfully sent tools/list response for session {session_id} via write_stream")
|
| 122 |
-
except Exception as fallback_e:
|
| 123 |
-
logger.error(f"Fallback failed for session {session_id}: {str(fallback_e)}")
|
| 124 |
-
return Response(status_code=202)
|
| 125 |
return Response(status_code=202)
|
| 126 |
|
| 127 |
-
if not write_stream
|
| 128 |
-
logger.error(f"No write_stream
|
| 129 |
return Response(status_code=202)
|
| 130 |
|
| 131 |
try:
|
|
|
|
| 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")
|
|
|
|
| 51 |
placeholder_id = f"placeholder_{id(write_stream)}"
|
| 52 |
if placeholder_id in write_streams:
|
| 53 |
write_streams[session_id] = write_streams.pop(placeholder_id)
|
|
|
|
| 54 |
logger.info(f"Updated placeholder {placeholder_id} to session_id {session_id}")
|
| 55 |
await sse_stream_writer.send({"event": event, "data": data})
|
| 56 |
|
|
|
|
| 59 |
write_stream_reader = write_stream
|
| 60 |
placeholder_id = f"placeholder_{id(write_stream)}"
|
| 61 |
write_streams[placeholder_id] = write_stream
|
|
|
|
| 62 |
logger.info("Starting MCP server with streams")
|
| 63 |
await server.run(read_stream, write_stream, server.create_initialization_options())
|
| 64 |
logger.info("MCP server running")
|
|
|
|
| 75 |
session_id = request.query_params.get("session_id")
|
| 76 |
logger.info(f"Received POST with session_id: {session_id}, message: {message}")
|
| 77 |
|
| 78 |
+
# Try to find the write_stream
|
| 79 |
write_stream = write_streams.get(session_id)
|
| 80 |
+
if not write_stream:
|
|
|
|
| 81 |
for sid, ws in list(write_streams.items()):
|
| 82 |
if sid.startswith("placeholder_"):
|
| 83 |
write_streams[session_id] = ws
|
|
|
|
| 84 |
write_streams.pop(sid)
|
| 85 |
write_stream = write_streams[session_id]
|
|
|
|
| 86 |
logger.info(f"Associated placeholder {sid} with session_id {session_id}")
|
| 87 |
break
|
| 88 |
|
| 89 |
+
if message.get("method") == "tools/list" and write_stream:
|
| 90 |
response = {
|
| 91 |
"jsonrpc": "2.0",
|
| 92 |
"id": message.get("id"),
|
|
|
|
| 100 |
}
|
| 101 |
response_data = json.dumps(response)
|
| 102 |
try:
|
| 103 |
+
await write_stream.send({"event": "message", "data": response_data})
|
| 104 |
+
logger.info(f"Successfully sent tools/list response for session {session_id} via write_stream")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
except Exception as e:
|
| 106 |
+
logger.error(f"Failed to send response for session {session_id} via write_stream: {str(e)}")
|
| 107 |
+
return Response(status_code=202)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
return Response(status_code=202)
|
| 109 |
|
| 110 |
+
if not write_stream:
|
| 111 |
+
logger.error(f"No write_stream found for session_id: {session_id}")
|
| 112 |
return Response(status_code=202)
|
| 113 |
|
| 114 |
try:
|