Skip to main content
Glama

host.tool_publish

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.

Input Schema

NameRequiredDescriptionDefault
kindYesWhich 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).
nameYesLocal name for the new tool; must match ^[a-z][a-z0-9_]{1,40}$.
specYesThe 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".
tagsNoCatalog tags: at most 16, each 1-32 chars of a-z, 0-9 and '-', stored lower-case and deduped.
forceNoPublish a chain whose mapping can never resolve (verdict will_fail) anyway; the response's gates entry then carries forced: true. Default false.
scopesNoOAuth 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_runNoreturn the diff this call would make and commit nothing
tenant_keyNoThe 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.
visibilityNoWho 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

NameRequiredDescriptionDefault
okNo
hintNo
kindNo
lockNo
nameNo
nextNo
gatesNo
stepsNo
reasonNo
verdictNo
versionNoThe tool's version after this publish (1 for a first publish).
evidenceNo
failuresNo
warningsNo
call_lineNoA 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_lintNoAdvisory publish-time lint findings for a python tool ([] when clean); a finding never blocks the publish.
onboardingNo
deprecationsNo
welcome_backNo
resolved_fromNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / force
      Added value: +{
      +  "description": "Publish a chain whose mapping can never resolve (verdict will_fail) anyway; the response's gates entry then carries forced: true. Default false.",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changed
    • addedOutput schema / properties / warnings
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "ceiling": {
      +        "type": "integer"
      +      },
      +      "ceiling_field": {
      +        "type": "string"
      +      },
      +      "code": {
      +        "enum": [
      +          "timeout_clamped"
      +        ],
      +        "type": "string"
      +      },
      +      "effective": {
      +        "type": "integer"
      +      },
      +      "field": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "plan": {
      +        "type": "string"
      +      },
      +      "requested": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "ceiling",
      +      "ceiling_field",
      +      "code",
      +      "effective",
      +      "field",
      +      "message",
      +      "plan",
      +      "requested"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  3. Changed2 schema fields changed
    • addedOutput schema / $defs
      Added value: +{
      +  "ErrorEnvelope": {
      +    "properties": {
      +      "code": {
      +        "type": "integer"
      +      },
      +      "data": {
      +        "properties": {
      +          "error_code": {
      +            "type": "string"
      +          },
      +          "retryable": {
      +            "type": "boolean"
      +          }
      +        },
      +        "required": [
      +          "error_code"
      +        ],
      +        "type": "object"
      +      },
      +      "message": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "message",
      +      "data"
      +    ],
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / x-error-envelope
      Added value: +{
      +  "$ref": "#/$defs/ErrorEnvelope"
      +}
  4. Changed1 schema field changed
    • addedInput schema / properties / name / pattern
      Added value: +"^[a-z][a-z0-9_]{1,40}$"
  5. Changed2 schema fields changed
    • addedInput schema / properties / tags
      Added value: +{
      +  "description": "Catalog tags: at most 16, each 1-32 chars of a-z, 0-9 and '-', stored lower-case and deduped.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / visibility
      Added value: +{
      +  "description": "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.",
      +  "enum": [
      +    "private",
      +    "unlisted",
      +    "public"
      +  ],
      +  "type": "string"
      +}
  6. Changed3 schema fields changed
    • changedInput schema / allOf
      Previous value: -[
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "chain"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "description": {
      -              "description": "the tool's description in `tools/list` (every kind)"
      -            },
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "steps": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "steps"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "echo"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "description": {
      -              "description": "the tool's description in `tools/list` (every kind)"
      -            },
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "schema": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "schema"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "http"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "body": {},
      -            "description": {
      -              "description": "the tool's description in `tools/list` (every kind)"
      -            },
      -            "headers": {},
      -            "method": {},
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "query": {},
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "response": {},
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "upstream": {},
      -            "upstream_provider": {},
      -            "url": {}
      -          },
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "js"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            },
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "python"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "requirements": {
      -              "description": "a list of strings"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            },
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "wasm"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "component": {},
      -            "description": {
      -              "description": "the tool's description in `tools/list` (every kind)"
      -            },
      -            "memory_mb": {},
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "component"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  }
      -]New value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "chain"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "steps": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "steps"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "echo"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "schema": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "schema"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "http"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "body": {},
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "headers": {},
      +            "method": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "query": {},
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "response": {},
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "upstream": {},
      +            "upstream_provider": {},
      +            "url": {}
      +          },
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "jq"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "max_output_bytes": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "program": {},
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "program"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "js"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "python"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "requirements": {
      +              "description": "a list of strings"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "wasm"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "component": {},
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "memory_mb": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "component"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  }
      +]
    • changedInput schema / properties / kind / description
      Previous value: -"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); 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)."New value: +"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)."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "chain",
      -  "echo",
      -  "http",
      -  "js",
      -  "python",
      -  "wasm",
      -  "event",
      -  "events",
      -  "webhook",
      -  "webhooks",
      -  "inbound",
      -  "trigger",
      -  "inbox",
      -  "cron",
      -  "schedule",
      -  "scheduled",
      -  "doc",
      -  "docs",
      -  "document",
      -  "documents",
      -  "message",
      -  "messages",
      -  "msg",
      -  "database",
      -  "db",
      -  "table",
      -  "tables",
      -  "csv",
      -  "sql",
      -  "schedules",
      -  "uptime",
      -  "probe",
      -  "probes",
      -  "memory",
      -  "memories"
      -]New value: +[
      +  "chain",
      +  "echo",
      +  "http",
      +  "jq",
      +  "js",
      +  "python",
      +  "wasm",
      +  "event",
      +  "events",
      +  "webhook",
      +  "webhooks",
      +  "inbound",
      +  "trigger",
      +  "inbox",
      +  "cron",
      +  "schedule",
      +  "scheduled",
      +  "doc",
      +  "docs",
      +  "document",
      +  "documents",
      +  "message",
      +  "messages",
      +  "msg",
      +  "database",
      +  "db",
      +  "table",
      +  "tables",
      +  "csv",
      +  "sql",
      +  "schedules",
      +  "uptime",
      +  "probe",
      +  "probes",
      +  "memory",
      +  "memories"
      +]
  7. Changed1 schema field changed
    • changedInput schema / allOf
      Previous value: -[
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "chain"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "steps": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "steps"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "echo"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "schema": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "schema"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "http"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "body": {},
      -            "description": {},
      -            "headers": {},
      -            "method": {},
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "query": {},
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "response": {},
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "upstream": {},
      -            "upstream_provider": {},
      -            "url": {}
      -          },
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "js"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            },
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "python"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "requirements": {
      -              "description": "a list of strings"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            },
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "wasm"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "component": {},
      -            "memory_mb": {},
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "component"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  }
      -]New value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "chain"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "steps": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "steps"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "echo"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "schema": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "schema"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "http"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "body": {},
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "headers": {},
      +            "method": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "query": {},
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "response": {},
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "upstream": {},
      +            "upstream_provider": {},
      +            "url": {}
      +          },
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "js"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "python"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "requirements": {
      +              "description": "a list of strings"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "wasm"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "component": {},
      +            "description": {
      +              "description": "the tool's description in `tools/list` (every kind)"
      +            },
      +            "memory_mb": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "component"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  }
      +]
  8. Changed3 schema fields changed
    • changedInput schema / allOf
      Previous value: -[
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "chain"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "steps": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "steps"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "echo"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "schema": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "schema"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "http"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "body": {},
      -            "description": {},
      -            "headers": {},
      -            "method": {},
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "query": {},
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "response": {},
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "upstream": {},
      -            "upstream_provider": {},
      -            "url": {}
      -          },
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "python"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "requirements": {
      -              "description": "a list of strings"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            },
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "wasm"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "component": {},
      -            "memory_mb": {},
      -            "outputs": {
      -              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      -            },
      -            "reads": {
      -              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      -            },
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "component"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  }
      -]New value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "chain"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "steps": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "steps"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "echo"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "schema": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "schema"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "http"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "body": {},
      +            "description": {},
      +            "headers": {},
      +            "method": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "query": {},
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "response": {},
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "upstream": {},
      +            "upstream_provider": {},
      +            "url": {}
      +          },
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "js"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "python"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "requirements": {
      +              "description": "a list of strings"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "wasm"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "component": {},
      +            "memory_mb": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "component"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  }
      +]
    • changedInput schema / properties / kind / description
      Previous value: -"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); python (families: tool_code, tool_limit, upstream, compose, tool_state; source_line: yes); wasm (families: tool_code, tool_limit; source_line: no)."New value: +"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); 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)."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "chain",
      -  "echo",
      -  "http",
      -  "python",
      -  "wasm",
      -  "event",
      -  "events",
      -  "webhook",
      -  "webhooks",
      -  "inbound",
      -  "trigger",
      -  "inbox",
      -  "cron",
      -  "schedule",
      -  "scheduled",
      -  "doc",
      -  "docs",
      -  "document",
      -  "documents",
      -  "message",
      -  "messages",
      -  "msg",
      -  "database",
      -  "db",
      -  "table",
      -  "tables",
      -  "csv",
      -  "sql",
      -  "schedules",
      -  "uptime",
      -  "probe",
      -  "probes",
      -  "memory",
      -  "memories"
      -]New value: +[
      +  "chain",
      +  "echo",
      +  "http",
      +  "js",
      +  "python",
      +  "wasm",
      +  "event",
      +  "events",
      +  "webhook",
      +  "webhooks",
      +  "inbound",
      +  "trigger",
      +  "inbox",
      +  "cron",
      +  "schedule",
      +  "scheduled",
      +  "doc",
      +  "docs",
      +  "document",
      +  "documents",
      +  "message",
      +  "messages",
      +  "msg",
      +  "database",
      +  "db",
      +  "table",
      +  "tables",
      +  "csv",
      +  "sql",
      +  "schedules",
      +  "uptime",
      +  "probe",
      +  "probes",
      +  "memory",
      +  "memories"
      +]
  9. Changed1 schema field changed
    • changedInput schema / properties / kind / description
      Previous value: -"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."New value: +"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); python (families: tool_code, tool_limit, upstream, compose, tool_state; source_line: yes); wasm (families: tool_code, tool_limit; source_line: no)."
  10. Changed66 schema fields changed
    • changedInput schema / allOf
      Previous value: -[
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "chain"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "reads": {},
      -            "steps": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "steps"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "echo"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "reads": {},
      -            "schema": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "schema"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "http"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "body": {},
      -            "description": {},
      -            "headers": {},
      -            "method": {},
      -            "outputs": {},
      -            "query": {},
      -            "reads": {},
      -            "response": {},
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "upstream": {},
      -            "upstream_provider": {},
      -            "url": {}
      -          },
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "python"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {},
      -            "requirements": {
      -              "description": "a list of strings"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            },
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "wasm"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "component": {},
      -            "memory_mb": {},
      -            "outputs": {},
      -            "reads": {},
      -            "timeout_s": {},
      -            "ui": {
      -              "additionalProperties": false,
      -              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      -              "properties": {
      -                "form": {
      -                  "type": "boolean"
      -                },
      -                "submit_label": {
      -                  "maxLength": 40,
      -                  "type": "string"
      -                },
      -                "success_text": {
      -                  "maxLength": 200,
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "component"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  }
      -]New value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "chain"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "steps": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "steps"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "echo"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "schema": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "schema"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "http"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "body": {},
      +            "description": {},
      +            "headers": {},
      +            "method": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "query": {},
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "response": {},
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "upstream": {},
      +            "upstream_provider": {},
      +            "url": {}
      +          },
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "python"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "requirements": {
      +              "description": "a list of strings"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "wasm"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "component": {},
      +            "memory_mb": {},
      +            "outputs": {
      +              "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
      +            },
      +            "reads": {
      +              "description": "tables this tool reads, recorded for lineage and blast-radius reports"
      +            },
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "component"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  }
      +]
    • changedOutput schema / properties / call_line / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / deprecations / items / properties / path / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / deprecations / items / properties / replacement / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / deprecations / items / properties / since / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / deprecations / items / properties / sunset / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / deprecations / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / evidence / items / properties / available / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / evidence / items / properties / did_you_mean / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / evidence / items / properties / path / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / evidence / items / properties / predecessor_keys / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / evidence / items / properties / step / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / evidence / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / failures / items / properties / available / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / failures / items / properties / did_you_mean / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / failures / items / properties / path / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / failures / items / properties / predecessor_keys / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / failures / items / properties / step / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / failures / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / gates / items / properties / evidence / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / gates / items / properties / failures / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / gates / items / properties / gate / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / gates / items / properties / ok / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedOutput schema / properties / gates / items / properties / verdict / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / gates / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / hint / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / kind / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / lock / properties / hashes / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedOutput schema / properties / lock / properties / packages / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / lock / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / name / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / next / properties / tool / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / next / properties / why / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / next / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / ok / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / properties / claim_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / properties / memory_hint / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / properties / memory_line / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / properties / note / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / properties / tenant / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / properties / url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / onboarding / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / reason / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / resolved_from / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / steps / items / properties / hint / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / steps / items / properties / prev_fields_source / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / steps / items / properties / step / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / steps / items / properties / tool / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / steps / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / tool_lint / items / properties / fix / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / tool_lint / items / properties / line / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / tool_lint / items / properties / message / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / tool_lint / items / properties / rule / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / tool_lint / items / properties / source_line / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / tool_lint / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / verdict / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / version / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • removedOutput schema / properties / welcome_back / properties / last_note / type
      Removed value: -"null"
    • changedOutput schema / properties / welcome_back / properties / last_seen / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / properties / notes / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / properties / since_you_left / properties / calls / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / properties / since_you_left / properties / days / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / properties / since_you_left / properties / inbox / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / properties / since_you_left / properties / runs / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / properties / since_you_left / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / welcome_back / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
  11. Changed1 schema field changed
    • addedOutput schema / properties / tool_lint
      Added value: +{
      +  "description": "Advisory publish-time lint findings for a python tool ([] when clean); a finding never blocks the publish.",
      +  "items": {
      +    "properties": {
      +      "fix": {
      +        "type": "string"
      +      },
      +      "line": {
      +        "type": "integer"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "rule": {
      +        "type": "string"
      +      },
      +      "source_line": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  12. Changed1 schema field changed
    • changedInput schema / allOf
      Previous value: -[
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "chain"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "reads": {},
      -            "steps": {}
      -          },
      -          "required": [
      -            "steps"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "echo"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "reads": {},
      -            "schema": {}
      -          },
      -          "required": [
      -            "schema"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "http"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "body": {},
      -            "description": {},
      -            "headers": {},
      -            "method": {},
      -            "outputs": {},
      -            "query": {},
      -            "reads": {},
      -            "response": {},
      -            "timeout_s": {},
      -            "upstream": {},
      -            "upstream_provider": {},
      -            "url": {}
      -          },
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "python"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {
      -              "description": "a JSON Schema object"
      -            },
      -            "description": {
      -              "description": "a string"
      -            },
      -            "env": {
      -              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      -            },
      -            "memory_mb": {
      -              "description": "a positive integer number of megabytes"
      -            },
      -            "network": {
      -              "description": "\"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\""
      -            },
      -            "outputs": {
      -              "description": "a list of field names or an object mapping field names to path strings"
      -            },
      -            "reads": {},
      -            "requirements": {
      -              "description": "a list of strings"
      -            },
      -            "secrets": {
      -              "description": "a list of strings"
      -            },
      -            "source": {
      -              "description": "a string"
      -            },
      -            "timeout_s": {
      -              "description": "a positive integer number of seconds"
      -            }
      -          },
      -          "required": [
      -            "source"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "kind": {
      -          "const": "wasm"
      -        }
      -      },
      -      "required": [
      -        "kind"
      -      ]
      -    },
      -    "then": {
      -      "properties": {
      -        "spec": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "args_schema": {},
      -            "component": {},
      -            "memory_mb": {},
      -            "outputs": {},
      -            "reads": {},
      -            "timeout_s": {}
      -          },
      -          "required": [
      -            "component"
      -          ],
      -          "type": "object"
      -        }
      -      }
      -    }
      -  }
      -]New value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "chain"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "reads": {},
      +            "steps": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "steps"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "echo"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "reads": {},
      +            "schema": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "schema"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "http"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "body": {},
      +            "description": {},
      +            "headers": {},
      +            "method": {},
      +            "outputs": {},
      +            "query": {},
      +            "reads": {},
      +            "response": {},
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "upstream": {},
      +            "upstream_provider": {},
      +            "url": {}
      +          },
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "python"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {},
      +            "requirements": {
      +              "description": "a list of strings"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            },
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "wasm"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "component": {},
      +            "memory_mb": {},
      +            "outputs": {},
      +            "reads": {},
      +            "timeout_s": {},
      +            "ui": {
      +              "additionalProperties": false,
      +              "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
      +              "properties": {
      +                "form": {
      +                  "type": "boolean"
      +                },
      +                "submit_label": {
      +                  "maxLength": 40,
      +                  "type": "string"
      +                },
      +                "success_text": {
      +                  "maxLength": 200,
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "component"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  }
      +]
  13. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "call_line": {
      +      "description": "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.",
      +      "type": "string"
      +    },
      +    "deprecations": {
      +      "items": {
      +        "properties": {
      +          "path": {
      +            "type": "string"
      +          },
      +          "replacement": {
      +            "type": "string"
      +          },
      +          "since": {
      +            "type": "string"
      +          },
      +          "sunset": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "evidence": {
      +      "items": {
      +        "properties": {
      +          "available": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "did_you_mean": {
      +            "type": "string"
      +          },
      +          "path": {
      +            "type": "string"
      +          },
      +          "predecessor_keys": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "step": {
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "failures": {
      +      "items": {
      +        "properties": {
      +          "available": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "did_you_mean": {
      +            "type": "string"
      +          },
      +          "path": {
      +            "type": "string"
      +          },
      +          "predecessor_keys": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "step": {
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "gates": {
      +      "items": {
      +        "properties": {
      +          "evidence": {
      +            "items": {
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "failures": {
      +            "items": {
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "fix": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "gate": {
      +            "type": "string"
      +          },
      +          "message": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "ok": {
      +            "type": "boolean"
      +          },
      +          "verdict": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "hint": {
      +      "type": "string"
      +    },
      +    "kind": {
      +      "type": "string"
      +    },
      +    "lock": {
      +      "properties": {
      +        "hashes": {
      +          "type": "boolean"
      +        },
      +        "packages": {
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "name": {
      +      "type": "string"
      +    },
      +    "next": {
      +      "properties": {
      +        "tool": {
      +          "type": "string"
      +        },
      +        "why": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "ok": {
      +      "type": "boolean"
      +    },
      +    "onboarding": {
      +      "properties": {
      +        "claim_url": {
      +          "type": "string"
      +        },
      +        "memory_hint": {
      +          "type": "string"
      +        },
      +        "memory_line": {
      +          "type": "string"
      +        },
      +        "note": {
      +          "type": "string"
      +        },
      +        "tenant": {
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "reason": {
      +      "type": "string"
      +    },
      +    "resolved_from": {
      +      "type": "string"
      +    },
      +    "steps": {
      +      "items": {
      +        "properties": {
      +          "hint": {
      +            "type": "string"
      +          },
      +          "prev_fields": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "prev_fields_source": {
      +            "type": "string"
      +          },
      +          "step": {
      +            "type": "integer"
      +          },
      +          "tool": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "verdict": {
      +      "type": "string"
      +    },
      +    "version": {
      +      "description": "The tool's version after this publish (1 for a first publish).",
      +      "type": "integer"
      +    },
      +    "welcome_back": {
      +      "properties": {
      +        "last_note": {
      +          "type": "null"
      +        },
      +        "last_seen": {
      +          "type": "string"
      +        },
      +        "notes": {
      +          "type": "integer"
      +        },
      +        "since_you_left": {
      +          "properties": {
      +            "calls": {
      +              "type": "integer"
      +            },
      +            "days": {
      +              "type": "integer"
      +            },
      +            "inbox": {
      +              "type": "integer"
      +            },
      +            "runs": {
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  14. Changed1 schema field changed
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "description": "return the diff this call would make and commit nothing",
      +  "type": "boolean"
      +}
  15. Changed1 schema field changed
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "chain",
      -  "echo",
      -  "http",
      -  "python",
      -  "wasm",
      -  "event",
      -  "events",
      -  "webhook",
      -  "webhooks",
      -  "inbound",
      -  "trigger",
      -  "cron",
      -  "schedule",
      -  "scheduled",
      -  "doc",
      -  "docs",
      -  "document",
      -  "documents",
      -  "message",
      -  "messages",
      -  "inbox",
      -  "msg",
      -  "database",
      -  "db",
      -  "table",
      -  "tables",
      -  "csv",
      -  "sql",
      -  "schedules",
      -  "uptime",
      -  "probe",
      -  "probes",
      -  "memory",
      -  "memories"
      -]New value: +[
      +  "chain",
      +  "echo",
      +  "http",
      +  "python",
      +  "wasm",
      +  "event",
      +  "events",
      +  "webhook",
      +  "webhooks",
      +  "inbound",
      +  "trigger",
      +  "inbox",
      +  "cron",
      +  "schedule",
      +  "scheduled",
      +  "doc",
      +  "docs",
      +  "document",
      +  "documents",
      +  "message",
      +  "messages",
      +  "msg",
      +  "database",
      +  "db",
      +  "table",
      +  "tables",
      +  "csv",
      +  "sql",
      +  "schedules",
      +  "uptime",
      +  "probe",
      +  "probes",
      +  "memory",
      +  "memories"
      +]
  16. Changed4 schema fields changed
    • addedInput schema / allOf
      Added value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "chain"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "reads": {},
      +            "steps": {}
      +          },
      +          "required": [
      +            "steps"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "echo"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "reads": {},
      +            "schema": {}
      +          },
      +          "required": [
      +            "schema"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "http"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "body": {},
      +            "description": {},
      +            "headers": {},
      +            "method": {},
      +            "outputs": {},
      +            "query": {},
      +            "reads": {},
      +            "response": {},
      +            "timeout_s": {},
      +            "upstream": {},
      +            "upstream_provider": {},
      +            "url": {}
      +          },
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "python"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {
      +              "description": "a JSON Schema object"
      +            },
      +            "description": {
      +              "description": "a string"
      +            },
      +            "env": {
      +              "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
      +            },
      +            "memory_mb": {
      +              "description": "a positive integer number of megabytes"
      +            },
      +            "network": {
      +              "description": "\"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\""
      +            },
      +            "outputs": {
      +              "description": "a list of field names or an object mapping field names to path strings"
      +            },
      +            "reads": {},
      +            "requirements": {
      +              "description": "a list of strings"
      +            },
      +            "secrets": {
      +              "description": "a list of strings"
      +            },
      +            "source": {
      +              "description": "a string"
      +            },
      +            "timeout_s": {
      +              "description": "a positive integer number of seconds"
      +            }
      +          },
      +          "required": [
      +            "source"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "kind": {
      +          "const": "wasm"
      +        }
      +      },
      +      "required": [
      +        "kind"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "spec": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args_schema": {},
      +            "component": {},
      +            "memory_mb": {},
      +            "outputs": {},
      +            "reads": {},
      +            "timeout_s": {}
      +          },
      +          "required": [
      +            "component"
      +          ],
      +          "type": "object"
      +        }
      +      }
      +    }
      +  }
      +]
    • changedInput schema / properties / kind / description
      Previous value: -"Which registered kind to publish under: chain, echo, http, python, wasm. A job-word alias also resolves here -- event, events, webhook, webhooks, inbound or trigger for an inbound webhook, cron, schedule or scheduled for a timed run -- both resolve to kind http and the descriptor comes back with resolved_from naming the alias you asked for."New value: +"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."
    • addedInput schema / properties / kind / enum
      Added value: +[
      +  "chain",
      +  "echo",
      +  "http",
      +  "python",
      +  "wasm",
      +  "event",
      +  "events",
      +  "webhook",
      +  "webhooks",
      +  "inbound",
      +  "trigger",
      +  "cron",
      +  "schedule",
      +  "scheduled",
      +  "doc",
      +  "docs",
      +  "document",
      +  "documents",
      +  "message",
      +  "messages",
      +  "inbox",
      +  "msg",
      +  "database",
      +  "db",
      +  "table",
      +  "tables",
      +  "csv",
      +  "sql",
      +  "schedules",
      +  "uptime",
      +  "probe",
      +  "probes",
      +  "memory",
      +  "memories"
      +]
    • changedInput schema / properties / spec / description
      Previous value: -"The kind-specific spec object; see host.quickstart(kind) for a filled-in example. For python's network field: \"none\", \"public\", or \"egress\" -- 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\"."New value: +"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\"."
  17. Changed1 schema field changed
    • changedInput schema / properties / tenant_key / description
      Previous value: -"The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602)."New value: +"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."
  18. Changed1 schema field changed
    • addedInput schema / x-deprecated
      Added value: +{
      +  "replaced_by": "host.tool.publish",
      +  "sunset": "2026-12-31"
      +}
  19. Changed2 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / spec / description
      Previous value: -"The kind-specific spec object; see host.quickstart(kind) for a filled-in example."New value: +"The kind-specific spec object; see host.quickstart(kind) for a filled-in example. For python's network field: \"none\", \"public\", or \"egress\" -- 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\"."
  20. Changed1 schema field changed
    • changedInput schema / properties / tenant_key / description
      Previous value: -"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins. Omitting it on a connection with no header returns tenant_key_missing (-32602)."New value: +"The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. Required only when this connection carries no Authorization: Bearer header and never ran signup -- when both a header and this argument are present, the header wins. Omitting it on such a connection returns tenant_key_missing (-32602)."
  21. Changed1 schema field changed
    • changedInput schema / properties / kind / description
      Previous value: -"Which registered kind to publish under, e.g. echo, http, python."New value: +"Which registered kind to publish under: chain, echo, http, python, wasm. A job-word alias also resolves here -- event, events, webhook, webhooks, inbound or trigger for an inbound webhook, cron, schedule or scheduled for a timed run -- both resolve to kind http and the descriptor comes back with resolved_from naming the alias you asked for."
  22. Changed1 schema field changed
    • changedInput schema / properties / tenant_key / description
      Previous value: -"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins."New value: +"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins. Omitting it on a connection with no header returns tenant_key_missing (-32602)."
  23. Changed1 schema field changed
    • addedInput schema / properties / scopes
      Added value: +{
      +  "description": "OAuth scopes a token must carry (directly, or via mcp) to reach this tool: catalogued names from host.oauth.scopes, or the built-ins read/write. At most 8. Omit (or [] ) to require only mcp -- unaffected by any catalog.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  24. Changed3 schema fields changed
    • addedInput schema / properties / kind / description
      Added value: +"Which registered kind to publish under, e.g. echo, http, python."
    • addedInput schema / properties / name / description
      Added value: +"Local name for the new tool; must match ^[a-z][a-z0-9_]{1,40}$."
    • addedInput schema / properties / spec / description
      Added value: +"The kind-specific spec object; see host.quickstart(kind) for a filled-in example."
  25. First observed

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources