mcp_supported in the
voice catalog before
selecting a voice. Saved connections remain when you choose an unsupported voice,
but that voice cannot use their tools or context.
Connection credentials are write-only. The voice service receives access tokens
for tool execution. OAuth refresh tokens and client secrets stay with Inkbox.
External tools run automatically under those credentials in either
data-access mode. Changes apply to future calls. Deletion, interruption, and call
termination cannot undo an external action that has already started.
Endpoints
All paths below start with/api/v1/phone/hosted-agent-config/mcp-servers.
Authenticate with a claimed agent API key, an admin API key, or identity OAuth.
Agent credentials target their own identity. Admin callers provide
agent_identity_id when listing or creating connections. Create and refresh
requests require Idempotency-Key; reuse the same key when retrying the same request.
Starting OAuth authorization and disconnecting also require this header and a JSON
body containing expected_version.
Configuration
Authentication forms:
auth.type, auth.configured, auth.header_name, and
auth.value_prefix. They never include tokens or client secrets. A manually
supplied bearer token works until it expires; automatic renewal requires OAuth.
PATCH requires expected_version from the last read. Omitted fields are preserved.
Changing an authenticated endpoint requires a complete replacement auth object,
even for a different path on the same host. Use auth: {"type": "none"} to remove
authentication explicitly. Only allowed_tools accepts null.
Preparation is asynchronous. Read preparation_status (pending, ready, or
error) and health_code. Only ready connections are available to new calls.
capabilities, catalog_version, and catalog_fetched_at describe discovery.
Refresh does not change tools already admitted to an active call.
Conflicts such as a fourth connection, duplicate label, or stale version return
409. Invalid settings return 422. An inaccessible connection returns 404.
SDK and CLI
Requires version 0.7.24 or later.--file - to read JSON from stdin. Put tokens in the input file or
stdin, not command arguments. Python uses client.hosted_agent and TypeScript uses
client.hostedAgent for item methods: get, update, delete, test, refresh, catalog,
and activity. Rust exposes the corresponding methods on client.hosted_agent().
Connect an external account with OAuth
- Choose OAuth when adding or editing an external connection in the Inkbox Console.
- Save the connection and wait for authentication setup to finish.
- Select Connect, review the identity, server, and requested permissions, then continue to the external service to approve access.
- Return to the connection settings and check both authorization and catalog preparation. The connection becomes usable when both are ready.
Inkbox uses a supplied client ID first, then advertised client metadata registration,
then advertised dynamic registration. If setup reports
client_configuration_required,
register an application with the external service using the exact auth.callback_uri
shown on the connection. Save the resulting client ID and, when needed, client secret.
Application approval and account permissions depend on that external service.
Supported flows use authorization codes with S256 PKCE and bearer access tokens.
Access tokens must report a lifetime greater than 150 seconds.
Implicit, password, device, client-credentials, request-signing, and proof-bound
token flows are unsupported. A service must support the required discovery and
resource parameters; OAuth support alone does not establish compatibility.
SDK and CLI authorization
After creating an OAuth connection and waiting for setup, request a browser URL:start_mcp_authorization, get_mcp_authorization,
cancel_mcp_authorization, and disconnect_mcp_server on client.hosted_agent().
TypeScript and CLI configuration use clientId, clientSecret, and
tokenEndpointAuthMethod; Python and the API use snake_case.
Supply client secrets through the configuration file or stdin, never CLI arguments.
Authorization responses include status, expires_at, requested_scopes,
error_code, and the resulting config_version after completion. A new intent
expires after ten minutes. A connection edit during approval requires starting again.
The CLI can wait for up to 600 seconds; it never completes browser consent for you.
Expiry, reconnect, and disconnect
OAuth connection views exposeauth.status, auth.expires_at,
auth.refresh_supported, auth.requested_scopes, auth.granted_scopes, and
auth.error_code. auth.configured means an account was connected, not that its
authorization is currently usable. Catalog preparation has a separate status.
Inkbox renews refreshable credentials when needed. When renewal is unavailable,
select Reconnect and approve access again. A reconnect applies to future calls;
an active call never switches to a different external account or expanded permissions.
Missing authorization makes the connection unavailable for new tool requests.
If safe credential replacement fails during a call, the affected voice session
may stop. Failed or uncertain external actions are not automatically repeated.
Disabling excludes future calls but retains authorization. Disconnecting or deleting
an OAuth connection stops new credential issuance and renewal. It cannot retract
credentials already sent to the voice service or undo an action already started.
You can also revoke access directly at the external service.
Automatic capabilities and selected context
Tools, prompts, resources, and skills are separate capabilities. List cached metadata through/catalog; pass its next_cursor as cursor for the next page.
The page limit is 1–100, default 50.
The Console enables all tools, prompts, resources, and supported skills when you
save a connection. You do not need to enter tool names or context JSON. Existing
custom selections remain until you edit and save that connection.
For the same behavior through the API, send:
context.mode, or setting it to selected, keeps explicit selections.
Do not combine mode: "all" with prompt, resource, or skill selections.
Set context.prompts to [{"name":"briefing","arguments":{"team":"support"}}]
and context.resources to explicitly selected resource URIs. Prompt roles are
preserved. Selected context supplements the call’s instructions without expanding
permissions.
In selected mode, inspect a skill with /catalog?skill_uri=.... Approve it by placing its uri and
returned manifest_digest in context.skills. Instructions and supporting files
load only when needed and must match the approved manifest. Changes require a new
approval. Only instruction workflows are supported; dynamic content, local code
execution, and executable skill environments are unavailable.
Once a skill loads, file reads stay on that skill’s server for the rest of the
call. Tools from all connected servers remain available. Reading a nested skill as
a supporting file does not activate it.
External call activity
UseGET /phone/calls/{call_id}/tool-invocations for a shared history of built-in and remote MCP tools, including source, connection label, and server URL. The existing GET /api/v1/phone/calls/{call_id}/mcp-activity endpoint remains available as an MCP-only projection of that same history and returns a page with items,
limit, offset, has_more, and incomplete. Each item contains the connection
label, tool name, status, safe error code, and available timestamps. Status is
started, succeeded, failed, or unknown. Arguments and result bodies are not
included. Limit is 1–200, default 50.
incomplete: true means additional external activity may have occurred. An empty
page does not prove that no tools ran. Confirm an unknown operation with your
external service before repeating it.
