Skip to main content
Glama
qwang07
by qwang07

search

Query the web with DuckDuckGo to retrieve structured search results, supporting options like region, SafeSearch, and result count for precise and customizable searches.

Instructions

Search the web using DuckDuckGo

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
optionsNo
queryYes

Implementation Reference

  • Main handler for the 'search' tool: validates input, calls external search library, processes results with metadata, handles errors.
    server.setRequestHandler(CallToolRequestSchema, async (request) => { try { const { name, arguments: args } = request.params; if (name !== "search") { throw Object.assign( new Error(`Unknown tool: ${name}`), { errorType: 'UNKNOWN_TOOL', name } ); } const parsed = SearchArgsSchema.safeParse(args); if (!parsed.success) { throw Object.assign( new Error(`Invalid arguments: ${parsed.error}`), { errorType: 'INVALID_ARGS', details: parsed.error } ); } const searchResults = await search(parsed.data.query, { region: parsed.data.options?.region || 'zh-cn', safeSearch: parsed.data.options?.safeSearch ? SafeSearchType[parsed.data.options.safeSearch] : SafeSearchType.MODERATE, maxResults: parsed.data.options?.numResults || 50 }); const response = processSearchResults( searchResults.results, parsed.data.query, { region: parsed.data.options?.region, safeSearch: parsed.data.options?.safeSearch ? SafeSearchType[parsed.data.options.safeSearch] : SafeSearchType.MODERATE } ); return { content: [{ type: "text", text: JSON.stringify(response, null, 2) }] }; } catch (error) { const errorResponse = { type: 'search_error', message: error instanceof Error ? error.message : String(error), suggestion: '你可以尝试:1. 修改搜索关键词 2. 减少结果数量 3. 更换地区', context: { query: request.params.arguments?.query, options: request.params.arguments?.options } }; return { content: [{ type: "text", text: JSON.stringify(errorResponse, null, 2) }], isError: true }; } });
  • Zod schema defining the input structure for the search tool: query (required string), optional options (region, safeSearch, numResults).
    const SearchArgsSchema = z.object({ query: z.string(), options: z.object({ region: z.string().default('zh-cn'), safeSearch: z.enum(['OFF', 'MODERATE', 'STRICT']).default('MODERATE'), numResults: z.number().default(50) }).optional() });
  • src/index.js:92-102 (registration)
    Registers the 'search' tool in the MCP server's listTools response, providing name, description, and JSON schema.
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: "search", description: "Search the web using DuckDuckGo", inputSchema: zodToJsonSchema(SearchArgsSchema), } ], }; });
  • Helper function to transform raw search results into a rich structured response with content type detection, source extraction, language/topic analysis, and metadata.
    function processSearchResults(results, query, options) { return { type: 'search_results', data: results.map(result => ({ title: result.title.replace(/'/g, "'").replace(/"/g, '"'), url: result.url, description: result.description.trim(), metadata: { type: detectContentType(result), source: new URL(result.url).hostname } })), metadata: { query, timestamp: new Date().toISOString(), resultCount: results.length, searchContext: { region: options.region || 'zh-cn', safeSearch: options.safeSearch?.toString() || 'MODERATE' }, queryAnalysis: { language: detectLanguage(query), topics: detectTopics(results) } } }; }

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/qwang07/duck-duck-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server