diff --git a/webmcp/declarative/executeTool-abort.https.html b/webmcp/declarative/executeTool-abort.https.html index b5b6bb4c55669c..4fcdc6dc1f29bd 100644 --- a/webmcp/declarative/executeTool-abort.https.html +++ b/webmcp/declarative/executeTool-abort.https.html @@ -39,7 +39,7 @@ const tool = tools.find(t => t.name === 'submit_test'); const controller = new AbortController(); - const executionPromise = document.modelContext.executeTool(tool, '{}', { signal: controller.signal }); + const executionPromise = document.modelContext.executeTool(tool, {}, { signal: controller.signal }); await toolActivatedPromise; diff --git a/webmcp/declarative/executeTool-respondWith-circular-object.https.html b/webmcp/declarative/executeTool-respondWith-circular-object.https.html index a7dddbf5305f32..2f6fda2bdfa7d6 100644 --- a/webmcp/declarative/executeTool-respondWith-circular-object.https.html +++ b/webmcp/declarative/executeTool-respondWith-circular-object.https.html @@ -27,7 +27,7 @@ await promise_rejects_dom( t, 'UnknownError', - document.modelContext.executeTool(tool, '{}'), + document.modelContext.executeTool(tool), 'executeTool() should reject with UnknownError when respondWith is passed a circular object' ); }, 'Declarative tool executeTool() rejects when respondWith() receives a circular object'); diff --git a/webmcp/declarative/execute_tool_change_event.https.html b/webmcp/declarative/execute_tool_change_event.https.html index 3cec95b69a3f77..b332cc9242a15e 100644 --- a/webmcp/declarative/execute_tool_change_event.https.html +++ b/webmcp/declarative/execute_tool_change_event.https.html @@ -37,16 +37,16 @@ } } - let inputArgs = JSON.stringify({ + let inputObject = { text: "regular text", number: 42, checkbox: true, radio: "radio2", textarea: "some text area content", select: "opt2" - }); + }; - await document.modelContext.executeTool(tool, inputArgs); + await document.modelContext.executeTool(tool, inputObject); assert_equals(document.getElementById('myinput').value, 'regular text'); assert_true(events['myinput'].inputFired, 'text input event should fire'); diff --git a/webmcp/declarative/execute_tool_submit_from_js.https.html b/webmcp/declarative/execute_tool_submit_from_js.https.html index d626c061859c8d..fa6cb031ccc769 100644 --- a/webmcp/declarative/execute_tool_submit_from_js.https.html +++ b/webmcp/declarative/execute_tool_submit_from_js.https.html @@ -24,7 +24,7 @@ }); // Call executeTool. If it throws, the test fails automatically. - await document.modelContext.executeTool(tool, '{}'); + await document.modelContext.executeTool(tool); assert_true(submitFired, 'submit event should have fired'); }, 'executeTool resolves successfully when submit handler calls form.submit()'); diff --git a/webmcp/declarative/form_removal_submit_crash.https.html b/webmcp/declarative/form_removal_submit_crash.https.html index d6e705782e06b3..4d4b0980d22574 100644 --- a/webmcp/declarative/form_removal_submit_crash.https.html +++ b/webmcp/declarative/form_removal_submit_crash.https.html @@ -36,7 +36,7 @@ // Execute the tool. This asynchronously fires the `submit` event at the form. // The tool execution should resolve successfully even if the form is removed // from the document during submission. - const promise = document.modelContext.executeTool(tool, '{}'); + const promise = document.modelContext.executeTool(tool); await promise; assert_true(submitFired); diff --git a/webmcp/declarative/opaque-origin-tools.https.html b/webmcp/declarative/opaque-origin-tools.https.html index 491a4cd1acf224..ffed048e6006ee 100644 --- a/webmcp/declarative/opaque-origin-tools.https.html +++ b/webmcp/declarative/opaque-origin-tools.https.html @@ -26,7 +26,7 @@ await promise_rejects_dom( t, 'NotSupportedError', - document.modelContext.executeTool(tool, '{"param1":"value"}'), + document.modelContext.executeTool(tool, {"param1":"value"}), 'executeTool() must reject with NotSupportedError in opaque origin documents' ); }, 'An opaque origin document can register but not execute its own declarative tools'); @@ -36,7 +36,7 @@ const tool = tools.find(t => t.name === 'opaque_tool'); let events = []; - const p = document.modelContext.executeTool(tool, '{}'); + const p = document.modelContext.executeTool(tool); // Since `executeTool()` synchronously rejects the Promise for opaque origins, // the microtask to run the catch reaction is already queued before @@ -49,7 +49,7 @@ await promise_rejects_dom( t, 'NotSupportedError', - document.modelContext.executeTool(tool, '{"param1":"value"}'), + document.modelContext.executeTool(tool, {"param1":"value"}), 'executeTool() must reject with NotSupportedError in opaque origin documents' ); diff --git a/webmcp/declarative/select-multiple-events.https.html b/webmcp/declarative/select-multiple-events.https.html index 613aba8cff53a7..0164174760fe68 100644 --- a/webmcp/declarative/select-multiple-events.https.html +++ b/webmcp/declarative/select-multiple-events.https.html @@ -37,10 +37,10 @@ changeEventCount++; }); - let inputArgs = JSON.stringify({ fruits: ['apple', 'banana'] }); + let inputObject = { fruits: ['apple', 'banana'] }; // This should dispatch events. - await document.modelContext.executeTool(tool, inputArgs); + await document.modelContext.executeTool(tool, inputObject); assert_true(fruits.options[0].selected); assert_false(fruits.options[1].selected); @@ -50,7 +50,7 @@ assert_equals(changeEventCount, 1); // Executing with the same arguments again does not trigger events. - await document.modelContext.executeTool(tool, inputArgs); + await document.modelContext.executeTool(tool, inputObject); assert_equals(inputEventCount, 1); assert_equals(changeEventCount, 1); diff --git a/webmcp/declarative/unregister-during-executeTool.https.html b/webmcp/declarative/unregister-during-executeTool.https.html index ff662f8980a90b..3ed0444ce15a0d 100644 --- a/webmcp/declarative/unregister-during-executeTool.https.html +++ b/webmcp/declarative/unregister-during-executeTool.https.html @@ -33,7 +33,7 @@ const tool = tools.find(t => t.name === 'endless_tool'); assert_true(!!tool, 'Tool should be registered'); - const execute_promise = document.modelContext.executeTool(tool, '{}'); + const execute_promise = document.modelContext.executeTool(tool); // Wait deterministically for the form to submit and call respondWith(). await submitted_promise; @@ -79,7 +79,7 @@ const tool = tools.find(t => t.name === 'endless_tool_attr'); assert_true(!!tool, 'Tool should be registered'); - const execute_promise = document.modelContext.executeTool(tool, '{}'); + const execute_promise = document.modelContext.executeTool(tool); // Wait deterministically for the form to submit and call respondWith(). await submitted_promise; diff --git a/webmcp/imperative/cancel-reentrancy-crash.https.html b/webmcp/imperative/cancel-reentrancy-crash.https.html index 7aac08f4befef6..82da4f25ca84c7 100644 --- a/webmcp/imperative/cancel-reentrancy-crash.https.html +++ b/webmcp/imperative/cancel-reentrancy-crash.https.html @@ -44,8 +44,8 @@ const regA = tools.find(t => t.name === 'toolA'); const regB = tools.find(t => t.name === 'toolB'); - document.modelContext.executeTool(regA, '{}', { signal: controllerA.signal }); - document.modelContext.executeTool(regB, '{}'); + document.modelContext.executeTool(regA, {}, { signal: controllerA.signal }); + document.modelContext.executeTool(regB); // Wait for both tool execute callbacks to run and return, ensuring they are // inserted into pending_executions_. diff --git a/webmcp/imperative/detached-frame-executeTool.https.html b/webmcp/imperative/detached-frame-executeTool.https.html index 6ae14e9fc9e31b..872ba33428f7ce 100644 --- a/webmcp/imperative/detached-frame-executeTool.https.html +++ b/webmcp/imperative/detached-frame-executeTool.https.html @@ -40,7 +40,7 @@ iframe.remove(); // Calling executeTool() should reject with InvalidStateError. - await promise_rejects_dom(t, 'InvalidStateError', iDOMException, iframe_modelContext.executeTool(tool, '{}')); + await promise_rejects_dom(t, 'InvalidStateError', iDOMException, iframe_modelContext.executeTool(tool)); }, 'executeTool() throws `InvalidStateError` in detached frame');
diff --git a/webmcp/imperative/resources/iframe-caller-and-target-crash.html b/webmcp/imperative/resources/iframe-caller-and-target-crash.html index 2f52500addd696..5ceaa1a9b1d0a6 100644 --- a/webmcp/imperative/resources/iframe-caller-and-target-crash.html +++ b/webmcp/imperative/resources/iframe-caller-and-target-crash.html @@ -11,7 +11,7 @@ }); const tools = await document.modelContext.getTools(); const tool = tools.find(t => t.name === "test_tool"); - document.modelContext.executeTool(tool, "{}"); + document.modelContext.executeTool(tool); } run(); diff --git a/webmcp/imperative/resources/iframe-caller.html b/webmcp/imperative/resources/iframe-caller.html index 602b23d903c636..f44ebfe031f329 100644 --- a/webmcp/imperative/resources/iframe-caller.html +++ b/webmcp/imperative/resources/iframe-caller.html @@ -11,7 +11,7 @@ const options = e.data.options || {}; document.modelContext.getTools(options).then(tools => { const tool = tools.find(t => t.name === e.data.name); - document.modelContext.executeTool(tool, '{}').then(result => { + document.modelContext.executeTool(tool).then(result => { parent.postMessage({action: 'executeResponse', result: result, success: true}, '*'); }).catch(err => { parent.postMessage({action: 'executeResponse', result: String(err), success: false}, '*'); @@ -22,7 +22,7 @@ const controller = new AbortController(); document.modelContext.getTools(options).then(tools => { const tool = tools.find(t => t.name === e.data.name); - document.modelContext.executeTool(tool, '{}', { signal: controller.signal }).then(result => { + document.modelContext.executeTool(tool, {}, { signal: controller.signal }).then(result => { parent.postMessage({action: 'executeResponse', result: result, success: true}, '*'); }).catch(err => { parent.postMessage({action: 'executeResponse', result: String(err), success: false}, '*'); diff --git a/webmcp/imperative/resources/iframe-register-tool.html b/webmcp/imperative/resources/iframe-register-tool.html index f977a6d93f8cf2..759712e1f4eccc 100644 --- a/webmcp/imperative/resources/iframe-register-tool.html +++ b/webmcp/imperative/resources/iframe-register-tool.html @@ -91,7 +91,7 @@ }); } else if (action === 'execute') { const name = e.data.name; - const args = e.data.args || '{}'; + const args = e.data.args || {}; const options = e.data.options || {}; document.modelContext.getTools(options).then(tools => { const tool = tools.find(t => t.name === name); @@ -108,7 +108,7 @@ window: window, origin: self.origin }; - document.modelContext.executeTool(fake_tool, '{}').then(result => { + document.modelContext.executeTool(fake_tool).then(result => { parent.postMessage({action: 'executeFakeToolResponse', result: result, success: true}, '*'); }).catch(err => { parent.postMessage({action: 'executeFakeToolResponse', result: String(err), success: false, error_name: err.name}, '*'); diff --git a/webmcp/imperative/unregister-during-executeTool.https.html b/webmcp/imperative/unregister-during-executeTool.https.html index c23bf779a7e380..5ee502ef6bd010 100644 --- a/webmcp/imperative/unregister-during-executeTool.https.html +++ b/webmcp/imperative/unregister-during-executeTool.https.html @@ -53,7 +53,7 @@ // 2. Run the tool, and wait for the iframe to report back that execution has // begun. - const executePromise = document.modelContext.executeTool(tool, '{}'); + const executePromise = document.modelContext.executeTool(tool); await toolStartedPromise; // Before we tell the iframe to unregister the tool, set up a handler to @@ -103,7 +103,7 @@ }, { signal: regController.signal }); const [tool] = await document.modelContext.getTools(); - const executePromise = document.modelContext.executeTool(tool, '{}'); + const executePromise = document.modelContext.executeTool(tool); await toolStartedPromise;