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:
|