A search engine for AI-agent-callable capabilities — import it into your framework, copy a tool definition, or call POST /search / POST /resolve directly.
Four ways to plug this in, in order of how little code you have to write. Client SDKs (TypeScript, Python) are in progress.
Point your framework's tool-calling / plugin importer at the spec below. Most modern agent frameworks (and a growing number of LLM providers' own tool-use setup flows) can ingest an OpenAPI document directly and generate a working tool with no hand-written integration code.
GET /openapi.json
Same source of truth as the OpenAPI spec — generated from the actual request/response schemas, not hand-maintained, so it can't drift from what the API really does.
GET /tools/openai.json // OpenAI Chat Completions / Responses API `tools` array
GET /tools/anthropic.json // Claude Messages API `tools` array
// Example: OpenAI
const tools = await fetch("https://agent-capability-search-api.shamarwebsterrb.workers.dev/tools/openai.json")
.then((r) => r.json());
// pass `tools` directly as the `tools` param on your Chat Completions call
If your agent already speaks MCP, add this as a server directly — no HTTP
code to write, just config. It's a thin local passthrough to the same
/search and /resolve endpoints below, using your
own API key, so tiering/rate limits/billing all work exactly like calling
the REST API yourself. (Runs locally via npx, not a remote
hosted server — see packages/mcp-server/README.md in the repo
for why, if you're curious.)
{
"mcpServers": {
"agent-capability-search": {
"command": "npx",
"args": ["-y", "@acs/mcp-server"],
"env": { "ACS_API_KEY": "<your key>" }
}
}
}
Exposes two tools: search_capabilities and resolve_capability.
POST /search and POST /resolve, documented below
— works from any language, any framework, zero dependencies.
Pass your key as x-api-key. /search allows a small
unauthenticated demo quota; /resolve always requires a key.
| Tier | /search | /resolve |
|---|---|---|
| Free (no key) | Limited demo quota | Not allowed |
| Free (with key) | Allowed | 20 / day |
| Starter+ | Allowed | Higher limits, plus payment-hint detail and verified-only filtering |
Find capabilities matching a natural-language query.
{
"query": "get the current weather for a city",
"protocol": ["mcp_tool", "rest_api"], // optional
"constraints": { // optional
"verifiedOnly": true,
"authType": "api_key",
"paymentMethod": "free"
},
"limit": 10, // 1-50, default 10
"cursor": null // optional pagination cursor
}
{
"results": [
{
"capabilityId": "b6f1a2b0-1c2d-4e3f-8a9b-000000000002",
"name": "get_weather",
"description": "Returns current weather for a city.",
"protocol": "mcp_tool",
"provider": { "id": "...", "name": "Acme Weather" },
"score": 0.94,
"verificationStatus": "scanned_clean",
"paymentHintSummary": ["free"]
}
],
"nextCursor": null
}
curl -X POST https://api.example.com/search \
-H "content-type: application/json" \
-d '{"query":"weather"}'
Get everything needed to invoke a capability returned by /search.
{
"capabilityId": "b6f1a2b0-1c2d-4e3f-8a9b-000000000002",
"intentContext": "user is asking about weather in Berlin" // optional
}
{
"capabilityId": "b6f1a2b0-1c2d-4e3f-8a9b-000000000002",
"protocol": "mcp_tool",
"endpoint": { "url": "https://...", "method": "streamable-http" },
"auth": { "type": "none" },
"schema": { "input": { ... }, "output": { ... } },
"payment": { "accepted": ["free"], "providerDeclared": true, "verified": false },
"safety": { "verificationStatus": "scanned_clean", "lastScannedAt": "2026-08-01T00:00:00Z" },
"expiresAt": "2026-08-29T00:10:00Z"
}
curl -X POST https://api.example.com/resolve \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"capabilityId":"b6f1a2b0-1c2d-4e3f-8a9b-000000000002"}'
Every capability is scanned before listing. verificationStatus
tells you what stage it's at — only scanned_clean and
manual_reviewed capabilities are ever returned by
/search or /resolve. Flagged or delisted
capabilities are excluded automatically.