extract_logo
Extract logo icon URLs from website URLs to identify and retrieve brand logos automatically from any given webpage.
Instructions
从指定网站URL提取Logo图标链接
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | 要提取Logo的网站URL |
Implementation Reference
- src/index.ts:89-131 (handler)The primary handler function for the 'extract_logo' MCP tool. It validates the input URL, extracts logo candidates using LogoExtractor, selects the best one, and returns a JSON-formatted response with the logo details.private async handleExtractLogo(args: any) { const { url } = args; if (!url || typeof url !== 'string') { throw new Error('请提供有效的网站URL'); } // 提取Logo候选项 const candidates = await this.logoExtractor.extractLogoCandidates(url); if (candidates.length === 0) { return { content: [ { type: 'text', text: `未能从网站 ${url} 找到任何Logo图标。`, }, ], }; } // 选择最佳Logo const bestLogo = this.logoExtractor.selectBestLogo(candidates); // 直接返回Logo链接信息 const responseData = { message: 'Logo提取成功,已返回可直接下载的Logo链接。', websiteUrl: url, logoUrl: bestLogo.url, logoType: bestLogo.type, logoSource: bestLogo.source, logoScore: bestLogo.score, }; return { content: [ { type: 'text', text: JSON.stringify(responseData, null, 2), }, ], }; }
- src/index.ts:32-45 (schema)The schema definition for the 'extract_logo' tool, specifying the required 'url' input parameter.{ name: 'extract_logo', description: '从指定网站URL提取Logo图标链接', inputSchema: { type: 'object', properties: { url: { type: 'string', description: '要提取Logo的网站URL', }, }, required: ['url'], }, },
- src/index.ts:64-86 (registration)Registration of the tool call handler, which dispatches to handleExtractLogo when 'extract_logo' is called.this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; try { switch (name) { case 'extract_logo': return await this.handleExtractLogo(args); case 'analyze_logo_candidates': return await this.handleAnalyzeCandidates(args); default: throw new Error(`未知的工具: ${name}`); } } catch (error) { return { content: [ { type: 'text', text: `错误: ${error instanceof Error ? error.message : '未知错误'}`, }, ], }; } });
- src/index.ts:29-62 (registration)Registration in ListTools response, listing 'extract_logo' with its schema.this.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'extract_logo', description: '从指定网站URL提取Logo图标链接', inputSchema: { type: 'object', properties: { url: { type: 'string', description: '要提取Logo的网站URL', }, }, required: ['url'], }, }, { name: 'analyze_logo_candidates', description: '分析网站的所有Logo候选项并返回详细信息', inputSchema: { type: 'object', properties: { url: { type: 'string', description: '要分析的网站URL', }, }, required: ['url'], }, }, ], }; });
- src/logo-extractor.ts:24-58 (helper)Core helper function that implements the logo extraction logic: fetches website, parses with cheerio, collects candidates from favicons, apple icons, OG images, logo images, common paths, deduplicates and scores them.async extractLogoCandidates(websiteUrl: string): Promise<LogoCandidate[]> { try { const normalizedUrl = this.normalizeUrl(websiteUrl); const response = await axios.get(normalizedUrl, { headers: { 'User-Agent': this.userAgent }, timeout: 10000, maxRedirects: 5, }); const $ = cheerio.load(response.data); const candidates: LogoCandidate[] = []; const baseUrl = new URL(normalizedUrl); // 1. 提取favicon相关链接 await this.extractFaviconCandidates($, baseUrl, candidates); // 2. 提取Apple Touch Icon await this.extractAppleTouchIcons($, baseUrl, candidates); // 3. 提取OpenGraph图像 await this.extractOpenGraphImages($, baseUrl, candidates); // 4. 提取可能的Logo图像 await this.extractLogoImages($, baseUrl, candidates); // 5. 尝试常见的favicon路径 await this.extractCommonFaviconPaths(baseUrl, candidates); // 去重并评分 return this.deduplicateAndScore(candidates); } catch (error) { console.error(`提取Logo候选项时出错: ${error}`); return []; } }