aeonshift commited on
Commit
3a136c0
·
verified ·
1 Parent(s): 79f070a

Update server.py

Browse files
Files changed (1) hide show
  1. server.py +10 -27
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 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")
@@ -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 and SSE writer
82
  write_stream = write_streams.get(session_id)
83
- sse_writer = sse_writers.get(session_id)
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 and sse_writer:
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
- # Use a timeout to prevent hanging
110
- async with anyio.fail_after(5): # 5-second timeout
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 SSE response for session {session_id}: {str(e)}")
118
- # Fallback: Try sending directly through write_stream
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 or not sse_writer:
128
- logger.error(f"No write_stream or SSE writer found for session_id: {session_id}")
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: