Skip to main content
Glama
CorporateTravel Dispatch MCP

CorporateTravel Dispatch MCP

Official

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 at corporatetraveldc-dispatch. The public mirror is at ctdi-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

dispatch_health_check

/healthz

Service health + snapshot ages

dispatch_get_feeds

/api/v1/feeds

Feed freshness and error state

dispatch_get_tfr

/api/v1/tfr

Active TFRs from FAA

dispatch_get_tfr_enriched

/api/v1/tfr-enriched

TFRs with AI threat interpretation

dispatch_get_weather

/api/v1/weather

DC-area METAR snapshot

dispatch_get_alerts

/api/v1/alerts

Active NWS weather alerts

dispatch_get_notams

/api/v1/notams

Active NOTAMs (requires FAA key on Pi)

dispatch_get_cps

/api/v1/cps

Critical Predictability State (HEMS go/no-go)

dispatch_get_route

/api/v1/route

Ground route impact assessment

dispatch_get_amtrak

/api/v1/amtrak

Amtrak status at WAS

dispatch_get_brief

/api/v1/brief

AI-generated daily operational brief

dispatch_get_opsplan

/api/v1/opsplan

FAA ATCSCC National Operations Plan

dispatch_get_runsheet

/api/v1/runsheet

Active trip runsheet (Tailscale-only, sends bearer token)

dispatch_get_data_usage

/api/v1/data-usage?days={n}

Pi network data usage (vnstat daily log)

Dispatch platform — Watchlist — tools/dispatch.py (bearer token sent)

Tool

Method + route

Description

dispatch_watchlist_get

GET /api/v1/watchlist

List active VIP watchlist sessions

dispatch_watchlist_add

POST /api/v1/watchlist/{flights|trains|vessels}

Add subject to watchlist (typed routes; generic/ground/person not yet supported)

dispatch_watchlist_remove

DELETE /api/v1/watchlist/{session_id}

Remove watchlist session

Dispatch platform — FIDS — tools/fids.py

Tool

Endpoint

Description

dispatch_get_fids_flight

/api/v1/fids/{airport}/{flight}

Confirmed gate, baggage carousel, arrival status (DCA/IAD, MWAA)

dispatch_get_fids_snapshot

/api/v1/fids/{airport}

FIDS feed health/freshness snapshot (DCA/IAD)

dispatch_get_fids_arrivals

/api/v1/fids/{airport}/arrivals

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

dispatch_lookup_aircraft

/api/v1/aircraft/{identifier}

Look up aircraft by N-number or ICAO hex

dispatch_faa_registry_status

/api/v1/aircraft-registry/status

Local registry cache status

Admin — tools/admin.py (requires DISPATCH_TOKEN; excluded in public-safe mode)

Tool

Route

Description

dispatch_admin_health

GET /admin/healthz

Extended health check

dispatch_admin_refresh_feed

POST /admin/refresh-feed/{name}

Force-refresh a named feed (metar, nws, tfr, notam, amtrak, atcscc_opsplan, runsheet)

dispatch_admin_force_recompute_cps

POST /admin/force-recompute-cps

Force CPS recomputation

dispatch_admin_force_opsplan_snapshot

POST /admin/force-opsplan-snapshot

Force opsplan fetch

dispatch_admin_send_push_alert

POST /admin/push-test-alert

Send ntfy push notification

dispatch_admin_get_audit_log

GET /admin/audit

View audit log (append-only, 90-day retention)

dispatch_watchdog_status

GET /admin/watchdog/status

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

dispatch_remember

POST /api/v1/remember

Capture a manual note into the second-brain vault (01-Sources/manual/). Scrub-gated (CUI/PII block, not redact — 422 on match, nothing written).

Flight Tracking — airplanes.live — tools/flight.py (no auth)

Tool

Description

flight_get_by_callsign

ADS-B position lookup by ICAO callsign

flight_get_by_registration

ADS-B position + hex by tail number

flight_get_by_hex

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

acars_get_by_hex

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.py imports jsonschema unconditionally, but the mcp package does not declare it and the mcp[cli] extra does not reliably pull it in. Without it the server crashes at import. Declared explicitly in this repo's pyproject.toml as of 2026-08-11.

Public mirror gap (2026-08-11): the public GitHub mirror (corporatetravel-dispatch-mcp public copy) is missing the public_safe registration-mode commits. Anyone installing from the public repo's pip 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

DISPATCH_BASE_URL

http://100.94.80.100:8000

Tailscale address of the Pi — primary.

DISPATCH_FALLBACK_URL

https://dispatch.csexecutiveservices.com

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.

DISPATCH_TOKEN

(empty)

Required for admin/second-brain tools (csex-token create on the Pi)

DISPATCH_TIMEOUT

30

Dispatch HTTP timeout (seconds)

ADSB_TIMEOUT

15

airplanes.live timeout (seconds)

ACARS_BASE_URL

https://api.airframes.io/messages

airframes.io ACARS aggregator

ACARS_TIMEOUT

15

airframes.io timeout (seconds)

DISPATCH_MCP_TRANSPORT

stdio

stdio or http (streamable HTTP)

DISPATCH_MCP_PORT

8080

Port when transport=http

DISPATCH_MCP_PUBLIC_SAFE

(unset)

1/true/yes → never load admin/second_brain (26 tools). Opt-in per instance, never default.

Retired hostname: ops.csexecutiveservices.com is fully retired and hard-rejected app-side (dispatch platform runner/main.py _RETIRED_HOSTNAMES). It must not appear in any config. Older docs and examples that referenced it as the default DISPATCH_BASE_URL are 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-mcp

Or 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, port 8082, no public hostname — Open WebUI consumes it via host.containers.internal:8082.

  • Public-safe (26): corporatetraveldc-mcpo-public.service, port 8083 (loopback-bound), DISPATCH_MCP_PUBLIC_SAFE=1, fronted by nginx + Cloudflare Tunnel at https://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-guardian Cowork 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_runsheet is Tailscale-gated and only works against the default Tailscale DISPATCH_BASE_URL.

  • Admin endpoints require DISPATCH_TOKEN. Create tokens on the Pi: csex-token create.

  • dispatch.csexecutiveservices.com has Cloudflare Access on POST routes; it is the transport-failure fallback only, not the primary.

  • ops.csexecutiveservices.com is 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 tools
dispatch_admin_force_opsplan_snapshotA
Idempotent

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_cpsA
Idempotent

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_logA
Read-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_healthA
Read-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_feedA
Idempotent

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_alertsA
Read-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_amtrakA
Read-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_briefA
Read-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_cpsA
Read-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_feedsA
Read-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_notamsA
Read-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_opsplanA
Read-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_routeA
Read-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_runsheetA
Read-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_tfrA
Read-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_enrichedA
Read-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_weatherA
Read-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_checkA
Read-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_getA
Read-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_removeA
Destructive

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_callsignA
Read-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_hexA
Read-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_registrationA
Read-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

    A4.1/5.0

    Scored across 25 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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').

    Tool Count4/5

    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.

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers