3 tools registered. Strongest in usefulness, weakest in human experience.
search_tools: declares no required list, so an agent cannot tell which parameters are mandatory; get_tool_review: 1 parameter has no description (slug){
name: "search_tools",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "What to search for" }
},
required: ["query"]
}
}search_tools, get_tool_review, list_categories<!-- Give the tool a visible counterpart: a declarative form is one the person can see and use too. -->
<form toolname="search_tools" tooldescription="...">
<!-- the same action, as UI -->
</form>{
"name": "search_tools",
"description": "Search 10x GTM go-to-market tool reviews by keyword and/or category slug.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Free-text search."
},
"category": {
"type": "string",
"description": "Category slug."
},
"limit": {
"type": "number",
"description": "Max results (1-50, default 20)."
}
}
},
"annotations": {
"readOnlyHint": true
}
}search_tools: declares no required list, so an agent cannot tell which parameters are mandatory; get_tool_review: 1 parameter has no description (slug){
name: "search_tools",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "What to search for" }
},
required: ["query"]
}
}// The browser fires toolchange itself on register/unregister - never dispatch it by hand.
// Retire stale tools via the registration AbortSignal so agents see a coherent registry.
var controller = new AbortController();
document.modelContext.registerTool(tool, { signal: controller.signal });
// later, when the tool no longer applies:
controller.abort();search_tools, get_tool_review, list_categories<!-- Give the tool a visible counterpart: a declarative form is one the person can see and use too. -->
<form toolname="search_tools" tooldescription="...">
<!-- the same action, as UI -->
</form>{
"query": "GTM"
}{
"slug": "clearbit"
}{}