fix(runner): alias params/input to args so tool implementations don't ReferenceError
Some checks failed
Deploy to Production / deploy (push) Has been cancelled

Auth chain finally landed but tool calls crashed in the wetter server
with "Error: params is not defined". The MCP SDK passes the validated
tool args as a single parameter; our template names that parameter
`args` but the model frequently writes `params.location` / `input.x`
because that's how OpenAPI and JSON-RPC reference docs read.

Two-sided fix:
- render.ts wraps every implementation with `const params = args; const
  input = args;` inside the try block. Whichever alias the model
  picked, the variable resolves to the same validated object.
- SYSTEM_PROMPT now states the variable name EXPLICITLY ("variable
  named EXACTLY `args`, e.g. args.location") so new generations stop
  drifting on that detail.

Existing wetter runner needs a rebuild to pick up the alias shim.
This commit is contained in:
Marco Sadjadi
2026-05-28 21:39:11 +02:00
parent b421457010
commit 147ba69968
2 changed files with 10 additions and 1 deletions

View File

@@ -38,6 +38,15 @@ function renderTool(tool: ToolSpec): string {
inputSchema: ${schemaShape},
},
async (args) => {
// The MCP SDK passes the validated tool arguments as the single
// parameter. Models trained on OpenAPI / JSON-RPC examples reach
// for "params" instead of "args", and "input" shows up too — bind
// every common alias to the same object so the generated body
// works whichever name the model picked. Without this the runner
// crashes with "ReferenceError: params is not defined" at the
// first tool call (verified in prod with the wetter server).
const params = args;
const input = args;
try {
${tool.implementation}
} catch (err) {