adsb-mcp
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., "@adsb-mcpwhat aircraft are flying overhead right now?"
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.
adsb-mcp
Live local ADS-B flight data as MCP tools, over your own receiver's aircraft.json (readsb / tar1090 /
dump1090) — keyless, live, your own data. Answers "what's flying overhead right now?"
Tools
Tool | What it does |
aircraft_overhead | Aircraft in range of the receiver, nearest first (needs |
aircraft_near | Aircraft within a radius of a point you pass (no receiver location needed). |
find_aircraft | Match by callsign / ICAO hex / registration (partial, case-insensitive). |
Data is structured (hex, callsign, registration, type, altitude_ft, ground_speed_kt, track_deg, lat/lon,
distance_km + bearing_deg when the site is set, seen_s). Every result has a status: ok / refused
(caller-fixable, with advice) / error (receiver unreachable). ADS-B carries no route/airline — that's a
separate optional enrichment tier (not these tools).
Related MCP server: Aviation MCP Server
Run
uv sync # (--system-certs behind a TLS-inspecting proxy)
# stdio:
uv run adsb-mcp serve
# streamable-http (behind mcpo / on the LAN):
ADSB_MCP_TOKEN=... ADSB_URL=http://<feeder-host>:8080/data/aircraft.json \
ADSB_SITE_LAT=... ADSB_SITE_LON=... \
uv run adsb-mcp serve --transport http --host 0.0.0.0 --port 8000Config (env)
Var | Default | Notes |
|
| Your feeder's live snapshot (readsb / tar1090 path). |
| — | Receiver location for nearest-first overhead. Home-location PII — from 1Password, never committed. Unset = overhead without distances. |
| — | Bearer required on streamable-http when set. |
|
| Seconds. |
Claude Desktop / Claude Code (stdio)
{
"mcpServers": {
"adsb": {
"command": "uv",
"args": ["--directory", "/path/to/adsb-mcp", "run", "adsb-mcp", "serve"],
"env": { "ADSB_URL": "http://<feeder-host>:8080/data/aircraft.json" }
}
}
}Docker
docker build -t adsb-mcp .
docker run --rm -p 8000:8000 -e ADSB_MCP_TOKEN=... \
-e ADSB_URL=http://<feeder-host>:8080/data/aircraft.json \
-e ADSB_SITE_LAT=... -e ADSB_SITE_LON=... adsb-mcpThe server is stateless: no database, no volume. It needs to reach your feeder over the LAN. Inside the
container localhost is the container itself, so set ADSB_URL to the feeder's address.
Auth and exposure
Auth is deliberately simple: stdio, or streamable-HTTP with a single bearer token (ADSB_MCP_TOKEN) on a
private network, for example behind mcpo. /healthz stays open. There
is no OAuth, no users and no audit log, by design. To publish it more widely, put a management layer in
front of it: an MCP gateway or auth proxy that handles OAuth, users and audit for all your servers at once.
Keep in mind that ADSB_SITE_LAT/LON is your home location, and aircraft_overhead echoes it back as
observer: anyone who can call the tool can read it.
AI assistance
adsb-mcp is developed openly with the help of Claude (Anthropic). Commits Claude helped write carry a
Co-Authored-By: Claude trailer. The code and design are open source so the work can be inspected, reused,
and given back.
License
MPL-2.0 © Daniel Núñez.
Available Tools
3 toolsaircraft_nearAircraft near a pointARead-onlyIdempotent
Aircraft currently within radius_km of a given point (lat/lon you supply — e.g. a city), nearest
first. Unlike aircraft_overhead this needs no receiver location: distance is measured from the point
you pass.
Args:
latitude/longitude: the centre point to search around.
radius_km: search radius in kilometres (default 50).
max_results: cap on aircraft returned (default 10).
include_grounded: include aircraft on the ground (default False).
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | ||
| longitude | Yes | ||
| radius_km | No | ||
| max_results | No | ||
| include_grounded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real behavioral context: results are ordered nearest-first and no receiver location is required. It does not disclose rate limits, empty-result behavior, or freshness of the live data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sibling contrast are front-loaded in the first two sentences; the Args block is compact. It does restate defaults already present in the schema, which is mild redundancy but aids scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description never says what is returned per aircraft or how an empty result is signalled, only the cap and ordering. For a read-only lookup tool the essentials for invocation are present, but the return contract is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden and does compensate: all five parameters are explained, including units (kilometres) and defaults (50, 10, False) plus the meaning of include_grounded. It stops short of acceptable lat/lon ranges or format constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Aircraft currently within radius_km of a given point', with explicit ordering ('nearest first'). It also names the sibling it differs from (aircraft_overhead), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when this tool applies versus aircraft_overhead: it needs no receiver location because distance is measured from the supplied point. The find_aircraft sibling is never addressed, and there is no when-not-to-use guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aircraft_overheadAircraft overheadARead-onlyIdempotent
Aircraft currently in range of the receiver, nearest first. The "what's that plane overhead right now" query. With the receiver location configured, each result carries distance_km + bearing; without it, results are listed newest-position-first and distance is null (set ADSB_SITE_LAT/LON).
Args:
max_results: cap on aircraft returned (default 10).
include_grounded: include aircraft on the ground (default False — only airborne).
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | ||
| include_grounded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only/idempotent/openWorld=false, and the description adds real behavioral context beyond them: the config-dependent sort order, distance_km being null without a site location, and the env vars to set. It doesn't cover rate limits or result freshness, but the config-conditional behavior is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it returns, then the config conditional, then args. Mostly tight, though the quoted colloquialism and parenthetical env var hint are slightly casual for a tool spec.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param read-only tool with no output schema, the description covers the return ordering, distance/bearing semantics, config dependency, and both params. It doesn't document the shape of each aircraft record (fields besides distance/bearing), but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It documents both params with defaults and clarifies semantics (max_results is a cap, include_grounded defaults to airborne-only), though it doesn't document valid ranges for max_results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: aircraft currently in range, nearest first. The phrase 'what's that plane overhead right now' quote concretely distinguishes it from siblings like aircraft_near and find_aircraft, which suggest different query modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage via the colloquial framing and mentions behavior with/without receiver config, but doesn't explicitly say when to use this vs aircraft_near or find_aircraft. The routing is inferable from the name and 'right now' framing but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_aircraftFind aircraftARead-onlyIdempotent
Find aircraft currently in range by a partial match on callsign, ICAO hex, or registration (case-insensitive). Returns matches even if they have no position yet.
Args:
query: text to match against callsign / hex / registration (e.g. "LAN", "e80", "CC-B").
max_results: cap on matches returned (default 10).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuinely useful context beyond them: case-insensitive matching and the fact that matches are returned even when they have no position yet, which matters for result interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core operation in the first sentence, then documents each argument compactly. The Args block is conventional and each line earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with full annotation coverage and no output schema, the definition is essentially complete: matching rules, scope limitation ('currently in range'), and a result caveat are all present. Only inter-sibling disambiguation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden and largely does: query is defined as a case-insensitive partial match across three identifier fields with concrete examples ("LAN", "e80", "CC-B"), and max_results is described as a cap defaulting to 10. This compensates well for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (aircraft), plus the matching semantics: partial match across callsign, ICAO hex, or registration, case-insensitive. It does not explicitly differentiate itself from siblings aircraft_overhead and aircraft_near, so sibling routing is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently in range' implies a live-coverage context, but the description never states when to use this over aircraft_overhead or aircraft_near, nor any exclusions. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
aircraft_near - First observed
aircraft_overhead - First observed
find_aircraft
TDQS
Scored across 3 tools
aircraft_overhead and aircraft_near are both 'aircraft in range, nearest first' spatial queries, but the descriptions clearly distinguish them (implicit receiver location vs. an explicit lat/lon you supply). find_aircraft is a clearly separate identifier-lookup path, so an agent can pick correctly.
Two tools follow an aircraft_<modifier> pattern while the third is a verb_noun form (find_aircraft), and none use a consistent verb prefix. It is still readable and unprefixed-domain-consistent, but the convention is mixed.
Three tools is on the thin side even for a narrow, read-only ADS-B query domain. It is defensible since each tool covers a distinct query mode, but the surface feels minimal.
Core live queries (overhead, radius, identifier lookup) are covered, but there is no tool for detailed single-aircraft data, historical/track positions, or receiver/feeder status. Agents can work around these gaps but cannot fully answer common questions like a plane's route or recent track.
Maintenance
Related MCP Connectors
Read-only access to live ADSBiq aircraft and network state, with community contribution metadata.
Aircraft registry search, flight history, and analytics powered by ADS-B Exchange data.
Offline, keyless lookup of the US civil aircraft registry — decode N-numbers, search records.
OpenSky MCP — live aircraft, served from keyless community ADS-B feeds.
Related MCP Servers
- AlicenseAqualityCmaintenanceExposes real-time ADS-B aircraft data from a feeder, enabling natural language queries for aircraft positions, receiver statistics, and flight searches.69GPL 3.0
- FlicenseAqualityDmaintenanceEnables querying real-time aircraft data from ADS-B Exchange using multiple query types such as callsign, registration, aircraft type, location, and more, via a FastMCP server with API key authentication.2-
- FlicenseAqualityCmaintenanceOfficial bounded, read-only access to live community-powered aircraft positions and aggregate ADSBiq network statistics.3-
- AlicenseNot gradedqualityBmaintenanceEnables live aircraft tracking by geographic area, individual aircraft lookup, flight route resolution, and airport arrivals/departures using OpenSky Network ADS-B data.18 npmMIT