·· Model Context Protocol ··
Connect an agent
eYKON exposes 24 live-data tools over MCP. Point Claude, Cursor or your own agent at the endpoint and it can query vessels, aircraft, conflict events, thermal anomalies, night-time radiance, convergence signals — and eYKON's own calibration record.
1 · Create a key
Keys are created at Settings. The key is shown once and never again — eYKON stores only a hash of it.
2 · Add the server
claude mcp add --transport http eykon \ https://eykon.ai/api/mcp \ --header "Authorization: Bearer eyk_YOUR_KEY"
Any MCP client works. The transport is stateless Streamable HTTP, so there is no session to manage and nothing to keep alive.
Daily limits
| member | 5 calls/day |
| pro | 25 calls/day |
| desk | 100 calls/day |
| enterprise | 500 calls/day |
Limits reset at 00:00 UTC. MCP is included on paid plans; the free tier does not include it. A citizen-tier key reaches 13 of the 24 tools and is refused on every call while its plan carries no allowance.
What you get back
Every successful result carries a provenance envelope: the instrument behind the number, how well grounded it is, and its known limits. That is deliberate — a tool result travels into your agent's context with no eYKON page around it to caveat it, so the caveats travel with the data.
Several feeds are partial and say so. AIS is chokepoint-only. Night-lights lag NASA publication by about nine days. Thermal watches 10,556 of 13,262 facilities, and the uncovered regions return NO DATA, never zero. Critical minerals is fixture-backed and excluded from anything quotable.
The 24 tools
query_vesselsQuery AIS vessel positions within a geographic area and time window. Returns vessel name, MMSI, type, position, speed, heading, destination.
query_aircraftQuery ADS-B aircraft positions within a geographic area.
query_conflictsQuery armed-conflict events (GDELT-backed, with ACLED fallback when licensed) by region / date / event type / actor.
query_refineriesQuery oil refineries from OpenStreetMap (canonical refinery tags only — petroleum_refinery, oil_refinery, refinery). ~700 facilities globally, each with name, operator, product, capacity (when tagged), country, city. Use for questions like "refineries in Saudi Arabia", "oil refining capacity on the Gulf Coast", "European refineries near Russian crude pipelines". Pass country to slice (ISO2 code or country name).
query_minesQuery mineral deposits from the USGS Mineral Resources Data System (MRDS — public-domain US Government, ~304k records globally, archival snapshot frozen at 2011). Each row carries site name, development status (Producer / Past Producer / Prospect / Occurrence / Plant), commodities (commod1/2/3 + commodities array), country, state, deposit type. Default returns only Producer / Past Producer / Plant rows with a known commod1 (significant sites); pass include_minor=true for prospects and occurrences. Use for questions like "lithium mines in Chile", "rare-earth deposits worldwide", "active copper producers in Peru". Pass commodity to filter on the commodities[] array (case-sensitive, e.g. "Copper", "Lithium", "Rare Earths").
query_power_plantsQuery unit-level power plants from the Global Energy Monitor — Global Integrated Power Tracker (GIPT). ~127k operating units worldwide spanning coal, oil/gas, nuclear, geothermal, bioenergy, utility-scale solar, wind, and hydropower. Each row carries plant name, fuel type, capacity (MW), status, start year, country, owner. Use for questions like "nuclear plants in France above 1 GW", "coal capacity in India", "operating bioenergy plants in Brazil". Pass include_minor=true to bypass the operating-only filter (e.g. to include proposed/retired). Pass fuel to slice to a single fuel_type.
query_pipelinesQuery gas pipelines (GEM GGIT), oil/NGL pipelines (GEM GOIT), and LNG terminals (GEM GGIT) in one call. Returns a mixed list — each row has infra_subtype=pipeline_gas|pipeline_oil|lng_terminal so you can disambiguate. Pipeline rows carry start/end country, length, capacity (bcm/y for gas, BOEd or raw bpd for oil), status, owner, route accuracy. LNG terminals carry facility_type=import|export, capacity in mtpa, country. Use for questions like "Russian gas pipelines into Europe", "LNG export terminals in Qatar", "Trans-Alaska oil pipeline status", "Keystone XL". Pass fuel=gas or fuel=oil to slice to one type. Pass include_minor=true to bypass the operating-only default.
query_airportsQuery airports from OurAirports. Default returns the ~7,500 commercially-significant airports (large airports + medium airports with scheduled service); pass include_minor=true for the full ~85k including small airfields, heliports, etc. Each row carries name, type, IATA/ICAO codes, country, municipality, elevation, scheduled_service. Use for questions like "airports near recent conflict events", "ICAO code for Heathrow", "all scheduled-service airports in Ukraine".
query_portsQuery commercial seaports from the NGA World Port Index (~3,800 ports worldwide). Each row carries port name, country, harbor size (Large/Medium/Small/Very Small), harbor type, shelter rating, channel depth in metres, repair facilities. Use for questions like "ports near Bab-el-Mandeb", "deepwater ports in West Africa", "all large harbors in the Mediterranean". Pass harbor_size to slice to a single tier.
query_weatherQuery current weather conditions for a specific location (Open-Meteo).
query_thermal_anomaliesQuery NASA FIRMS satellite thermal anomalies (VIIRS 375m + MODIS 1km, near-real-time, ~3h latency). Two modes. mode="facilities" (default) reads the pre-aggregated per-facility-per-day rollup — use it for facility-centric questions ("thermal anomalies at Russian refineries this week", "which Gulf refineries lit up", "anything at the Ryazan refinery"). Filter by country, facility_type (refinery | power_plant), facility_name, days. Returns per facility: total detections, max FRP (fire radiative power, MW), nearest detection distance in km, and the monitoring radius used. mode="raw" reads individual detections inside a lat/lon box — use it for geographic questions not anchored to a monitored facility. CRITICAL INTERPRETATION RULES — a FIRMS detection is a SATELLITE HOT PIXEL, nothing more. It is NOT a confirmed fire, NOT a strike, NOT an outage. Most detections at oil and gas infrastructure are ROUTINE GAS FLARES that burn every single day. Attributing a detection to a strike, an attack, an explosion or a production halt is INFERENCE and must be labelled as inference, corroborated with other sources (conflict events, agent reports, news), and never stated as fact. Equally, ABSENCE OF DETECTION DOES NOT MEAN ABSENCE OF FIRE — cloud cover, smoke, and satellite overpass timing routinely hide real fires. Every response carries a `coverage` block: ingest is REGIONAL (Russia/Ukraine, Arabian Gulf, Europe), not global, so facilities outside those boxes report zero detections because they are NOT WATCHED, not because nothing burned. Always read `coverage` before characterising a zero result, and tell the user which of the two it is.
query_nightlightsQuery NASA Black Marble night-lights (VIIRS VNP46A2, ~500 m): moonlight/atmosphere-corrected nighttime radiance sampled nightly at every FIRMS-watched facility, plus significance events judged against each facility's OWN clear-night baseline. Two modes. mode="events" (default) reads SITE-LEVEL significance events — went_dark_lights (a habitually-lit facility dark across several consecutive CLEAR nights: the outage signal), surge (materially brighter than its own norm), first_light (a reliably-dark facility lights up). Use it for "which power stations went dark last week", "unusual lighting activity in Kuwait". mode="radiance" reads the per-facility nightly radiance rollup — use it for baseline questions ("how bright is Bandar Abbas at night", "clear-night trend at Az Zour"). CRITICAL INTERPRETATION RULES — RADIANCE IS NOT POWER STATE. A dark pixel is not a confirmed outage: cloud, snow, moon geometry and the ~500 m footprint all hide light, so went_dark_lights requires SUSTAINED absence across multiple confidently-CLEAR nights and is still an inference, never a verdict. Judgements use confident_clear observations ONLY (cloud scatters city light back at the sensor — cloudy readings average ~100x brighter and would fake both surges and collapses). ABSENCE OF A ROW IS ABSENCE OF A LOOK, never darkness. Counts are per PHYSICAL SITE, not per registry row (one plant = many generating-unit rows at identical coordinates). LATENCY: NASA publishes VNP46A2 in stages, typically ~1-2 WEEKS behind — every response carries a coverage block with newest_night and lag_days; answers describe that week, NOT last night, and you must say so. Thermal (FIRMS) and night-lights are INDEPENDENT sensors — infrared combustion power vs visible emitted light — so agreement between them (e.g. a FIRMS went_dark and a went_dark_lights at the same facility) is materially stronger evidence than either alone. Corroborate across both before characterising an outage.
query_agent_reportsRetrieve recent intelligence reports generated by eYKON Sub-Agents. Returns structured reports with severity, narrative, and entity references.
query_posture_scoresMost recent posture_scores rows per theatre. Returns composite + 5-domain sub-scores.
query_convergencesRecent convergence_events (anomaly-of-anomalies) with synthesis and contributing anomaly IDs.
query_shadow_fleet_leadsRanked shadow-fleet vessel leads, scored from silence relative to the OWN observed reporting cadence of each vessel (14-day baseline), vanished-under-way, and flag-of-convenience. Vessels without a cadence baseline yet are unscored, not defaulted. Each lead carries silence_hours = hours since its last AIS fix, measured against the data clock. NOTE: the commodity argument is accepted but NOT applied — vessel type is known for under 1% of the tracked fleet, so all values return the same list; do not tell the user results were filtered by commodity. Coverage IS gated: vessels last seen in a coverage box that has itself been silent >12h are VOID, never ranked; the response carries per-box coverage state (live/stale/dead) you should relay when a corridor the user asks about is dark.
query_dark_contact_eventsDark-contact EVENTS from the Shadow Fleet board — resolvable observations with a lifecycle, not a leads snapshot. An event opens when a vessel goes silent >=12x its OWN 14-day cadence inside a live coverage box, and resolves within 72 h as: reappeared (a newer fix arrived — positive, feed-wide observation), still_dark (NOT RE-OBSERVED by our coverage — a statement about the instrument, never proof the transponder was off; say "not re-observed", never "confirmed dark"), or void (the coverage box died mid-event; neither a hit nor a miss). Response carries per-box coverage state and open/24h resolution tallies. Use this for "what went dark / what came back" questions; use query_shadow_fleet_leads for the current ranked list.
query_calibrationBrier + log-loss aggregates for the given feature / window.
query_precursor_matchesNearest precursor_library entries for the given theatre, by cosine similarity.
run_chokepoint_scenarioRun a chokepoint closure scenario (same model as the Chokepoint Simulator). Returns the persisted scenario_run.
run_sanctions_wargameRun a sanctions propagation scenario.
query_regime_shiftsActive regime shifts (30d-vs-60d test) with p-values and effect sizes.
query_entitiesSearch the entities registry (vessels, operators, owners, flags, ports, refineries, mines).
expand_actor_networkWalk the fleet kinship graph from a seed entity. Returns the nodes and edges within N hops.
The one nobody else has
query_calibration returns eYKON's own forecast record — Brier scores and skill by observable family, against each family's own base rate. Your agent can ask how well eYKON has actually performed on a question type before it trusts the answer. Forecasts are hash-bound at issue and the hash is publicly recomputable in the browser.