name: "mcp" description: "TypeScript MCP server development with geospatial tools, KQL Eventhouse queries, and Microsoft Fabric IQ ontology. USE FOR: mcp server, mcp tools, openmeteo, noaa wind, notam zones, nominatim geocoding, elevation api, sunrise sunset, air quality, osm poi, kql query, eventhouse table, balloon_telemetry, weather_observations, flight_alerts, fabric iq ontology, fabric extensibility, vitest tests. DO NOT USE FOR: Python simulator code, React components, CopilotKit hooks, frontend styling, CSS, event hubs producer, pytest."
Overview
The SkyNav MCP server exposes 8 geospatial tools via the Model Context Protocol, enabling LLMs and the CopilotKit agent to query weather, aviation zones, and geographic data. It also manages KQL queries for Eventhouse analytics and Fabric IQ ontology definitions.
MCP Server Architecture
Tool Registry
| Tool | API Source | Purpose |
|---|---|---|
get-weather |
OpenMeteo | Current conditions and hourly forecast at coordinates |
get-wind-profile |
NOAA GFS | Wind speed/direction at multiple altitude levels |
get-notams |
FAA NOTAM API | Active aviation notices in a geographic area |
geocode |
Nominatim | Forward/reverse geocoding for location names |
get-elevation |
Open-Elevation | Terrain height at coordinates |
get-sun-times |
sunrise-sunset.org | Dawn, sunrise, sunset, dusk times |
get-air-quality |
OpenMeteo AQI | PM2.5, PM10, AQI at coordinates |
search-pois |
OSM Overpass | Nearby points of interest (landing sites, hospitals) |
Tool Implementation Pattern
server.tool(
"tool-name",
{ param: z.string().describe("What this param is for") },
async ({ param }) => {
const data = await fetchFromApi(param);
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
);
KQL Query Patterns
Eventhouse Tables
| Table | Key Columns | Purpose |
|---|---|---|
balloon_telemetry |
balloon_id, timestamp, latitude, longitude, altitude_m |
Real-time position and metrics |
weather_observations |
station_id, timestamp, temperature, wind_speed |
Weather station data |
flight_alerts |
alert_id, balloon_id, severity, timestamp, message |
Operational alerts |
Common Query Patterns
// Time-window aggregation
balloon_telemetry
| where timestamp between (ago(1h) .. now())
| summarize avg_alt = avg(altitude_m), max_alt = max(altitude_m)
by balloon_id, bin(timestamp, 5m)
// Anomaly detection
balloon_telemetry
| where balloon_id == "B-001"
| make-series alt = avg(altitude_m) on timestamp step 1m
| extend anomalies = series_decompose_anomalies(alt)
Fabric IQ Ontology
Six entities with N:N relationships:
- Balloon ↔ Pilot (via PilotBalloonCertification)
- Balloon → Flight (one-to-many)
- Flight → Site (launch/landing sites)
- Site ↔ RestrictedZone (proximity)
- Flight ↔ WeatherWindow (flight-weather correlation)
Entity YAML files live in ontology/entities/ with properties, relationships, measures, and synonyms sections.
Testing Strategy
- Vitest with MSW for mocking all external HTTP APIs
- One test file per MCP tool:
__tests__/tools/{tool-name}.test.ts - Test both success responses and error handling paths
- Validate Zod schemas reject invalid inputs
- KQL query tests validate string output against expected patterns
When NOT to Use
- Python telemetry simulator → use
iot-telemetryskill - React dashboard components → use
reactjsskill - CopilotKit hooks and actions → use
reactjsskill