velocity
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| API_KEY | No | API key for the backend, if one has been set (API_KEY on the backend); a keyless local instance needs no key. Used for server/CLI/MCP access (the MCP client may instead pass it as an Authorization: Bearer header). | |
| API_BASE | No | Base URL of the running Velocity backend that provides the warm live feeds (e.g. http://localhost:8000). The MCP server queries this instance. | |
| OLLAMA_HOST | No | Host of the optional local Ollama instance used by the deep_analyze reasoning model; analysis degrades to raw intel JSON if Ollama is absent. | |
| OLLAMA_MODEL | No | Ollama model to use for deep_analyze; empty picks the smallest installed model. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_situationA | Global situational snapshot — the cheap first call to orient. Returns total aircraft (airborne/ground, by category), GNSS-degraded count, active emergency squawks, the worst GPS-jamming cells worldwide, tracked vessel counts by category, and recent fusion-alert counts. A few hundred tokens describing the whole planet. detail='short' (default) trims the jamming/vessel/alert samples to their top few; detail='long' returns the full situation bundle. |
| focus_areaA | Load a region PRIMARY and return a full intel bundle for it in one call. This is the headline tool. It triggers a DEDICATED, always-fresh fetch for just this area (bypassing global rate limits) and registers it for ongoing priority refresh. The bundle contains: fresh aircraft summary + sample, aircraft-density grid, GPS-jamming assessment, vessels, and fused anomalies (emergencies, jamming hotspots, dark vessels, alerts) with a threat level. Args: lat, lon: centre of the area of interest. Required unless polygon is given, in which case they are ignored. radius_nm: radius in nautical miles (1–250; default 200). label: optional human name for the AOI (e.g. "Kaliningrad"). cell_deg: density grid cell size in degrees (0.1–10; default 1.0). polygon: optional irregular region as ONE ring of [lon, lat] pairs (longitude FIRST; 3–500 vertices, closed or open; no holes, no antimeridian crossing). Overrides lat/lon/radius_nm: its bounding circle (max 250 nm, else polygon_truncated) is loaded PRIMARY and every record outside the ring is dropped. Grid cells and jamming hexes are kept by centre point, so use a small cell_deg for a small ring. A total the capped samples cannot give for the ring comes back as _in_circle (the bounding circle's figure). |
| aircraft_densityA | Aircraft density over an area as a grid of cells (count, by category, GNSS-degraded per cell) plus totals, peak cell, and in-area vessel count. Give either a centre (lat, lon [, radius_nm]) or an explicit bbox (min_lon, min_lat, max_lon, max_lat). cell_deg sets grid resolution. |
| gps_jammingA | GPS/GNSS jamming assessment (GPSJam method: ADS-B NACp<8 / NIC<7 binned into 1° cells). Returns flagged cells ranked by severity, counts of high/medium cells, and a sample of affected aircraft. Omit all coordinates for a global view; otherwise pass a centre or a bbox to scope it. |
| query_aircraftA | Filtered aircraft query against the live snapshot. Returns matched_total
category ∈ airliner|private|helicopter|glider|military|emergency. Combine with area (centre or bbox), squawk, callsign_contains, altitude band (metres), emergency / gnss_degraded / on_ground booleans. limit ≤200. |
| lookup_aircraftA | Look up one aircraft by ICAO24 hex (exact) or callsign (substring). Returns its current state, registration, an integrity/threat assessment, and the latest server-held fix. |
| query_vesselsB | Vessels (AIS) in an area, classified (cargo/tanker/fishing/passenger/ military/sailing/pleasure/tug). dark_only=True returns only dark-vessel candidates (moving with no static identity). Scoped by centre or bbox. |
| anomaliesB | Fused anomaly report for an area (or global if no coords): emergency aircraft, GPS-jamming hotspots, dark-vessel candidates, recent fusion alerts, plus a triage threat_level (low|elevated|high) and score. |
| intel_briefA | Cross-domain INCIDENT brief — the headline analytic tool. Fuses the raw layers into ranked, cited INCIDENTS instead of returning
signals you have to correlate yourself. An incident is a CONVERGENCE: signals
within |
| detect_deceptionA | Denial & deception — "am I being fed?". Flags MANIPULATED tracks distinct from jamming: AIS duplicate-MMSI (one identity, two hulls) and impossible teleports; ADS-B GPS spoofing (many aircraft snapped to one false position) and kinematic position-injection. Run before trusting a feed in a contested area. Omit coords for global. |
| locate_emitterA | Estimate a GPS jammer/spoofer LOCATION from the degraded-ADS-B footprint (severity-weighted centroid + CEP + confidence). Turns "jamming somewhere here" into "emitter ~here ±N km". Footprint-centroid estimate (~tens of km), not RF direction-finding — stated in the response. Scope with lat/lon. |
| area_baselineB | Is this normal? Current vessel / dark-vessel / jamming / military counts z-scored against a rolling baseline, with anomalies called out (e.g. "dark vessels +5σ", "traffic -3σ"). Global uses the background sampler; polling an AOI repeatedly builds that area's baseline. Distinguishes a real shift from a normal day. |
| whats_changedA | Standing watch — what CHANGED since the last check, not the full picture. Returns incidents that are NEW, ESCALATED, DE-ESCALATED, or RESOLVED. Global (no coords) reflects the background watch loop (recomputed ~every 60s); an AOI (lat/lon) diffs against YOUR previous whats_changed call for that area, so you can poll one region and be told only what moved. Use this to monitor instead of re-reading the whole brief each time. |
| incident_historyA | Timeline of how each incident built up over the recent window — per
incident, a compact The full window can hold many incidents; this returns the |
| vessel_dossierA | Pattern-of-life dossier for one vessel (MMSI): recent track, AIS gaps, derived speed profile (loiter / transit / loiter-then-dash), area covered, which live incidents it appears in, and a behaviour assessment. The track is the store's ~1h retention window. |
| aircraft_dossierB | Pattern-of-life dossier for one aircraft (ICAO24 hex or callsign): recent track, gaps, derived speed profile, GNSS-integrity, emergency/military flags, and which live incidents it appears in. |
| list_focus_areasA | List the priority areas currently loaded PRIMARY (with fetch stats and whether each is served by a dedicated fetch or the degraded snapshot fallback). |
| data_sourcesA | Which feeds are always-on vs key-gated, and the configured Ollama host/model. Use to explain coverage gaps (e.g. fires need a FIRMS key). |
| disaster_alertsB | GDACS severity-scored global disasters (earthquake/cyclone/flood/volcano/ drought/wildfire), each Green/Orange/Red by modelled impact. |
| fire_perimetersA | Active wildfire burn-area polygons (NIFC/WFIGS) — the AREA behind FIRMS hotspot points, with incident name + size in acres. |
| tropical_cyclonesB | Active tropical cyclones (NHC) with center fix, classification, intensity and pressure. |
| volcanoesB | Smithsonian GVP Holocene volcanoes — location, type, elevation, last eruption year. |
| radiationC | Recent Safecast crowd radiation measurements (value + unit + location) — a nuclear-incident detection layer. |
| relief_disastersC | ReliefWeb active humanitarian disasters, geocoded to the affected country. |
| air_qualityB | Air quality (US AQI + PM2.5/PM10) sampled across major world cities — a proxy for industrial activity, smoke drift, and chemical release. |
| marine_buoysC | NDBC marine buoy observations — wave height, wind, pressure, water temp. |
| maritime_chokepointsB | Vessel congestion at named straits (Hormuz/Suez/Malacca/Bosphorus/…), derived live from the AIS union: vessel + stationary counts per chokepoint. |
| space_weatherB | SWPC space weather — solar X-ray flares, active alerts, and the auroral oval. The causal layer under GPS/HF degradation. |
| power_plantsB | WRI global power plants (≥200 MW) — name, fuel, capacity, country. Static energy-infra targets to correlate strikes/outages against. |
| aviation_sigmetC | AIRMET/SIGMET hazard polygons (turbulence, icing, IFR, volcanic ash, convective) constraining the aircraft layer. |
| travel_advisoriesC | Official country-level travel advisories pooled from US State, UK FCDO, and Australia Smartraveller — each country's highest reported level. |
| displacementB | UN OCHA HAPI country-level IDP and refugee figures, latest reporting period per country. |
| nas_statusB | FAA National Airspace System ground stops, ground delays, arrival/ departure delays, and airport closures, as points at the affected airport. |
| climate_anomaliesC | Temperature/precipitation anomalies (vs. a 5-year same-window baseline) over conflict-dense country centroids. |
| markets_snapshotB | Batched keyless market quote snapshot: indices, commodities, fx, crypto. |
| market_stressC | Composite market-stress score from equity drawdown, gold/oil moves, USD flight-to-safety, and BTC drawdown. |
| quakes_nearA | Earthquakes (USGS) within radius_km of a point (GET /api/eq). lat, lon, and radius_km must ALL be given together — the route 422s on a partial set rather than silently falling back to the unfiltered global feed (agent-safe: pass all three or none). range is 'hour'|'day' (default)|'week'|'month'. For a severity-scored global disaster view instead, use disaster_alerts(). |
| track_historyB | Historical position track for ONE entity (GET /api/history/track). id is 'aircraft:' / 'vessel:', or a bare id whose shape is unambiguous (6-char ICAO24 hex or 9-digit MMSI) — the route infers the kind from it. from_ts/to_ts are unix seconds (default: the last hour). A id the route can't resolve returns its 422 message as-is (e.g. ambiguous shape — pass a 'kind:id' prefix). |
| create_watch_ruleA | Create a standing watch rule (POST /api/alerts/rules). A rule needs a gate: either an identity pin (icao24/mmsi/callsign — follows that one entity globally, no AOI required) or a complete AOI (lat, lon; radius_nm defaults to 50 nm if omitted). kinds filters which signal kinds fire it — jamming/dark_vessel/military_air/military_vessel/incident/quake/ fire/ais_gap/rendezvous/loiter (omit for all). channel is 'inapp'|'discord'|'webhook' ('discord'/'webhook' require sink_url). The route validates and 400/422s on a bad gate, channel, sink_url, or kind — this wrapper does not re-validate, it passes the error through. |
| list_watch_rulesC | List your standing watch rules (GET /api/alerts/rules). |
| delete_watch_ruleB | Delete a standing watch rule by id (DELETE /api/alerts/rules/{rule_id}). |
| propose_actionA | Queue a governed action for the operator to approve (POST /api/actions/proposals). This does NOT run the action.
Multi-user deployments: this server authenticates with an INTERNAL token that is deliberately never a user (apps/api/CLAUDE.md, Auth), so on a Supabase deployment these four tools answer 401 by design — a write-back has to be attributable to a person, and the internal token is not one. They are for the single-operator box, where the operator IS the one user. |
| list_proposalsA | Pending action proposals awaiting operator approval, oldest first (GET /api/actions/proposals). 401 on a multi-user deployment by design — see propose_action. |
| approve_proposalA | Approve and EXECUTE a queued proposal (POST /api/actions/proposals/{id}/approve). Only call this when the operator has told you to. The receipt carries the audit row the execution wrote. 404 for an unknown or expired proposal (the queue has a 15-minute TTL); 403 when the action is operator-only and the caller is not the operator; 401 on a multi-user deployment by design — see propose_action. |
| reject_proposalA | Drop a queued proposal without executing it (POST /api/actions/proposals/{id}/reject). 401 on a multi-user deployment by design — see propose_action. |
| deep_analyzeA | Have a reasoning model reason deeply over the live intel. Gathers the relevant data (global situation, plus a focused area bundle +
jamming + anomalies when lat/lon given) and feeds it to a real reasoning
model — DeepSeek ( Args:
question: what to analyse (e.g. "Is there coordinated GPS jamming near
the Baltic, and which aircraft are affected?").
lat, lon, radius_nm: optional area to focus on (loaded PRIMARY).
model: optional Ollama model override used only on the Ollama fallback.
tier: |
| news_analysisA | Cross-source, debiased world-news intelligence. Scrapes ~12 outlets (BBC, Reuters, AP, Al Jazeera, Guardian, CNN, Fox, …), then a reasoning model strips bias/propaganda and separates VERIFIED FACTS (corroborated by ≥2 independent outlets) from ATTRIBUTED CLAIMS and rhetoric. A leader promising "the war will end soon" is flagged as rhetoric, never reported as fact. Returns events with neutral_summary, verified_facts, attributed_claims, bias_flags, propaganda_techniques, rhetoric_flags and a confidence. May take ~30s when the cache is cold (it reasons over the feed). |
| fact_checkA | Adjudicate one free-text claim against current world-news headlines. Returns |
| news_briefA | Latest assembled morning brief: top story per category plus a short
synthesis paragraph tying the leads together. Built on a ~20h cadence by
the background news refresher, not on-demand — use |
| aoi_imageryA | Building imagery for a location at two dates — set time + place directly. Give a location (lat/lon + radius_km, OR an explicit min/max bbox) and a
before + after date (YYYY-MM-DD). Returns what imagery is available for each
date WITHOUT downloading: Maxar Open Data VHR (~0.3-0.5 m, event-gated — only
where a disaster/conflict event covers the AOI) and Sentinel (10 m, global,
any date). Args: before, after: dates as YYYY-MM-DD. lat, lon, radius_km: centre + radius (km) of the AOI. min_lon/min_lat/max_lon/max_lat: explicit bbox (overrides lat/lon). window_days: ± days around each date to search Maxar (events are sparse). |
| answerA | Named questions answered with a verdict, its rule, and the evidence age. The one call that returns a CONCLUSION rather than data to interpret. Each
answer carries Two contracts worth relaying to a user verbatim rather than paraphrasing:
Omit question_id to list every registered question. |
| contact_provenanceA | Which sources are seeing the sky right now, and how much they agree. Per tier: how many contacts it reported and how many ONLY it reported, plus the share of contacts with two or more independent observers and the confidence rule in force. The exclusive count is the column that matters. Crowd-sourced ADS-B accepts whatever is uploaded to it, so a contact only one tier can see is not corroborated, and a tier contributing thousands of exclusive contacts is either unique coverage or an unverifiable claim. Say which when you report it, and never present an uncorroborated contact as confirmed. |
| history_diffA | What changed inside a box between two moments: arrived, departed, stayed. Answers from OWNED history, so it works for any past window still retained
rather than only the present instant.
|
| system_doctorA | What is configured, what is missing, and the exact line that fixes it. Use this when a layer looks empty before concluding the world is quiet: a
blank layer is far more often an unconfigured optional source than an
absence of activity. Every capability listed is optional - the console runs
keyless - so a long |
| ukraine_alertsC | Live air-raid alert status across Ukraine's 25 oblasts (alerts.com.ua). |
| deepstate_firmsC | FIRMS fire hotspots within the Ukrainian theater (DeepState). |
| deepstate_radiation_stationsC | Live radiation monitoring stations in Ukraine (DeepState, ~565 stations). |
| radio_reportsA | Amateur-radio reception reports from PSKReporter, plotted at the transmitter. Each feature is an emitter that an independent receiving station decoded in
the last |
| deepstate_war_newsC | Geolocated war-news events from the DeepState map. |
| satnogs_observationsC | Recent satellite downlink observations from the SatNOGS ground station network — real decoded telemetry from space. |
| satnogs_ground_stationsC | Map of active SatNOGS ground stations worldwide. |
| satnogs_transmittersB | Known satellite transmitter frequencies from the SatNOGS database. Pass a NORAD catalog ID to filter to one satellite. |
| weather_sondesC | Live weather balloon (radiosonde) positions worldwide from SondeHub. |
| cisa_kevC | CISA Known Exploited Vulnerabilities catalog — what's actively being exploited in the wild right now. |
| shodan_ipA | Shodan InternetDB lookup for one IPv4 address — ports, vulns, hostnames. NO API key needed. |
| fema_disastersC | Recent FEMA disaster declarations across US states and territories. |
| spc_storm_reportsC | Today's SPC severe weather reports — tornado, wind, and hail events. |
| osm_military_objectsC | Military objects from OpenStreetMap via Overpass API. bbox = south,west,north,east. |
| mineral_sitesA | USGS MRDS mineral deposit sites inside a bbox. bbox is REQUIRED for data (lon_min,lat_min,lon_max,lat_max): the whole
catalogue is ~300k sites, so with no viewport this answers an empty
collection. |
| gleif_lookupC | Look up a company's Legal Entity Identifier (LEI) via the GLEIF API. |
| courtlistener_searchC | Search US court opinions on CourtListener. |
| unhcr_refugeesC | UNHCR refugee/IDP population figures by country. |
| worldpopC | WorldPop population grid datasets metadata. Filter by ISO3 country. |
| hdx_datasetsC | Search humanitarian datasets on HDX (data.humdata.org). |
| adsb_by_hexB | Live aircraft by ICAO24 hex code (e.g. 'a1b2c3'). |
| adsb_by_registrationB | Live aircraft by tail/registration number (e.g. 'N12345'). |
| adsb_by_callsignC | Live aircraft by callsign (e.g. 'UAL123'). |
| adsb_by_typeB | Live aircraft by ICAO type designator (e.g. 'B738', 'A320'). |
| adsb_laddA | Aircraft on FAA's Limiting Aircraft Data Displayed (LADD) list. |
| adsb_piaC | Aircraft using Privacy ICAO Address (PIA) — randomized hex codes. |
| fr24_searchC | FlightRadar24 unauthed search — aircraft, airports, flights. |
| gdelt_articlesC | GDELT DOC 2 API — article-level search across global news. |
| telegram_channelC | Scrape recent messages from a Telegram OSINT channel. |
| source_catalogB | Master catalog of all data sources the platform knows about — tile providers, SAR archives, SDR directories, splat sources, streaming endpoints, and more. Filter by category. |
| splat_searchC | Search Sketchfab for downloadable 3D Gaussian Splat models. |
| esri_waybackC | ESRI Wayback time-travel manifest — every historical imagery version since 2014. |
| ms_global_buildingsB | Microsoft Global Buildings manifest — 1.3 billion footprint polygons, download links per quadkey region. |
| kiwisdr_stationsC | Map of public KiwiSDR software-defined radio receivers worldwide. |
| tinygs_packetsC | Recent LoRa satellite packets from the tinyGS community network. |
| maritime_pipeline_statsA | Health of the keyless AIS pipeline: vessels per source, the OpenWaters sweep (tiles failed/truncated, whether it completed), fix-age percentiles, and the standing note that keyless AIS is coastal, not open-ocean. |
| maritime_coverageA | Where keyless AIS actually reaches: a dense 36x72 grid of live-vessel counts in 5 degree cells (row 0 = 90S..85S, col 0 = 180W..175W). A zero cell means no feed reports there, not that the sea is empty. Returned whole; a trimmed grid would be unreadable. |
| maritime_vessels_bboxB | Vessels in a box from the freshness-wins AIS store, freshest first, each
with its fix age and every source that reported it. bbox =
lon0,lat0,lon1,lat1 (lon0 > lon1 crosses the antimeridian). |
| sar_scenesA | Recent keyless Sentinel-1 SAR scenes over a box, for water AIS does not
reach. bbox = lon0,lat0,lon1,lat1. By default a SCENE INVENTORY (id, time,
footprint, public download URL). detect=True also returns LOCATED radar
contacts for a box up to one degree a side, each classified against AIS:
'dark' only where enough nearby AIS makes absence meaningful, otherwise
'unknown'. Read |
| maritime_satellite_positionsA | Unidentified satellite AIS positions: where ships are in OPEN OCEAN,
beyond coastal AIS. Each is a position, a type class and a heading only;
upstream publishes no MMSI, name or position age for them, so do not
present one as a tracked, identified vessel. bbox = lon0,lat0,lon1,lat1
(optional). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 94 tools
The tool set contains many overlapping analytic entry points: get_situation, focus_area, anomalies, intel_brief, area_baseline, whats_changed, deep_analyze, and answer all return situation/intel conclusions with subtle boundaries. Aircraft and vessel access is also split across several near-equivalent tools (query_aircraft/lookup_aircraft/adsb_by_*/fr24_search; query_vessels/maritime_vessels_bbox/maritime_satellite_positions), making misselection likely.
Almost all names are lowercase snake_case, which is consistent at the formatting level. However, the naming convention itself is mixed: some tools use verb_noun (query_aircraft, create_watch_rule, detect_deception), while many are bare nouns or domain labels (anomalies, intel_brief, gps_jamming, tinygs_packets, weather_sondes).
94 tools is an extreme surface for a single MCP server, far beyond the 3-15 well-scoped range. While the platform covers many data domains, the count is so large that agents must navigate a sprawling catalogue rather than a focused tool set.
The surface covers an unusually broad OSINT/geospatial domain: situation awareness, aircraft/vessel queries, anomalies, history, watch rules, proposals, imagery, disaster feeds, cyber feeds, and many specialist sources. Minor lifecycle gaps exist, such as no update_watch_rule, but core workflows and many optional layers are represented.