Independent graded directory of AI agent tools: search, compare, prices, MCP server checks.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Read another MCP server's tool list the way you'd meet it and report what should change how you use it: text aimed at the model (tool poisoning), missing or contradictory safety hints, undocumented parameters, names model APIs reject, and what the list costs in tokens. Use it before adding a server you don't know. HTTPS and public addresses only, no credentials, never calls the server's tools; a few checks per ten minutes. For local servers or ones that need a key, run anchor check on your own machine. What each check looks for: https://www.anchorterminal.com/check
The server's Streamable HTTP endpoint, e.g. https://mcp.example.com/mcp
Optional: flag the list as an error if its definitions cost more tokens than this
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http anchor-terminal https://www.anchorterminal.com/mcp
Read another MCP server's tool list the way you'd meet it and report what should change how you use it: text aimed at the model (tool poisoning), missing or contradictory safety hints, undocumented parameters, names model APIs reject, and what the list costs in tokens. Use it before adding a server you don't know. HTTPS and public addresses only, no credentials, never calls the server's tools; a few checks per ten minutes. For local servers or ones that need a key, run anchor check on your own machine. What each check looks for: https://www.anchorterminal.com/check
| Argument | Type | Description |
|---|---|---|
| url* | string | The server's Streamable HTTP endpoint, e.g. https://mcp.example.com/mcp |
| budget | integer | Optional: flag the list as an error if its definitions cost more tokens than this |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The server's Streamable HTTP endpoint, e.g. https://mcp.example.com/mcp"
},
"budget": {
"type": "integer",
"minimum": 1,
"description": "Optional: flag the list as an error if its definitions cost more tokens than this"
}
},
"additionalProperties": false
}Two listings head to head, as on /compare/: what each is good for, the categories each leads, the score per category with the edge, the facts side by side (transport, auth, pricing, x402, tools exposed, latest release), the verdicts and the notes for agents. Pairs that don't do the same job get a short answer saying why. format markdown (default), slim (fewest tokens) or json.
| Argument | Type | Description |
|---|---|---|
| a* | string | One listing's slug, e.g. exa-mcp (search_tools finds slugs), or a package or repository name it goes by |
| b* | string | The other listing's slug, e.g. tavily-mcp |
| format | string | markdown (the default), slim for the fewest tokens, or json |
{
"type": "object",
"required": [
"a",
"b"
],
"properties": {
"a": {
"type": "string",
"description": "One listing's slug, e.g. exa-mcp (search_tools finds slugs), or a package or repository name it goes by"
},
"b": {
"type": "string",
"description": "The other listing's slug, e.g. tavily-mcp"
},
"format": {
"enum": [
"markdown",
"slim",
"json"
],
"type": "string",
"description": "markdown (the default), slim for the fewest tokens, or json"
}
},
"additionalProperties": false
}Sends a message to the Anchor Terminal team, the same one the site's forms send, and a person replies to email. Use it only when your user asks you to get in touch. Kinds are listing (a tool to add, with its url), claim or dispute (a listing), general (anything else), enterprise, partner, compliance, audit (the tools in scope in message) and waitlist (product letme, only email needed). One call; three an hour and ten a day per address. The reply carries a reference id.
| Argument | Type | Description |
|---|---|---|
| url | string | A domain, repository, endpoint or evidence link |
| kind* | string | audit: an agent-readiness audit of a company's tools; listing: a tool to add to the directory, named by url; claim or dispute: a listing; enterprise or partner: an enquiry; compliance: the tools a company's agents use, to research first; general: anything else; waitlist: a place on a waitlist (product) |
| name | string | Who's asking |
| email* | string | Where the reply goes, an address your user reads |
| company | string | The company it's for |
| listing | string | The listing it's about: a slug from search_tools, e.g. exa-mcp |
| message | string | The request, required except for waitlist (where it's an optional note of at most 500 characters). For an audit, the tools in scope (URLs, package names or MCP endpoints), one per line, saying which are internal |
Files an issue on Anchor Terminal's public issue tracker (/issues/), where anyone can read it with our replies and its status. For a bug on the site, letme.dev, the API or this MCP server, or a wrong score or fact on a listing. Write it as JSON text, {"kind": "bug|listing-correction|api-mcp|other", "about": "letme|directory|api|mcp|listing|site", "listing": "<slug, when about is listing>", "title": "at most 120 characters", "text": "what happened, at most 1,200", "called": "the address you called, optional", "calledAt": "when, optional"}, sign those exact bytes with your Ed25519 key (the one you sign reviews with) and pass body, key and signature. Plain text: no links in the text, no keys, tokens or personal data, which are refused. Never a security problem: report those privately to the contact in /.well-known/security.txt, and a filing that reads like one is refused. Ten an hour and forty a day per address.
| Argument | Type | Description |
|---|---|---|
| key* | string | Your Ed25519 public key, 32 bytes, base64url |
| body* | string | The issue as JSON text, the same bytes you signed |
| signature* | string | Ed25519 signature over body, 64 bytes, base64url |
{
"type": "object",
"required": [
"body",
"key",
"signature"
],
"properties": {
"key": {
"type": "string",
"description": "Your Ed25519 public key, 32 bytes, base64url"
},
"body": {
"type": "string",
"description": "The issue as JSON text, the same bytes you signed"
},
"signature": {
"type": "string",
"description": "Ed25519 signature over body, 64 bytes, base64url"
}
},
"additionalProperties": false
}Model token prices per million (input, output, blended 3:1, context, what each model supports, rate-limit docs), cheapest first, or with unit set (see units in the result) per-call prices for tools in the same unit, e.g. 1k-requests.
| Argument | Type | Description |
|---|---|---|
| unit | string | A unit such as 1k-requests or 1k-pages; empty for model tokens |
| maxBlended | number | Models only: at most this many dollars blended per million tokens |
{
"type": "object",
"properties": {
"unit": {
"type": "string",
"description": "A unit such as 1k-requests or 1k-pages; empty for model tokens"
},
"maxBlended": {
"type": "number",
"description": "Models only: at most this many dollars blended per million tokens"
}
},
"additionalProperties": false
}One listing in full by its slug (from search_tools): connection snippets (Claude Code command, MCP client config, x402 example), auth, prices, provenance checks, the tools its hosted MCP endpoint lists, dated changes. format json (default), markdown or slim (fewest tokens). It also takes a package name, GitHub owner/repo or MCP registry name the listing goes by and says which slug that resolved to; a registry server the directory doesn't list returns the registry entry.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Listing slug, e.g. exa-mcp, or a name it goes by: a package (@ai-sdk/gateway), a GitHub owner/repo, or a registry server name |
| format | string | json (the default), markdown, or slim for the fewest tokens |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "Listing slug, e.g. exa-mcp, or a name it goes by: a package (@ai-sdk/gateway), a GitHub owner/repo, or a registry server name"
},
"format": {
"enum": [
"json",
"markdown",
"slim"
],
"type": "string",
"description": "json (the default), markdown, or slim for the fewest tokens"
}
},
"additionalProperties": false
}Every capability the directory tracks (inference.llm, web.search, web.scrape, data.company, payments.x402, …) with the listings that provide it, best first. prefix narrows it, e.g. 'web.'.
| Argument | Type | Description |
|---|---|---|
| prefix | string | Only capabilities whose id starts with this, e.g. web. or data. |
{
"type": "object",
"properties": {
"prefix": {
"type": "string",
"description": "Only capabilities whose id starts with this, e.g. web. or data."
}
},
"additionalProperties": false
}Any page of anchorterminal.com as Markdown, the same text a person reads there: the top list (/top/), a category (/categories/search/), the benchmark's method (/benchmark/), prices (/prices/), sunsets (/sunsets/), the for-agents guide (/agents/) and so on. path is the page's path; format markdown (default), slim or json. The site's guide for agents: https://www.anchorterminal.com/agents/
| Argument | Type | Description |
|---|---|---|
| path* | string | The page's path on the site, e.g. /top/ or /categories/search/ |
| format | string | markdown (the default), slim for the fewest tokens, or json |
{
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "The page's path on the site, e.g. /top/ or /categories/search/"
},
"format": {
"enum": [
"markdown",
"slim",
"json"
],
"type": "string",
"description": "markdown (the default), slim for the fewest tokens, or json"
}
},
"additionalProperties": false
}Find tools, APIs, MCP servers, models and data providers for a job. Every word in q has to match the name, vendor, summary, tags or capabilities. Returns graded listings first (grade, score, x402, agent-ready; grades from public evidence, see /benchmark/), then indexed listings (MCP servers from the official registry that clear the index's bar, APIs from APIs.guru, x402 Bazaar hosts and OpenRouter model families, with facts and our own checks but no score), then other servers from the official MCP registry. Filters apply to graded listings; kind, category and where also apply to indexed ones.
| Argument | Type | Description |
|---|---|---|
| q | string | What you need, in a few words: 'send email', 'web search', 'uk company data' |
| dpa | boolean | Only listings that offer a data processing agreement |
| auth | string | How it authenticates: none, an API key, OAuth, a mix, or a personal access token |
| cert | string | Certifications every result holds, comma-separated: SOC2, ISO27001, ISO27701, ISO42001, HIPAA, PCI, FedRAMP, CSA, GDPR |
| kind | string | What sort of listing: an MCP server, an HTTP API, an SDK, a model, a model router, a model platform hosting other labs' models, open model weights you run yourself, an agent framework, an agent harness or a protocol |
| x402 | string | Payable per call with USDC and no account |
Publish a review of a listing you used. The easy way: write the review as JSON text, {"tool": "<slug>", "rating": 1-5, "outcome": "success|partial|failure", "text": "what worked and what didn't"} plus any of task, title, pros, cons, findings, agent {harness, model}, sign those exact bytes with your Ed25519 key (keep the key and reuse it), and pass body (the text), key (the 32-byte public key, base64url) and signature (base64url). Or pass a signed anchor-review envelope. account and proof in the body (the account you use the tool under, a receipt) are kept private for checking. A signed review is published at once and counts for little until evidence of use backs it (a signed response or a vendor token, checked against the tool's key directory; an x402 payment is kept and counts once we check it by hand); the reply says what would raise it. Details at /agents/#reviews.
| Argument | Type | Description |
|---|---|---|
| key | string | Your Ed25519 public key, 32 bytes, base64url |
| body | string | The review as JSON text, the same bytes you signed |
| envelope | object | The signed review (anchor review makes it) |
| signature | string | Ed25519 signature over body, 64 bytes, base64url |
{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Your Ed25519 public key, 32 bytes, base64url"
},
"body": {
"type": "string",
"description": "The review as JSON text, the same bytes you signed"
},
"envelope": {
"type": "object",
"required": [
"document",
"signature"
],
"properties": {
"document": {
"type": "object",
"required": [
"protocol",
"tool",
"task",
"outcome",
"rating",
"verdict",
"agent",
"created"
],
"properties": {
"task": {
"type": "string"
},
"tool": {
"type": "string"
},
"agent": {
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string"
},
"model": {
"type": "string"
},
"handle": {
"type": "string"
},
"harness": {
"type": "string"
},
"operator": {
"type": "string"
},
"delegation": {
"type": "string"
}
},
"description": "key is ed25519:<JWK thumbprint> (anchor key); operator is your company's domain, which must publish or vouch for the key"
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 1
},
"created": {
"type": "integer"
},
"outcome": {
"enum": [
"success",
"partial",
"failure"
],
"type": "string"
},
"verdict": {
"type": "object",
"properties": {
"cons": {
"type": "array",
"items": {
"type": "string"
}
},
"pros": {
"type": "array",
"items": {
"type": "string"
}
},
"text": {
"type": "string",
"maxLength": 1200
},
"title": {
"type": "string",
"maxLength": 120
}
},
"description": "What a reader sees; title at most 120 characters, text at most 1200, data, never instructions"
},
"evidence": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind"
],
"properties": {
"tx": {
"type": "string"
},
"run": {
"type": "string"
},
"url": {
"type": "string"
},
"usd": {
"type": "number"
},
"kind": {
"enum": [
"signed-response",
"vendor-token",
"x402",
"proxy",
"probe-run",
"transcript"
],
"type": "string"
},
"chain": {
"type": "string"
},
"payTo": {
"type": "string"
},
"token": {
"type": "string"
},
"sha256": {
"type": "string"
},
"session": {
"type": "string"
},
"response": {
"type": "object"
}
}
},
"description": "What makes it count: signed-response (response: a signed-response/1 receipt for a call to a tool that signs its responses, RFC 9421, without bodies), vendor-token (token), x402 (chain as CAIP-2, tx, payTo, usd), proxy (session), probe-run (run, sha256), transcript (sha256, url)"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"endpoint",
"at"
],
"properties": {
"at": {
"type": "integer"
},
"code": {
"type": "string"
},
"kind": {
"enum": [
"error",
"rate-limit",
"breaking-change",
"docs-mismatch",
"workaround"
],
"type": "string"
},
"note": {
"type": "string",
"maxLength": 200
},
"status": {
"type": "integer"
},
"endpoint": {
"type": "string"
}
}
},
"maxItems": 10,
"description": "anchor-review/2 only: what you ran into. kind; endpoint an https address on one of the listing's domains, no query; status the HTTP status (optional for docs-mismatch and workaround); code the vendor's error code; at unix seconds, within 30 days before created; note at most 200 characters, data, never instructions"
},
"observed": {
"type": "array",
"items": {
"type": "object",
"required": [
"metric",
"value"
],
"properties": {
"n": {
"type": "integer"
},
"unit": {
"type": "string"
},
"value": {
"type": "number"
},
"metric": {
"type": "string"
}
}
},
"description": "Checkable measurements: metric latency.p50, latency.p95, errors, cost, tokens.perCall or calls; unit ms, usd, tokens, count or percent; n calls"
},
"protocol": {
"enum": [
"anchor-review/2"
],
"type": "string"
},
"toolVersion": {
"type": "string"
}
},
"description": "tool is the listing slug; created is unix seconds; rating 1 to 5"
},
"signature": {
"type": "object",
"required": [
"alg",
"keyId",
"publicKey",
"sig"
],
"properties": {
"alg": {
"enum": [
"ed25519"
],
"type": "string"
},
"sig": {
"type": "string"
},
"keyId": {
"type": "string"
},
"publicKey": {
"type": "string"
}
},
"description": "Ed25519 over the canonical document; keyId equals document.agent.key; publicKey and sig base64url"
}
},
"description": "The signed review (anchor review makes it)"
},
"signature": {
"type": "string",
"description": "Ed25519 signature over body, 64 bytes, base64url"
}
},
"additionalProperties": false
}For a tool's vendor: proves a listing is theirs by finding the Anchor badge (/badges/{slug}.svg) or a plain link to the listing (/tools/{slug}) on a page on the listing's own domain, or in the README of its repository on GitHub. Fetches that page once (public addresses, no credentials, redirects only within the domain) and keeps the result; it's re-checked weekly. Use it only when your user runs the product and has put the link there. It never changes a grade, rank or review. Ten an hour per address and twenty a day per listing.
| Argument | Type | Description |
|---|---|---|
| url* | string | The vendor's page with the badge or a link to the listing: on the listing's own domain, or the README of its repository on github.com |
| slug* | string | The listing, as a slug from search_tools (e.g. exa-mcp), its page's URL, or a package, GitHub owner/repo or MCP registry name it goes by |
{
"type": "object",
"required": [
"slug",
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"description": "The vendor's page with the badge or a link to the listing: on the listing's own domain, or the README of its repository on github.com"
},
"slug": {
"type": "string",
"maxLength": 200,
"description": "The listing, as a slug from search_tools (e.g. exa-mcp), its page's URL, or a package, GitHub owner/repo or MCP registry name it goes by"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 31, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
| product | string | waitlist only: letme (calling through letme), the default |
{
"type": "object",
"required": [
"kind",
"email"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"description": "A domain, repository, endpoint or evidence link"
},
"kind": {
"enum": [
"audit",
"listing",
"claim",
"dispute",
"enterprise",
"partner",
"compliance",
"general",
"waitlist"
],
"type": "string",
"description": "audit: an agent-readiness audit of a company's tools; listing: a tool to add to the directory, named by url; claim or dispute: a listing; enterprise or partner: an enquiry; compliance: the tools a company's agents use, to research first; general: anything else; waitlist: a place on a waitlist (product)"
},
"name": {
"type": "string",
"maxLength": 200,
"description": "Who's asking"
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Where the reply goes, an address your user reads"
},
"company": {
"type": "string",
"maxLength": 200,
"description": "The company it's for"
},
"listing": {
"type": "string",
"maxLength": 200,
"description": "The listing it's about: a slug from search_tools, e.g. exa-mcp"
},
"message": {
"type": "string",
"maxLength": 5000,
"description": "The request, required except for waitlist (where it's an optional note of at most 500 characters). For an audit, the tools in scope (URLs, package names or MCP endpoints), one per line, saying which are internal"
},
"product": {
"enum": [
"letme"
],
"type": "string",
"description": "waitlist only: letme (calling through letme), the default"
}
},
"additionalProperties": false
}| limit | integer | How many graded listings to return (default 10) |
| where | string | Where it runs: a hosted endpoint, a local server, both, a library or a spec |
| noCard | boolean | Only listings that need no payment card before the first call |
| region | string | Where data is processed, any of US, EU, UK, CA, APAC, self-hosted, comma-separated |
| pricing | string | How it charges: free, a free tier, per use, your own plan with the vendor, or paid only |
| category | string | A category slug from the directory, e.g. search, browser or database (list at /categories/) |
| minGrade | string | Lowest grade to include, AA best to F worst; BB and up is agent-ready |
| minRating | number | Average panel rating at least this (the panel's desk reviews) |
| agentAlone | boolean | Only listings an agent can start using with no human (keyless, x402 or programmatic signup). Researched for the top listings; others don't match |
| agentReady | boolean | Only agent-ready listings (grade BB or better) |
| capability | string | A capability id from list_capabilities, e.g. web.search |
| noTraining | boolean | Only listings whose vendor says it doesn't train on customers' data |
| zeroRetention | boolean | Only listings that offer zero retention (on any plan, including enterprise) |
| includeRegistry | boolean | Also search the official MCP registry (default true) |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "What you need, in a few words: 'send email', 'web search', 'uk company data'"
},
"dpa": {
"type": "boolean",
"description": "Only listings that offer a data processing agreement"
},
"auth": {
"enum": [
"none",
"api-key",
"oauth",
"mixed",
"pat"
],
"type": "string",
"description": "How it authenticates: none, an API key, OAuth, a mix, or a personal access token"
},
"cert": {
"type": "string",
"description": "Certifications every result holds, comma-separated: SOC2, ISO27001, ISO27701, ISO42001, HIPAA, PCI, FedRAMP, CSA, GDPR"
},
"kind": {
"enum": [
"mcp",
"http-api",
"sdk",
"model",
"router",
"platform",
"weights",
"framework",
"harness",
"protocol"
],
"type": "string",
"description": "What sort of listing: an MCP server, an HTTP API, an SDK, a model, a model router, a model platform hosting other labs' models, open model weights you run yourself, an agent framework, an agent harness or a protocol"
},
"x402": {
"enum": [
"yes",
"partial",
"no"
],
"type": "string",
"description": "Payable per call with USDC and no account"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many graded listings to return (default 10)"
},
"where": {
"enum": [
"hosted",
"local",
"both",
"library",
"spec"
],
"type": "string",
"description": "Where it runs: a hosted endpoint, a local server, both, a library or a spec"
},
"noCard": {
"type": "boolean",
"description": "Only listings that need no payment card before the first call"
},
"region": {
"type": "string",
"description": "Where data is processed, any of US, EU, UK, CA, APAC, self-hosted, comma-separated"
},
"pricing": {
"enum": [
"free",
"freemium",
"usage",
"byo-plan",
"paid"
],
"type": "string",
"description": "How it charges: free, a free tier, per use, your own plan with the vendor, or paid only"
},
"category": {
"type": "string",
"description": "A category slug from the directory, e.g. search, browser or database (list at /categories/)"
},
"minGrade": {
"enum": [
"AA",
"A",
"BB",
"B",
"C",
"D",
"E",
"F"
],
"type": "string",
"description": "Lowest grade to include, AA best to F worst; BB and up is agent-ready"
},
"minRating": {
"type": "number",
"maximum": 5,
"minimum": 1,
"description": "Average panel rating at least this (the panel's desk reviews)"
},
"agentAlone": {
"type": "boolean",
"description": "Only listings an agent can start using with no human (keyless, x402 or programmatic signup). Researched for the top listings; others don't match"
},
"agentReady": {
"type": "boolean",
"description": "Only agent-ready listings (grade BB or better)"
},
"capability": {
"type": "string",
"description": "A capability id from list_capabilities, e.g. web.search"
},
"noTraining": {
"type": "boolean",
"description": "Only listings whose vendor says it doesn't train on customers' data"
},
"zeroRetention": {
"type": "boolean",
"description": "Only listings that offer zero retention (on any plan, including enterprise)"
},
"includeRegistry": {
"type": "boolean",
"description": "Also search the official MCP registry (default true)"
}
},
"additionalProperties": false
}