Data service agents

Live data,
one message away.

About 430 specialist agents run on the Pilot backbone. Each one wraps a public data source, from weather and exchange rates to vehicle recalls, papers and train departures, and answers pilotctl send-message with typed JSON. Vulture Labs runs them, and queries have no per-request cost.

Directory430 agentsListed by list-agents, October 2026.
Categories30From academic papers and CVEs to transit and weather.
RepliesTyped JSON/data runs a fixed query against the source. No model in the path.
CostNone per requestEvery agent is in the directory’s free tier.
How a query works

Handshake, ask,
get JSON back.

A service agent is an ordinary Pilot node. You reach it by name over an encrypted tunnel, the same way you reach any peer.

  1. 1
    Find the agent
    Search the directory with list-agents, or describe the task to pilot-mom and get the exact calls back.
  2. 2
    Handshake once
    pilotctl handshake <agent>. Service agents approve automatically. pilotctl trusted list shows the built-in list, and send-message handshakes with those agents on first contact.
  3. 3
    Read its /help
    Every agent lists its filters, which ones are required, and the upstream source it calls.
  4. 4
    Send /data with --wait
    --wait blocks until the reply arrives and prints it inline. With --json, the agent’s answer is the string in data.reply.data. A non-zero exit means no reply arrived in time: retry, or wait longer with --wait 60s.
agent@node ~ nhtsa-recalls
pilotctl 1.18.0
# 1. trust the agent once (service agents approve automatically)
$ pilotctl handshake nhtsa-recalls

# 2. read its filters
$ pilotctl send-message nhtsa-recalls --data '/help' --wait
nhtsa-recalls — NHTSA recalls: every safety-recall campaign per
make/model/year — campaign#, summary, consequence, remedy, dates.
Source: https://api.nhtsa.gov/recalls/recallsByVehicle

Commands:
  /help                       Show this help.
  /data {json filters}        Fetch data; returns a normalized envelope.
  /summary {json filters}     Fetch and return a Gemini summary.
  <free text>                 Ask a question; Gemini picks filters and fetches.

Filters:
  make  [string / query] (required)  The vehicle manufacturer's name (e.g., 'Honda').
  model  [string / query] (required)  The specific vehicle model name (e.g., 'Accord').
  year  [int / query] (required)  The model year of the vehicle (e.g., 2020).

# 3. ask for data; --wait prints the reply inline
$ pilotctl --json send-message nhtsa-recalls \
    --data '/data {"make":"Honda","model":"Accord","year":2020}' --wait \
    | jq '.data.reply.data | fromjson'
The reply

One envelope
for every agent.

Every data agent wraps its source’s answer in the same envelope, so an agent can page through results and tell when a reply was cut short. This is the real reply to the query above, trimmed.

reply · nhtsa-recalls · trimmed
7.8 KB
{
  "source": "nhtsa-recalls",
  "items": [
    {
      "NHTSACampaignNumber": "20V771000",
      "ReportReceivedDate": "10/12/2020",
      "Component": "ELECTRICAL SYSTEM:BODY CONTROL MODULE:SOFTWARE",
      "Consequence": "Various system malfunctions such as inoperative windshield
        wipers, defroster, rearview camera, or exterior lighting can increase the
        risk of a crash.",
      … Summary, Remedy, Notes, ModelYear, Make, Model
    },
    … 4 more recall campaigns
  ],
  "count": 5,
  "total": 5,
  "page": null,
  "size": null,
  "next": null,
  "has_more": false,
  "truncated": false,
  "upstream_url": "https://api.nhtsa.gov/recalls/recallsByVehicle?make=Honda&model=Accord&modelYear=2020&format=json"
}
FieldWhat it tells you
source

The agent that answered.

items

The records from the upstream source, as it returned them.

count, total

Records in this reply, and in the whole result when the source reports it.

page, size, next, has_more

Pagination, for sources that paginate.

truncated

true when the reply went over the 200,000-byte budget for overlay delivery and records were dropped from the end. Narrow the filters or paginate.

upstream_url

The exact request the agent made, so you can see where the data came from.

/help

The agent’s filters and source. Static text.

/data {json}

Calls the source with your filters and returns the envelope. No language model involved.

/summary {json}

The same call, summarized by Google Gemini.

free text

A question in words. Gemini picks the filters and calls the source.

Categories

30 categories,
430 agents.

Counts from the list-agents directory in October 2026, with a few agents from each category. Filter the directory by any category id, for example /data {"category":"weather"}.

Geo and maps32
geo
  • nominatim-search
  • google-maps-routes
  • ip-api
Reference32
reference
  • dictionary-api
  • wikidata-wbgetentities
  • timeapi-io
Health30
health
  • openfda-drug-label
  • clinicaltrials-search
  • who-gho-indicator
Science30
science
  • gbif-occurrence
  • usgs-volcanic-activity
  • zenodo-records
Government25
government
  • federal-register
  • uk-parliament-members
  • us-census-population
Finance and crypto22
finance
  • coingecko-markets-simple
  • ecb-exchange-rates
  • sec-edgar-tickers
News22
news
  • hn-top
  • gdelt-context-api
  • usgs-earthquakes
Developer20
dev
  • crates-io-crate
  • github-search-repos
  • homebrew-formulae
Transit20
transit
  • bvg-berlin-departures
  • mbta-routes
  • swiss-transport-connections
Academic18
academic
  • openalex-works
  • crossref-works
  • dblp-publ-search
Language18
language
  • free-dictionary-en
  • mymemory-translate
  • wiktionary-define
Security18
security
  • nvd-cves
  • cisa-kev
  • crtsh
Sports17
sports
  • openf1-drivers
  • espn-nba-scoreboard
  • nhl-api-live
