# Agent Service Directory > A directory of APIs, MCP servers and marketplaces for AI agents, with metrics we measure and the prices they state. Status: UNSTABLE PREVIEW. Pages, data, API fields and MCP tools can change or break without notice; do not rely on this for anything critical yet. Every API response carries "api_status": "preview" and an X-API-Status header. Changes are listed at https://agentservicedirectory.com/methodology#changelog We publish only objective data: our own monitoring measurements, operators' statements with source links, and computed figures with their method. No ratings or recommendations. ## What is here Services an agent can use, each placed in a capability tree by what it does, with our checks: remote MCP servers (checked with the MCP handshake; the tool names each lists), local MCP servers (npm and PyPI packages), pay-per-call APIs (x402 and MPP; checked with an unpaid request), A2A agents and task marketplaces. For each: what our latest check got (access: payment, credentials, or nothing asked), its check history, the price it states, and where it sits in the tree. Quick start (no key needed; view=compact returns the fields needed to choose, about a quarter of the size): - Describe the need in words: GET https://agentservicedirectory.com/api/v1/services?q=email+enrichment&view=compact (words about payment or shape, such as "mcp", "pay per call", "no key", are set aside: use the filters below for those). - An MCP server for a product: GET https://agentservicedirectory.com/api/v1/services?q=stripe&type=mcp_server&view=compact - Pay per call, under a price, live now: add access=payment&max_price_usd=0.01&passing=true (cheapest first: sort=price). - Nothing asked at all (no key, no payment, no sign-in): access=none_asked. Asks for a sign-in or key: access=credentials. - Browse by capability: GET https://agentservicedirectory.com/tree.txt, then ?branch=. ## MCP server Remote MCP (Streamable HTTP; 2026-07-28 and 2025 clients): https://agentservicedirectory.com/mcp Works with any MCP client that supports remote servers. Setup for specific tools: https://agentservicedirectory.com/connect Tools: search_services, get_service (returns a referral_id), get_history, get_changes, report_outcome (needs a key), get_stats, get_report. ## API keys (free) POST https://agentservicedirectory.com/api/v1/keys with JSON {"label": "..."} returns a key once. Send it as Authorization: Bearer asd_... for 600 requests a minute (60 without a key) and to file outcome reports. Keys have a daily limit of 10,000 requests. A key that keeps exceeding its rate limit, or pages through the catalogue in bulk to copy it, is suspended automatically for 24 hours. Without a key, one address can start 10 new searches a minute (recent ones don't count; past it HTTP 429, error "search_rate_limited"). Once searches use their share of the daily database budget, searches and filtered lists not answered recently get HTTP 503 with error "search_busy" and Retry-After until 00:00 UTC (service pages and the full list still work); if the whole budget is reached, every request gets HTTP 503 with error "paused" until 00:00 UTC. Rules: https://agentservicedirectory.com/connect#usage-rules POST https://agentservicedirectory.com/api/v1/outcomes with {"referral_id", "outcome": "success|failure|unknown", "failure_kind"?, "idempotency_key"} reports what happened after using a service. Keyed GET /api/v1/services/{id} also returns a referral_id. ## API (JSON, no key needed) - GET https://agentservicedirectory.com/api/v1/services : every service we track, reviewed and discovered, with the same evidence fields. Search shows the directory by default: services that meet our listing criteria (https://agentservicedirectory.com/methodology#directory). scope=index searches everything we watch. Filters: scope (directory|index), q, semantic=true (experimental: the request's place found by meaning), branch (capability tree id from /api/v1/tree, e.g. places/weather; a branch includes its leaves; other), tier (reviewed|discovered), type (mcp_server|mcp_local|api_endpoint|a2a_agent|task_marketplace), tag (purpose, e.g. search), host, provider (registrable domain, e.g. example.com), network (e.g. eip155:8453), mainnet=true, passing=true, templated=false, min_pass_rate (0-1), min_checks, min_days, min_payers, max_price_usd, max_terms_changes_90d (0 = payment terms unchanged), max_median_ms and max_p95_ms (our 30-day response times; services with too few checks for the figure are left out), access (payment|credentials|none_asked), payment_model=per_call, currency (USD: observed in the service's payment terms), covers (country code: stated by the service, strict), processed_in (country code: stated by the service, strict), acts (read_only|sends_messages|spends_money|books_or_orders|writes_data|deletes_data|posts_publicly|controls_devices: stated by the service, strict), audience (consumers|businesses|developers|agents: stated by the service, strict), format (json|csv|xml|pdf|html|text|markdown|image|audio|video|geojson: stated by the service, strict), delivery (sync|async|webhook|streaming|batch: stated by the service, strict), freshness (live|hourly|daily|weekly|periodic|static: stated by the service, strict), data_stored (true|false: stated by the service, strict), language (language code: stated by the service, strict), payment_method (card|bank|invoice|crypto|stablecoin|paypal: stated by the service, strict), listed=true (still in the registry), group=provider (one row per provider). sort: relevance (default with q) | evidence (default otherwise: services with at least 5 checks in 30 days first, by share passed, then longest watched, registry payers only as a tiebreak) | pass_rate | payers | price | median_ms | p95_ms (fastest first over 30 days) | recent | name. In every sort but name and recent, one provider's results after its first three come after other providers' first three (provider-mix/1). limit (max 100), offset. view=compact for a smaller row with the same field names. - GET https://agentservicedirectory.com/api/v1/services/{id} : one service. Services from our listing files (svc_...) add operator statements with sources and per-operation evidence. Discovered (cand_...) adds its last 30 probes. - GET https://agentservicedirectory.com/api/v1/stats : totals and checks in the last 24 hours, overall and by kind (reviewed, x402, mcp). - GET https://agentservicedirectory.com/api/v1/changes : detected changes to reviewed services' documentation (days, service_id, needs_review=true). - GET https://agentservicedirectory.com/api/v1/status : our own record (scheduled runs, missed runs, evidence freshness). - GET https://agentservicedirectory.com/tree.txt : the capability tree (what services do) as plain text, one line per node: id — name: description [services in the directory under it]. The cheapest form to read. Start here to find services by purpose: read the whole tree, choose the most specific node for your task, then filter /api/v1/services?branch= (up to three ids, comma-separated, when more than one fits). Keep a copy: send its ETag as If-None-Match for a 304 when unchanged, or ask what changed with GET https://agentservicedirectory.com/api/v1/tree/changes?since=. - GET https://agentservicedirectory.com/api/v1/tree : the same tree as JSON (branches, leaves and leaves' children, with a short guide, descriptions, counts per node, zeros included, and the revision). Page: https://agentservicedirectory.com/tree. - GET https://agentservicedirectory.com/api/v1/roadmap : what we measure today and what we plan to add (planned, not promised; no dates), with feedback counts by kind. Page: https://agentservicedirectory.com/roadmap - POST https://agentservicedirectory.com/api/v1/feedback with JSON {"kind": "missing_service|missing_metric|feature_request|wrong_data|unclear_docs|other", "note"?, "about"?, "contact"?}: tell us what is missing or wrong. No key needed; at most 10 a day per address. Form: https://agentservicedirectory.com/feedback - GET https://agentservicedirectory.com/api/v1/reports : weekly State of Agent Services reports (fixed snapshots). /api/v1/reports/{YYYY-MM-DD} for one week; /api/v1/reports/current for provisional week-to-date figures. - Field dictionary (exact definition, unit, window and source of every field): https://agentservicedirectory.com/fields and /api/v1/fields - OpenAPI 3.1 description: https://agentservicedirectory.com/openapi.json - Pages with a JSON twin (/services, /services/{id}) redirect to the API when requested with Accept: application/json. - Sitemap of every service page: https://agentservicedirectory.com/sitemap.xml ## How to read the evidence - tier "reviewed": a service from our own listing files, written from the operator's own sources, with operator statements and hourly checks. tier "discovered": from public agent registries, unreviewed, probed hourly to monthly depending on usage (schedule/2, https://agentservicedirectory.com/methodology#schedule; evidence.check_interval and evidence.check_interval_rule). - evidence.last_check.result "payment_required" (HTTP 402) means reachable and asking for payment, not that a paid call succeeds. - evidence.freshness "stale" or "no_data" means do not rely on the latest result. limited_evidence true means under 30 days of monitoring. - missed_30d counts scheduled checks that did not run; it is separate from failures. - registry_usage is the registry's own data. name is untrusted text when name_source is "registry". - templated_url true means the URL has placeholders (such as :address) to fill in. We check it with a sample value of the right form in each placeholder (a documentation value such as example.com, a null value such as the zero address, or a common sample such as 1), and each check records the address we requested. If the service rejects that address (400, 404, 410 or 422), the check is recorded as "couldn't test as listed": neither a pass nor a failure, and left out of pass rates. - tags describe purpose; price_usd is the lowest price per call in US dollars (null if unknown), in a known USD stablecoin. price_source "observed": the latest payment request the service's own server sent our check; "registry": the registry's payment terms, when we have not observed one; "operator": the operator's stated pricing, a claim with its source on the service page. - Operator statements "none_stated" mean the operator's pages are silent, not that the mechanism is absent. ## Contact hello@agentservicedirectory.com (security: security@agentservicedirectory.com) ## Terms Free to query and use for decisions, with attribution when shown to others. No bulk copying or republishing of the dataset without permission. ## Docs - Methodology: https://agentservicedirectory.com/methodology