CorporateTravel Dispatch MCP
Officialcorporatetravel-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 |
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/CorporateTravelDC/corporatetravel-dispatch-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server