aakashdg commited on
Commit
ab37e84
·
verified ·
1 Parent(s): 775edf3

feat (v0 adding MCP server wrapper)

Browse files
Files changed (1) hide show
  1. mcp_server.py +98 -0
mcp_server.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 servers.weather import WeatherServer
19
+ from servers.soil import SoilPropertiesServer
20
+ from servers.water import WaterServer
21
+ from servers.elevation import ElevationServer
22
+ from servers.pests import PestsServer
23
+
24
+ # Create MCP server
25
+ mcp = FastMCP("farmer-chat")
26
+
27
+ # Initialize data servers
28
+ weather = WeatherServer()
29
+ soil = SoilPropertiesServer()
30
+ water = WaterServer()
31
+ elevation = ElevationServer()
32
+ pests = PestsServer()
33
+
34
+
35
+ # ============================================================================
36
+ # MCP TOOLS
37
+ # ============================================================================
38
+
39
+ @mcp.tool()
40
+ async def get_weather(latitude: float, longitude: float) -> dict:
41
+ """Get current weather and 7-day forecast from Open-Meteo API."""
42
+ return await weather.get_data(latitude, longitude)
43
+
44
+
45
+ @mcp.tool()
46
+ async def get_soil_properties(latitude: float, longitude: float) -> dict:
47
+ """Get soil composition (clay, sand, silt, pH, organic carbon) from Google Earth Engine."""
48
+ return await soil.get_data(latitude, longitude)
49
+
50
+
51
+ @mcp.tool()
52
+ async def get_groundwater(latitude: float, longitude: float) -> dict:
53
+ """Get groundwater levels and drought status from NASA GRACE satellite data."""
54
+ return await water.get_data(latitude, longitude)
55
+
56
+
57
+ @mcp.tool()
58
+ async def get_elevation(latitude: float, longitude: float) -> dict:
59
+ """Get terrain elevation from OpenElevation API."""
60
+ return await elevation.get_data(latitude, longitude)
61
+
62
+
63
+ @mcp.tool()
64
+ async def get_pest_observations(latitude: float, longitude: float) -> dict:
65
+ """Get recent pest/insect observations within 50km from iNaturalist."""
66
+ return await pests.get_data(latitude, longitude)
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),
75
+ water.get_data(latitude, longitude),
76
+ elevation.get_data(latitude, longitude),
77
+ pests.get_data(latitude, longitude),
78
+ return_exceptions=True
79
+ )
80
+
81
+ def safe(r):
82
+ return r if not isinstance(r, Exception) else {"status": "error", "error": str(r)}
83
+
84
+ return {
85
+ "weather": safe(results[0]),
86
+ "soil": safe(results[1]),
87
+ "groundwater": safe(results[2]),
88
+ "elevation": safe(results[3]),
89
+ "pests": safe(results[4])
90
+ }
91
+
92
+
93
+ # ============================================================================
94
+ # RUN
95
+ # ============================================================================
96
+
97
+ if __name__ == "__main__":
98
+ mcp.run(transport="stdio")