{"record":{"id":"3d21bd79ebd70aec","repo":"CherryHQ/cherry-studio","slug":"invalid-arguments-for-brave-local-search","errorCode":null,"errorMessage":"Invalid arguments for brave_local_search","messagePattern":"Invalid arguments for brave_local_search","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"src/main/ai/mcp/servers/braveSearch.ts","lineNumber":343,"sourceCode":"          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\n            }\n          }\n\n          default:\n            return {\n              content: [{ type: 'text', text: `Unknown tool: ${name}` }],\n              isError: true\n            }\n        }\n      } catch (error) {\n        return {\n          content: [","sourceCodeStart":325,"sourceCodeEnd":361,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/src/main/ai/mcp/servers/braveSearch.ts#L325-L361","documentation":"Thrown when isBraveLocalSearchArgs(args) returns false before running brave_local_search. The guard (braveSearch.ts:148) is identical to the web-search guard: args must be a non-null object with a string 'query' property.","triggerScenarios":"CallTool for brave_local_search where args.query is missing or not a string; or args is not an object.","commonSituations":"LLM sends {count: 5} without a query; uses a non-string query; or addresses the parameter by a different name.","solutions":["Include a string 'query' such as {query: 'coffee near Central Park'}.","Validate the args shape against the tool inputSchema (required: ['query']) before calling.","Use the same isBraveLocalSearchArgs guard client-side in tests."],"exampleFix":"// before\ntool.call('brave_local_search', { count: 5 })\n\n// after\ntool.call('brave_local_search', { query: 'coffee near Central Park', count: 5 })","handlingStrategy":"type-guard","validationCode":"function validateLocalSearchArgs(args) {\n  if (typeof args.query !== 'string' || !args.query.trim()) {\n    throw new Error('brave_local_search requires a non-empty string \"query\"')\n  }\n}","typeGuard":"function isBraveLocalSearchArgs(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 (!isBraveLocalSearchArgs(args)) {\n  return { content: [{ type: 'text', text: 'Invalid args: string \"query\" required' }], isError: true }\n}","preventionTips":["Include a non-empty string query for local search.","Use place-oriented phrasing (e.g. 'pizza near Central Park').","Validate against inputSchema before calling."],"tags":["mcp","validation","brave-search","local-search","type-guard"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}