aeonshift commited on
Commit
6d033fe
·
verified ·
1 Parent(s): 3a136c0

Update server.py

Browse files
Files changed (1) hide show
  1. server.py +30 -0
server.py CHANGED
@@ -2,6 +2,7 @@ import os
2
  import json
3
  import logging
4
  import anyio
 
5
  from fastapi import FastAPI, Request
6
  from fastapi.responses import Response
7
  from sse_starlette import EventSourceResponse
@@ -53,6 +54,10 @@ async def handle_sse(request: Request):
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
 
57
  sse_stream_writer, sse_stream_reader = anyio.create_memory_object_stream(0)
58
  async with transport.connect_sse(request.scope, request.receive, request._send) as (read_stream, write_stream):
@@ -86,6 +91,31 @@ async def handle_post(request: Request):
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",
 
2
  import json
3
  import logging
4
  import anyio
5
+ import asyncio
6
  from fastapi import FastAPI, Request
7
  from fastapi.responses import Response
8
  from sse_starlette import EventSourceResponse
 
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
+ # Keep-alive loop to maintain the SSE connection
58
+ while True:
59
+ await sse_stream_writer.send({"event": "ping", "data": "keep-alive"})
60
+ await asyncio.sleep(15) # Send keep-alive every 15 seconds
61
 
62
  sse_stream_writer, sse_stream_reader = anyio.create_memory_object_stream(0)
63
  async with transport.connect_sse(request.scope, request.receive, request._send) as (read_stream, write_stream):
 
91
  logger.info(f"Associated placeholder {sid} with session_id {session_id}")
92
  break
93
 
94
+ if message.get("method") == "initialize" and write_stream:
95
+ response = {
96
+ "jsonrpc": "2.0",
97
+ "id": message.get("id"),
98
+ "result": {
99
+ "protocolVersion": "2025-03-26",
100
+ "capabilities": {
101
+ "tools": {"listChanged": True},
102
+ "prompts": {"listChanged": False},
103
+ "resources": {"subscribe": False, "listChanged": False},
104
+ "logging": {},
105
+ "experimental": {}
106
+ },
107
+ "serverInfo": {
108
+ "name": "airtable-mcp",
109
+ "version": "1.0.0"
110
+ },
111
+ "instructions": "Airtable MCP server for listing and creating records."
112
+ }
113
+ }
114
+ response_data = json.dumps(response)
115
+ await write_stream.send({"event": "message", "data": response_data})
116
+ logger.info(f"Sent initialize response for session {session_id} via write_stream")
117
+ return Response(status_code=202)
118
+
119
  if message.get("method") == "tools/list" and write_stream:
120
  response = {
121
  "jsonrpc": "2.0",