mcphost
Server Details
Hosted MCP runtime where your agent publishes its own tools by tool call and keeps working.
- Status
- Healthy
- Uptime
- 100.0% over 62 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Server Listing
- mcphost
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 18 tools
Most tools target clearly distinct operations (state.get/list/set, feedback.list/send, help.get/search, tool_publish/call/test/share). The closest pairs are host.tool_call vs host.tool_test (real vs dry-run) and host.quickstart vs host.tool_publish, but descriptions explicitly differentiate them. Minor residual ambiguity only.
Names use a namespace prefix (host.*, billing.*) which is largely consistent, but the segment style is mixed: dotted hierarchy in host.state.get/host.tool_* uses underscores (host.tool_call, host.tool_publish) while others use dots, and billing.plans is a bare noun. Other names are single tokens (signup, host.whoami, host.resume). Readable but not a single predictable pattern.
18 tools for a multi-domain host (state, tools, billing, help, feedback, auth) is reasonable and each appears to earn its place. Slightly on the heavy side but well within scope.
Core lifecycle is covered (signup/redeem/whoami, state get/list/set, tool publish/call/test/share, help, feedback), but there is no state.delete and, more seriously, host.resume references tools that do not exist in this surface (host.tool.list, host.runs.list, host.runs.get/wait, host.note.list, host.changelog), creating dead ends for agents following its guidance.
Available Tools
18 toolsbilling.plansBInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| plans | Yes | |
| billing_mode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses one access fact (anonymous callers get the same answer as tenants) but says nothing about whether the call is read-only or side-effect free. Per the schema, omitting tenant_key can implicitly create a brand-new tenant -- a material side effect the description never surfaces.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary return content followed by the secondary billing-configuration fact. No filler, though the second sentence could be folded in.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the single parameter is fully documented. The description covers what is returned and the auth-invariance behavior, leaving only side-effect disclosure as a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so tenant_key's full semantics (signup binding, header precedence, implicit signup) are already documented in the schema. The description adds nothing about the parameter, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource and its contents -- the plan catalog with price and quotas per plan -- plus a configuration fact (Stripe billing configured on this host). A reader knows exactly what comes back. It does not name or contrast with any sibling, but the subject matter is distinct from the host.* and signup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers it should call this to discover plans and billing availability. There is no explicit when-to-use, when-not-to-use, or alternative named, though the note that anonymous callers get the same answer subtly signals no auth prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.errorsAInspect
List every error code this host can return, each with its class (agent_fault | host_refusal | upstream_fault | plan_limit | host_fault), family, remedy, docs anchor, retryable flag and help_url -- the same object GET /errors.json serves. Pass code to get one row; a misspelt code answers tool_not_found with did_you_mean. Read-only, anonymous, no tenant data.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | An error code, e.g. tool_exception. Omit to list every code. | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| class | No | |
| codes | No | |
| family | No | |
| remedy | No | |
| classes | No | |
| version | No | |
| help_url | No | |
| retryable | No | |
| docs_anchor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares read-only, anonymous, no tenant data, and the return fields, plus the edge-case behavior for a misspelt code (tool_not_found with did_you_mean). It stops short of stating rate limits or auth mechanics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-ordered paragraph that front-loads the main purpose and return shape before the filtering and edge-case details. Every clause earns its place, though the field list is fairly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be re-explained, and the description still tells the agent the two invocation modes and the failure behavior. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema. The description adds only the filtering behavior of code; it says nothing extra about tenant_key, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'List every error code this host can return', with the exact payload shape enumerated. It is clearly distinguishable from siblings like host.help.search, which deal with documentation rather than error codes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two modes: omit code to list everything, pass code to get one row, and even covers the misspelling case. It gives clear context but never names an alternative tool or states when another sibling would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.feedback.listAInspect
List your own feedback (newest first, status received). Anonymous callers get [].
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows, up to 100; default 20. | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| feedback | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose non-obvious traits: results are newest-first, only status "received" is returned, and anonymous callers get an empty list. It is silent on auth mechanics, but those are handled thoroughly in the tenant_key schema description rather than here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence, front-loaded with the action, and each parenthetical carries a distinct, useful fact. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema (so return values need no explanation) and full schema coverage, the description supplies scope, ordering, status filtering, and the anonymous edge case. It is essentially complete, though it could note that the tool is read-only and non-paginated beyond limit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already fully documents limit and tenant_key (including the elaborate binding/auth semantics). The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List your own feedback") plus scope ("your own") and filter conditions, which is enough to distinguish it from the write-oriented sibling host.feedback.send. It never names that sibling explicitly, so differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The "your own feedback" scoping and the anonymous-caller note imply who should call it and what they get, but there is no explicit when-to-use guidance and no named alternative for broader feedback retrieval. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.feedback.sendAInspect
Tell the host's humans what you needed: kind, up to 2048 bytes of text, optional context. Works before signup. Returns feedback_id.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What you are telling the host. | |
| text | Yes | What you needed or saw; 1 to 2048 bytes after trim. | |
| context | No | Optional, at most 1 KB: tool, error_code, free. | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| feedback_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real behavioral facts: it is available prior to signup and returns a feedback_id. What it omits is the side effect documented in the schema that omitting tenant_key implicitly signs the caller up as a new tenant, plus any rate or dedupe behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero padding; the core action and the key constraint (works before signup) are front-loaded. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A four-parameter tool with a nested context object and an output schema; the return value need not be explained, and the schema covers tenant_key. Still, the description never flags the implicit tenant-creation side effect of omitting tenant_key, which is the single most consequential behavior an agent should know before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all four parameters in depth, including the nuanced tenant_key binding rules. The description restates the 2048-byte bound and that context is optional but adds nothing beyond the schema, and never mentions tenant_key.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: telling "the host's humans" something, i.e. submitting feedback, with the expected inputs named. It distinguishes itself implicitly from the read-side sibling host.feedback.list by being the send path, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Works before signup" is a useful precondition for when this can be called, but there is no explicit when-to-use guidance, no direction on choosing among the kind enum values, and no reference to host.feedback.list or signup as alternatives. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.help.getAInspect
Return the documentation section an anchor points at: its text (at most 4 KB) and its first fenced example. Pass an anchor exactly as an error, hint or help entry printed it, e.g. a rate_limited error's anchor. Read-only, anonymous, no tenant data. An unknown anchor is anchor_not_found with the nearest anchors in did_you_mean.
| Name | Required | Description | Default |
|---|---|---|---|
| anchor | Yes | A `<path>#<slug>` anchor, e.g. README.md#call-limits, as printed by an error's `anchor` field or a `host.help.search` hit. `<path>#top` and a bare `<path>` (e.g. docs/kinds/chain.md) both return that document's first section. | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| line | Yes | |
| path | Yes | |
| text | Yes | |
| title | Yes | |
| anchor | Yes | |
| example | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it declares the operation read-only, anonymous, and free of tenant data, caps output size, and discloses the error contract (anchor_not_found plus did_you_mean suggestions). It does not cover the implicit tenant signup behavior that the tenant_key parameter enables.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the return contract, then invocation, then safety and error behavior. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. The description supplies purpose, invocation rule, safety profile, size limit, and error contract, which is everything an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: exact-match semantics for the anchor string and the anchor_not_found/did_you_mean behavior for unknown values. The tenant_key parameter is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return) and resource (the documentation section an anchor points at), plus scope details: text capped at 4 KB and the first fenced example. It is clearly distinguishable from host.help.search because it resolves an already-known anchor rather than searching for one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete invocation guidance ('Pass an anchor exactly as an error, hint or help entry printed it') and names where anchors come from (an error's `anchor`, a host.help.search hit). It stops short of an explicit when-not or a direct statement telling the agent to use host.help.search first to discover anchors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.help.searchAInspect
Search this host's own documentation and tool descriptions. Returns up to k hits (default 3, response under 2 KB), each with a snippet, the nearest runnable example and an anchor. Read-only, anonymous, no tenant data -- call it with the error text or import line you are stuck on before reading any docs file.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | How many hits to return (default 3). | |
| q | Yes | What you are stuck on: a tool name, an error code or message, an import line. | |
| kind | No | Only search the page of this registered kind (docs/kinds/<kind>.md). | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| hits | Yes | |
| total | Yes | |
| index_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses read-only, anonymous, no tenant data, a response size ceiling (<2 KB), default k=3, and what each hit contains. It does not cover auth header interplay or rate limits, but the schema's tenant_key note covers the former.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but front-loaded block: purpose, then output shape, then usage guidance. Every clause earns its place, though the single long sentence is slightly harder to scan than two shorter ones.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is optional, yet the description still summarizes hit contents usefully. The 'anonymous, no tenant data' framing sits slightly apart from the schema's tenant_key signup behavior, but the schema resolves that nuance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents q, k, kind, and tenant_key in detail. The description reinforces q's intent ('the error text or import line you are stuck on') and the k default, but adds no format or syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search this host's own documentation and tool descriptions') and immediately characterizes the output (up to k hits with snippet, nearest runnable example, anchor). The contrast with reading docs files directly makes its role distinct from siblings like host.help.get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use trigger -- 'call it with the error text or import line you are stuck on' -- and an ordering rule ('before reading any docs file'). It does not name the alternative tool (host.help.get) explicitly, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.quickstartAInspect
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 -- this call alone never creates a tenant. Call this before host.tool_publish if you're not sure what a spec should look like. Unauthenticated callers get a worked example with no tenant data; any other host./billing. call creates a tenant on first use, no signup required.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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 | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. | |
| retry_after_s | No | Seconds a rate-limited signup said to wait; an error's next_call carries it back here. Informational, never required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| kind | No | |
| next | No | |
| kinds | No | |
| steps | No | |
| verbs | No | |
| limits | No | |
| recipe | No | |
| aliases | No | |
| example | No | |
| outcome | No | |
| recipes | No | |
| verdict | No | |
| contract | No | The asked kind's KindContract summary: the error families its failures carry and whether they carry data.source_line. |
| endpoint | No | |
| triggers | No | |
| namespace | No | |
| next_steps | No | |
| sandbox_api | No | |
| alt_endpoint | No | |
| reachability | No | |
| starter_tool | No | |
| welcome_back | No | |
| authenticated | No | |
| install_links | No | |
| resolved_from | No | |
| bridge_returns | No | |
| recipes_nearby | No | |
| install_doc_url | No | |
| try_before_call | No | |
| host_steps_allowed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it states the call is read-only and never creates a tenant, explains that unauthenticated callers get a worked example with no tenant data, and notes that any other host.*/billing.* call creates a tenant on first use. It does not cover error handling or rate limits on this call itself, but the key side-effect and auth nuances are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with what the tool returns, then read-only status, then usage guidance, and finally auth-related behavior. Every sentence adds value, though the first sentence is dense and could be slightly shorter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Schema coverage is 100% for parameters. Behavior and usage are well covered. The only missing elements are edge cases like invalid kind or specific error responses, which are minor for this help/quickstart tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters in detail. The description adds no additional syntax or meaning for kind, tenant_key, or retry_after_s beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Return) and a clear resource (shortest ordered sequence of calls to a working tool of `kind`, plus limits and a try_before_call table). It distinguishes itself from siblings by explicitly referencing host.tool_publish and the broader host.*/billing.* context, so an agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative (host.tool_publish) and the condition that selects this tool ('Call this before host.tool_publish if you're not sure what a spec should look like'). It also implicitly guides usage for unauthenticated callers versus other host.*/billing.* calls that create tenants. No inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.redeemAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. | |
| handoff_token | Yes | The handoff_token signup(handoff: true) returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| next | Yes | |
| usage | Yes | |
| session_bound | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden: it declares unauthenticated operation, single-use redemption, the handoff_token_redeemed failure code on second use, the handoff_token_expired failure code past expiry, and that the token itself is the proof. This is rich behavioral disclosure well beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences, front-loaded with purpose and followed by the critical lifecycle and failure semantics. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations and an output schema, the description supplies the needed auth, lifecycle, and failure context. Return values are covered by the output schema, and tenant_key nuances are covered by the schema description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds no parameter syntax, format, or constraint detail beyond what the schema already documents for handoff_token and tenant_key. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Exchange) and resource (signup(handoff: true) handoff_token for the tenant key), making the operation distinct from the sibling signup tool. The relation to signup's handoff mode identifies the exact input and outcome without requiring the schema to be opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly triggers on a handoff_token returned by signup(handoff: true) and gives failure conditions for redeeming it again or after expiry. It does not explicitly compare to alternatives such as host.resume or host.whoami, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.resumeAInspect
Resume where you left off in one call (at most 4096 bytes): your tools with each one's last call status, unfinished runs, your newest notes, what changed on the host since your last call, and one suggested next_call. truncated names any section that was cut -- call that section's own tool (host.tool.list, host.runs.list, host.note.list, host.changelog) for the rest. Read-only. An unauthenticated caller gets the onboarding block and creates no tenant.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| host | No | |
| notes | No | |
| tools | No | |
| tenant | No | |
| last_seen | No | |
| next_call | Yes | |
| runs_open | No | |
| truncated | No | |
| onboarding | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does so well: it discloses the 4096-byte cap, the truncation contract via 'truncated', that the operation is read-only, and the unauthenticated path (onboarding block, no tenant created). Auth/binding nuance is further handled in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the payoff (what you get in one call), then truncation handling, then safety/auth notes. Dense but every clause carries information; the parenthetical enumerations make it slightly run-on but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, yet the description still frames the return shape and the truncation escape hatch, plus auth behavior. For a resumption/orchestration tool with one optional param, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the tenant_key schema text already explains binding, signup, header precedence, and implicit signup. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Resume where you left off') and enumerates exactly what comes back: tools with last call status, unfinished runs, newest notes, host changelog, and a suggested next_call. It distinguishes itself from siblings by naming the per-section tools (host.tool.list, host.runs.list, host.note.list, host.changelog) an agent would use instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for when to use it (to resume in one call) and explicit routing to the section-specific tools when output is truncated. It doesn't explicitly contrast with host.state.get or host.state.list, which are the closest-looking siblings, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.state.getAInspect
Read one key from this tenant's key-value state namespace. Returns found: false (not an error) if the key was never set.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key to read from this tenant's key-value state namespace. | |
| end_user | No | "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 | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| found | Yes | |
| value | Yes | |
| impersonated | No | |
| updated_unix | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose one genuinely useful trait — a missing key returns found:false rather than an error — but says nothing about permissions, tenant binding requirements, or what happens when an implicit tenant is created, all of which are behaviors an agent would want surfaced at this level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the core operation is front-loaded ahead of the not-found caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the parameter semantics are fully documented in the schema. The description is nearly complete for a simple getter, though it does not touch the non-obvious tenant-binding/implicit-signup implications that an agent could otherwise miss.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed prose for tenant_key and end_user, so the schema already does the heavy lifting. The description adds only the namespace-scoping phrase, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Read") and resource ("one key from this tenant's key-value state namespace"), which is enough to separate it from host.state.list (many keys) and host.state.set (write). It does not explicitly name those siblings, so it stops short of the 5 benchmark, but the scope word "one" conveys the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the read-one-key framing and the not-found behavior signals when this is the correct call, but there is no explicit when/when-not guidance or naming of alternatives such as host.state.list or host.state.set. Adequate minimum, with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.state.listBInspect
List keys (with their current values) in this tenant's key-value state namespace, optionally filtered by prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max keys to return; default 100. | |
| prefix | No | Only list keys starting with this prefix; default: all keys. | |
| end_user | No | "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 | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| keys | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose that current values are returned (not just keys) and that results can be narrowed by prefix, and 'List' implies a read operation, but it says nothing about permissions, rate limits, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and its scope lead, with the optional filter trailing. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 100%-covered schema and an output schema that documents return values, the description need not explain formats or fields. It is adequate, though it omits any mention of the implicit tenant-binding/signup side effects that the tenant_key schema documents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, prefix, end_user and tenant_key are already fully documented in the schema. The description only restates the optional prefix filter and adds no syntax or semantics beyond what the schema provides, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), resource (keys in this tenant's key-value state namespace) and scope (this tenant's, optional prefix filter), plus the useful detail that values are returned alongside keys. It does not explicitly differentiate from the sibling host.state.get/host.state.set, but the name and scope make the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes the prefix filter is optional but gives no when-to-use guidance, no conditions for choosing this over host.state.get, and no prerequisites. Usage must be inferred from the name and schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.state.setAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key to write in this tenant's key-value state namespace. | |
| value | Yes | Any JSON value to store under key. | |
| dry_run | No | return the diff this call would make and commit nothing | |
| end_user | No | "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 | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | |
| set | No | |
| bytes_delta | No | |
| impersonated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It helpfully discloses quota-failure behavior ('state_quota_exceeded' and 'writes nothing'), but it does not say whether writing an existing key overwrites its prior value, whether the write is atomic/idempotent, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and followed by the most important failure mode. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and fully described input schema mean return values and parameter details need not be in the description. The description covers purpose and a key failure mode, though it omits overwrite semantics that matter for a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents key, value, dry_run, end_user, and tenant_key semantics. The description adds no parameter-level meaning beyond repeating that the value may be any JSON value; baseline 3 applies when the schema does this much work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Write') and resource ('one key in this tenant's key-value state namespace'), and implicitly distinguishes itself from read-oriented siblings like host.state.get and host.state.list. The value-type and quota clauses add useful scope without obscuring the core action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state when to use this tool versus alternatives such as host.state.get, host.state.list, or dry-run mode. It gives no when-not-to-use guidance, leaving the agent to infer usage from the write verb and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.tool_callAInspect
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 (.), 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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments to pass, validated against the tool's own args_schema. | |
| name | Yes | Local name of the tool to invoke. | |
| async | No | Run as a job instead of inline: returns {run_id, status} within ~50ms under the plan's job_max_s deadline; default false. | |
| budget | No | Lowers this call's budget below the plan default: any subset of max_child_calls, max_est_tokens, max_tool_latency_ms, max_wall_ms. A value above the plan's own ceiling is a validation error naming it; see host.runs.get's progress.budget. | |
| dry_run | No | Ask instead of call: runs every admission check the real call runs, dispatches nothing, writes no call row, and returns {fits, units, remaining, refusal}; same as host.estimate. Default false. | |
| version | No | Pin the call to this version instead of whichever is current; see host.tool_history. An unknown version is an argument error. | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| state | No | |
| result | No | |
| call_id | No | |
| dry_run | No | |
| verdict | No | |
| stale_test | No | |
| client_tool | No | |
| forwarded_to | No | |
| tested_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that this is a real metered call that counts toward host.usage and appears in host.tool_logs, describes the async return shape {run_id, status}, and notes that an unknown version is an argument error. It omits behavioral detail on budget refusal and tenant_key side effects, which are only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense but well-structured paragraph that front-loads the core purpose and equivalence to namespaced invocation before elaborating options. Every sentence adds some value, though a few clauses on async/version duplicate schema content and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-param tool with nested budget and an output schema, the description covers the essential invocation semantics, metering, and async/version behavior without needing to explain return values (output schema exists). The one gap is that dry_run, budget, and tenant_key semantics are left entirely to the schema, but overall it is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters thoroughly (including nested budget fields). The description's notes on async and version largely restate what the schema says, adding only the local-vs-namespaced name framing. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Invoke") and resource ("a tool this tenant has already published, by its local name") and explicitly equates it to calling by namespaced name, so the agent understands the exact operation. It also names the sibling host.tool_test as the contrasting tool, making it distinguishable without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for use ("for a session that has no way to see its own namespaced tool name yet") and an explicit contrast with host.tool_test (which does not meter). It also routes long-running calls to async mode and version pinning to host.tool_history. It does not cover the dry_run/host.estimate alternative, leaving one notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.tool_publishAInspect
Publish a tool of a registered kind (e.g. python, http or echo; the kind argument's enum lists them all) under this tenant's namespace. Call host.quickstart(kind) first for a filled-in example spec and the full publish-to-call sequence. Python's sandbox API: import mcphost (mcphost.table, mcphost.state, mcphost.docs). 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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which registered kind to publish under: one of this field's `enum` (host.quickstart with no kind lists every kind, alias and recipe). A job-word alias in the enum also resolves here -- webhook-style words for an inbound webhook, cron-style words for a timed run -- both resolve to kind http and the descriptor comes back with resolved_from naming the alias you asked for. Error contract per kind: chain (families: compose, tool_state; source_line: no); echo (families: none; source_line: no); http (families: upstream; source_line: no); jq (families: tool_code, tool_limit; source_line: no); js (families: tool_code, tool_limit, upstream, compose, tool_state; source_line: yes); python (families: tool_code, tool_limit, upstream, compose, tool_state; source_line: yes); wasm (families: tool_code, tool_limit; source_line: no). | |
| name | Yes | Local name for the new tool; must match ^[a-z][a-z0-9_]{1,40}$. | |
| spec | Yes | The kind-specific spec object; see host.quickstart(kind) for a filled-in example. For python's network field: "none" (every plan), "public" (requires the pro plan), "egress" (requires the pro plan) -- a tool's own code reaches this tenant's data with `import mcphost` (mcphost.table, mcphost.state, mcphost.docs, mcphost.lineage) even when network is "none". | |
| tags | No | Catalog tags: at most 16, each 1-32 chars of a-z, 0-9 and '-', stored lower-case and deduped. | |
| force | No | Publish a chain whose mapping can never resolve (verdict will_fail) anyway; the response's gates entry then carries forced: true. Default false. | |
| scopes | No | 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. | |
| dry_run | No | return the diff this call would make and commit nothing | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. | |
| visibility | No | Who may find the tool (default private). unlisted: callable by full name and readable by host.catalog.get, never listed. public: listed in the catalog, and refused (untested_tool_cannot_be_public) unless the current version passes its dry run first. Use host.tool_share for group or url. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| hint | No | |
| kind | No | |
| lock | No | |
| name | No | |
| next | No | |
| gates | No | |
| steps | No | |
| reason | No | |
| verdict | No | |
| version | No | The tool's version after this publish (1 for a first publish). |
| evidence | No | |
| failures | No | |
| warnings | No | |
| call_line | No | A ready-to-paste call for the published tool. Optional: declared so a typed client reserves the field; absent from responses that do not carry one. |
| tool_lint | No | Advisory publish-time lint findings for a python tool ([] when clean); a finding never blocks the publish. |
| onboarding | No | |
| deprecations | No | |
| welcome_back | No | |
| resolved_from | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden. It usefully discloses the name regex, the rejection behavior (failing field plus corrected example), and Python's mcphost sandbox imports. However it never states what publishing does to an existing tool of the same name (overwrite vs conflict), nor the mutation/permission profile, which are the traits an agent most needs here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by prerequisites, then environment and error details, in four dense sentences with no filler. Every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and the schema fully documents the kind-specific spec shapes and error families. Combined with quickstart and tool_test pointers, the description is nearly complete; the one real gap is the republish/overwrite semantics of a mutating publish call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 9 parameters, so force, scopes, tags, dry_run, tenant_key and visibility are already well documented in the schema. The description adds only the kind examples and a Python sandbox note, both of which the schema also touches, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: publish a tool of a registered kind, scoped to the tenant namespace, and names the kind enum as the source of valid values. An agent can distinguish it from host.tool_test and host.tool_call purely from this sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing and alternatives: call host.quickstart(kind) first for an example spec and the publish-to-call sequence, and try host.tool_test before a real call. The condition that selects each sibling is stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.tool_testAInspect
Dry-run a published tool by name: verdict (pass/will_fail/unverifiable), writes rolled back (dry_run); see host.quickstart.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments to pass, same shape as a real call. Omit to run one example generated from the tool's args_schema; the response then carries example_args (what ran) and untyped (keys the schema gave no type for). | |
| name | Yes | Local name of the already-published tool to dry-run. | |
| fixtures | No | Chain tools only: {"<step number or tool name>": <recorded result>}. A fixtured step executes nothing (no upstream call); later mappings resolve against it. host.runs.get(run_id, as_fixtures=true) exports a real run in this shape. | |
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| state | No | |
| result | No | |
| call_id | No | |
| dry_run | Yes | |
| verdict | No | |
| stale_test | No | |
| client_tool | No | |
| forwarded_to | No | |
| tested_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key behavioral trait: writes are rolled back in dry_run. It also names the verdict states, which tells the agent what to inspect. It omits auth/tenant implications and what a failed verdict means in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the core action front-loaded and no filler; the verdict enumeration and rollback note are packed efficiently. The quickstart pointer is short and actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema fully covers the four parameters including nested objects. The description covers the essential contract (dry-run, rollback, verdict); only the fixture/chaining story is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; every parameter including args, fixtures and tenant_key is already documented in the schema. The description adds little beyond re-stating that the tool is selected 'by name'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Dry-run a published tool by name') plus the outcome vocabulary (pass/will_fail/unverifiable), which lets an agent distinguish it from the real-call sibling host.tool_call. It stops short of naming that sibling explicitly, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'Dry-run' and the pointer 'see host.quickstart'. There is no explicit statement of when to prefer this over host.tool_call, nor any exclusion such as 'cannot dry-run unpublished tools'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host.whoamiBInspect
Return the calling tenant's identity, including key_age_s and key_rotated_at for auditing credential hygiene.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_key | No | 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. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | |
| hint | No | |
| next | No | |
| plan | No | |
| admin | No | |
| links | No | |
| owner | No | |
| source | No | |
| tenant | No | |
| clients | No | |
| subject | No | |
| disabled | No | |
| join_url | No | |
| resource | No | |
| claim_url | No | |
| client_id | No | |
| key_age_s | No | |
| namespace | No | |
| activation | No | |
| created_at | No | |
| invite_url | No | |
| onboarding | No | |
| plan_since | No | |
| auth_method | No | |
| client_name | No | |
| contract_sha | Yes | |
| display_name | No | |
| metadata_url | No | |
| shared_tools | No | |
| source_class | No | |
| welcome_back | No | |
| client_version | No | |
| key_rotated_at | No | |
| owner_verified | No | |
| session_tenant | No | |
| naming_rule_url | No | |
| contract_version | Yes | |
| admin_schema_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it only restates the return content. It does not disclose the significant side effect documented in the schema — that omitting tenant_key on a connection with no Authorization header silently signs up a brand-new tenant — nor does it mention auth expectations or read-only status. The one behavioral fact an agent most needs is absent from the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the core action front-loaded and no filler. Every phrase (calling tenant, key_age_s, key_rotated_at) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single parameter is fully documented in the schema. The description supplies adequate purpose context for a 1-param read tool; only the behavioral side effect and auth model live solely in the schema, which is a minor completeness gap rather than a functional one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the tenant_key description is unusually thorough (header precedence, implicit signup, binding from signup/redeem). The tool description adds nothing about the parameter, so the schema does all the work — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return the calling tenant's identity' with the additional scope of credential-hygiene fields. It is clearly distinct from mutation siblings like host.state.set or signup, but it never explicitly contrasts itself with the closest read siblings (host.state.get, host.resume), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'for auditing credential hygiene' — an agent can infer this is a read of its own identity for key-age checks. However, there is no when-to-use/when-not guidance, no prerequisites, and no named alternative (e.g., vs host.state.get for tenant state), so the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signupAInspect
Explicit signup, for a client that cannot keep a session across calls: create a tenant and receive a bearer key and namespace. Unauthenticated. Most clients never need this -- any other host./billing. call from a fresh connection creates a tenant implicitly and returns its own /u//mcp URL in the response's onboarding field. Recommended here: 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | display name | |
| source | No | Optional attribution tag for this signup (1-64 chars matching the pattern), e.g. "plugin", "www", "cli", "hn"; omit for none. Stored as the tenant's signup_source and counted in the signup-source funnel. Attribution only: whether a signup is real or synthetic is decided by the harness header and fleet IP, never by this value. "synthorg" is reserved for the discovery-chain harness. | |
| handoff | No | Recommended: true to receive a handoff_token (redeem via host.redeem) instead of the raw key. Default false (raw key, unchanged). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares the call unauthenticated, explains that handoff_token is short-lived and single-use, and gives the security rationale (a leaked transcript carries a dead credential). It does not mention rate limits, tenant quotas, or what happens on duplicate names, so it is strong but not exhaustive for an unannotated mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the primary caveat in the first sentence, with no filler. The final sentence about the raw-key path staying supported is a useful but slightly padded reassurance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe returns, and it does: a bearer key plus namespace, or a handoff_token, plus the mention of the onboarding field on implicit creation. An agent has enough to call correctly and to decide between handoff modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to handoff: why it is recommended, that the token is single-use, and that it must be redeemed via host.redeem. The name and source parameters are left to the schema, which already documents them thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('create a tenant') plus what is returned ('bearer key and namespace'), and pins down the exact audience: a client that cannot keep a session across calls. It is clearly distinguished from the implicit-tenant behavior of sibling host.*/billing.* calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says most clients never need this and names the alternative path (any fresh host.*/billing.* call creates a tenant implicitly and returns /u/<secret>/mcp in the onboarding field). It also recommends the handoff:true variant and names host.redeem as the redemption step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
host.state.set1 field changed- added
Input schema / properties / value / typeAdded value: +[ + "string", + "number", + "integer", + "boolean", + "array", + "object", + "null" +]
2 tool updates
- Changed
host.feedback.send1 field changed- added
Input schema / properties / text / minLengthAdded value: +1
- Changed
host.tool_share3 fields changed- added
Input schema / properties / rate_per_hour_per_caller / maximumAdded value: +10000 - added
Input schema / properties / rate_per_hour_per_caller / minimumAdded value: +1 - added
Input schema / properties / scopes / minItemsAdded value: +1
2 tool updates
- Changed
host.tool_call47 fields changed- removed
Output schema / properties / argsRemoved value: -{ - "properties": {}, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / bodyRemoved value: -{ - "properties": { - "ok": { - "type": [ - "boolean", - "null" - ] - }, - "pong": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - added
Output schema / properties / call_idAdded value: +{ + "type": [ + "string", + "null" + ] +} - removed
Output schema / properties / changedRemoved value: -{ - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / checked_atRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - removed
Output schema / properties / columnsRemoved value: -{ - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / countRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - removed
Output schema / properties / createdRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / created_unixRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - added
Output schema / properties / dataAdded value: +{} - removed
Output schema / properties / dedupe_headerRemoved value: -{} - removed
Output schema / properties / doubledRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - added
Output schema / properties / dry_runAdded value: +{} - removed
Output schema / properties / enabledRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / failed_stepsRemoved value: -{ - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / headersRemoved value: -{ - "properties": { - "content-type": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / https_proxyRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / idRemoved value: -{} - removed
Output schema / properties / kindRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / last_fired_unixRemoved value: -{} - removed
Output schema / properties / last_run_idRemoved value: -{} - removed
Output schema / properties / last_statusRemoved value: -{} - removed
Output schema / properties / msgRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / nameRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / nextRemoved value: -{ - "properties": { - "tool": { - "type": [ - "string", - "null" - ] - }, - "why": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / next_unixRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - removed
Output schema / properties / okRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / onboardingRemoved value: -{ - "properties": { - "claim_url": { - "type": [ - "string", - "null" - ] - }, - "invited_by": { - "type": [ - "string", - "null" - ] - }, - "shared_tools": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "tenant": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / payloadRemoved value: -{ - "properties": { - "ok": { - "type": [ - "boolean", - "null" - ] - }, - "pong": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / presetRemoved value: -{} - removed
Output schema / properties / rowsRemoved value: -{} - removed
Output schema / properties / run_idRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / scheduleRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / stale_testAdded value: +{} - added
Output schema / properties / stateAdded value: +{} - removed
Output schema / properties / statusRemoved value: -{ - "type": [ - "string", - "integer", - "null" - ] -} - removed
Output schema / properties / stepsRemoved value: -{ - "items": { - "properties": { - "result": {}, - "status": { - "type": [ - "string", - "null" - ] - }, - "step": { - "type": [ - "integer", - "null" - ] - }, - "tool": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] -} - added
Output schema / properties / tested_versionAdded value: +{} - removed
Output schema / properties / textRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / toolRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / tzRemoved value: -{} - removed
Output schema / properties / unverifiedRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / v1Removed value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / verdictAdded value: +{} - removed
Output schema / properties / verifyRemoved value: -{ - "properties": { - "allow_unverified": { - "type": [ - "boolean", - "null" - ] - }, - "scheme": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / welcome_backRemoved value: -{ - "properties": { - "last_note": {}, - "last_seen": { - "type": [ - "string", - "null" - ] - }, - "notes": { - "type": [ - "integer", - "null" - ] - }, - "since_you_left": { - "properties": { - "calls": { - "type": [ - "integer", - "null" - ] - }, - "days": { - "type": [ - "integer", - "null" - ] - }, - "inbox": { - "type": [ - "integer", - "null" - ] - }, - "runs": { - "type": [ - "integer", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -}
- Changed
host.tool_test48 fields changed- removed
Output schema / properties / argsRemoved value: -{ - "properties": {}, - "type": [ - "object", - "null" - ] -} - added
Output schema / properties / call_idAdded value: +{ + "type": [ + "string", + "null" + ] +} - removed
Output schema / properties / chain_dry_runRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / changedRemoved value: -{ - "type": [ - "array", - "null" - ] -} - added
Output schema / properties / client_toolAdded value: +{ + "type": [ + "string", + "null" + ] +} - removed
Output schema / properties / createdRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / created_unixRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - added
Output schema / properties / dataAdded value: +{} - removed
Output schema / properties / detailRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / dry_run / propertiesRemoved value: -{ - "delivered": { - "type": [ - "boolean", - "null" - ] - }, - "rolled_back": { - "type": [ - "boolean", - "null" - ] - }, - "writes": { - "items": { - "properties": { - "channel": { - "type": [ - "string", - "null" - ] - }, - "key": { - "type": [ - "string", - "null" - ] - }, - "op": { - "type": [ - "string", - "null" - ] - }, - "rows": { - "type": [ - "integer", - "null" - ] - }, - "store": { - "type": [ - "string", - "null" - ] - }, - "table": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] - } -} - removed
Output schema / properties / dry_run / typeRemoved value: -"object" - removed
Output schema / properties / enabledRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / envelopeRemoved value: -{ - "properties": { - "declared": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "found_at_contract_path": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "green": { - "type": [ - "boolean", - "null" - ] - }, - "missing": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "missing_detail": { - "items": { - "properties": { - "name": { - "type": [ - "string", - "null" - ] - }, - "path": { - "type": [ - "string", - "null" - ] - }, - "seen_at": { - "type": [ - "array", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / environmentRemoved value: -{ - "items": { - "properties": { - "kind": { - "type": [ - "string", - "null" - ] - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "value": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / errorRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / evidenceRemoved value: -{ - "items": { - "properties": { - "available": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "did_you_mean": { - "type": [ - "string", - "null" - ] - }, - "path": { - "type": [ - "string", - "null" - ] - }, - "predecessor_keys": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "step": { - "type": [ - "integer", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / exception_classRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / failuresRemoved value: -{ - "items": { - "properties": { - "available": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "did_you_mean": { - "type": [ - "string", - "null" - ] - }, - "path": { - "type": [ - "string", - "null" - ] - }, - "predecessor_keys": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "step": { - "type": [ - "integer", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / idRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / inputs_requiredRemoved value: -{ - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / kindRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / last_fired_unixRemoved value: -{} - removed
Output schema / properties / last_run_idRemoved value: -{} - removed
Output schema / properties / last_statusRemoved value: -{} - removed
Output schema / properties / lineRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - removed
Output schema / properties / msgRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / nameRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / nextRemoved value: -{ - "properties": { - "tool": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / next_unixRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - removed
Output schema / properties / okRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - removed
Output schema / properties / outerRemoved value: -{ - "properties": { - "tenant_key": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / payloadRemoved value: -{ - "properties": { - "msg": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / reasonRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / requestRemoved value: -{ - "properties": { - "body": {}, - "headers": { - "properties": { - "x-api-key": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "method": { - "type": [ - "string", - "null" - ] - }, - "query": { - "properties": {}, - "type": [ - "object", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / responseRemoved value: -{ - "properties": { - "body": { - "properties": { - "blocking_tool": { - "type": [ - "string", - "null" - ] - }, - "fact": { - "type": [ - "string", - "null" - ] - }, - "json": { - "properties": { - "bridge_status": { - "type": [ - "string", - "null" - ] - }, - "ingestion_status": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "length": { - "type": [ - "integer", - "null" - ] - }, - "ok": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "headers": { - "properties": { - "content-type": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "payload": { - "properties": { - "blocking_tool": { - "type": [ - "string", - "null" - ] - }, - "fact": { - "type": [ - "string", - "null" - ] - }, - "json": { - "properties": { - "bridge_status": { - "type": [ - "string", - "null" - ] - }, - "ingestion_status": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "length": { - "type": [ - "integer", - "null" - ] - }, - "ok": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "status": { - "type": [ - "integer", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / scheduleRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / schemaRemoved value: -{ - "properties": { - "properties": { - "properties": { - "cid": { - "properties": {}, - "type": [ - "object", - "null" - ] - }, - "city": { - "properties": {}, - "type": [ - "object", - "null" - ] - }, - "note": { - "properties": { - "default": { - "type": [ - "string", - "null" - ] - }, - "type": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "required": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "type": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -} - removed
Output schema / properties / source_lineRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / stale_testAdded value: +{} - removed
Output schema / properties / state / propertiesRemoved value: -{ - "keys": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "reads": { - "type": [ - "integer", - "null" - ] - }, - "tables": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "writes": { - "type": [ - "integer", - "null" - ] - } -} - removed
Output schema / properties / state / typeRemoved value: -[ - "object", - "null" -] - removed
Output schema / properties / stepsRemoved value: -{ - "items": { - "properties": { - "dispatched": { - "type": [ - "boolean", - "null" - ] - }, - "error": { - "type": [ - "string", - "null" - ] - }, - "prev_fields": { - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] - }, - "resolved": { - "type": [ - "string", - "null" - ] - }, - "resolved_args": { - "type": [ - "object", - "null" - ] - }, - "result": {}, - "side_effects": { - "type": [ - "boolean", - "null" - ] - }, - "step": { - "type": [ - "integer", - "null" - ] - }, - "tool": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "type": [ - "array", - "null" - ] -} - added
Output schema / properties / tested_versionAdded value: +{} - removed
Output schema / properties / toolRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / tzRemoved value: -{} - removed
Output schema / properties / verdict / typeRemoved value: -[ - "string", - "null" -] - removed
Output schema / properties / warningsRemoved value: -{ - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] -} - removed
Output schema / properties / welcome_backRemoved value: -{ - "properties": { - "last_note": {}, - "last_seen": { - "type": [ - "string", - "null" - ] - }, - "notes": { - "type": [ - "integer", - "null" - ] - }, - "since_you_left": { - "properties": { - "calls": { - "type": [ - "integer", - "null" - ] - }, - "days": { - "type": [ - "integer", - "null" - ] - }, - "inbox": { - "type": [ - "integer", - "null" - ] - }, - "runs": { - "type": [ - "integer", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] -}
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Hosted MCP memory and agent control plane for durable conversations, jobs, and operations.
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.67MIT
- FlicenseNot gradedqualityDmaintenanceA runtime for inspectable agent workflows that provides MCP tools, bounded Python execution, session memory, and deterministic evaluation.-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to expose and control local and self-hosted tools via MCP, with isolated workers, long-running task management, persisted state, and modular integrations for reverse engineering and development workflows.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to securely discover, invoke, and manage tools through a hardened MCP endpoint with protections like injection detection, circuit breakers, retry backoff, response caching, context-window limiting, and state snapshots.7 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.