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

TableJSON 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".
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.

Output Schema

TableJSON 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
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. 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"
      +]
  2. 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"
      +        }
      +      }
      +    }
      +  }
      +]
  3. 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"
      +]
  4. 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)."
  5. 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"
      +]
  6. 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"
      +}
  7. 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"
      +        }
      +      }
      +    }
      +  }
      +]
  8. 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"
      +}
  9. Changed1 schema field changed
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "description": "return the diff this call would make and commit nothing",
      +  "type": "boolean"
      +}
  10. 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"
      +]
  11. 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\"."
  12. 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."
  13. Changed1 schema field changed
    • addedInput schema / x-deprecated
      Added value: +{
      +  "replaced_by": "host.tool.publish",
      +  "sunset": "2026-12-31"
      +}
  14. 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\"."
  15. 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)."
  16. 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."
  17. 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)."
  18. 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"
      +}
  19. 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."
  20. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.