{"record":{"id":"dbd96785cef2a9ee","repo":"CherryHQ/cherry-studio","slug":"invalid-arguments-for-brave-web-search","errorCode":null,"errorMessage":"Invalid arguments for brave_web_search","messagePattern":"Invalid arguments for brave_web_search","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"src/main/ai/mcp/servers/braveSearch.ts","lineNumber":331,"sourceCode":"\n  initialize() {\n    // Tool handlers\n    this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n      tools: [WEB_SEARCH_TOOL, LOCAL_SEARCH_TOOL]\n    }))\n\n    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      try {\n        const { name, arguments: args } = request.params\n\n        if (!args) {\n          throw new Error('No arguments provided')\n        }\n\n        switch (name) {\n          case 'brave_web_search': {\n            if (!isBraveWebSearchArgs(args)) {\n              throw new Error('Invalid arguments for brave_web_search')\n            }\n            const { query, count = 10 } = args\n            const results = await performWebSearch(this.apiKey, query, count)\n            return {\n              content: [{ type: 'text', text: results }],\n              isError: false\n            }\n          }\n\n          case 'brave_local_search': {\n            if (!isBraveLocalSearchArgs(args)) {\n              throw new Error('Invalid arguments for brave_local_search')\n            }\n            const { query, count = 5 } = args\n            const results = await performLocalSearch(this.apiKey, query, count)\n            return {\n              content: [{ type: 'text', text: results }],\n              isError: false","sourceCodeStart":313,"sourceCodeEnd":349,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/src/main/ai/mcp/servers/braveSearch.ts#L313-L349","documentation":"Thrown when isBraveWebSearchArgs(args) returns false before running brave_web_search. That type guard (braveSearch.ts:139) requires args to be a non-null object whose 'query' property is a string. Any other shape — missing query, non-string query, or non-object — fails.","triggerScenarios":"CallTool for brave_web_search where args.query is missing, undefined, null, a number, or an array; or args itself is not a plain object.","commonSituations":"An LLM emits only {count: 10} forgetting query; passes query as a number; or sends the query under a wrong key like 'q' or 'search'.","solutions":["Ensure the tool call includes a string 'query' field, e.g. {query: 'latest rust news'}.","If integrating programmatically, validate with the same type guard before sending the request.","Check the tool's inputSchema (required: ['query']) and align the call."],"exampleFix":"// before — caller omits query\ntool.call('brave_web_search', { count: 10 })\n\n// after — include a string query\ntool.call('brave_web_search', { query: 'latest rust news', count: 10 })","handlingStrategy":"type-guard","validationCode":"function validateWebSearchArgs(args) {\n  if (typeof args.query !== 'string' || !args.query.trim()) {\n    throw new Error('brave_web_search requires a non-empty string \"query\"')\n  }\n}","typeGuard":"function isBraveWebSearchArgs(a): a is { query: string; count?: number } {\n  return typeof a === 'object' && a !== null && typeof a.query === 'string' && a.query.trim().length > 0\n}","tryCatchPattern":"if (!isBraveWebSearchArgs(args)) {\n  return { content: [{ type: 'text', text: 'Invalid args: string \"query\" required' }], isError: true }\n}","preventionTips":["Always include a non-empty string query.","Run the same type guard client-side in tests.","Align calls with the tool inputSchema (required: ['query'])."],"tags":["mcp","validation","brave-search","type-guard"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}