UNPKG

apple-developer-docs-mcp

Version:

An MCP server that fetches the right data from Apple's developer documentation site

106 lines 3.7 kB
import * as cheerio from 'cheerio'; /** * Parse HTML search results from Apple Developer Documentation * * @param html HTML content from the search results page * @param query Original search query * @param searchUrl URL of the search * @returns Formatted search results or error response */ export function parseSearchResults(html, query, searchUrl) { try { const $ = cheerio.load(html); const results = []; // Find all search result items $('.search-results .search-result').each((i, element) => { const resultItem = $(element); // Extract type (documentation, video, etc.) const resultType = resultItem.hasClass('documentation') ? 'documentation' : resultItem.hasClass('video') ? 'video' : resultItem.hasClass('sample') ? 'sample' : resultItem.hasClass('general') ? 'general' : 'other'; // Extract title const titleElement = resultItem.find('.result-title'); const title = titleElement.text().trim(); // Extract URL const urlElement = titleElement.find('a'); let url = urlElement.attr('href') || ''; if (url && url.startsWith('/')) { url = `https://developer.apple.com${url}`; } // Extract description const description = resultItem.find('.result-description').text().trim(); if (title && url) { results.push({ title, url, description, type: resultType }); } }); // If no results were found if (results.length === 0) { return { content: [ { type: "text", text: `No results found for "${query}". You can view the search page directly at: ${searchUrl}`, } ], }; } // Format results for display const formattedResults = results.map(result => { return `## [${result.title}](${result.url})\n${result.description}\n*Type: ${result.type}*\n`; }).join('\n'); return { content: [ { type: "text", text: `# Search Results for "${query}"\n\n${formattedResults}\n\nView all results: ${searchUrl}`, } ], }; } catch (error) { console.error('Error parsing search results:', error); return { content: [ { type: "text", text: `Error parsing search results for "${query}". You can view the search page directly at: ${searchUrl}`, } ], isError: true }; } } /** * Filter search results by content type * * @param results The search results to filter * @param type The type to filter by * @returns Filtered results */ export function filterResultsByType(results, type) { if (type === 'all') { return results; } return results.filter(result => { if (type === 'api' && result.type === 'documentation') { return true; } if (type === 'guide' && result.type === 'documentation') { return true; } if (type === 'sample' && result.type === 'sample') { return true; } if (type === 'video' && result.type === 'video') { return true; } return false; }); } //# sourceMappingURL=search-parser.js.map