aakashdg commited on
Commit
0314ff4
·
verified ·
1 Parent(s): d4ccd54

fix (adding Starlette app for SSE to tackle hf proxy issues)

Browse files
Files changed (1) hide show
  1. mcp_server.py +45 -10
mcp_server.py CHANGED
@@ -1,18 +1,17 @@
1
  """
2
- Farmer.chat MCP Server
3
- Minimal wrapper exposing existing servers as MCP tools
4
-
5
- Usage:
6
- Local (stdio): python mcp_server.py
7
- Remote (SSE): Mount in FastAPI with mcp.sse_app()
8
  """
9
 
10
  from mcp.server.fastmcp import FastMCP
11
- import asyncio
 
 
 
 
12
  import sys
13
  import os
14
 
15
- # Add parent dir to path for imports
16
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
17
 
18
  from src.servers.weather import WeatherServer
@@ -67,8 +66,10 @@ async def get_pest_observations(latitude: float, longitude: float) -> dict:
67
 
68
 
69
  @mcp.tool()
70
- async def get_all_data(latitude: float, longitude: float) -> dict:
71
  """Get data from all sources in parallel (weather, soil, water, elevation, pests)."""
 
 
72
  results = await asyncio.gather(
73
  weather.get_data(latitude, longitude),
74
  soil.get_data(latitude, longitude),
@@ -91,7 +92,41 @@ async def get_all_data(latitude: float, longitude: float) -> dict:
91
 
92
 
93
  # ============================================================================
94
- # RUN
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  # ============================================================================
96
 
97
  if __name__ == "__main__":
 
1
  """
2
+ MCP SSE Transport for HuggingFace Spaces
3
+ Manual SSE setup that works behind HF's proxy
 
 
 
 
4
  """
5
 
6
  from mcp.server.fastmcp import FastMCP
7
+ from mcp.server.sse import SseServerTransport
8
+ from starlette.applications import Starlette
9
+ from starlette.routing import Route, Mount
10
+ from starlette.requests import Request
11
+
12
  import sys
13
  import os
14
 
 
15
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
16
 
17
  from src.servers.weather import WeatherServer
 
66
 
67
 
68
  @mcp.tool()
69
+ async def get_all_farm_data(latitude: float, longitude: float) -> dict:
70
  """Get data from all sources in parallel (weather, soil, water, elevation, pests)."""
71
+ import asyncio
72
+
73
  results = await asyncio.gather(
74
  weather.get_data(latitude, longitude),
75
  soil.get_data(latitude, longitude),
 
92
 
93
 
94
  # ============================================================================
95
+ # SSE TRANSPORT SETUP (Works with HF Spaces)
96
+ # ============================================================================
97
+
98
+ def create_sse_app():
99
+ """Create Starlette app with proper SSE transport for remote hosting."""
100
+
101
+ sse_transport = SseServerTransport("/messages/")
102
+
103
+ async def handle_sse(request: Request):
104
+ async with sse_transport.connect_sse(
105
+ request.scope,
106
+ request.receive,
107
+ request._send,
108
+ ) as (read_stream, write_stream):
109
+ await mcp._mcp_server.run(
110
+ read_stream,
111
+ write_stream,
112
+ mcp._mcp_server.create_initialization_options(),
113
+ )
114
+
115
+ return Starlette(
116
+ debug=True,
117
+ routes=[
118
+ Route("/sse", endpoint=handle_sse),
119
+ Mount("/messages/", app=sse_transport.handle_post_message),
120
+ ],
121
+ )
122
+
123
+
124
+ # Create the SSE app for mounting
125
+ sse_app = create_sse_app()
126
+
127
+
128
+ # ============================================================================
129
+ # STANDALONE RUN (for local testing)
130
  # ============================================================================
131
 
132
  if __name__ == "__main__":