Skip to content

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_month and last_month are calendar months. Ignored when from is 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_month and last_month are calendar months. Ignored when from is 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; none for 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; detailed returns 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; detailed returns 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; detailed returns 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; detailed returns 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; detailed returns 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; detailed returns 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; detailed returns 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 version you last read with get_configuration or list_configuration. A stale one is refused with version_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 as class. Null removes it.
route_idstringrequired
Route id (rt_…).
expected_versionintegerrequired
The version you last read with get_configuration or list_configuration. A stale one is refused with version_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 version you last read with get_configuration or list_configuration. A stale one is refused with version_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 version you last read with get_configuration or list_configuration. A stale one is refused with version_conflict.
enabledbooleanrequired
false turns the key off; true turns it back on.
↑ ↓ navigate↵ open/ anywhere in docs