CherryHQ/cherry-studio · warning · Error

Invalid arguments for brave_local_search

Error message

Invalid arguments for brave_local_search

What it means

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.

Source

Thrown at src/main/ai/mcp/servers/braveSearch.ts:343

          throw new Error('No arguments provided')
        }

        switch (name) {
          case 'brave_web_search': {
            if (!isBraveWebSearchArgs(args)) {
              throw new Error('Invalid arguments for brave_web_search')
            }
            const { query, count = 10 } = args
            const results = await performWebSearch(this.apiKey, query, count)
            return {
              content: [{ type: 'text', text: results }],
              isError: false
            }
          }

          case 'brave_local_search': {
            if (!isBraveLocalSearchArgs(args)) {
              throw new Error('Invalid arguments for brave_local_search')
            }
            const { query, count = 5 } = args
            const results = await performLocalSearch(this.apiKey, query, count)
            return {
              content: [{ type: 'text', text: results }],
              isError: false
            }
          }

          default:
            return {
              content: [{ type: 'text', text: `Unknown tool: ${name}` }],
              isError: true
            }
        }
      } catch (error) {
        return {
          content: [

View on GitHub (pinned to 726446b54c)

Solutions

  1. Include a string 'query' such as {query: 'coffee near Central Park'}.
  2. Validate the args shape against the tool inputSchema (required: ['query']) before calling.
  3. Use the same isBraveLocalSearchArgs guard client-side in tests.

Example fix

// before
tool.call('brave_local_search', { count: 5 })

// after
tool.call('brave_local_search', { query: 'coffee near Central Park', count: 5 })
Defensive patterns

Strategy: type-guard

Validate before calling

function validateLocalSearchArgs(args) {
  if (typeof args.query !== 'string' || !args.query.trim()) {
    throw new Error('brave_local_search requires a non-empty string "query"')
  }
}

Type guard

function isBraveLocalSearchArgs(a): a is { query: string; count?: number } {
  return typeof a === 'object' && a !== null && typeof a.query === 'string' && a.query.trim().length > 0
}

Try / catch

if (!isBraveLocalSearchArgs(args)) {
  return { content: [{ type: 'text', text: 'Invalid args: string "query" required' }], isError: true }
}

Prevention

When it happens

Trigger: CallTool for brave_local_search where args.query is missing or not a string; or args is not an object.

Common situations: LLM sends {count: 5} without a query; uses a non-string query; or addresses the parameter by a different name.

Related errors


AI-assisted analysis of CherryHQ/cherry-studio@726446b54c (2026-08-12). Data as JSON: /api/errors/3d21bd79ebd70aec. Report an issue: GitHub.