{"ok":true,"site":{"host":"gogomj5010.github.io","url":"https://gogomj5010.github.io/toolsmith/","type":"live","desc":"A website hands an AI agent a fixed set of buttons. Toolsmith lets the agent build one that is missing — and lets you decide whether it keeps it.","tools":[{"name":"read_workbench","kind":"answer","impl":"imperative","description":"Inspect the data currently loaded in the Toolsmith workbench: its column names, row count, and a few sample rows. Call this FIRST, before forging a tool, so the code you write matches the real column names.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"sample_rows":{"type":"integer","description":"How many sample rows to return (default 3, max 20)."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/toolsmith/"},{"name":"forge_tool","kind":"act","impl":"imperative","description":"Create a BRAND NEW WebMCP tool on this page and expose it to yourself. Use this whenever you need a capability this page does not already have — do not apologise for a missing tool, forge it.\nThe `code` you pass is the BODY of a JavaScript function with the signature (input, data, helpers) and it must RETURN a JSON-serialisable value.\n  • input   — the arguments the caller passes, matching input_schema\n  • data    — the workbench rows, as an array of plain objects (call read_workbench first)\n  • helpers — { today(), parseDate(v), daysUntil(v), num(v), sum(arr), groupBy(rows,key), sortBy(rows,key,dir) }\nThe code runs in a locked-down Web Worker: there is NO network, NO DOM, NO storage, and a 3 second limit. Write pure computation only.\nUnless the human has switched on auto-approve, the forged tool starts in a PENDING state: a person reads your code and clicks Approve before it is registered. Tell the user to look at the Forge panel.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Tool name: letters, digits, underscore or dash, 1-64 chars."},"description":{"type":"string","description":"What the tool does and when to call it, written for another agent to read."},"input_schema":{"type":"string","description":"A JSON Schema object for the arguments, given as a JSON string. Use {\"type\":\"object\",\"properties\":{}} if it takes none."},"code":{"type":"string","description":"The JavaScript function body. Must return a value."}},"required":["name","description","code"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/toolsmith/"},{"name":"list_forged_tools","kind":"answer","impl":"imperative","description":"List every tool forged on this page, with its current status (pending, live, retired) and how many times it has been called. Use it to check whether a tool you forged has been approved yet.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/toolsmith/"},{"name":"revise_tool","kind":"act","impl":"imperative","description":"Replace the code and/or schema of a tool that was already forged. A live tool is unregistered and returns to PENDING so a human re-approves the new version — the same review gate as forging. Use this when a tool you wrote threw an error or returned the wrong shape.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","description":"New function body. Omit to keep the current one."},"input_schema":{"type":"string","description":"New JSON Schema as a JSON string. Omit to keep the current one."},"description":{"type":"string"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/toolsmith/"},{"name":"retire_tool","kind":"act","impl":"imperative","description":"Permanently unregister a forged tool. Toolsmith aborts the AbortSignal the tool was registered with, so it disappears from document.modelContext immediately and can no longer be called by anyone.","inputSchema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/toolsmith/"}],"category":"Developer Tools","favicon":"/favicons/gogomj5010.github.io.svg","apiSurface":"spec","toolCount":5}}