CorporateTravel Dispatch MCP
OfficialThe CorporateTravel Dispatch MCP server provides tools for operational dispatch, flight tracking, and administrative control, focused on aviation and ground transportation logistics primarily in the DC area.
Platform Health & Feed Monitoring
Check service health, feed freshness, and error states for all data sources (TFR, METAR, NWS, NOTAM, Amtrak, ATCSCC, runsheet)
Airspace & Aviation Data
Retrieve active FAA Temporary Flight Restrictions (TFRs), including AI-enriched versions with threat level, movement type (POTUS/Marine One/AF1), and plain-language summaries
Fetch active NOTAMs for DC-area airports
Access the FAA ATCSCC National Operations Plan (ground delays, ground stops, miles-in-trail restrictions)
Weather
Get DC-area METAR snapshots (ceiling, visibility, wind, flight category) for KIAD, KDCA, KBWI
Retrieve active NWS weather alerts (warnings, watches, advisories) for the DC metro region
HEMS & Ground Operations
Query the Critical Predictability State (CPS) — a go/no-go score for HEMS operations based on ceiling, visibility, wind, precipitation, airspace, and GDP
Get ground route impact assessments for DC-area chauffeur corridors with recommended adjustments
Check Amtrak train status at Washington Union Station (Acela, NE Regional)
Access the active trip runsheet with client, pickup, destination, and status details (requires Tailscale)
Daily Briefing
Retrieve an AI-generated daily operational brief synthesizing TFRs, weather, CPS, NWS alerts, and ATCSCC ops plan
VIP Flight Watchlist
List, add, and remove flights/persons/ground subjects from a VIP watchlist for automated ntfy push monitoring
Live Flight Tracking (ADS-B via airplanes.live)
Look up real-time aircraft position by ICAO callsign, tail/registration number, or confirmed ICAO 24-bit hex address
Admin Tools (requires DISPATCH_TOKEN)
Extended health check with internal queue and container status
Force-refresh any named data feed on demand
Trigger immediate CPS recomputation or ATCSCC ops plan snapshot
Send push notifications via ntfy with configurable priority
View the append-only audit log (90-day retention)
Sends push notifications via ntfy.sh for alerting and monitoring.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@CorporateTravel Dispatch MCP check active TFRs near DC"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
corporatetravel-dispatch-mcp
Last verified against code: 2026-08-11
Right repo? You want
corporatetravel-dispatch-mcp(this one) for the MCP server. The dispatch platform source lives atcorporatetraveldc-dispatch. The public mirror is atctdi-dispatch.
MCP server exposing the CS Executive Services dispatch platform (Raspberry Pi 5 based), airplanes.live flight tracking, and airframes.io ACARS as portable, agent-agnostic tools. Works with any MCP-compatible agent: Claude Code, Cline, Cursor, Zed, Windsurf, and — via two mcpo HTTP bridges — Open WebUI locally and remote integrations (e.g. a Claude.ai custom connector) publicly.
ALL Public Commits are GPG signed using Key: ABD3976FCC006E0F3FE559177286B3118BA4EFB2. Pubkey is included in this repo as
ABD3976FCC006E0F3FE559177286B3118BA4EFB2.gpg.
Tools (34 total; 26 in public-safe mode)
Tool registration lives in dispatch_mcp/tools/__init__.py:
register(mcp, public_safe: bool). With DISPATCH_MCP_PUBLIC_SAFE=1 the
admin module (7 tools) and second_brain package (1 tool) are never
loaded — not merely gated — leaving the 26-tool public-safe subset. Counts
verified 2026-08-11 with grep -rc "@mcp.tool" dispatch_mcp/tools/ and against
both running mcpo instances' /openapi.json (34 paths private, 26 public).
Dispatch platform — Tier 0 (no auth required) — tools/dispatch.py
Tool | Endpoint | Description |
|
| Service health + snapshot ages |
|
| Feed freshness and error state |
|
| Active TFRs from FAA |
|
| TFRs with AI threat interpretation |
|
| DC-area METAR snapshot |
|
| Active NWS weather alerts |
|
| Active NOTAMs (requires FAA key on Pi) |
|
| Critical Predictability State (HEMS go/no-go) |
|
| Ground route impact assessment |
|
| Amtrak status at WAS |
|
| AI-generated daily operational brief |
|
| FAA ATCSCC National Operations Plan |
|
| Active trip runsheet (Tailscale-only, sends bearer token) |
|
| Pi network data usage (vnstat daily log) |
Dispatch platform — Watchlist — tools/dispatch.py (bearer token sent)
Tool | Method + route | Description |
|
| List active VIP watchlist sessions |
|
| Add subject to watchlist (typed routes; generic/ground/person not yet supported) |
|
| Remove watchlist session |
Dispatch platform — FIDS — tools/fids.py
Tool | Endpoint | Description |
|
| Confirmed gate, baggage carousel, arrival status (DCA/IAD, MWAA) |
|
| FIDS feed health/freshness snapshot (DCA/IAD) |
|
| Forward-looking arrivals, DCA/IAD/BWI (SWIM + website + AeroAPI) |
FAA Aircraft Registry — tools/aircraft.py (local cache on the Pi, updated weekly)
Tool | Endpoint | Description |
|
| Look up aircraft by N-number or ICAO hex |
|
| Local registry cache status |
Admin — tools/admin.py (requires DISPATCH_TOKEN; excluded in public-safe mode)
Tool | Route | Description |
|
| Extended health check |
|
| Force-refresh a named feed (metar, nws, tfr, notam, amtrak, atcscc_opsplan, runsheet) |
|
| Force CPS recomputation |
|
| Force opsplan fetch |
|
| Send ntfy push notification |
|
| View audit log (append-only, 90-day retention) |
|
| Last ctdi-watchdog run result (lives in admin.py, so excluded in public-safe mode despite the name) |
Second Brain — tools/second_brain/remember.py (requires DISPATCH_TOKEN; excluded in public-safe mode)
Tool | Route | Description |
|
| Capture a manual note into the second-brain vault ( |
Flight Tracking — airplanes.live — tools/flight.py (no auth)
Tool | Description |
| ADS-B position lookup by ICAO callsign |
| ADS-B position + hex by tail number |
| ADS-B position by confirmed ICAO 24-bit hex |
Hex resolution order: callsign → registration → hex. Always confirm hex via
flight_get_by_registration before adding to watchlist — hex is airframe-bound;
callsign-to-hex mappings can be stale day-over-day.
ACARS — airframes.io — tools/acars.py (no auth)
Tool | Description |
| Recent ACARS/VDL2/HFDL messages for an airframe hex |
Related MCP server: quads-mcp
Security model: no per-caller auth on admin/second-brain tools
admin._check_token() only verifies the process has a DISPATCH_TOKEN
configured — it does not verify the MCP caller presented anything. Every
outbound admin call uses that one fixed token regardless of caller. These
tools are therefore only safe on instances where reachability itself is the
access control (stdio on your own machine, or the loopback/tailnet mcpo
instance). Any instance fronted by a public hostname must run with
DISPATCH_MCP_PUBLIC_SAFE=1, which never loads them at all. See
docs/mcpo-openwebui.md for the two-instance
deployment that enforces this.
Install
pip install -e .Requires Python 3.11+. Dependencies (declared in pyproject.toml): mcp[cli],
httpx, pydantic, and jsonschema.
Why jsonschema is pinned here:
mcp/server/lowlevel/server.pyimportsjsonschemaunconditionally, but themcppackage does not declare it and themcp[cli]extra does not reliably pull it in. Without it the server crashes at import. Declared explicitly in this repo'spyproject.tomlas of 2026-08-11.
Public mirror gap (2026-08-11): the public GitHub mirror (
corporatetravel-dispatch-mcppublic copy) is missing thepublic_saferegistration-mode commits. Anyone installing from the public repo'spip install git+https://...instructions gets a build with no way to exclude admin/second_brain tools. Until the mirror is re-synced, do not build a publicly exposed instance from the public repo.
Configure
Env var | Default | Notes |
|
| Tailscale address of the Pi — primary. |
|
| Tried only on transport-level failure of the primary (connect/timeout), never on HTTP 4xx/5xx. CF Access gates POST routes there, so admin failover may 401/403. |
| (empty) | Required for admin/second-brain tools ( |
|
| Dispatch HTTP timeout (seconds) |
|
| airplanes.live timeout (seconds) |
|
| airframes.io ACARS aggregator |
|
| airframes.io timeout (seconds) |
|
|
|
|
| Port when transport=http |
| (unset) |
|
Retired hostname:
ops.csexecutiveservices.comis fully retired and hard-rejected app-side (dispatch platformrunner/main.py_RETIRED_HOSTNAMES). It must not appear in any config. Older docs and examples that referenced it as the defaultDISPATCH_BASE_URLare obsolete.
Use with Claude Code
Register at user scope (persists across projects):
claude mcp add dispatch \
-e DISPATCH_BASE_URL=http://100.94.80.100:8000 \
-e DISPATCH_TOKEN=your-token-here \
--scope user \
-- dispatch-mcpOr add to ~/.claude/.claude.json directly under "mcpServers":
{
"mcpServers": {
"dispatch": {
"type": "stdio",
"command": "/full/path/to/dispatch-mcp",
"args": [],
"env": {
"DISPATCH_BASE_URL": "http://100.94.80.100:8000",
"DISPATCH_TOKEN": "your-token-here"
}
}
}
}On the Pi itself, dispatch-mcp-wrapper.sh (repo root) is the preferred
command: it extracts DISPATCH_ADMIN_TOKEN from
/etc/corporatetraveldc/dispatch-secrets.env without sourcing the file as
bash, exports it as DISPATCH_TOKEN, and execs the venv binary at
/opt/corporatetraveldc/corporatetravel-dispatch-mcp/venv/bin/dispatch-mcp.
Both deployed mcpo services use this wrapper.
Use with Cline / Cursor / Zed / Windsurf
Same MCP JSON config block — each supports mcpServers in their settings file.
Point command at the installed dispatch-mcp binary or python -m dispatch_mcp.server.
Use with Open WebUI / Claude.ai / HTTP clients
See docs/mcpo-openwebui.md. Two separate mcpo bridge instances run on the Pi:
Private, full toolset (34):
corporatetraveldc-mcpo.service, port8082, no public hostname — Open WebUI consumes it viahost.containers.internal:8082.Public-safe (26):
corporatetraveldc-mcpo-public.service, port8083(loopback-bound),DISPATCH_MCP_PUBLIC_SAFE=1, fronted by nginx + Cloudflare Tunnel athttps://mcp.csexecutiveservices.com— the endpoint remote integrations (e.g. a Claude.ai custom connector) use.
Context efficiency and plan compatibility
MCP tool responses are structured and compact — each tool returns only the data the agent actually needs, rather than dumping raw API payloads into the context window. This matters for subscription plan users:
Claude Pro — operational dispatch workflows (TFR checks, CPS queries, flight lookups, daily brief) stay well within the message window because context stays lean. Pairing with a context guardian skill (e.g. the
dispatch-context-guardianCowork skill bundled with this deployment) automatically compacts sessions before they hit plan limits.Claude Max / API — compact responses reduce per-request token cost and latency.
Cline / Cursor / Windsurf — same economy; MCP tool calls consume far fewer tokens than equivalent REST-then-paste workflows.
Verify syntax
python -m py_compile \
dispatch_mcp/server.py \
dispatch_mcp/config.py \
dispatch_mcp/client.py \
dispatch_mcp/tools/__init__.py \
dispatch_mcp/tools/dispatch.py \
dispatch_mcp/tools/flight.py \
dispatch_mcp/tools/admin.py \
dispatch_mcp/tools/aircraft.py \
dispatch_mcp/tools/acars.py \
dispatch_mcp/tools/fids.py \
dispatch_mcp/tools/second_brain/__init__.py \
dispatch_mcp/tools/second_brain/remember.py
echo "All clean"Notes
Tier 0 endpoints (
/api/v1/*) require no authentication.dispatch_get_runsheetis Tailscale-gated and only works against the default TailscaleDISPATCH_BASE_URL.Admin endpoints require
DISPATCH_TOKEN. Create tokens on the Pi:csex-token create.dispatch.csexecutiveservices.comhas Cloudflare Access on POST routes; it is the transport-failure fallback only, not the primary.ops.csexecutiveservices.comis retired and hard-rejected — never use it.CUI rules: this server never generates or exposes SHARES/HEARS/HEART frequencies. The platform ships with empty placeholder credential files.
License
MIT
Available Tools
25 toolsdispatch_admin_force_opsplan_snapshotAIdempotent
Force an immediate ATCSCC ops plan snapshot.
Triggers a fetch and parse of the current ATCSCC National Operations Plan outside the normal polling schedule. Requires DISPATCH_TOKEN env var to be set.
Returns: str: JSON confirmation or error string.
Examples: - "Force opsplan refresh" -> call with no params
Inputs: no named parameters. Returns: result
dispatch_admin_force_recompute_cpsAIdempotent
Force an immediate recomputation of the Critical Predictability State (CPS).
CPS is normally recomputed after each feed update. Use this to trigger recomputation immediately, e.g. after a manual feed refresh. Requires DISPATCH_TOKEN env var to be set.
Returns: str: JSON with new CPS state and score, or error string.
Examples: - "Recompute CPS now" -> call with no params
Inputs: no named parameters. Returns: result
dispatch_admin_get_audit_logARead-onlyIdempotent
Get the dispatch platform audit log (append-only, 90-day retention).
Returns recent audit log entries. Log is append-only and never leaves the Pi. Requires DISPATCH_TOKEN env var to be set.
Returns: str: JSON list of audit log entries with timestamp, action, and detail.
Examples: - "Show recent audit log entries" -> call (token required)
Inputs: no named parameters. Returns: result
dispatch_admin_healthARead-onlyIdempotent
Get extended admin health check for the dispatch platform (requires token).
Returns more detailed health data than the public /healthz endpoint, including internal queue state, container status, and error counts. Requires DISPATCH_TOKEN env var to be set.
Returns: str: JSON admin health object, or error string if token missing/invalid.
Examples: - "Show admin health status" -> call (token required)
Inputs: no named parameters. Returns: result
dispatch_admin_refresh_feedAIdempotent
Force an immediate refresh of a specific dispatch data feed.
Bypasses the normal polling interval and triggers an immediate fetch for the named feed. Useful when a feed is stale or in an error state. Requires DISPATCH_TOKEN env var to be set.
Args: params (RefreshFeedInput): - feed_name (str): One of: metar, nws, tfr, notam, amtrak, atcscc_opsplan, runsheet
Returns: str: JSON confirmation with refresh result, or error string.
Examples: - "Refresh the TFR feed" -> params.feed_name='tfr' - "Force weather update" -> params.feed_name='metar'
Inputs: params (required). Returns: result
dispatch_admin_send_push_alertA
Send a push notification via ntfy through the dispatch platform.
Fires a notification to the configured ntfy topics on the Pi. Use priority 5 for urgent alerts (e.g. Marine One TFR, weather emergency). Requires DISPATCH_TOKEN env var to be set.
Args: params (PushAlertInput): - message (str): Alert text, max 1000 chars - title (str, optional): Notification title (default: 'Dispatch Alert') - priority (int, optional): 1-5, default 3 (4=high, 5=urgent)
Returns: str: JSON confirmation or error string.
Examples: - "Send test alert" -> params.message='Test alert from MCP', priority=3 - "Send urgent Marine One alert" -> params.message='Marine One TFR active P-56', priority=5
Inputs: params (required). Returns: result
dispatch_get_alertsARead-onlyIdempotent
Get active National Weather Service alerts for the DC metro region.
Pulls from api.weather.gov for the DC area. Returns warnings, watches, advisories, and statements currently in effect.
Returns: str: JSON list of alert objects. Each alert includes: id (str), event (str, e.g. 'Winter Storm Warning'), headline (str), description (str), severity (str), certainty (str), urgency (str), effective (str), expires (str), areas (list[str]).
Examples: - "Are there any weather alerts for DC?" -> call, check array length - "Any tornado warnings active?" -> call, filter by event containing 'Tornado'
Inputs: no named parameters. Returns: result
dispatch_get_amtrakARead-onlyIdempotent
Get current Amtrak train status at Washington Union Station (WAS/WASH).
Returns arrival and departure status for trains at WAS. Covers Acela and NE Regional services on the NEC corridor. Requires AMTRAK_FEED_URL to be configured on the Pi (push-primary ingest or poller fallback).
Returns: str: JSON object with 'trains' list. Each train: train_number (str), route_name (str), direction (str: NORTH/SOUTH), scheduled_time (str), estimated_time (str|null), status (str), delay_minutes (int), platform (str|null), last_updated (str).
Examples: - "Is the Acela arriving on time?" -> call, filter route_name by 'Acela' - "How delayed is train 95?" -> call, find by train_number, check delay_minutes
Inputs: no named parameters. Returns: result
dispatch_get_briefARead-onlyIdempotent
Get the AI-generated daily operational brief for CS Executive Services.
Synthesizes TFR status, weather, CPS score, NWS alerts, and ATCSCC ops plan into a concise executive brief suitable for morning standup or client briefing. Brief is cached and regenerated periodically by the poller.
Returns: str: JSON object with: brief_text (str: full plain-language brief), generated_at (str: ISO timestamp), cps_state (str: GO/CAUTION/NO-GO at brief generation time), tfr_count (int), alert_count (int).
Examples: - "What's the daily brief?" -> call, return brief_text to user - "Summarize today's operational picture" -> call, synthesize brief_text
Inputs: no named parameters. Returns: result
dispatch_get_cpsARead-onlyIdempotent
Get the current Critical Predictability State (CPS) — the HEMS go/no-go score.
CPS is computed from six factors: ceiling, visibility, wind, precipitation, airspace restriction, and GDP (Ground Delay Program). Final state is one of: GO, CAUTION, or NO-GO per Part 135.609 thresholds.
Returns: str: JSON object with: state (str: GO/CAUTION/NO-GO), score (float: 0.0-1.0), factors: { ceiling: {value, score, label}, visibility: {value, score, label}, wind: {value, score, label}, precip: {value, score, label}, airspace: {value, score, label}, gdp: {value, score, label} }, computed_at (str: ISO timestamp).
Examples: - "Is it a go for HEMS operations?" -> call, check state field - "What's limiting the CPS score?" -> call, find lowest factor scores
Inputs: no named parameters. Returns: result
dispatch_get_feedsARead-onlyIdempotent
Get freshness and error state for all dispatch data feeds.
Returns per-feed metadata: last_updated timestamp, age_seconds, whether the feed is in an error state, and the last error message if any.
Returns: str: JSON dict keyed by feed name (tfr, metar, nws, notam, amtrak, atcscc_opsplan, runsheet). Each entry includes last_updated, age_seconds, error (bool), error_msg (str|null).
Examples: - "Which feeds are stale or erroring?" -> call and filter error==true - "When was weather last updated?" -> call, check metar.last_updated
Inputs: no named parameters. Returns: result
dispatch_get_notamsARead-onlyIdempotent
Get active NOTAMs (Notices to Air Missions) from the dispatch platform.
Requires FAA_NOTAM_API_KEY to be configured on the Pi. Returns NOTAMs from the FAA NOTAM API covering DC-area airports and airspace.
Returns: str: JSON list of NOTAM objects, or feed-error string if key not configured. Each NOTAM includes: id, type, location, effective_start, effective_end, text (raw NOTAM text).
Examples: - "Any NOTAMs for KIAD?" -> call, filter by location=='KIAD' - "Are there any runway closures at DCA?" -> call, filter by location and text
Inputs: no named parameters. Returns: result
dispatch_get_opsplanARead-onlyIdempotent
Get the current FAA ATCSCC National Operations Plan snapshot.
Returns the current day's ATCSCC ops plan from aviationweather.gov/node/1, which includes ground delay programs, ground stops, miles-in-trail restrictions, and other national ATCSCC advisories.
Returns: str: JSON object with: snapshot_time (str: ISO timestamp), programs (list[dict]): each entry has type, facility, reason, avg_delay_minutes, scope, start_time, end_time. raw_text (str: full ops plan text).
Examples: - "Are there any ground delays at IAD?" -> call, filter programs by facility - "What's the ATCSCC situation today?" -> call, return programs list
Inputs: no named parameters. Returns: result
dispatch_get_routeARead-onlyIdempotent
Get current ground route impact assessment for DC-area chauffeur operations.
Evaluates active TFRs, weather alerts, and airspace restrictions against common executive transportation corridors. Returns impact level and recommended route adjustments.
Returns: str: JSON object with: impact_level (str: NONE/LOW/MODERATE/HIGH/SEVERE), factors (list[str]: active impact sources), recommendations (list[str]: suggested route adjustments), computed_at (str: ISO timestamp).
Examples: - "Will TFRs affect our route today?" -> call, check impact_level - "Any route adjustments needed?" -> call, check recommendations list
Inputs: no named parameters. Returns: result
dispatch_get_runsheetARead-onlyIdempotent
Get the active trip runsheet for today's chauffeur operations.
NOTE: This endpoint is Tier 1 — it requires Tailscale network access (100.x.x.x range) or will return 403. Set DISPATCH_BASE_URL to the Tailscale address (http://100.94.80.100:8000) to access this endpoint.
Returns: str: JSON object with 'trips' list. Each trip includes: trip_id (str), client_name (str), pickup_time (str), pickup_location (str), destination (str), notes (str), status (str: PENDING/ACTIVE/COMPLETE). Returns 403 error if not on Tailscale.
Examples: - "What trips do we have today?" -> call (requires Tailscale) - "What time is the first pickup?" -> call, find earliest pickup_time
Inputs: no named parameters. Returns: result
dispatch_get_tfrARead-onlyIdempotent
Get all active Temporary Flight Restrictions (TFRs) from the dispatch platform.
Returns raw TFR list parsed from FAA tfr.faa.gov XML feed. Each TFR includes location, altitude floor/ceiling, effective time window, and type code. For AI-enriched TFRs with threat interpretation, use dispatch_get_tfr_enriched.
Returns: str: JSON list of active TFR objects, or error string. Each TFR includes: notam_id, type, location, floor_ft, ceiling_ft, effective_start, effective_end, description.
Examples: - "Are there any active TFRs?" -> call, check array length - "Are there VIP or POTUS TFRs active?" -> call, filter by type or description
Inputs: no named parameters. Returns: result
dispatch_get_tfr_enrichedARead-onlyIdempotent
Get active TFRs with AI-generated threat interpretation and enrichment.
Same TFR data as dispatch_get_tfr but with additional fields: threat_level, movement_type (e.g. POTUS, VVIP), pattern match flags for Marine One and Air Force One indicators, and plain-language summary of each TFR.
Returns: str: JSON list of enriched TFR objects. Additional fields beyond raw TFR: threat_level (str), movement_type (str|null), is_marine_one (bool), is_af1 (bool), summary (str).
Examples: - "Any Marine One TFRs right now?" -> call, filter is_marine_one==true - "What's the threat level of active TFRs?" -> call, check threat_level fields
Inputs: no named parameters. Returns: result
dispatch_get_weatherARead-onlyIdempotent
Get the current METAR weather snapshot for DC-area airports.
Returns parsed METARs from AviationWeather.gov ADDS for stations in and around the DC area (KIAD, KDCA, KBWI, KJYO, KHEF, KCGS, etc.). Data includes ceiling, visibility, wind, temperature, altimeter.
Returns: str: JSON dict with 'stations' list. Each station entry: icao (str), obs_time (str), wind_dir (int|null), wind_speed_kt (int), wind_gust_kt (int|null), visibility_sm (float), ceiling_ft (int|null), temp_c (float), dewpoint_c (float), altimeter_inhg (float), flight_category (str: VFR/MVFR/IFR/LIFR), raw_metar (str).
Examples: - "What's the ceiling at Dulles?" -> call, find KIAD entry, check ceiling_ft - "Is it VFR at DC area airports?" -> call, check flight_category per station
Inputs: no named parameters. Returns: result
dispatch_health_checkARead-onlyIdempotent
Check the health of the CS Executive Services dispatch platform.
Returns service health summary including API status and snapshot age for each data feed. Use this first to verify the platform is reachable before querying individual feeds.
Returns: str: JSON with 'status' field and per-feed freshness, or error string.
Examples: - "Is the dispatch platform up?" -> call with no params - "How old is the TFR data?" -> call, check 'tfr.age_seconds' in response
Inputs: no named parameters. Returns: result
dispatch_watchlist_addA
Add a subject to the VIP watchlist for automated dispatch monitoring.
Creates a new watchlist session. For flight tracking, provide the confirmed ICAO hex address (use flight_get_by_callsign or flight_get_by_registration to resolve hex before adding). The dispatch poller will send ntfy push alerts for tracked events.
Args: params (WatchlistAddInput): - session_type (str): 'flight', 'ground', or 'person' - subject (str): Human label, e.g. 'KLM651' or 'POTUS' - hex (str, optional): ICAO 24-bit hex, required for flight sessions - registration (str, optional): Aircraft tail number - destination_icao (str, optional): 4-letter ICAO airport code
Returns: str: JSON with new session_id on success, or error string.
Examples: - "Start tracking KLM651" -> first resolve hex via flight_get_by_callsign, then call with session_type='flight', subject='KLM651', hex=
Inputs: params (required). Returns: result
dispatch_watchlist_getARead-onlyIdempotent
Get all active VIP watchlist sessions from the dispatch platform.
The watchlist tracks flights, persons, or other subjects of interest. Active sessions receive automatic ntfy push alerts when tracked events occur.
Returns: str: JSON list of watchlist session objects. Each session: session_id (str), session_type (str), subject (str), hex (str|null), registration (str|null), destination_icao (str|null), created_at (str), last_updated (str).
Examples: - "What's on the watchlist?" -> call, return sessions - "Is KLM651 being tracked?" -> call, filter by subject=='KLM651'
Inputs: no named parameters. Returns: result
dispatch_watchlist_removeADestructive
Remove a session from the VIP watchlist, stopping automated monitoring.
Provide either session_id (precise) or hex (removes all sessions for that aircraft). At least one of session_id or hex must be provided.
Args: params (WatchlistRemoveInput): - session_id (str, optional): Session ID from dispatch_watchlist_get - hex (str, optional): ICAO hex to remove all sessions for that aircraft
Returns: str: JSON confirmation or error string.
Examples: - "Stop tracking KLM651" -> get hex via flight_get_by_callsign, then call with hex= - "Remove watchlist session abc123" -> call with session_id='abc123'
Inputs: params (required). Returns: result
flight_get_by_callsignARead-onlyIdempotent
Get current ADS-B position for a flight by ICAO callsign via airplanes.live.
WARNING: Callsign-to-hex mapping can be stale (yesterday's aircraft on today's flight number). After getting the hex from this call, verify it with flight_get_by_registration to confirm the physical airframe. Use the confirmed hex for all subsequent queries and watchlist entries.
Args: params (CallsignInput): - callsign (str): ICAO 3-letter callsign, e.g. 'KLM651', 'UAL925' (normalize: KL->KLM, UA->UAL, AA->AAL, BA->BAW, DL->DAL)
Returns: str: Pipe-delimited aircraft state line: hex | reg | type | callsign | lat lon | alt_baro | gs | hdg | baro_rate | seen_ago | rssi | squawk | nic | rc Or: "No aircraft found" message with guidance for overwater flights.
Examples: - "Where is KLM651 right now?" -> params.callsign='KLM651' - "Track UAL925" -> params.callsign='UAL925', then verify hex via registration
Inputs: params (required). Returns: result
flight_get_by_hexARead-onlyIdempotent
Get current ADS-B position for an aircraft by confirmed ICAO 24-bit hex address.
Hex queries are the most reliable — they bypass callsign privacy filters and avoid stale callsign-to-hex associations. Use this for all position polls once hex has been confirmed via flight_get_by_registration.
Args: params (HexInput): - hex (str): 6-character uppercase hex, e.g. '484150', 'A1B2C3'
Returns: str: Pipe-delimited aircraft state line with full telemetry, or "No aircraft found" (overwater, ground, or hex not in ADS-B coverage).
Examples: - "Poll position for hex 484150" -> params.hex='484150' - "Is hex A1B2C3 still airborne?" -> call, check alt field
Inputs: params (required). Returns: result
flight_get_by_registrationARead-onlyIdempotent
Get ADS-B position and ICAO hex for an aircraft by tail/registration number.
Registration is airframe-bound, making this the preferred way to confirm ICAO hex before adding to watchlist. airplanes.live returns the aircraft's database entry including hex even when the aircraft is not currently transmitting.
Args: params (RegistrationInput): - registration (str): Tail number, e.g. 'N12345', 'PH-BKB', 'G-EUYA'
Returns: str: Pipe-delimited aircraft state line including confirmed hex. Or: "No aircraft found" message (aircraft may be on ground or not in DB).
Examples: - "What's the hex for N12345?" -> params.registration='N12345', extract hex from result - "Confirm the aircraft on KLM651 is PH-BKB" -> call with PH-BKB, verify hex matches callsign result
Inputs: params (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 25 tools
Most tools have distinct purposes, but there is some overlap between raw and enriched TFR endpoints (dispatch_get_tfr vs dispatch_get_tfr_enriched) and between multiple refresh admin tools. However, descriptions clarify differences, so agents can usually select correctly.
Tools follow a consistent prefix pattern (dispatch_*, flight_*) with verb_noun structure. However, there are minor inconsistencies such as 'force_opsplan_snapshot' vs 'refresh_feed', and some verbs are ambiguous (e.g., 'get' vs 'health_check').
25 tools is on the higher end but still appropriate for a comprehensive dispatch platform covering weather, flight tracking, alerts, admin, and watchlist features. Each tool has a specific role, and no obvious bloat.
Core data retrieval is well covered, but there are gaps in trip management (no create/update/delete for runsheet) and limited watchlist editing beyond add/remove. Missing CRUD for some entities, but the surface is functional for monitoring and alerting.
Maintenance
Related MCP Connectors
MCP Server for an Agent Task Marketplace
Host any HTTP API as a standard MCP server; auto-distribute to 12+ mainstream agent platforms.
Hosted MCP server for live public-data APIs and Skills for AI agents.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.67MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with QUADS infrastructure systems via API, enabling resource management and automation through LLM applications.MIT
- AlicenseAqualityDmaintenanceMCP server giving AI agents access to real-time aviation data — live flight tracking, airport weather, airline and airport information.1028 PyPI3MIT
- AlicenseBqualityDmaintenanceMCP server for grounded analysis of synthetic electric-taxi operations data, exposing tools for aggregated metrics, charging risk, and policy retrieval.3MIT