monica-search
Get AI-generated answers to search queries by analyzing web content through DuckDuckGo Search MCP, providing privacy-friendly access to real-time information.
Instructions
AI-powered search using Monica AI. Returns AI-generated responses based on web content.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query or question. |
Implementation Reference
- src/tools/monicaTool.js:26-58 (handler)The main execution handler for the 'monica-search' MCP tool. Extracts query from params, calls the searchMonica helper, and returns formatted text content or error response./** * Monica AI search tool handler * @param {Object} params - The tool parameters * @returns {Promise<Object>} - The tool result */ export async function monicaToolHandler(params) { const { query } = params; console.log(`Searching Monica AI for: "${query}"`); try { const result = await searchMonica(query); return { content: [ { type: 'text', text: result || 'No results found.' } ] }; } catch (error) { console.error(`Error in Monica search: ${error.message}`); return { isError: true, content: [ { type: 'text', text: `Error searching Monica: ${error.message}` } ] }; } }
- src/tools/monicaTool.js:3-24 (schema)The tool definition object including name, title, description, inputSchema for parameter validation, and annotations./** * Monica AI search tool definition */ export const monicaToolDefinition = { name: 'monica-search', title: 'Monica AI Search', description: 'AI-powered search using Monica AI. Returns AI-generated responses based on web content.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The search query or question.' } }, required: ['query'] }, annotations: { readOnlyHint: true, openWorldHint: false } };
- src/index.js:49-61 (registration)In the MCP CallToolRequest handler, routes calls to 'monica-search' to the monicaToolHandler function.switch (name) { case 'web-search': return await searchToolHandler(args); case 'iask-search': return await iaskToolHandler(args); case 'monica-search': return await monicaToolHandler(args); default: throw new Error(`Tool not found: ${name}`); }
- src/index.js:14-18 (registration)Includes monicaToolDefinition in the list of tools returned by ListToolsRequestSchema handler.const availableTools = [ searchToolDefinition, iaskToolDefinition, monicaToolDefinition ];
- src/utils/search_monica.js:196-242 (helper)The core helper function implementing the API interaction with Monica AI, including client instantiation, streaming request handling, response formatting, and comprehensive error management./** * Search using Monica AI * @param {string} query - The search query * @returns {Promise<string>} The search results */ export async function searchMonica(query) { // Input validation if (!query || typeof query !== 'string') { throw new Error('Invalid query: query must be a non-empty string'); } console.log(`Monica AI search starting: "${query}"`); try { const client = new MonicaClient(); const result = await client.search(query); if (result && result.trim()) { console.log(`Monica AI search completed: ${result.length} characters received`); } else { console.log('Monica AI search completed but returned empty result'); } return result; } catch (error) { console.error('Error in Monica AI search:', error.message); // Enhanced error handling if (error.code === 'ENOTFOUND') { throw new Error('Monica network error: unable to resolve host'); } if (error.code === 'ECONNREFUSED') { throw new Error('Monica network error: connection refused'); } if (error.message.includes('timeout')) { throw new Error('Monica timeout: request took too long'); } if (error.message.includes('network')) { throw new Error('Monica network error: service may be unavailable'); } throw new Error(`Monica search failed for "${query}": ${error.message}`); } }