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
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| query | Yes |
Implementation Reference
- src/index.js:104-163 (handler)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 }; } });
- src/index.js:19-26 (schema)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), } ], }; });
- src/index.js:55-81 (helper)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) } } }; }