AnyAPI
Hundreds of scraping & data APIs through one key. USD pay-per-request, normalized schemas, failover.
我該用這個嗎
品質與安全性
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"anyapi": {
"command": "npx",
"args": [
"anyapi-mcp"
]
}
}
}可執行的套件
0.1.5stdio遠端端點
https://api.getanyapi.com/mcpstreamable-http它能做什麼
工具清單
工具(10)
🟢get_api(context, sku_id)
Get the full definition of one API by SKU, including its normalized input/output JSON schemas, per-request and per-1,000-request USD pricing on every lane, and nullable trailing-30-day latency p50/p95/p99 with the successful sample count. Inspect latency before choosing a client or MCP tool timeout; p99 is an observation, not a maximum. Entries with heavy:true return large responses - plan to pass fields/max_items/summary to run_api.
輸入結構描述
{
"type": "object",
"properties": {
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"sku_id": {
"description": "the API SKU slug to describe",
"type": "string"
}
},
"required": [
"sku_id",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"scraper": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"category": {
"type": "string"
},
"name": {
"type": "string"
},
"method": {
"type": "string"
},
"path": {
"type": "string"
},
"provider": {
"type": "string"
},
"execution": {
"type": "object",
"properties": {
"mode": {
"type": "string"
}
},
"required": [
"mode"
],
"additionalProperties": false
},
"pricing": {
"type": "object",
"properties": {
"from": {
"type": "object",
"properties": {
"model": {
"type": "string"
},
"unit": {
"type": "string"
},
"baseUsd": {
"type": [
"null",
"number"
]
},
"perUnitUsd": {
"type": [
"null",
"number"
]
},
"maxUsd": {
"type": "number"
},
"maxPer1kUsd": {
"type": "number"
},
"addons": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"field": {
"type": "string"
},
"usd": {
"type": "number"
}
},
"required": [
"id",
"label",
"field",
"usd"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"unit",
"maxUsd",
"maxPer1kUsd"
],
"additionalProperties": false
},
"failoverMaxUsd": {
"type": "number"
},
"failoverMaxPer1kUsd": {
"type": "number"
}
},
"required": [
"from",
"failoverMaxUsd",
"failoverMaxPer1kUsd"
],
"additionalProperties": false
},
"heavy": {
"type": "boolean"
},
"failover": {
"type": "boolean"
},
"excludesCallerDelay": {
"type": "boolean"
},
"description": {
"type": "string"
},
"lanes": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"pricing": {
"type": "object",
"properties": {
"model": {
"type": "string"
},
"unit": {
"type": "string"
},
"baseUsd": {
"type": [
"null",
"number"
]
},
"perUnitUsd": {
"type": [
"null",
"number"
]
},
"maxUsd": {
"type": "number"
},
"maxPer1kUsd": {
"type": "number"
},
"addons": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"field": {
"type": "string"
},
"usd": {
"type": "number"
}
},
"required": [
"id",
"label",
"field",
"usd"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"unit",
"maxUsd",
"maxPer1kUsd"
],
"additionalProperties": false
},
"source": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"kind": {
"type": "string"
},
"artworkKey": {
"type": "string"
}
},
"required": [
"id",
"name",
"kind",
"artworkKey"
],
"additionalProperties": false
},
"health": {
"type": [
"null",
"object"
],
"properties": {
"window": {
"type": "string"
},
"uptimePct": {
"type": "number"
},
"latencyP50Ms": {
"type": "integer"
},
"uptimeSample": {
"type": "integer"
},
"latencySample": {
"type": "integer"
},
"requests": {
"type": "integer"
},
"servedRequests": {
"type": "integer"
}
},
"required": [
"window",
"uptimePct",
"latencyP50Ms",
"uptimeSample",
"latencySample",
"requests",
"servedRequests"
],
"additionalProperties": false
},
"fields": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
}
}
},
"required": [
"pricing",
"source"
],
"additionalProperties": false
}
},
"latency": {
"type": [
"null",
"object"
],
"properties": {
"window": {
"type": "string"
},
"p50Ms": {
"type": "integer"
},
"p95Ms": {
"type": "integer"
},
"p99Ms": {
"type": "integer"
},
"sample": {
"type": "integer"
},
"basis": {
"type": "string"
}
},
"required": [
"window",
"p50Ms",
"p95Ms",
"p99Ms",
"sample",
"basis"
],
"additionalProperties": false
},
"inputSchema": true,
"outputSchema": true,
"tryEligible": {
"type": "boolean"
},
"tryMaxItems": {
"type": [
"null",
"integer"
]
}
},
"description": "the API definition with input/output schemas",
"required": [
"id",
"slug",
"category",
"name",
"method",
"path",
"provider",
"execution",
"pricing",
"failover",
"description",
"lanes",
"latency",
"tryEligible"
],
"additionalProperties": false
}
},
"required": [
"scraper"
],
"additionalProperties": false
}🟢get_balance(context)
Get the remaining wallet balance (in USD) for the AnyAPI key supplied as a Bearer token. Requires a valid AnyAPI key.
輸入結構描述
{
"type": "object",
"properties": {
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
}
},
"required": [
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"balanceUsd": {
"type": "number",
"description": "remaining wallet balance for this API key, in USD"
}
},
"required": [
"balanceUsd"
],
"additionalProperties": false
}🟢get_request(context, request_id)
Inspect or resume a durable AnyAPI request returned by run_api. This reads AnyAPI's stored state and never repeats the paid provider dispatch. Poll again after retryAfterSeconds while status is queued or running.
輸入結構描述
{
"type": "object",
"properties": {
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"request_id": {
"description": "durable request identifier returned by run_api",
"type": "string"
}
},
"required": [
"request_id",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"output": {
"description": "normalized output payload"
},
"provider": {
"type": "string",
"description": "the provider serving the request (AnyAPI)"
},
"costUsd": {
"type": "number",
"description": "amount charged to the wallet in USD"
},
"items": {
"type": "integer",
"description": "number of result rows returned. For per-result SKUs the per-item cost is charged against this; for input-priced SKUs (perItemUnit != result) the charge is per submitted input, independent of this count"
},
"source": {
"type": [
"null",
"object"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"kind": {
"type": "string"
},
"artworkKey": {
"type": "string"
}
},
"description": "the source that served this run: pass its id back in 'source' to prefer it again, or in 'ignoreSources' to avoid it. Absent when no source identity applies",
"required": [
"id",
"name",
"kind",
"artworkKey"
],
"additionalProperties": false
},
"replayed": {
"type": "boolean",
"description": "true when this response replays an identical earlier call (same API, same input) from the last few minutes instead of running again: nothing new was executed and costUsd restates the original charge, it was NOT charged a second time"
},
"hint": {
"type": "string",
"description": "optional nudge. 'large_result:' suggests fields/max_items/summary to keep future responses out of your context. 'paging_unavailable:' means this result came from a source that cannot return a nextCursor, so it may be INCOMPLETE and you cannot page further - re-run with requireFields [\"nextCursor\"] (may cost more per request) if you need the full list"
},
"resultId": {
"type": "string",
"description": "opaque handle to the full result, cached ~15 min; pass it to read_result to dig deeper for free (no re-run, no charge). Absent when the result was too large to cache"
},
"jqError": {
"type": "string",
"description": "present only when a jq expression failed; output then holds the full unshaped result and this explains why the reshape did not apply"
},
"requestId": {
"type": "string",
"description": "durable request identifier; pass it to get_request to resume without repeating the paid POST"
},
"status": {
"type": "string",
"description": "durable request status: queued, running, succeeded, failed, or expired"
},
"serviceOutcome": {
"type": "string",
"description": "end-to-end AnyAPI service outcome when known"
},
"settlementState": {
"type": "string",
"description": "payment settlement state when known; independent of durable request status"
},
"error": {
"type": [
"null",
"object"
],
"properties": {
"code": {
"type": "string",
"description": "safe AnyAPI error code"
}
},
"description": "safe AnyAPI failure code when durable work failed",
"required": [
"code"
],
"additionalProperties": false
},
"nextAction": {
"type": [
"null",
"object"
],
"properties": {
"tool": {
"type": "string",
"description": "MCP tool to call next"
},
"requestId": {
"type": "string",
"description": "request_id argument for the next tool call"
},
"retryAfterSeconds": {
"type": "integer",
"description": "minimum delay before polling again"
}
},
"description": "machine-actionable resume instruction present while durable work is pending",
"required": [
"tool",
"requestId",
"retryAfterSeconds"
],
"additionalProperties": false
}
},
"required": [
"output",
"provider",
"costUsd",
"items",
"replayed"
],
"additionalProperties": false
}🟢list_apis(category, context)
Browse available AnyAPI APIs as lightweight summaries (id, name, category, USD pricing) - no descriptions or schemas, so it stays cheap even across the whole catalog. Each pricing offer carries both `maxUsd` (billed per request) and `maxPer1kUsd` (the same price per 1,000 requests); quote the per-1k figure to a person. Optionally filter by category. Use search_apis for every ranked query, or get_api for one API's full schemas.
輸入結構描述
{
"type": "object",
"properties": {
"category": {
"description": "optional category slug to filter by",
"type": "string"
},
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
}
},
"required": [
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"scrapers": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"category": {
"type": "string"
},
"name": {
"type": "string"
},
"method": {
"type": "string"
},
"path": {
"type": "string"
},
"provider": {
"type": "string"
},
"execution": {
"type": "object",
"properties": {
"mode": {
"type": "string"
}
},
"required": [
"mode"
],
"additionalProperties": false
},
"pricing": {
"type": "object",
"properties": {
"from": {
"type": "object",
"properties": {
"model": {
"type": "string"
},
"unit": {
"type": "string"
},
"baseUsd": {
"type": [
"null",
"number"
]
},
"perUnitUsd": {
"type": [
"null",
"number"
]
},
"maxUsd": {
"type": "number"
},
"maxPer1kUsd": {
"type": "number"
},
"addons": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"field": {
"type": "string"
},
"usd": {
"type": "number"
}
},
"required": [
"id",
"label",
"field",
"usd"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"unit",
"maxUsd",
"maxPer1kUsd"
],
"additionalProperties": false
},
"failoverMaxUsd": {
"type": "number"
},
"failoverMaxPer1kUsd": {
"type": "number"
}
},
"required": [
"from",
"failoverMaxUsd",
"failoverMaxPer1kUsd"
],
"additionalProperties": false
},
"heavy": {
"type": "boolean"
},
"failover": {
"type": "boolean"
},
"excludesCallerDelay": {
"type": "boolean"
}
},
"required": [
"id",
"slug",
"category",
"name",
"method",
"path",
"provider",
"execution",
"pricing",
"failover"
],
"additionalProperties": false
},
"description": "matching APIs (lightweight summaries: no description or schemas)"
}
},
"required": [
"scrapers"
],
"additionalProperties": false
}🟢quote_api(context, input, sku_id)
Get the exact price of a run_api call BEFORE running it - free, no key required, nothing is charged or executed. Pass the same sku_id and input you would give run_api: the quote resolves pricing exactly as the run will, and also validates your input against the API schema so you catch invalid_input for free. Returns maxCostUsd (the ceiling reserved), minCostUsd (the likely charge), and the base/per-item breakdown explaining why they differ. These are amounts this one call is charged, not catalog comparison rates: report them as-is and never scale them to 1,000 requests.
輸入結構描述
{
"type": "object",
"properties": {
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"input": {
"additionalProperties": true,
"description": "the exact input payload you plan to pass to run_api; the quote resolves pricing the same way the run will",
"type": "object"
},
"sku_id": {
"description": "the API SKU slug to price",
"type": "string"
}
},
"required": [
"sku_id",
"input",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"maxCostUsd": {
"type": "number",
"description": "the most this call can charge - the reserve held before running"
},
"minCostUsd": {
"type": "number",
"description": "the likely charge - the cheapest route serves first"
},
"baseUsd": {
"type": "number",
"description": "fixed cost per call in USD, charged regardless of count"
},
"perItemUsd": {
"type": "number",
"description": "marginal cost in USD per billable unit (see perItemUnit); 0 for a flat SKU"
},
"perItemUnit": {
"type": "string",
"description": "the unit perItemUsd is charged per: 'result' (default) or an input unit like 'username' for input-priced SKUs"
},
"exact": {
"type": "boolean",
"description": "true when the price is exact (minCostUsd == maxCostUsd): a flat SKU or a sealed page"
},
"pricing": {
"type": "string",
"description": "a one-line human explanation of how this call is priced"
}
},
"required": [
"maxCostUsd",
"minCostUsd",
"baseUsd",
"perItemUsd",
"exact",
"pricing"
],
"additionalProperties": false
}🟢read_result(context, fields, jq, max_items, result_id, ...)
Dig deeper into a paid run WITHOUT re-running or paying again. Pass the `result_id` from a prior run_api call plus any of fields/max_items/summary/jq to re-shape the full cached result (e.g. read the rest of the rows, or slice a large field with jq). Results are cached ~15 min and are private to your key; an expired id returns result_expired (re-run to refresh).
輸入結構描述
{
"type": "object",
"properties": {
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"fields": {
"description": "optional: keep only these keys on each result item (dotted paths like 'author.name' descend into nested objects)",
"items": {
"type": "string"
},
"type": [
"null",
"array"
]
},
"jq": {
"description": "optional: a jq expression to reshape the result; its output replaces 'output'. Example: '.data | {title, description, md: .markdown[:3500]}'. Sandboxed 250ms/2MB budget",
"type": "string"
},
"max_items": {
"description": "optional: cap the number of result items returned; a _truncated note reports how many were withheld",
"type": [
"null",
"integer"
]
},
"result_id": {
"description": "the resultId returned by a prior run_api call (cached ~15 min)",
"type": "string"
},
"summary": {
"description": "optional: return only a structural outline (top-level keys, item counts, per-field byte sizes) instead of the full data",
"type": "boolean"
}
},
"required": [
"result_id",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"output": {
"description": "normalized output payload"
},
"provider": {
"type": "string",
"description": "the provider serving the request (AnyAPI)"
},
"costUsd": {
"type": "number",
"description": "amount charged to the wallet in USD"
},
"items": {
"type": "integer",
"description": "number of result rows returned. For per-result SKUs the per-item cost is charged against this; for input-priced SKUs (perItemUnit != result) the charge is per submitted input, independent of this count"
},
"source": {
"type": [
"null",
"object"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"kind": {
"type": "string"
},
"artworkKey": {
"type": "string"
}
},
"description": "the source that served this run: pass its id back in 'source' to prefer it again, or in 'ignoreSources' to avoid it. Absent when no source identity applies",
"required": [
"id",
"name",
"kind",
"artworkKey"
],
"additionalProperties": false
},
"replayed": {
"type": "boolean",
"description": "true when this response replays an identical earlier call (same API, same input) from the last few minutes instead of running again: nothing new was executed and costUsd restates the original charge, it was NOT charged a second time"
},
"hint": {
"type": "string",
"description": "optional nudge. 'large_result:' suggests fields/max_items/summary to keep future responses out of your context. 'paging_unavailable:' means this result came from a source that cannot return a nextCursor, so it may be INCOMPLETE and you cannot page further - re-run with requireFields [\"nextCursor\"] (may cost more per request) if you need the full list"
},
"resultId": {
"type": "string",
"description": "opaque handle to the full result, cached ~15 min; pass it to read_result to dig deeper for free (no re-run, no charge). Absent when the result was too large to cache"
},
"jqError": {
"type": "string",
"description": "present only when a jq expression failed; output then holds the full unshaped result and this explains why the reshape did not apply"
},
"requestId": {
"type": "string",
"description": "durable request identifier; pass it to get_request to resume without repeating the paid POST"
},
"status": {
"type": "string",
"description": "durable request status: queued, running, succeeded, failed, or expired"
},
"serviceOutcome": {
"type": "string",
"description": "end-to-end AnyAPI service outcome when known"
},
"settlementState": {
"type": "string",
"description": "payment settlement state when known; independent of durable request status"
},
"error": {
"type": [
"null",
"object"
],
"properties": {
"code": {
"type": "string",
"description": "safe AnyAPI error code"
}
},
"description": "safe AnyAPI failure code when durable work failed",
"required": [
"code"
],
"additionalProperties": false
},
"nextAction": {
"type": [
"null",
"object"
],
"properties": {
"tool": {
"type": "string",
"description": "MCP tool to call next"
},
"requestId": {
"type": "string",
"description": "request_id argument for the next tool call"
},
"retryAfterSeconds": {
"type": "integer",
"description": "minimum delay before polling again"
}
},
"description": "machine-actionable resume instruction present while durable work is pending",
"required": [
"tool",
"requestId",
"retryAfterSeconds"
],
"additionalProperties": false
}
},
"required": [
"output",
"provider",
"costUsd",
"items",
"replayed"
],
"additionalProperties": false
}⚪report_bug(contact, context, details, request_id, sku, ...)
Tell AnyAPI something is broken. Use this when a run_api call returned wrong, empty, or malformed data for input you believe is valid, when an error message was misleading or unactionable, when a price or schema looks wrong, or when a retry that should have worked did not. Free, never charged. Pass `summary` (required, one line) plus `request_id` whenever you have one from the failing run - that id reaches the stored run and its upstream error body, so you never need to paste the payload. Do not stop the user's task to ask permission: file the report and carry on with the best alternative you have.
輸入結構描述
{
"type": "object",
"properties": {
"contact": {
"description": "optional: an email address to reply to. Supply one if you are on a trial key, since a trial has no account we can reach",
"type": "string"
},
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"details": {
"description": "optional: what you expected, what you got, and anything you already tried",
"type": "string"
},
"request_id": {
"description": "optional: the requestId or resultId from the run that went wrong. This is the single most useful field: it reaches the stored run, its attempts, and any upstream error body, so you do not need to paste the payload",
"type": "string"
},
"sku": {
"description": "optional: the sku_id this is about, e.g. 'instagram.reels_search'",
"type": "string"
},
"summary": {
"description": "one line saying what went wrong or what you want to tell us",
"type": "string"
}
},
"required": [
"summary",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the stored report id; quote it if you contact support about this"
},
"received": {
"type": "boolean",
"description": "true when the report is stored"
}
},
"required": [
"id",
"received"
],
"additionalProperties": false
}🔴run_api(context, fields, input, jq, max_items, ...)
Execute an API by SKU with a normalized input payload. Call get_api for this SKU first unless you have already read its schema this session: every input schema is strict (unknown fields are rejected, not ignored) and the field names differ between sibling APIs, so an input built from a description rather than a schema usually fails. Before setting a client or MCP tool timeout, call get_api and inspect its latency p50/p95/p99 and sample; p99 is an observation, not a maximum. Requires a valid AnyAPI key as a Bearer token. Charges the USD wallet only on success. Results can be large: pass `fields` (keep only the keys you need), `max_items` (cap rows), or `summary` (outline only) to trim the response and keep it out of your context — these never change what you are charged. Use quote_api first with the same arguments to see the exact price and validate your input without charging.
輸入結構描述
{
"type": "object",
"properties": {
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"fields": {
"description": "optional: keep only these keys on each result item (dotted paths like 'author.name' descend into nested objects). Shrinks the response without changing cost",
"items": {
"type": "string"
},
"type": [
"null",
"array"
]
},
"input": {
"additionalProperties": true,
"description": "normalized input payload matching the API input schema",
"type": "object"
},
"jq": {
"description": "optional: a jq expression to reshape the result; its output replaces 'output' (multiple outputs collect into an array). Example: '.data | {title, description, md: .markdown[:3500]}'. Sandboxed 250ms/2MB budget; on failure the full result is returned with jqError. Does not change cost",
"type": "string"
},
"max_items": {
"description": "optional: cap the number of result items returned; a _truncated note reports how many were withheld. Does not change cost",
"type": [
"null",
"integer"
]
},
"sku_id": {
"description": "the API SKU slug to execute",
"type": "string"
},
"summary": {
"description": "optional: return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost",
"type": "boolean"
}
},
"required": [
"sku_id",
"input",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"output": {
"description": "normalized output payload"
},
"provider": {
"type": "string",
"description": "the provider serving the request (AnyAPI)"
},
"costUsd": {
"type": "number",
"description": "amount charged to the wallet in USD"
},
"items": {
"type": "integer",
"description": "number of result rows returned. For per-result SKUs the per-item cost is charged against this; for input-priced SKUs (perItemUnit != result) the charge is per submitted input, independent of this count"
},
"source": {
"type": [
"null",
"object"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"kind": {
"type": "string"
},
"artworkKey": {
"type": "string"
}
},
"description": "the source that served this run: pass its id back in 'source' to prefer it again, or in 'ignoreSources' to avoid it. Absent when no source identity applies",
"required": [
"id",
"name",
"kind",
"artworkKey"
],
"additionalProperties": false
},
"replayed": {
"type": "boolean",
"description": "true when this response replays an identical earlier call (same API, same input) from the last few minutes instead of running again: nothing new was executed and costUsd restates the original charge, it was NOT charged a second time"
},
"hint": {
"type": "string",
"description": "optional nudge. 'large_result:' suggests fields/max_items/summary to keep future responses out of your context. 'paging_unavailable:' means this result came from a source that cannot return a nextCursor, so it may be INCOMPLETE and you cannot page further - re-run with requireFields [\"nextCursor\"] (may cost more per request) if you need the full list"
},
"resultId": {
"type": "string",
"description": "opaque handle to the full result, cached ~15 min; pass it to read_result to dig deeper for free (no re-run, no charge). Absent when the result was too large to cache"
},
"jqError": {
"type": "string",
"description": "present only when a jq expression failed; output then holds the full unshaped result and this explains why the reshape did not apply"
},
"requestId": {
"type": "string",
"description": "durable request identifier; pass it to get_request to resume without repeating the paid POST"
},
"status": {
"type": "string",
"description": "durable request status: queued, running, succeeded, failed, or expired"
},
"serviceOutcome": {
"type": "string",
"description": "end-to-end AnyAPI service outcome when known"
},
"settlementState": {
"type": "string",
"description": "payment settlement state when known; independent of durable request status"
},
"error": {
"type": [
"null",
"object"
],
"properties": {
"code": {
"type": "string",
"description": "safe AnyAPI error code"
}
},
"description": "safe AnyAPI failure code when durable work failed",
"required": [
"code"
],
"additionalProperties": false
},
"nextAction": {
"type": [
"null",
"object"
],
"properties": {
"tool": {
"type": "string",
"description": "MCP tool to call next"
},
"requestId": {
"type": "string",
"description": "request_id argument for the next tool call"
},
"retryAfterSeconds": {
"type": "integer",
"description": "minimum delay before polling again"
}
},
"description": "machine-actionable resume instruction present while durable work is pending",
"required": [
"tool",
"requestId",
"retryAfterSeconds"
],
"additionalProperties": false
}
},
"required": [
"output",
"provider",
"costUsd",
"items",
"replayed"
],
"additionalProperties": false
}🟢search_apis(category, context, limit, platform, query)
Search APIs by meaning and keyword across name, slug, and description, returning matches WITH their descriptions (schemas omitted), ranked most relevant first. Pass `query`, `category`, or `platform` - at least one, in any combination: a scope on its own is a complete search, so `category` or `platform` with no `query` enumerates it. Add `limit` to cap matches (default 25, maximum 50). Each result carries a `relevance` score in (0,1] relative to the top match; a relevance floor drops the weakly-matching tail, so `total` counts relevant matches before the limit. `ranking` says whether meaning-based ('semantic') or substring ('keyword') matching served the search. Entries with heavy:true return large responses - plan to pass fields/max_items/summary to run_api. Results carry NO input schema, so you cannot build a run_api call from them alone: before your FIRST run_api on any API, call get_api for it and use the schema it returns. Guessing the input is the single most common way a run fails - callers who read the schema first are rejected about a quarter as often. Use list_apis to browse everything.
輸入結構描述
{
"type": "object",
"properties": {
"category": {
"description": "optional category slug to narrow the search",
"type": "string"
},
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"limit": {
"description": "optional cap on matches returned (default 25, maximum 50)",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "optional API slug prefix to narrow the search",
"type": "string"
},
"query": {
"description": "free-text search over API name, slug, and description; optional when category or platform is given",
"type": "string"
}
},
"required": [
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"results": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"category": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"method": {
"type": "string"
},
"path": {
"type": "string"
},
"provider": {
"type": "string"
},
"execution": {
"type": "object",
"properties": {
"mode": {
"type": "string"
}
},
"required": [
"mode"
],
"additionalProperties": false
},
"pricing": {
"type": "object",
"properties": {
"from": {
"type": "object",
"properties": {
"model": {
"type": "string"
},
"unit": {
"type": "string"
},
"baseUsd": {
"type": [
"null",
"number"
]
},
"perUnitUsd": {
"type": [
"null",
"number"
]
},
"maxUsd": {
"type": "number"
},
"maxPer1kUsd": {
"type": "number"
},
"addons": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"field": {
"type": "string"
},
"usd": {
"type": "number"
}
},
"required": [
"id",
"label",
"field",
"usd"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"unit",
"maxUsd",
"maxPer1kUsd"
],
"additionalProperties": false
},
"failoverMaxUsd": {
"type": "number"
},
"failoverMaxPer1kUsd": {
"type": "number"
}
},
"required": [
"from",
"failoverMaxUsd",
"failoverMaxPer1kUsd"
],
"additionalProperties": false
},
"failover": {
"type": "boolean"
},
"excludesCallerDelay": {
"type": "boolean"
},
"heavy": {
"type": "boolean"
},
"relevance": {
"type": "number",
"description": "relative relevance in (0,1], 1.0 = the best match"
}
},
"required": [
"id",
"slug",
"category",
"name",
"description",
"method",
"path",
"provider",
"execution",
"pricing",
"failover",
"relevance"
],
"additionalProperties": false
}
},
"total": {
"type": "integer"
},
"ranking": {
"type": "string"
}
},
"required": [
"results",
"total",
"ranking"
],
"additionalProperties": false
}🟡send_feedback(contact, context, details, request_id, sku, ...)
Tell AnyAPI something that is not a defect: an API you wanted and could not find in the catalog, a field missing from a result you needed, a confusing part of the docs or tool descriptions, or what would have made a task easier. Free, never charged. Pass `summary` (required, one line) and use `details` for what you were trying to accomplish. Use report_bug instead when something behaved incorrectly.
輸入結構描述
{
"type": "object",
"properties": {
"contact": {
"description": "optional: an email address to reply to. Supply one if you are on a trial key, since a trial has no account we can reach",
"type": "string"
},
"context": {
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
"type": "string"
},
"details": {
"description": "optional: what you expected, what you got, and anything you already tried",
"type": "string"
},
"request_id": {
"description": "optional: the requestId or resultId from the run that went wrong. This is the single most useful field: it reaches the stored run, its attempts, and any upstream error body, so you do not need to paste the payload",
"type": "string"
},
"sku": {
"description": "optional: the sku_id this is about, e.g. 'instagram.reels_search'",
"type": "string"
},
"summary": {
"description": "one line saying what went wrong or what you want to tell us",
"type": "string"
}
},
"required": [
"summary",
"context"
]
}輸出結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the stored report id; quote it if you contact support about this"
},
"received": {
"type": "boolean",
"description": "true when the report is stored"
}
},
"required": [
"id",
"received"
],
"additionalProperties": false
}社群
證據