DocsAI assistants (MCP)
MCP tools
Every tool the INFRO MCP server publishes: what it does, the scope it needs, its annotations and its arguments. Generated from the server's own tool registry.
INFRO is in private early access. Running these examples requires an early-access account, an active trial or subscription entitlement, and your own provider connection. Self-serve purchasing is not generally open. See Early access.
The MCP server is served at https://mcp.infro.io/mcp.
Version 1.1.0. Generated from the server's tool registry. Money is estimated provider cost in USD (estimated_provider_cost_usd), never an INFRO charge; an unpriced amount is null. Times are ISO 8601 in UTC. Every entity carries a console_url.
Observe
get_overview
Organization overview. A summary of the organization, and the place to start when the person asks how their INFRO organization is doing. Returns the organization, its plan, which INFRO environment this is (production or sandbox), the current billing period with its bounds, estimated provider cost so far this period (USD), gateway requests against the plan's monthly allowance, open findings by severity, spend limits at 80% or more, and failing provider connections. A section this token cannot read is left out and listed under not_visible with the scope it needs — say so rather than guessing. Estimated provider cost is what the customer's own AI providers will bill them, never an INFRO charge. For breakdowns use query_usage; for individual requests use search_requests.
Needs any read scope · read-only, idempotent.
query_usage
Query usage and estimated cost. Aggregated gateway traffic over a window: requests, errors, error rate, tokens and units, estimated provider cost (USD) and unpriced requests — in total, as a time series, and optionally grouped by ONE dimension (model, provider, connection, route, project, key, environment, endpoint, modality, workflow, step, feature or user). Use it for 'how much', 'which X costs most' and 'when did it change'. Use search_requests to see the individual requests behind a number. Groups are ranked by estimated cost; top are returned and the rest are folded into other. History is limited to the plan's window; window_clamped says when it moved from.
Needs analytics:read · read-only, idempotent.
period"last_hour" | "last_24h" | "last_7d" | "last_30d" | "this_month" | "last_month"- A preset window, in UTC.
this_monthandlast_monthare calendar months. Ignored whenfromis given. fromstring- Window start, ISO 8601 (overrides
period). tostring- Window end, ISO 8601. Default: now.
granularity"hour" | "day" | "month"- Series bucket size. Default: hour for windows up to two days, else day.
group_by"model" | "modality" | "project" | "key" | "endpoint" | "provider" | "connection" | "route" | "environment" | "workflow" | "step" | "feature" | "user"- One dimension to break the totals down by.
projectstring- Only this project (
proj_…). environmentstring- Only requests whose key was in this environment (or several, comma-separated).
topinteger- Groups returned before the rest are folded into
other.
search_requests
Search requests. Find individual gateway requests by status, model, provider, connection, route, project, key, environment, finish reason, trace id, end user, tag or time window, sorted newest, slowest or costliest. Each row: id, time, project, model requested → served, provider and connection, status and error code, latency, tokens, estimated provider cost (USD) and cache result, attempt count, trace id. Prompts and completions are never returned (recorded content, when the organization records it, is read in the console). Use get_request for one request's attempts and routing; use query_usage for totals. Pass cursor (the previous result's next_cursor) for the next page.
Needs analytics:read · read-only, idempotent.
period"last_hour" | "last_24h" | "last_7d" | "last_30d" | "this_month" | "last_month"- A preset window, in UTC.
this_monthandlast_monthare calendar months. Ignored whenfromis given. fromstring- Window start, ISO 8601 (overrides
period). tostring- Window end, ISO 8601. Default: now.
status"ok" | "error"- —
modelstring- Model id as served, e.g.
openai/gpt-5. providerstring- Provider kind id, e.g.
openai,anthropic,aws-bedrock. connectionstring- Connection id (
conn_…). routestring- Route id or slug;
nonefor direct model calls. projectstring- Project id (
proj_…). keystring- Gateway key id (
key_…). environmentstring- —
finish_reason"stop" | "length" | "tool_calls" | "content_filter" | "other"- —
trace_idstring- —
end_userstring- The customer's own end-user id (
metadata.user_id). tagsobject- Tag filters, ANDed:
{"team": "search"}. sort"newest" | "slowest" | "costliest"- —
limitinteger- —
cursorstring- —
response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
get_request
Get one request. Everything INFRO recorded about one gateway request EXCEPT its content: each provider attempt in order (provider, connection, upstream status, the provider's own cleaned error message, latency), the route that chose it, guardrail outcomes, tokens, estimated provider cost (USD) with how it was priced, the calls INFRO made for it, and a console link. Prompts and completions are never returned (recorded content, when the organization records it, is read in the console). Use it after search_requests; for a whole multi-step run use get_trace.
Needs analytics:read · read-only, idempotent.
idstringrequired- Request id (
req_…). response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
get_trace
Get a trace (one run). Every request that carried one trace id, in order: step, model, status, latency and estimated provider cost (USD) per step, plus the run's totals and cost by step. The total covers model calls made through INFRO only and is a lower bound when any step is unpriced (cost_is_partial). Use get_request for one step's attempts.
Needs analytics:read · read-only, idempotent.
trace_idstringrequired- —
response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
list_findings
List findings. What INFRO noticed without being asked: spend anomalies, forecasts over budget, cost drift, budget threshold crossings, failing connections, unpriced traffic, served-model changes and regressions. Filters by status (default open), type and severity. Acknowledge one with acknowledge_finding (manage set).
Needs findings:read · read-only, idempotent.
status"open" | "acknowledged" | "resolved" | "all"- —
type"spend.anomaly" | "spend.forecast_over_budget" | "cost.drift" | "budget.threshold_crossed" | "connection.failing" | "unpriced.traffic" | "traffic.model_changed" | "traffic.regression" | "mcp.tool_changed" | "mcp.server_failing"- —
severity"info" | "warning" | "critical"- —
limitinteger- —
cursorstring- —
response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
get_budget_status
Spend limits and how much is used. Every enforced spend limit — organization, project, member and gateway key — with its period, limit (USD), estimated provider spend against it, percent used, whether it is hard (blocks requests) or soft (alerts only), and when it resets. Sorted by percent used, highest first. Unpriced requests are counted beside the spend, not inside it. End-customer caps are not included; see list_configuration with end_user_cap_rules. Change a project or member limit with set_spend_limit (manage set).
Needs budgets:read · read-only, idempotent.
search_audit_log
Search the audit log. Who changed what in this organization: members in the console, management tokens (Terraform, the CLI, scripts, AI assistants through MCP) and INFRO itself. Filter by action (an exact action such as api_key.revoked, or a resource prefix such as route), actor (people, tokens or infro), free text q and a time window. Newest first.
Needs audit:read · read-only, idempotent.
actionstring- —
actor"people" | "tokens" | "infro"- —
qstring- Case-insensitive text in the action, actor or target.
fromstring- —
tostring- —
limitinteger- —
cursorstring- —
response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
Configure
list_models
List catalog models. The model catalog: each model's id, name, modality, which provider kinds can serve it, whether this organization has a connection of one of those kinds, and the vendor's LIST rate. The list rate is a reference for estimating provider cost — what the vendor publishes — not an INFRO price; INFRO charges nothing per token. Filter by provider kind, modality or a text query.
Needs any read scope · read-only, idempotent.
providerstring- Provider kind id, e.g.
anthropic,aws-bedrock,openrouter. modality"text" | "image" | "video" | "audio"- —
querystring- Case-insensitive text in the model id or name.
limitinteger- —
cursorstring- The previous result's
next_cursor. response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
list_configuration
List configuration. List one kind of configuration: projects, gateway keys, provider connections, routes, organization settings, member budgets, negotiated prices, notification rules, cost centers and their rules, commitments, guardrail policies or end-customer cap rules — only the kinds this token can read. Each row has the id, name, the fields that matter, managed_by (terraform, cli or api: a tool owns it and will revert changes) and version (pass it as expected_version to a manage tool). Credentials are never returned.
Needs <family>:read · read-only, idempotent.
resource_type"projects" | "gateway_keys" | "provider_connections" | "routes" | "org_settings" | "member_budgets" | "model_prices" | "notification_rules" | "cost_centers" | "cost_center_rules" | "commitments" | "guardrail_policies" | "end_user_cap_rules" | "mcp_servers" | "mcp_key_grants" | "mcp_server_tools"required- —
projectstring- Only items of this project (
proj_…), for types that belong to one. response_format"concise" | "detailed"concise(default) returns the fields most questions need;detailedreturns every field.
get_configuration
Get one configuration item. One configuration item in full (credentials removed), with its version — needed as expected_version by every manage tool — its managed_by, and a console link. If managed_by is terraform, cli or api, tell the person before changing it: the tool that manages it will revert a change made here.
Needs <family>:read · read-only, idempotent.
resource_type"projects" | "gateway_keys" | "provider_connections" | "routes" | "org_settings" | "member_budgets" | "model_prices" | "notification_rules" | "cost_centers" | "cost_center_rules" | "commitments" | "guardrail_policies" | "end_user_cap_rules" | "mcp_servers" | "mcp_key_grants" | "mcp_server_tools"required- —
idstring- The item's id. Omit for
org_settings.
prepare_gateway_key
Prepare a gateway key (console link). NEVER creates a key. Validates the settings for a new gateway key — label, project, environment, allowed provider kinds, rate tier (requests per minute) and expiry — and returns a console_url that opens the console's create dialog prefilled. The person reviews it and clicks Create in the console, which shows the secret once. Give them the link; a key secret never passes through an assistant.
Needs keys:read · read-only, idempotent.
labelstringrequired- —
projectstring- Project id (
proj_…). A project-restricted token always uses its own. environmentstring- Environment slug, e.g.
production. allowed_providersstring[]- Provider kind ids. Empty: every provider.
rate_limit_rpminteger- One of 60, 100, 200, 300, 500, 1000, 2000, 5000, 10000, 20000, 50000.
expires_in_daysinteger- —
Manage
create_project
Create a project. Create a project, optionally with a monthly spend limit (spend_limit: monthly in USD of estimated provider cost, behavior block or alert, alert_at as fractions such as 0.8). Safe to retry: the same arguments return the same project. Confirm the name with the person first. To issue its gateway key, use prepare_gateway_key and give the person the link.
Needs projects:write · changes configuration, idempotent.
namestringrequired- —
slugstring- —
spend_limitobject | null- —
set_spend_limit
Set a project or member spend limit. Set or remove the monthly spend limit of a project or of a member (target). spend_limit is {monthly: USD, behavior: "block" | "alert", alert_at: [0.5, 0.8]} — fractions, not percents — or null to remove it. block refuses requests once the limit is reached; alert only notifies. Amounts are estimated provider cost, never an INFRO charge. Needs expected_version from get_configuration (projects or member_budgets). Confirm the amount with the person first.
Needs projects:write (projects) or budgets:write (members) · changes configuration, destructive, idempotent.
target"project" | "member"required- —
idstringrequired- Project id (
proj_…) or member id, as list_configuration returns them. expected_versionintegerrequired- The
versionyou last read with get_configuration or list_configuration. A stale one is refused withversion_conflict. spend_limitobject | null | nullrequired- —
update_route
Change a route. Change a route's ordered targets, if-rules, failover settings or other fields; fields you leave out are unchanged, targets/rules replace the whole list. This changes PRODUCTION traffic: show the person the change and get their confirmation first. Needs expected_version from get_configuration (routes). Returns a before/after diff, and a warning if Terraform or another tool manages the route.
Needs routes:write · changes configuration, destructive, idempotent.
namestring- —
descriptionstring | null- —
strategy"priority" | "weighted"- —
environmentstring | null- —
environmentsstring[] | null- —
timeout_msinteger | null- —
max_retriesinteger- —
targetsobject[]- —
rulesobject[]- —
failoverobject- —
classifierany- Prompt classifier (0087):
{model, instructions, classes: [{key, description}], input, timeout_ms, min_confidence, fallback_class}. A decision model (model; Jev by default) picks one class per prompt on the organization's own connection to its provider; rules test it asclass. Null removes it. route_idstringrequired- Route id (
rt_…). expected_versionintegerrequired- The
versionyou last read with get_configuration or list_configuration. A stale one is refused withversion_conflict.
acknowledge_finding
Acknowledge a finding. Mark an open finding as acknowledged (seen and being handled). Safe to repeat: the first acknowledgement stands. It does not resolve the cause or mute future findings.
Needs findings:write · changes configuration, idempotent.
finding_idstringrequired- Finding id (
calr_…).
revoke_gateway_key
Revoke a gateway key (irreversible). IRREVERSIBLE: revoke a gateway key now; every request with it fails from then on and it cannot be restored. Confirm with the person first, naming the key by its label. confirm_label must equal the key's current label exactly, and expected_version its version (get_configuration with gateway_keys). To pause a key instead, use set_gateway_key_enabled.
Needs keys:write · changes configuration, destructive, idempotent.
key_idstringrequired- Gateway key id (
key_…). expected_versionintegerrequired- The
versionyou last read with get_configuration or list_configuration. A stale one is refused withversion_conflict. confirm_labelstringrequired- The key's current label, exactly, as the person confirmed it.
set_gateway_key_enabled
Turn a gateway key off or on. Turn a gateway key off (enabled: false) or back on. Off, every request with it is refused with key_disabled until it is turned on again; its secret, limits and history are kept. This changes production traffic: confirm with the person first. Needs expected_version from get_configuration (gateway_keys). Use revoke_gateway_key only to end a key for good.
Needs keys:write · changes configuration, destructive, idempotent.
key_idstringrequired- —
expected_versionintegerrequired- The
versionyou last read with get_configuration or list_configuration. A stale one is refused withversion_conflict. enabledbooleanrequiredfalseturns the key off;trueturns it back on.