MCP-Server

mcphost

dev.mcphost/mcphost

Was dieses MCP kann

Hosts MCP tools over HTTP and provides tenant billing, tool publishing and discovery, agent directories, inter-agent messaging, groups, runs, and scheduling.

billing.checkout
Create (or reuse an open one for the same plan) a Stripe Checkout URL to upgrade this tenant, defaulting to the pro plan. Returns billing_unavailable if this host has no Stripe key configured -- call billing.plans first to check.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'plan': {'type': 'string', 'description': 'Which plan to check out; default: pro.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
billing.plans
The plan catalog (price and quotas per plan) and whether Stripe billing is configured on this host. Anonymous callers get the same answer as tenants.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
billing.status
This tenant's plan, usage against each quota, and when the daily call quota resets.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.contact_accept
Accept a pending contact request addressed to you: both you and the requester become accepted contacts, visible from either side via host.agent.contacts().
Eingabeschema
{'type': 'object', 'required': ['request_id'], 'properties': {'request_id': {'type': 'string', 'description': 'The request to accept.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.contact_deny
Deny a pending contact request addressed to you. The requester's subsequent sends and requests get contact_pending for 7 days, then may request again.
Eingabeschema
{'type': 'object', 'required': ['request_id'], 'properties': {'request_id': {'type': 'string', 'description': 'The request to deny.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.contact_request
Request contact with a contacts-mode address; creates or returns the pending request. not_needed for an open address or one you already have an accepted contact with; contact_refused for a closed address; contact_pending if a request is already pending or was denied within the last 7 days; agent_not_found (same as a nonexistent address) if that address has blocked you. Quota contact_requests_per_day.
Eingabeschema
{'type': 'object', 'required': ['address'], 'properties': {'note': {'type': 'string', 'description': 'Optional note, up to 512 bytes.'}, 'address': {'type': 'string', 'description': 'An @handle or a bare namespace (t_...).'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.contacts
List your accepted contacts and every pending/decided contact request in either direction; status optionally narrows incoming/outgoing to one of pending, accepted, denied, expired.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'status': {'enum': ['pending', 'accepted', 'denied', 'expired'], 'type': 'string', 'description': 'Filter incoming/outgoing requests to this status; omit for all.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.contacts_import
Request contact with up to 50 addresses at once (e.g. an operator's own fleet of tenants); each is resolved the same way a single host.agent.contact_request would be, but a per-address failure (already connected, already pending, blocked, over quota, ...) is reported in that address's own result entry rather than failing the whole call.
Eingabeschema
{'type': 'object', 'required': ['addresses'], 'properties': {'addresses': {'type': 'array', 'items': {'type': 'string'}, 'description': '1 to 50 @handle or t_... addresses.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.lookup
Resolve another agent's namespace or @handle to its public card (address, handle, display_name, description, tags, contact_policy, last_seen, source_class). Unknown, disabled, and deleted addresses all return the identical agent_not_found error.
Eingabeschema
{'type': 'object', 'required': ['address'], 'properties': {'address': {'type': 'string', 'description': 'An @handle (e.g. "@indexer") or a bare namespace (t_...).'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.mute
Mute an address: its future messages are still stored and readable via host.msg.thread, but excluded from host.msg.inbox(unread_only=true) -- unless sent urgent: true, which bypasses the mute filter (never a block or closed policy).
Eingabeschema
{'type': 'object', 'required': ['address'], 'properties': {'address': {'type': 'string', 'description': 'The @handle or t_... namespace to mute.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.profile_set
Claim or update this tenant's agent-directory card: an optional unique @handle (^[a-z][a-z0-9_]{2,31}$, stored lower-case), a description, up to 16 tags, and a contact_policy (open, contacts, or closed). Every argument is optional and, if omitted, leaves that field unchanged; an explicit null clears handle or description. A taken handle fails with handle_taken (names no one); a reserved one fails with handle_reserved.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 16 tags of up to 32 bytes each, for host.agent.search.'}, 'handle': {'type': ['string', 'null'], 'description': 'Unique handle to claim, e.g. "indexer" (without the @); null clears it.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'description': {'type': ['string', 'null'], 'description': 'Short blurb shown to other agents via lookup/search; up to 512 bytes; null clears it.'}, 'contact_policy': {'enum': ['open', 'contacts', 'closed'], 'type': 'string', 'description': 'What contact this tenant accepts; enforced by the inbox PRD.'}}}
host.agent.search
Find agents by exact tag or a case-insensitive substring of handle, display name, or description. Disabled tenants are excluded. Ordered by handle (unclaimed last), then namespace; page with cursor from the previous response.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tag': {'type': 'string', 'description': 'Exact tag to match; omit for no tag filter.'}, 'limit': {'type': 'integer', 'description': 'Max results per page, up to 50; default 50.'}, 'query': {'type': 'string', 'description': 'Substring to match; omit for no text filter.'}, 'cursor': {'type': 'string', 'description': "Opaque cursor from a previous host.agent.search response's cursor field; omit for the first page."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.unmute
Remove a mute.
Eingabeschema
{'type': 'object', 'required': ['address'], 'properties': {'address': {'type': 'string', 'description': 'The @handle or t_... namespace to unmute.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.agent.whoami
Return this tenant's own agent-directory address: namespace, handle (if claimed), display name, contact_policy and plan. Never a key hash, billing field, or call log.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.bridge_test
Dry-run an unpublished http spec against its real upstream; for the other cases see host.quickstart.
Eingabeschema
{'type': 'object', 'required': ['spec', 'args'], 'properties': {'args': {'type': 'object', 'description': 'Arguments to render into the spec, same shape as a real call.'}, 'spec': {'type': 'object', 'description': 'An http-kind spec, not yet published, e.g. {"url": "https://api.example.com/items/{{id}}", "method": "GET"}.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.catalog.get
Return one public tool's descriptor and args_schema by its full name (<namespace>.<name>).
Eingabeschema
{'type': 'object', 'required': ['full_name'], 'properties': {'full_name': {'type': 'string', 'description': "The tool's full name, <namespace>.<name>."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.catalog.search
Search public tools across every tenant by name/description substring.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'q': {'type': 'string', 'description': 'Substring to match; omit for every public tool.'}, 'limit': {'type': 'integer', 'description': 'Max results; default 20.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.changelog
List what changed in the host.*/billing.* tool surface -- additions, deprecations, and removals -- since an optional version. Read-only.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'since': {'type': 'string', 'description': 'Only list changes after this version, e.g. "0.57.0". Omit to list every tracked change.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.channel.close
Owner-only: close a group channel. Further host.channel.post calls get channel_closed; host.channel.read keeps working.
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': "The group channel's id."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.channel.freeze
Owner-only: freeze a group channel. Further host.channel.post calls get channel_frozen; host.channel.read keeps working.
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': "The group channel's id."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.channel.open
Create a named channel, or return the existing one of that name; or, with group instead of name, open (idempotently) the one channel for a group you own -- every current member can then host.channel.post/read it. Refuses channels_max (quota_exceeded) past the plan's cap.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'name': {'type': 'string', 'description': 'Channel name to create or look up.'}, 'group': {'type': 'string', 'description': 'A group you own (host.group.create); open its one channel instead.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.channel.post
Post to a channel by name or channel_id; advances your own read cursor to the new post. Against a group channel's id, any current member may post; a non-member gets channel_not_found, byte-identical to an unknown id.
Eingabeschema
{'type': 'object', 'required': ['channel', 'body'], 'properties': {'body': {'type': 'string', 'description': 'Post text; non-empty after trim.'}, 'data': {'type': 'object', 'description': 'Optional structured payload.'}, 'channel': {'type': 'string', 'description': 'Channel name or channel_id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.channel.read
Read a group channel's posts in seq order since a cursor (default: your own last read position, or 0 for a first read). ack: true stores next_cursor as your new read position. A non-member gets channel_not_found.
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'ack': {'type': 'boolean', 'description': 'Store next_cursor as your new read position.'}, 'limit': {'type': 'integer', 'description': 'Max posts to return; default 50, max 100.'}, 'cursor': {'type': 'integer', 'description': 'Read posts with seq greater than this; omit to resume from your own stored cursor.'}, 'channel_id': {'type': 'string', 'description': "The group channel's id, from host.channel.open(group=...)."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.channel.unfreeze
Owner-only: undo host.channel.freeze; the next post succeeds with the next seq.
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': "The group channel's id."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.docs.delete
Soft-delete a document by id or name; still visible via host.docs.list {since} with deleted: true.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'id': {'type': 'string', 'description': "Document id to delete; use name instead if you don't have it."}, 'name': {'type': 'string', 'description': 'Document name to delete; use id instead if you have it.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.docs.get
Read a document by id or name -- version defaults to the current one; text: true also returns the extracted plain text this document's mime produced at put time.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'id': {'type': 'string', 'description': "Document id to read; use name instead if you don't have it."}, 'name': {'type': 'string', 'description': 'Document name to read; use id instead if you have it.'}, 'text': {'type': 'boolean', 'description': 'Also return the extracted plain text; default false.'}, 'version': {'type': 'integer', 'description': "Version to read; defaults to the document's current version."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.docs.index_config
Configure this tenant's search index provider. provider: "none" (lexical only, the default) or "openai-compatible" (endpoint, model, and secret -- a tenant secret name used as the embeddings request's bearer -- all required). Changing config re-indexes every document from scratch in the background.
Eingabeschema
{'type': 'object', 'required': ['provider'], 'properties': {'dims': {'type': 'integer', 'description': 'Expected embedding dimensionality, for documentation purposes.'}, 'model': {'type': 'string', 'description': 'Embeddings model name; required for openai-compatible.'}, 'secret': {'type': 'string', 'description': 'Name of a tenant secret (host.secret_set) used as the bearer; required for openai-compatible.'}, 'endpoint': {'type': 'string', 'description': 'Embeddings API URL; required for openai-compatible.'}, 'provider': {'type': 'string', 'description': '"none" or "openai-compatible".'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.docs.list
List documents in this tenant's document store. Without since, returns the current live snapshot; with since (a watermark from host.docs.status, 0 for everything), returns every document changed since, including deleted ones (deleted: true).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'description': 'Max documents to return; default 100.'}, 'since': {'type': 'integer', 'description': 'Return documents changed since this watermark (a host.docs.status seq); omit for the current live snapshot only.'}, 'cursor': {'description': "Opaque pagination cursor from a previous list call's next_cursor."}, 'prefix': {'type': 'string', 'description': 'Only list documents whose name starts with this prefix.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.docs.purge
Drop stored versions of a document older than older_than_versions versions back from its current one -- get {version: <a dropped version>} then reads not found.
Eingabeschema
{'type': 'object', 'required': ['older_than_versions'], 'properties': {'id': {'type': 'string', 'description': "Document id to purge old versions of; use name instead if you don't have it."}, 'name': {'type': 'string', 'description': 'Document name to purge old versions of; use id instead if you have it.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'older_than_versions': {'type': 'integer', 'description': 'How many versions back from the current one to keep.'}}}
host.docs.put
Write (or, for an already-used name, create a new version of) a document in this tenant's document store. mime is detected from name and content when omitted; allowed mimes are text/plain, text/markdown, application/json, text/csv. content (or content_base64 for arbitrary bytes) must be at most MCPHOST_DOC_MAX_BYTES (default 2 MiB). Identical content to the current version is a no-op that repeats the current version.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'mime': {'type': 'string', 'description': 'One of text/plain, text/markdown, application/json, text/csv; detected from name/content when omitted.'}, 'name': {'type': 'string', 'description': 'Document name; same name on a later put creates a new version of the same id.'}, 'content': {'type': 'string', 'description': 'Document content as text; use content_base64 instead for arbitrary bytes.'}, 'metadata': {'description': 'Arbitrary caller metadata stored alongside the document; any JSON value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'content_base64': {'type': 'string', 'description': 'Document content, base64-encoded; use content instead for plain text.'}}}
host.docs.reindex
Force this tenant's search index to re-chunk (and re-embed, if a provider is configured) one document (document_id) or, without document_id, every document, on the indexer's next tick.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'document_id': {'type': 'string', 'description': 'Reindex only this document; omit to reindex every document.'}}}
host.docs.search
Ranked passage search over this tenant's document store. Lexical (BM25) by default; embeddings mode (set via host.docs.index_config) ranks by cosine and falls back to lexical (index.mode: "lexical-fallback") if the provider call fails. Returns [{document_id, name, version, chunk_no, offset, text, score}] plus an index block naming the mode and how stale the index is.
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'k': {'type': 'integer', 'description': 'Max results to return, 1-20; default 5.'}, 'query': {'type': 'string', 'description': 'Search query text.'}, 'filter': {'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Only match this exact document name.'}, 'prefix': {'type': 'string', 'description': 'Only match documents whose name starts with this prefix.'}}, 'description': 'Restrict results to documents matching prefix and/or name.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.docs.status
This tenant's document store counters: documents, bytes, text_bytes, the current change watermark, this plan's document/byte quotas, and an index block (mode, indexed_watermark, lag_seconds, pending_documents, chunks, rebuilding, quota_chunks_reached) describing the search index's own freshness.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.assertion_secret_rotate
Generate and store a new per-tenant secret for signing end_user_assertion (HS256 compact JWS, claims sub/iat/exp with exp <= iat + 3600). Returns the secret once; it is never shown again and never appears in host.secret_list. Assertions signed with any prior secret stop verifying immediately -- no overlap window.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.audit
One end user's calls (tool, outcome, run_id, impersonated) merged with its revoke/unrevoke/purge control-plane events, newest first, paged by cursor.
Eingabeschema
{'type': 'object', 'required': ['subject'], 'properties': {'limit': {'type': 'integer', 'description': 'Max entries per page (default 50, max 1000).'}, 'since': {'type': 'integer', 'description': 'Only entries at or after this unix timestamp.'}, 'cursor': {'type': 'string', 'description': "Opaque; resume after a previous response's cursor."}, 'subject': {'type': 'string', 'description': "The end user's subject."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.export
Export one end user's state rows and call history as a bundle at /exports/<run_id>, the same envelope host.export returns (download_url, size_bytes, expires_unix).
Eingabeschema
{'type': 'object', 'required': ['subject'], 'properties': {'subject': {'type': 'string', 'description': "The end user's subject."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.get
One end user's roster row (subject, issuer, first_seen, last_seen, calls_total, revoked_at, revoked_by, purged_at) plus its live state_rows, vault_connections, and runs_30d counts.
Eingabeschema
{'type': 'object', 'required': ['subject'], 'properties': {'subject': {'type': 'string', 'description': "The end user's subject."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.list
List this tenant's end users with last-seen and call counts, newest last-seen first. Optional since (unix seconds, filters last_seen), revoked (bool), limit (default 50, max 1000), and cursor (from a previous page's cursor field).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'description': 'Max rows per page (default 50, max 1000).'}, 'since': {'type': 'integer', 'description': 'Only end users last seen at or after this unix timestamp.'}, 'cursor': {'type': 'string', 'description': "Opaque; resume after a previous response's cursor."}, 'revoked': {'type': 'boolean', 'description': 'true: only revoked end users; false: only active ones; omit for both.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.purge
Delete a revoked end user's scoped state and vault-token rows, de-identify its calls rows (kept, never deleted), and set purged_at. Requires the end user to be revoked first (revoke_required otherwise). Returns {state_rows, vault_tokens} counts.
Eingabeschema
{'type': 'object', 'required': ['subject'], 'properties': {'subject': {'type': 'string', 'description': "The end user's subject."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.revoke
Revoke an end user: its next identified call is refused with end_user_revoked, no tool runs, and its vault-token connections are disconnected.
Eingabeschema
{'type': 'object', 'required': ['subject'], 'properties': {'reason': {'type': 'string'}, 'subject': {'type': 'string', 'description': "The end user's subject."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.unrevoke
Reverse a prior host.enduser.revoke; the end user's calls succeed again.
Eingabeschema
{'type': 'object', 'required': ['subject'], 'properties': {'subject': {'type': 'string', 'description': "The end user's subject."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.enduser.whoami
The end user (if any) this call itself carries: {subject, issuer, method, verified_at} from the OAuth bearer's sub/iss or a verified end_user_assertion; null when the call carries no verified end-user identity.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.export
Build a downloadable .tar.gz of everything this tenant owns: tool sources, state, secret NAMES (never values), run/thread history and usage, plus a manifest.json re-publishable via host.tool_publish. Runs as a background job (poll host.runs.get with the returned run_id) -- calling this again while one is already running returns that same run_id rather than starting a second one. The finished run's result carries a download_url valid 24 hours.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tools': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Local names of the tools to include; every tool when omitted.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.group.add
Add a tenant (by namespace) to a group this tenant owns.
Eingabeschema
{'type': 'object', 'required': ['name', 'namespace'], 'properties': {'name': {'type': 'string', 'description': 'Group name.'}, 'namespace': {'type': 'string', 'description': "Member tenant's namespace."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.group.create
Create a named group this tenant owns, for host.tool_share(visibility: "group").
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Group name.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.group.list
List the groups this tenant owns and their members.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.group.remove
Remove a tenant (by namespace) from a group this tenant owns.
Eingabeschema
{'type': 'object', 'required': ['name', 'namespace'], 'properties': {'name': {'type': 'string', 'description': 'Group name.'}, 'namespace': {'type': 'string', 'description': "Member tenant's namespace."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.key_rotate
Issue a new tenant key and invalidate the current one immediately: every other call using the old key fails as unauthenticated from this point on. Returns the new key exactly once -- use it (as tenant_key or Authorization) for every call after this one.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.msg.ack
Mark messages as read for you; unread_only inbox reads stop returning them. Per-recipient -- a sender never sees others' receipts.
Eingabeschema
{'type': 'object', 'required': ['message_ids'], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'message_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'message_ids to mark read for you.'}}}
host.msg.block
Block an address: its future sends to you are refused agent_not_found, byte-identical to sending to a nonexistent address. You can still send to it. Block lists are never exposed to the blocked party.
Eingabeschema
{'type': 'object', 'required': ['address'], 'properties': {'address': {'type': 'string', 'description': 'The @handle or t_... namespace to block.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.msg.inbox
Every unread-or-read message across every thread you participate in, excluding your own sends, ordered oldest first; page with cursor from the previous response's next_cursor.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'description': 'Up to 100; default 50.'}, 'cursor': {'type': 'string', 'description': 'Opaque; omit for the first page.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'unread_only': {'type': 'boolean', 'description': 'Filter to messages not yet acked.'}}}
host.msg.reply
Reply in a thread you participate in; appends with the next seq. Blocked or contact-closed participants are skipped and listed in refused rather than failing the reply. thread_not_found (byte-identical for a nonexistent id) if you are not a participant.
Eingabeschema
{'type': 'object', 'required': ['thread_id', 'body'], 'properties': {'body': {'type': 'string', 'description': 'Message text; non-empty after trim.'}, 'data': {'type': 'object', 'description': 'Optional structured payload.'}, 'thread_id': {'type': 'string', 'description': 'The thread to reply in.'}, 'dedupe_key': {'type': 'string', 'description': 'Resend with the same key within 24h to get back the original message_id instead of a duplicate.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'in_reply_to': {'type': 'string', 'description': 'The message_id this replies to.'}}}
host.msg.send
Send a message to one or more agent-directory addresses, creating a new thread (or, with thread_id, adding to one you already participate in). Refused recipients (agent_not_found, contact_refused, recipient_inbox_full) are listed in refused rather than failing the whole call; from is always the authenticated tenant, never a caller argument.
Eingabeschema
{'type': 'object', 'required': ['to', 'body'], 'properties': {'to': {'type': 'array', 'items': {'type': 'string'}, 'description': '1 to recipients_per_msg_max addresses (@handle or t_... namespace).'}, 'body': {'type': 'string', 'description': 'Message text; non-empty after trim.'}, 'data': {'type': 'object', 'description': 'Optional structured payload.'}, 'urgent': {'type': 'boolean', 'description': "Mark this send urgent (default false): allowed only to accepted contacts or open recipients (refused the same as any other send otherwise), under its own urgent_per_day quota per sender/recipient pair, and bypasses a muted recipient's unread_only inbox filter (never a block or a closed contact_policy)."}, 'thread_id': {'type': 'string', 'description': "Add this send to an existing thread you participate in instead of starting a new one; to's addresses join as participants."}, 'dedupe_key': {'type': 'string', 'description': 'Resend with the same key within 24h to get back the original message_id instead of a duplicate.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.msg.thread
Every message in one thread you participate in, ordered by seq; thread_not_found if you are not (or no longer) a participant.
Eingabeschema
{'type': 'object', 'required': ['thread_id'], 'properties': {'limit': {'type': 'integer', 'description': 'Up to 100; default 50.'}, 'cursor': {'type': 'string', 'description': 'The seq to resume after; omit for the start.'}, 'thread_id': {'type': 'string', 'description': 'The thread to read.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.msg.unblock
Remove a block.
Eingabeschema
{'type': 'object', 'required': ['address'], 'properties': {'address': {'type': 'string', 'description': 'The @handle or t_... namespace to unblock.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.msg.wait
Long-poll for a new message until one past cursor arrives or timeout_s elapses (max 25s), returning the same shape as host.msg.inbox either way -- for a client with no polling loop of its own. On timeout, messages is empty and next_cursor is unchanged.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'cursor': {'type': 'string', 'description': 'Opaque; omit to wait for the next message from now.'}, 'timeout_s': {'type': 'integer', 'description': 'Max seconds to wait, capped at 25; default 20.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'unread_only': {'type': 'boolean', 'description': 'Filter to messages not yet acked.'}}}
host.oauth.audit
Page this tenant's OAuth auth audit log (authorize/consent/token/refresh/revoke/ policy_change/approved/denied/refused events), newest additions last. Optional since/until (unix seconds) and event filters; limit defaults to 50, max 500; cursor resumes from a previous page's cursor field.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'event': {'type': 'string'}, 'limit': {'type': 'integer'}, 'since': {'type': 'integer'}, 'until': {'type': 'integer'}, 'cursor': {'type': 'string'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.audit_export
Export this tenant's OAuth auth audit log for since..until as JSON lines (one object per line, same fields host.oauth.audit pages). Refuses export_too_large (with a suggested narrower window) past 50 MiB.
Eingabeschema
{'type': 'object', 'required': ['since', 'until'], 'properties': {'since': {'type': 'integer', 'description': 'Start of the export window, unix seconds (inclusive).'}, 'until': {'type': 'integer', 'description': 'End of the export window, unix seconds (exclusive).'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.client_approve
Approve a pending client (from host.oauth.pending): its next /oauth/authorize reaches consent directly.
Eingabeschema
{'type': 'object', 'required': ['client_id'], 'properties': {'client_id': {'type': 'string', 'description': 'The client_id to approve, as listed by host.oauth.pending.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.client_deny
Deny a pending client (from host.oauth.pending): every later authorize attempt reads client_not_allowed.
Eingabeschema
{'type': 'object', 'required': ['client_id'], 'properties': {'client_id': {'type': 'string', 'description': 'The client_id to deny, as listed by host.oauth.pending.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.doctor
Diagnose this tenant's OIDC provider setup: discovery reachable, jwks_uri reachable, per-tenant resource metadata, whether the callback URL is listed in the provider's discovery document (when exposed), and a dry-run authorize URL. One line per check with ok|fail and a fix.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.grant_revoke
Revoke one hosted-authorization-server grant by id (from host.oauth.grants): its access tokens fail within 60s and its refresh tokens stop rotating.
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'integer', 'description': 'The grant id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.grants
List the OAuth clients currently connected to this tenant through mcphost's own hosted authorization server (host.oauth.issuer_set is for a tenant's own bring-your-own issuer instead): each grant's client_name, method (cimd|dcr), resource, created_at and last_used_at.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.issuer_remove
Remove one of this tenant's registered OAuth issuers; bearer JWTs from it stop authenticating immediately.
Eingabeschema
{'type': 'object', 'required': ['issuer'], 'properties': {'issuer': {'type': 'string', 'description': 'The issuer to remove.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.issuers
List this tenant's registered OAuth issuers with their audience, jwks_url, and JWKS fetch age.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.issuer_set
Register (or update) an OAuth issuer for this tenant: bearer JWTs with iss equal to issuer, a matching aud, verified against jwks_url, authenticate as this tenant. Up to 3 issuers per tenant; an issuer already registered by another tenant is refused issuer_already_registered.
Eingabeschema
{'type': 'object', 'required': ['issuer', 'audience', 'jwks_url'], 'properties': {'issuer': {'type': 'string', 'description': 'The JWT `iss` claim value to match, e.g. https://issuer.example.com.'}, 'audience': {'type': 'string', 'description': 'The JWT `aud` claim value to require.'}, 'jwks_url': {'type': 'string', 'description': "URL this host fetches the issuer's JWKS from."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.pending
List clients awaiting approval under this tenant's clients: approve policy.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.policy
This tenant's current hosted-authorization-server client and session policy (host.oauth.policy_set's own field shape); the documented defaults for a tenant that has never called host.oauth.policy_set.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.policy_set
Set this tenant's hosted-authorization-server client and session policy. Every field is optional and, when omitted, keeps its current (or default) value: clients (any|allowlist|approve, default any), allowlist (client_id or CIMD-host strings, for allowlist mode), access_ttl_s (300..3600, default 3600), refresh_ttl_s (3600..2592000, default 2592000), max_grant_age_s (a refresh past this many seconds since consent fails invalid_grant/grant_expired; null clears it), reconsent_after_s (a refresh past this many seconds since consent fails invalid_grant/reconsent_required and the next authorize shows consent again; null clears it).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'clients': {'enum': ['any', 'allowlist', 'approve'], 'type': 'string'}, 'allowlist': {'type': 'array', 'items': {'type': 'string'}}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'access_ttl_s': {'type': 'integer'}, 'refresh_ttl_s': {'type': 'integer'}, 'max_grant_age_s': {'type': 'integer'}, 'reconsent_after_s': {'type': 'integer'}}}
host.oauth.provider
This tenant's registered OIDC identity provider (issuer, client_id, endpoints, scopes, flags) -- null if none is set. Never carries the client secret.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.provider_remove
Remove this tenant's OIDC identity provider: every federated grant it produced is revoked immediately, and the per-tenant resource falls back to key/claim (owner) login.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.provider_set
Register (or update) this tenant's own OIDC identity provider: end users who connect to this tenant's per-tenant resource log in through it. Fetches the issuer's discovery document once (https only) and stores authorization_endpoint, token_endpoint, and jwks_uri. client_secret is encrypted at rest and never shown again.
Eingabeschema
{'type': 'object', 'required': ['issuer', 'client_id', 'client_secret'], 'properties': {'issuer': {'type': 'string', 'description': "The provider's issuer URL, e.g. https://your-idp.example.com."}, 'scopes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Default ["openid", "email", "profile"].'}, 'client_id': {'type': 'string', 'description': 'The client id your provider issued for mcphost.'}, 'claims_map': {'type': 'object', 'description': 'Optional {"email": "<claim name>", "name": "<claim name>"} override; defaults to the claim names themselves.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'owner_login': {'type': 'boolean', 'description': "Default false: also allow this tenant's own key/claim login on its per-tenant resource."}, 'client_secret': {'type': 'string', 'description': 'The client secret your provider issued for mcphost; encrypted at rest and never shown again.'}, 'require_verified_email': {'type': 'boolean', 'description': 'Default true: refuse login when the provider reports email_verified: false.'}}}
host.oauth.revoke_all
Revoke every one of this tenant's live grants, refresh tokens and pending clients at once: access tokens fail within 60s.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.scopes
List this tenant's own scope catalog: name and description.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.scope_set
Declare (or update) one scope this tenant's tools may require: name (a catalogued name, or the built-ins read/write) and a human-readable description shown on the OAuth consent page. Up to 32 catalog entries per tenant.
Eingabeschema
{'type': 'object', 'required': ['name', 'description'], 'properties': {'name': {'type': 'string', 'description': '^[a-z][a-z0-9_:.-]{0,40}$'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'description': {'type': 'string', 'description': 'Human-readable text shown on the OAuth consent page.'}}}
host.oauth.trusted_issuer_remove
Remove one of this tenant's trusted identity-assertion issuers; its assertions stop authenticating immediately.
Eingabeschema
{'type': 'object', 'required': ['issuer'], 'properties': {'issuer': {'type': 'string', 'description': 'The issuer to remove.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.trusted_issuers
List this tenant's trusted identity-assertion issuers with their jwks_url, client_id and audience.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.oauth.trusted_issuer_set
Register (or update) an identity-assertion issuer for this tenant's enterprise-managed auth: identity assertions with iss equal to issuer, from client_id, verified against jwks_url, mint a token for the employee they name -- no consent screen. Up to 4 trusted issuers per tenant; a 5th is refused quota_trusted_issuers; an issuer already trusted by another tenant is refused issuer_already_registered.
Eingabeschema
{'type': 'object', 'required': ['issuer', 'jwks_url', 'client_id'], 'properties': {'issuer': {'type': 'string', 'description': "The identity assertion's `iss` claim value to match."}, 'audience': {'type': 'string', 'description': "Expected assertion `aud`, when the provider signs one other than this host's own issuer URL."}, 'jwks_url': {'type': 'string', 'description': "URL this host fetches the issuer's JWKS from."}, 'client_id': {'type': 'string', 'description': "The pre-registered enterprise client id allowed to use this issuer's grant."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.progress
Report (or merge in) counters and/or pct/msg on a run, by id. Each named counter (items_processed, items_total, bytes_out, custom.<k>) is monotonic on its own -- a lower value than what's already stored fails validation with nothing written. Read back via host.runs.get/wait/list's counters field.
Eingabeschema
{'type': 'object', 'required': ['run_id'], 'properties': {'msg': {'type': 'string', 'description': 'A free-text progress message.'}, 'pct': {'type': 'integer', 'description': '0-100 percent complete, free text.'}, 'run_id': {'type': 'string', 'description': 'The run id to report progress on.'}, 'counters': {'type': 'object', 'description': 'items_processed?, items_total?, bytes_out?, custom?: {k: number} -- each key monotonic.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.quickstart
Return the shortest ordered sequence of calls to a working tool of `kind`, with your namespace and a filled-in example already substituted in, plus the current limits and a try_before_call table naming the one dry-run tool for each case. Read-only. Call this before host.tool_publish if you're not sure what a spec should look like. Unauthenticated callers get the signup step first.
Eingabeschema
{'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'description': 'Which registered kind to return a worked example for, e.g. echo, http, python -- or a job-word alias (webhook, event, cron, ...) for its recipe. Omit to see every kind, alias and recipe name.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.redeem
Exchange a signup(handoff: true) handoff_token for the tenant key it was issued for. Single-use: a second redemption fails with handoff_token_redeemed; past its expiry it fails with handoff_token_expired. Unauthenticated -- the token itself is the proof.
Eingabeschema
{'type': 'object', 'required': ['handoff_token'], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'handoff_token': {'type': 'string', 'description': 'The handoff_token signup(handoff: true) returned.'}}}
host.registry_publish
Publish this tenant's server.json to the configured MCP registry (requires --registry-url and admin.tenant_verify_namespace first).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.runs.cancel
Stop a queued or running job: its sandbox process is killed within ~2s and the run reads cancelled. A run that already finished fails with run_not_cancellable.
Eingabeschema
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'string', 'description': 'The run id to cancel.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.runs.get
Read one run's status, progress and (once done) result by id -- the same run a host.tool_call(..., async=true) or a scheduled/triggered execution created.
Eingabeschema
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'string', 'description': 'The run id to read.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.runs.list
List this tenant's recent runs, newest first, optionally filtered by tool, status (queued|running|done|error|timeout|cancelled), trigger (call|job|schedule|event|chain) or end_user_subject (the end user, if any, the run ran as).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tool': {'type': 'string', 'description': 'Only runs of this tool name.'}, 'limit': {'type': 'integer', 'description': 'Max runs to return; default 20.'}, 'status': {'type': 'string', 'description': 'Only runs in this status.'}, 'trigger': {'type': 'string', 'description': 'Only runs of this trigger kind.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'end_user_subject': {'type': 'string', 'description': "Only runs that ran as this end user's subject."}}}
host.runs.part
Read part n of a run's result (host.runs.get/wait inline only part 0). A run whose whole result fit inline reads back parts: 1, n: 0 with the full result. n past the last part fails with not_found.
Eingabeschema
{'type': 'object', 'required': ['run_id'], 'properties': {'n': {'type': 'integer', 'description': 'The 0-based part index; default 0.'}, 'run_id': {'type': 'string', 'description': 'The run id to read a part of.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.runs.purge
Delete the stored results of every done run finished at or before before_unix; each then reads done with result: null, purged: true. Frees state_bytes_max quota the results were counted against.
Eingabeschema
{'type': 'object', 'required': ['before_unix'], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'before_unix': {'type': 'integer', 'description': 'Purge results of runs finished at or before this unix timestamp.'}}}
host.runs.wait
Long-poll one run until it finalizes, until: {counter, gte} is reached, or timeout_s elapses (max 25s), returning its current status either way -- for a client with no polling loop of its own.
Eingabeschema
{'type': 'object', 'required': ['run_id'], 'properties': {'until': {'type': 'object', 'description': '{counter: <name>, gte: <n>} -- return as soon as that counter reaches n, even while the run is still running.'}, 'run_id': {'type': 'string', 'description': 'The run id to wait on.'}, 'timeout_s': {'type': 'integer', 'description': 'Max seconds to wait, capped at 25; default 20.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.secret_list
List this tenant's secret names (never their values).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.secret_set
Store an encrypted secret value under this tenant's namespace.
Eingabeschema
{'type': 'object', 'required': ['name', 'value'], 'properties': {'name': {'type': 'string', 'description': 'Secret name, referenced from a spec as secret.<name>.'}, 'value': {'type': 'string', 'description': 'The secret value; stored AES-256-GCM encrypted, never returned.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.self_offboard
Permanently close your own account: disables the tenant, cancels any active Stripe subscription (pro plan), and stops your key from authenticating anything further -- same as an admin-disabled tenant. Idempotent: an already-offboarded key gets the same tenant_disabled/tenant_key_invalid error every other host.*/ billing.* call already gets from it, not a crash. This does not scrub historical usage/signup records -- those stay for audit, same as today's admin-disabled tenants.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.share.caller_limit
Cap how many successful calls a caller tenant may make per UTC day into one of this tenant's shared tools. The tool must already be shared. Exceeding the cap fails the call with quota_caller (never runs it); this tenant's own calls to the tool are unaffected.
Eingabeschema
{'type': 'object', 'required': ['tool', 'caller_tenant', 'calls_per_day'], 'properties': {'tool': {'type': 'string', 'description': 'Local name of the shared tool.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'caller_tenant': {'type': 'string', 'description': "The caller's namespace to cap."}, 'calls_per_day': {'type': 'integer', 'description': 'Max successful calls per UTC day for this caller.'}}}
host.share.caller_limit_remove
Remove a caller_limit set by host.share.caller_limit.
Eingabeschema
{'type': 'object', 'required': ['tool', 'caller_tenant'], 'properties': {'tool': {'type': 'string', 'description': 'Local name of the shared tool.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'caller_tenant': {'type': 'string', 'description': "The caller's namespace whose limit to remove."}}}
host.state.delete
Delete one key from this tenant's key-value state namespace.
Eingabeschema
{'type': 'object', 'required': ['key'], 'properties': {'key': {'type': 'string', 'description': "Key to delete from this tenant's key-value state namespace."}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.delete_rows
Delete rows from a declared table matching an optional where filter (same grammar as host.state.query); omitting where deletes every row in the table.
Eingabeschema
{'type': 'object', 'required': ['table'], 'properties': {'table': {'type': 'string', 'description': 'Name of the declared table to delete rows from.'}, 'where': {'type': 'string', 'description': 'Optional filter, same grammar as host.state.query; omit to delete every row.'}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.get
Read one key from this tenant's key-value state namespace. Returns found: false (not an error) if the key was never set.
Eingabeschema
{'type': 'object', 'required': ['key'], 'properties': {'key': {'type': 'string', 'description': "Key to read from this tenant's key-value state namespace."}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.insert
Insert one row (an object) or several (an array of objects) into a declared table. Each row is validated against the table's schema first -- a type mismatch fails the whole call with state_schema_violation and writes nothing.
Eingabeschema
{'type': 'object', 'required': ['table', 'rows'], 'properties': {'rows': {'description': "One row (an object) or several (an array of objects), each validated against the table's schema."}, 'table': {'type': 'string', 'description': 'Name of the declared table to insert into.'}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.list
List keys (with their current values) in this tenant's key-value state namespace, optionally filtered by prefix.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'description': 'Max keys to return; default 100.'}, 'prefix': {'type': 'string', 'description': 'Only list keys starting with this prefix; default: all keys.'}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.query
Read rows from a declared table, optionally filtered (where: "field op value", ops = != < <= > >=, clauses joined by ' and '), ordered (order_by: "field" or "field desc") and capped (limit).
Eingabeschema
{'type': 'object', 'required': ['table'], 'properties': {'limit': {'type': 'integer', 'description': 'Max rows to return; optional.'}, 'table': {'type': 'string', 'description': 'Name of the declared table to read from.'}, 'where': {'type': 'string', 'description': 'Optional filter, e.g. "age > 21"; ops are != < <= > >=, clauses joined by \' and \'.'}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'order_by': {'type': 'string', 'description': 'Optional "field" or "field desc" to sort by.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.set
Write one key in this tenant's key-value state namespace; value may be any JSON value. Overrun of the plan's state_bytes_max quota fails with state_quota_exceeded and writes nothing.
Eingabeschema
{'type': 'object', 'required': ['key', 'value'], 'properties': {'key': {'type': 'string', 'description': "Key to write in this tenant's key-value state namespace."}, 'value': {'description': 'Any JSON value to store under key.'}, 'end_user': {'type': ['string', 'null'], 'description': '"self" for the caller\'s own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.state.table_create
Declare (or replace the schema of) a table in this tenant's state store. schema is {"column": "text"|"integer"|"real"|"boolean"|"json"}; primary_key, if given, must name one of schema's columns -- an insert whose row matches an existing row's primary_key value replaces it.
Eingabeschema
{'type': 'object', 'required': ['name', 'schema'], 'properties': {'name': {'type': 'string', 'description': 'Table name to declare, or replace the schema of.'}, 'schema': {'type': 'object', 'description': 'Column name to type map, each type one of text|integer|real|boolean|json, e.g. {"id": "integer"}.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'primary_key': {'type': 'string', 'description': 'Column name (must be in schema) whose matching value replaces an existing row on insert; optional.'}}}
host.state.table_drop
Drop a declared table and every row it holds.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Name of the declared table to drop, with every row it holds.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.append
Append one row (an object) or several (an array of objects) to a declared table. Each row is validated against the table's schema first -- a type mismatch fails the whole call with table_schema_violation and writes nothing.
Eingabeschema
{'type': 'object', 'required': ['table', 'rows'], 'properties': {'rows': {'description': "One row (an object) or several (an array of objects), each validated against the table's schema."}, 'table': {'type': 'string', 'description': 'Name of the declared table to append to.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.create
Declare a table in this tenant's SQL table store -- a different store from host.state.*'s key-value namespace and its own tables: use host.state.* for a handful of small values, host.table.* when you want real SQL (joins, aggregates, read-only queries) over rows. columns is {"column": "text"|"integer"|"real"| "timestamp"|"boolean"|"json"}; primary_key, if given, must name one of columns's own entries.
Eingabeschema
{'type': 'object', 'required': ['name', 'columns'], 'properties': {'name': {'type': 'string', 'description': 'Table name to declare.'}, 'columns': {'type': 'object', 'description': 'Column name to type map, each type one of text|integer|real|timestamp|boolean|json, e.g. {"id": "integer"}.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'primary_key': {'type': 'string', 'description': 'Column name (must be in columns); optional.'}}}
host.table.describe
Return the generated semantic model for a declared table: per column its inferred type, null share, distinct count, min/max or top values, and role (key|category|measure|date|id|text); per table its row count, candidate primary key, detected foreign keys, and suggested measures/dimensions. Refreshes after append/create within 30s; a call right after a write returns the previous model with stale: true rather than blocking.
Eingabeschema
{'type': 'object', 'required': ['table'], 'properties': {'table': {'type': 'string', 'description': 'Name of the declared table to describe.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.drop
Drop a declared table and every row it holds.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Name of the declared table to drop, with every row it holds.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.list
List this tenant's declared tables, each with its current row count, plus the tenant's whole table-store byte usage.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.models
List every declared table that has a computed semantic model, each with its version, staleness, row count and when it was last computed.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.model_set
Annotate a declared table or one of its columns -- the next describe merges this back in (an annotation's role wins over the inferred one; unit/description are added; hidden marks a column to omit from a summary). key must be one of role, unit, description, hidden.
Eingabeschema
{'type': 'object', 'required': ['table', 'key', 'value'], 'properties': {'key': {'type': 'string', 'description': 'One of role, unit, description, hidden.'}, 'table': {'type': 'string', 'description': 'Name of the declared table to annotate.'}, 'value': {'description': "The annotation's value."}, 'column': {'type': 'string', 'description': 'Column name to annotate; omit for a table-level annotation.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.query
Run a single read-only SQL SELECT (CTEs allowed) against this tenant's own tables. Structurally rejected (not by string matching): anything but exactly one SELECT statement, a result over 1,000 rows, or a query running past 5 seconds -- each refusal names the rule or bound it hit.
Eingabeschema
{'type': 'object', 'required': ['sql'], 'properties': {'sql': {'type': 'string', 'description': "A single read-only SELECT statement (CTEs allowed) over this tenant's own declared tables."}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.table.schema
Return one table's columns, types, row count and byte count, without running a query -- how an agent discovers its own table shape.
Eingabeschema
{'type': 'object', 'required': ['table'], 'properties': {'table': {'type': 'string', 'description': 'Name of the declared table to describe.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_call
Invoke a tool this tenant has already published, by its local name -- the same real, metered call as calling it directly by its namespaced name (<namespace>.<name>), for a session that has no way to see its own namespaced tool name yet. Unlike host.tool_test, this counts toward host.usage and appears in host.tool_logs. Pass async: true for a tool that needs more than the call deadline: returns {run_id, status: "queued"} immediately instead of running inline -- see host.runs.get/wait. Pass version to pin the call to one of host.tool_history's versions instead of whichever is current.
Eingabeschema
{'type': 'object', 'required': ['name', 'args'], 'properties': {'args': {'type': 'object', 'description': "Arguments to pass, validated against the tool's own args_schema."}, 'name': {'type': 'string', 'description': 'Local name of the tool to invoke.'}, 'async': {'type': 'boolean', 'description': "Run as a job instead of inline: returns {run_id, status} within ~50ms under the plan's job_max_s deadline; default false."}, 'version': {'type': 'integer', 'description': 'Pin the call to this version instead of whichever is current; see host.tool_history. An unknown version is an argument error.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_diff
Return a unified diff between two published versions of one of this tenant's tools.
Eingabeschema
{'type': 'object', 'required': ['name', 'from', 'to'], 'properties': {'to': {'type': 'integer', 'description': 'The later version number.'}, 'from': {'type': 'integer', 'description': 'The earlier version number.'}, 'name': {'type': 'string', 'description': 'Local name of the tool.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_history
List every published version of one of this tenant's tools, newest first, each with its creation time, source_sha256, and whether it's the current one.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Local name of the tool.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_list
List this tenant's published tools.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_logs
Return the most recent log lines for one of this tenant's tools.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Local name of the tool whose log lines to return.'}, 'limit': {'type': 'integer', 'description': 'Max lines to return, most recent first; default 20.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_publish
Publish a tool of a registered kind (chain, echo, http, python, wasm) under this tenant's namespace. Call host.quickstart(kind) first for a filled-in example spec and the full publish-to-call sequence. Name must match ^[a-z][a-z0-9_]{1,40}$; a rejection names the failing field and a corrected example. Try host.tool_test before a real call.
Eingabeschema
{'type': 'object', 'required': ['name', 'kind', 'spec'], 'properties': {'kind': {'type': 'string', 'description': 'Which registered kind to publish under: chain, echo, http, python, wasm. A job-word alias also resolves here -- event, events, webhook, webhooks, inbound or trigger for an inbound webhook, cron, schedule or scheduled for a timed run -- both resolve to kind http and the descriptor comes back with resolved_from naming the alias you asked for.'}, 'name': {'type': 'string', 'description': 'Local name for the new tool; must match ^[a-z][a-z0-9_]{1,40}$.'}, 'spec': {'type': 'object', 'description': 'The kind-specific spec object; see host.quickstart(kind) for a filled-in example.'}, 'scopes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'OAuth scopes a token must carry (directly, or via mcp) to reach this tool: catalogued names from host.oauth.scopes, or the built-ins read/write. At most 8. Omit (or [] ) to require only mcp -- unaffected by any catalog.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_remove
Remove a published tool by its local name.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Local name of the tool to remove.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_rollback
Make an earlier published version of one of this tenant's tools current again -- the next host.tool_call (or namespaced call) runs that version's source. See host.tool_history for the valid version numbers.
Eingabeschema
{'type': 'object', 'required': ['name', 'version'], 'properties': {'name': {'type': 'string', 'description': 'Local name of the tool to roll back.'}, 'version': {'type': 'integer', 'description': 'The version number (from host.tool_history) to make current.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_run
Debug-run a published python tool: result.payload plus duration_ms and exit_code; for the other cases see host.quickstart.
Eingabeschema
{'type': 'object', 'required': ['name', 'args'], 'properties': {'args': {'type': 'object', 'description': 'Arguments to pass, same shape as a real call.'}, 'name': {'type': 'string', 'description': 'Local name of the already-published python tool to debug-run.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_share
Share one of this tenant's published tools with everyone (visibility: "public") or with a named group this tenant owns (visibility: "group", group: <name>). The tool keeps running in this tenant's own sandbox with this tenant's own secrets; a caller reaches it as <this tenant's namespace>.<name>.
Eingabeschema
{'type': 'object', 'required': ['name', 'visibility'], 'properties': {'name': {'type': 'string', 'description': 'Local name of the tool to share.'}, 'group': {'type': 'string', 'description': 'Required when visibility is "group"; must already exist (host.group.create).'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'visibility': {'type': 'string', 'description': '"public" or "group".'}, 'description': {'type': 'string', 'description': 'Catalog-facing blurb; shown by host.catalog.search/get.'}, 'expose_spec': {'type': 'boolean', 'description': 'Default false. When true, any tenant this tool is shared with may call host.tool_spec_shared to read its (redacted) spec.'}}}
host.tool_spec_shared
Read a shared tool's kind and redacted spec -- only works when the owner shared it with expose_spec: true. The spec never carries env values or secret references (see host.tool_share's expose_spec).
Eingabeschema
{'type': 'object', 'required': ['tool'], 'properties': {'tool': {'type': 'string', 'description': '"<owner_namespace>.<name>", the same qualified name host.tool_call uses for a shared tool.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_test
Dry-run an already-published tool by name, no calls row written; for the other cases see host.quickstart.
Eingabeschema
{'type': 'object', 'required': ['name', 'args'], 'properties': {'args': {'type': 'object', 'description': 'Arguments to pass, same shape as a real call.'}, 'name': {'type': 'string', 'description': 'Local name of the already-published tool to dry-run.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.tool_unshare
Take a shared tool back to private.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Local name of the tool to unshare.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.fire
Run a schedule once right now, for testing -- recorded as trigger: "schedule" with manual: true, independent of next_unix or pause state.
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The trigger id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.get
Read one trigger's current schedule, next_unix, last_run_id and last_status.
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The trigger id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.list
List this tenant's triggers (optionally filtered by tool), each with next_unix, last_run_id and last_status (schedule), url/verify/unverified (event), or url/name/verify with no secret (webhook).
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tool': {'type': 'string', 'description': 'Only triggers on this tool name.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.pause
Stop a trigger from firing until resumed; still counts toward schedules_max.
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The trigger id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.remove
Delete a trigger outright (frees its schedules_max slot, unlike pause).
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The trigger id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.replay
Re-run a past event- or message-triggered run's exact stored event/envelope (no re-verification -- the original delivery already passed it). The new run's trigger_ref names the original run id. For a webhook trigger, pass id (the trigger) and row_id (an inbox_<name> row id, e.g. from POST /hook/...'s own response or host.state.query) instead of run_id -- a paused delivery has no run to replay from.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'id': {'type': 'string', 'description': 'kind="webhook" only: the trigger id (paired with row_id).'}, 'row_id': {'type': 'integer', 'description': 'kind="webhook" only: the inbox_<name> row id to replay (paired with id).'}, 'run_id': {'type': 'string', 'description': 'The event- or message-triggered run id to replay.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.resume
Re-enable a paused trigger; if its scheduled time already passed, the next tick fires it once (a missed firing is never replayed).
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The trigger id.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.trigger.set
Run a published tool on a cron schedule (5-field: minute hour day-of-month month day-of-week, UTC), give it a public webhook URL (kind="event"): a signed POST to that URL runs the tool with the event as its argument, fire it whenever this tenant receives a message (kind="message"): the tool runs with the message envelope as its argument, or give it an inbound-inbox URL (kind="webhook"): a verified POST lands as a row in state table inbox_<name> and fires the tool with that row as its argument -- the response carries {url, secret} once (host.trigger.get afterwards never returns the secret again). Each firing/delivery is a run visible in host.runs.list(trigger="schedule"|"event"|"message"|"webhook"). Refuses schedules_max (trigger_quota_exceeded, shared by schedule and webhook triggers), event_triggers_max (shared by event and message triggers) or a too-short schedule interval (trigger_interval_too_short); an invalid expression or verify config fails trigger_invalid naming the field.
Eingabeschema
{'type': 'object', 'required': ['tool'], 'properties': {'tz': {'type': 'string', 'description': 'kind="schedule" P1: only "UTC" (or omitted) works today.'}, 'args': {'type': 'object', 'description': 'Arguments passed to the tool on each firing/delivery (kind="schedule"/"event" only -- a message trigger\'s whole argument is the message envelope and a webhook trigger\'s whole argument is the stored inbox row).'}, 'from': {'type': 'string', 'description': 'kind="message": only fire for messages from this address (@handle or t_... namespace); omit to fire for any sender.'}, 'kind': {'type': 'string', 'description': '"schedule" (default), "event", "message" or "webhook".'}, 'name': {'type': 'string', 'description': 'kind="webhook": letters/digits/underscore -- becomes the inbox_<name> state table each accepted delivery is stored in.'}, 'tool': {'type': 'string', 'description': 'The published tool this trigger runs.'}, 'verify': {'description': 'kind="event": {scheme: "hmac-sha256"|"hmac-sha1"|"token"|"none", header, secret (a host.secret_set name), prefix?, timestamp_header?, tolerance_s?, allow_unverified? (required true for scheme "none")}. kind="webhook": a plain string, one of "hmac" (default; checks X-Mcphost-Signature: sha256=<hex>), "none", or "stripe" (checks Stripe-Signature the way Stripe itself signs, using the same generated secret).'}, 'schedule': {'type': 'string', 'description': 'kind="schedule": 5-field cron expression (minute hour day-of-month month day-of-week), UTC. Supports *, lists, ranges and steps.'}, 'channel_id': {'type': 'string', 'description': 'kind="message": scope this trigger to one group channel\'s posts (host.channel.open\'s channel_id) instead of ordinary host.msg.send/reply deliveries.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}, 'dedupe_header': {'type': 'string', 'description': 'kind="event": a header (e.g. X-GitHub-Delivery) whose repeated value within 24h answers 202 with the original run id instead of running again.'}}}
host.trigger.test
Dry-run an event trigger's verify config against a payload you supply, without exposing its real URL -- verifies the signature exactly as POST /hooks/... would, then runs the tool with the event as its argument. On a message trigger, runs the tool with a synthetic envelope (test: true, no messages row created). On a webhook trigger, builds and self-signs a synthetic body exactly like a real sender would, then stores and fires it through the same path POST /hook/... uses (one inbox row, one run). The run is marked test: true. A wrong signature fails signature_invalid, naming the header it checked.
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The event, message or webhook trigger id.'}, 'body': {'description': 'kind="event"/"webhook": the payload to verify and run with -- any JSON value. kind="message": the synthetic envelope\'s body text.'}, 'data': {'description': 'kind="message": the synthetic envelope\'s data payload.'}, 'from': {'type': 'string', 'description': 'kind="message": the synthetic envelope\'s from address; default "@test".'}, 'headers': {'type': 'object', 'description': 'kind="event": header name -> string value, e.g. {"X-Hub-Signature-256": "sha256=..."}.'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.usage
Calls, errors and duration percentiles for this tenant over a window. Pass `by` ("tool", "caller", or "end_user") for a breakdown instead of the plain per-tenant summary: "caller" (only valid for a tool this tenant has shared) shows which tenant called in and how much; "end_user" shows which identified end user called, with the caller tenant folded into the key when the call crossed tenants. Breakdown rows cap at 1000 per page; pass the returned `cursor` back to page further.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'by': {'type': 'string', 'description': '"tool", "caller", or "end_user" -- omit for the plain per-tenant summary.'}, 'tool': {'type': 'string', 'description': 'Scope the breakdown to one local tool name. Required when by is "caller".'}, 'limit': {'type': 'integer', 'description': 'Max breakdown rows per page (1-1000, default 1000).'}, 'cursor': {'type': 'string', 'description': "Resume a breakdown after this page's last key."}, 'window': {'type': 'string', 'description': 'Time window to summarize, e.g. "24h"/"1d"/"7d"/"30d"; default 24h ("1d" when `by` is given).'}, 'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
host.whoami
Return the calling tenant's identity, including key_age_s and key_rotated_at for auditing credential hygiene.
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'tenant_key': {'type': 'string', 'description': 'The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602).'}}}
signup
Create a tenant and receive a bearer key and namespace. Unauthenticated. Recommended: pass handoff: true to receive a short-lived, single-use handoff_token instead of the raw key -- redeem it once with host.redeem to get the key, so a transcript of this call and the redeem call, if it leaks, carries a dead credential. The raw-key path (handoff omitted) stays fully supported.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'display name'}, 'handoff': {'type': 'boolean', 'description': 'Recommended: true to receive a handoff_token (redeem via host.redeem) instead of the raw key. Default false (raw key, unchanged).'}}}
Geändert
host.enduser.export
1. October 2026 02:44
Geändert
host.enduser.purge
1. October 2026 02:44
Geändert
host.enduser.unrevoke
1. October 2026 02:44
Geändert
host.enduser.revoke
1. October 2026 02:44
Geändert
host.enduser.audit
1. October 2026 02:44
Geändert
host.enduser.get
1. October 2026 02:44
Geändert
host.enduser.list
1. October 2026 02:44
Geändert
host.enduser.assertion_secret_rotate
1. October 2026 02:44
Geändert
host.enduser.whoami
1. October 2026 02:44
Geändert
host.oauth.trusted_issuers
1. October 2026 02:44
Geändert
host.oauth.trusted_issuer_remove
1. October 2026 02:44
Geändert
host.oauth.trusted_issuer_set
1. October 2026 02:44
Geändert
host.oauth.doctor
1. October 2026 02:44
Geändert
host.oauth.provider_remove
1. October 2026 02:44
Geändert
host.oauth.provider
1. October 2026 02:44
Geändert
host.oauth.provider_set
1. October 2026 02:44
Geändert
host.oauth.audit_export
1. October 2026 02:44
Geändert
host.oauth.audit
1. October 2026 02:44
Geändert
host.oauth.revoke_all
1. October 2026 02:44
Geändert
host.oauth.client_deny
1. October 2026 02:44
Geändert
host.oauth.client_approve
1. October 2026 02:44
Geändert
host.oauth.pending
1. October 2026 02:44
Geändert
host.oauth.policy
1. October 2026 02:44
Geändert
host.oauth.policy_set
1. October 2026 02:44
Geändert
host.oauth.grant_revoke
1. October 2026 02:44
Geändert
host.oauth.grants
1. October 2026 02:44
Geändert
host.oauth.scopes
1. October 2026 02:44
Geändert
host.oauth.scope_set
1. October 2026 02:44
Geändert
host.oauth.issuers
1. October 2026 02:44
Geändert
host.oauth.issuer_remove
1. October 2026 02:44