---
name: letme
description: Pick the best tool for a job with letme (letme.dev), the agent-native side of Anchor Terminal, and get how to call it direct. Use when an agent needs a tool for a job (send an SMS, transcribe a call, scrape a page, search the web, company data) and wants the pick made by published Anchor grades rather than by hand, optionally keyless, under a price or above a grade; or when it has a listing's slug and wants its endpoint, auth and connect snippets.
---

# letme

letme picks the best tool for a job and says how to call it direct. Anchor Terminal grades the
tools; letme reads the grades and applies one published rule. Calling through letme (one key,
payments) comes later, so an agent calls the pick itself. Reading is free and needs no key.

## Ask

- https://letme.dev/{job in words}: https://letme.dev/send-an-sms, https://letme.dev/transcribe-a-phone-call (hyphens, + and %20 are spaces)
- https://letme.dev/?q={job}, or POST https://letme.dev/ with {"job": "...", "keyless": true}
- https://letme.dev/{capability}: the best listing for a capability id (https://letme.dev/web.search; 287 capabilities)
- https://letme.dev/{slug}: one listing and how to call it (https://letme.dev/exa-mcp)

JSON by default; Markdown with Accept: text/markdown or a .md suffix. Over MCP at https://letme.dev/mcp
(Streamable HTTP, tools pick and about). OpenAPI at https://letme.dev/openapi.json.

## Filters

- where=hosted,both: where it runs, as the record says (hosted, local, both, library, spec)
- kind=mcp,http-api: mcp, http-api, sdk, model, router, platform, framework, protocol
- auth=none,api-key,oauth: the record's auth (none, api-key, oauth, pat, mixed)
- keyless=1: usable with no key of your own (auth none, an x402 route, or anonymous use the record describes)
- x402=yes: pays per call over x402 (the record's level isn't no)
- pricing=free,freemium: free, freemium, usage, paid, byo-plan
- max=0.01: the lead unit price in dollars at most this (a listing with no published price is out)
- minGrade=BB: this grade or better (AA, A, BB, B, C, D, E, F)
- not=slug1,slug2: leave listings out, to fall back after a failure
- n=3: how many alternatives (default 3, up to 10)

## Read the answer

1. pick: the listing, with endpoint, auth, authNotes, connect (claudeCode, config, http),
   docs, x402Endpoints, priceSummary and three agentNotes. Call it direct with those.
2. why: the step of the rule that put it first; a price step names the unit it compared in, and
   when price didn't decide it says so and names the step that did. priceUnit: that unit at the
   pick's grade, absent when price didn't decide there. jobPrice on the pick and each alternative
   is the price the rule read (an item that names the job, in that unit); leadPriceUsd is the
   lowest price for anything, for the max filter, never the rule's. alternatives: the next n, in
   the rule's order.
3. understood (a job in words): the capability letme read, the words that matched and a
   confidence. When confidence is low or medium, others lists up to three other readings with
   their own picks; ask again with a capability id if the reading is wrong.
4. understood.named: a listing the job names ("search with exa"), included beside the rule's pick.
5. pick null: nothing fits the filters. nearest is the best listing without them, with ruledOutBy.
6. After a call to the pick fails, ask again with not={slug} for the next one.
7. 404: no capability matches the words; suggestions and the directory's search are in the
   answer. 400: a filter letme can't read (param names it). 429 with Retry-After: over the
   limit (20 requests a second per IP address, with bursts of up to 40); wait that long. 503 with Retry-After: letme is starting; wait and retry
   once. https://letme.dev/status says whether letme is up and how old its ratings are.

## The rule

highest Anchor grade for the capability, then price, compared only between prices whose item names the job, in one unit (the unit most listings at that grade price the job in, usage before plans), then p95 latency, then the Anchor score, then the name.

Price is compared only between prices published for the job itself, in one unit per grade. A
price counts when its item names the job (every word of the capability id's last part, plurals
and -ing forms included, so "Web Search" for web.search and never "Fetch" or "Scrape"). The unit
is the one most listings at that grade price the job in (per 1,000 requests, per minute of audio,
per 1M characters), a usage unit before a plan (per month, per seat), ties to the first key
alphabetically. A listing with no price for the job in that unit comes after the ones with one,
and a listing priced free with no unit prices counts as $0 for any job. When no two listings at
the grade price the job in the same unit, price doesn't decide and the next step does. Ties
after p95 go to the higher score, then the name.

No overrides and no paid placement. letme reads the ratings from the same public files
anyone can read (https://www.anchorterminal.com/api/v1/tools.json, https://www.anchorterminal.com/api/v1/capabilities.json,
https://www.anchorterminal.com/api/v1/categories.json; last read 2026-10-04T21:21:02Z), and maps words to capabilities without a model,
by the table at https://letme.dev/words.json. Grades are the directory's assessments from public evidence, with the reason and sources for each score on the listing; listings it doesn't grade (graded: false) and its own products (own: true, letme and LocalGhost) are never picked.

## Don't

- Don't quote a score as letme's own.
- Don't send a call to letme.dev expecting it to reach a tool: calling.open is false until it does.
- Don't pay anyone to change a pick: nobody can.
- Don't look for pages on letme.dev: a browser sees this same text, and the explanation for people is at https://www.anchorterminal.com/letme/.