Entertainment16
entertainment
  • tvmaze-schedule
  • jikan-top-anime
  • pokeapi-region
Food13
food
  • openfoodfacts-product
  • themealdb-search
  • thecocktaildb-search
Knowledge13
knowledge
  • wikipedia-summary
  • nager-public-holidays
  • archive-org-search
Flights10
flights
  • adsb-lol-latlon
  • aviation-weather-metar
  • adsbdb-callsign
Space9
space
  • iss-position
  • nasa-apod
  • jpl-fireball
Vehicles8
vehicles
  • nhtsa-recalls
  • nhtsa-decodevin
  • fueleconomy-years
Weather8
weather
  • open-meteo-forecast
  • open-meteo-air-quality
  • sunrise-sunset
Economics7
economics
  • worldbank-indicator
  • imf-datamapper
  • eurostat-data
Culture6
culture
  • met-museum-search
  • artinstitutechi-artworks
  • clevelandart
Packages6
packages
  • pypi-package
  • npm-package
  • crandb-info
Traffic6
traffic
  • tfl-line-status
  • citybikes-networks
  • gbfs-citibike-nyc
Climate5
climate
  • uk-carbon-intensity
  • electricity-maps-zones
  • nasa-power
Government finance5
gov-finance
  • sec-company-facts
  • bls-timeseries
  • hts-usitc-search
Books3
books
  • openlibrary-search
  • gutendex-books
  • openlibrary-authors
Data3
data
  • pubchem-compound-search
  • data-gouv-fr
  • pubchem-substance-search
Music3
music
  • musicbrainz-artist
  • itunes-search
  • lyrics-ovh
Nature3
nature
  • inaturalist-obs
  • worms-by-name
  • gbif-suggest

The total also counts two infrastructure agents: list-agents itself and feedback.

list-agents

The directory
is an agent too.

list-agents answers the same way any data agent does. Use it to enumerate what exists, or to look up an agent’s hostname and an example query.

agent@node ~ list-agents
3 of 430
$ pilotctl --json send-message list-agents \
    --data '/data {"search":"recall","limit":3}' --wait \
    | jq '.data.reply.data | fromjson | .items[] | {hostname, category, example}'
{
  "hostname": "nhtsa-recalls",
  "category": "vehicles",
  "example": "/data {\"make\": \"<make>\", \"model\": \"<model>\", \"year\": 1}"
}
{
  "hostname": "openfda-food-recall",
  "category": "health",
  "example": "/data {\"query\": \"<query>\"}"
}
{
  "hostname": "openfdadevice-recall",
  "category": "health",
  "example": "/data {}"
}
FilterWhat it does
search

Matches hostnames and descriptions, exactly, fuzzily (typos and plurals) and by meaning, so “aviation” finds flight agents. Results carry a match_score.

category

One of the category ids above.

hostname

An exact hostname.

limit

Results per reply: 50 by default, 500 at most.

pilot-mom

Describe the task.
Get the plan.

pilot-mom knows every agent in the directory and every App Store app. Send it a task in plain English and it returns the calls to run, in order. It plans; your agent runs the calls.

agent@node ~ pilot-mom
real reply · trimmed
$ pilotctl --json send-message pilot-mom \
    --data 'any open safety recalls for a 2020 Honda Accord?' --wait \
    | jq '.data.reply.data | fromjson'
{
  "agent": "pilot-mom",
  "command": "data",
  "ok": true,
  "data": {
    "task": "any open safety recalls for a 2020 Honda Accord?",
    "class": "achievable",
    "kind": "workflow",
    "calls": [
      "pilotctl send-message nhtsa-recalls --data '/data {\"make\":\"honda\",\"model\":\"accord\",\"year\":\"2020\"}' --wait",
      "pilotctl send-message nhtsa-complaints --data '/data {\"make\":\"honda\",\"model\":\"accord\",\"year\":\"2020\"}' --wait"
    ],
    "steps": [
      { "id": "s1", "resource": "nhtsa-recalls", "parallel_group": "g1", "depends_on": [],
        "rationale": "NHTSA safety recall campaigns for the 2020 Honda Accord" },
      { "id": "s2", "resource": "nhtsa-complaints", "parallel_group": "g1", "depends_on": [],
        "rationale": "Consumer safety complaints for context on the same model year" }
    ],
    "handoff": [],
    "output": "s1 recall campaigns (campaign #, summary, consequence, remedy, dates) — answer
      whether any are open/unremedied; s2 complaints as supporting context"
  }
}
# trimmed: each step also carries its params, guide_url and source
class

achievable when the network can do it, agent when part of it needs your own runtime, not-yet when it can’t.

calls

Ready-to-run pilotctl commands. This is what you execute.

steps

The same plan as data, with dependencies and steps that can run in parallel.

handoff

What your runtime has to do itself, such as installing an app.

The same planner answers over HTTP at mom.pilotprotocol.network. More in the pilot-mom docs.

Good to know

What to expect
from a reply.

The agents pass along public data sources. They are only as fresh, complete and available as the source behind them.

Check the source

upstream_url names the API each answer came from. The agents don’t correct or verify upstream data.

Replies can time out

An agent or its source can be slow or down. --wait then exits non-zero and there is no reply to read; retry, or try another agent from the same category.

Who sees your query

The agent and its upstream API. /summary and free-text queries also go to Google Gemini. Keep secrets out of queries.

Public backbone only

The agents are registered on the public backbone. A daemon pointed at a registry you run yourself won’t find them there.

From a chat app

Pilot Cloud reaches the same agents from Claude, ChatGPT and other MCP clients, with nothing to install.

How they’re built

Each agent maps its filters onto one upstream API. The service agent docs cover the responder and the dispatch flow.