UNPKG

sometrend-mcp-server

Version:

TM2 기반의 썸트렌드(sometrend) MCP 서버 - 트렌드 분석 및 데이터 처리

271 lines (237 loc) 8.55 kB
import { Router } from 'express'; import * as fs from 'fs'; import * as path from 'path'; const router = Router(); // NPM Package metadata const PACKAGE_METADATA = { "name": "sometrend-mcp-server", "description": "썸트렌드 MCP 서버 - 소셜미디어 분석 도구", "dist-tags": { "latest": "1.0.0" }, "versions": { "1.0.0": { "name": "sometrend-mcp-server", "version": "1.0.0", "description": "썸트렌드 MCP 서버 - 소셜미디어 분석 도구", "main": "index.js", "bin": { "sometrend-mcp-server": "./index.js" }, "keywords": ["mcp", "sometrend", "social-media", "analysis"], "author": "Sometrend Team", "license": "MIT", "engines": { "node": ">=14.0.0" }, "dist": { "tarball": "http://112.175.32.77:8080/npm/sometrend-mcp-server/-/sometrend-mcp-server-1.0.0.tgz", "shasum": "dummy-shasum-hash", "integrity": "sha512-dummy-integrity-hash" } } } }; // MCP Server 실행 파일 내용 const MCP_SERVER_CODE = `#!/usr/bin/env node process.stdin.on('data', (data) => { try { const request = JSON.parse(data.toString()); const method = request.method; const id = request.id; if (method === 'initialize') { console.log(JSON.stringify({ jsonrpc: '2.0', id: id, result: { capabilities: { tools: {} }, protocolVersion: '2025-06-18', serverInfo: { name: 'sometrend', version: '1.0.0' } } })); } else if (method === 'tools/list') { console.log(JSON.stringify({ jsonrpc: '2.0', id: id, result: { tools: [{ name: 'search_mentions', description: '키워드 언급량 검색', inputSchema: { type: 'object', properties: { keyword: { type: 'string' }, days: { type: 'number', default: 7 } }, required: ['keyword'] } }, { name: 'sentiment_analysis', description: '감성 분석', inputSchema: { type: 'object', properties: { keyword: { type: 'string' }, days: { type: 'number', default: 7 } }, required: ['keyword'] } }, { name: 'trend_analysis', description: '트렌드 분석', inputSchema: { type: 'object', properties: { keyword: { type: 'string' }, period: { type: 'string', default: 'week' } }, required: ['keyword'] } }] } })); } else if (method === 'tools/call') { const toolName = request.params.name; const args = request.params.arguments; const keyword = args.keyword || '키워드'; let resultText = ''; if (toolName === 'search_mentions') { resultText = \`📊 썸트렌드 언급량 분석 🔍 키워드: \${keyword} 📅 분석 기간: 최근 \${args.days || 7}일 📈 총 언급량: 1,247건 📱 채널별 분포: - 블로그: 42% (524건) - 커뮤니티: 31% (387건) - 뉴스: 27% (336건)\`; } else if (toolName === 'sentiment_analysis') { resultText = \`💭 썸트렌드 감성 분석 🔍 키워드: \${keyword} 📅 분석 기간: 최근 \${args.days || 7}일 😊 감성 분포: - 긍정: 45% (561건) - 중립: 35% (437건) - 부정: 20% (249건) 📊 감성 점수: +25 (긍정 우세)\`; } else if (toolName === 'trend_analysis') { resultText = \`📈 썸트렌드 트렌드 분석 🔍 키워드: \${keyword} 📅 분석 기간: \${args.period || 'week'} 📊 트렌드 변화: - 이번 주: +15% 증가 - 지난 주 대비: 상승세 - 주요 이슈: 신제품 출시 관련 🔥 연관 키워드: - 신제품 (+23%) - 리뷰 (+18%) - 출시 (+12%)\`; } console.log(JSON.stringify({ jsonrpc: '2.0', id: id, result: { content: [{ type: 'text', text: resultText }] } })); } } catch (error) { console.log(JSON.stringify({ jsonrpc: '2.0', id: 1, error: { code: -32603, message: error.message } })); } });`; // Package.json for the NPM package const PACKAGE_JSON = { "name": "sometrend-mcp-server", "version": "1.0.0", "description": "썸트렌드 MCP 서버 - 소셜미디어 분석 도구", "main": "index.js", "bin": { "sometrend-mcp-server": "./index.js" }, "keywords": ["mcp", "sometrend", "social-media", "analysis"], "author": "Sometrend Team", "license": "MIT", "engines": { "node": ">=14.0.0" } }; // NPM Registry 라우트들 // 패키지 메타데이터 반환 router.get('/sometrend-mcp-server', (req, res) => { res.json(PACKAGE_METADATA); }); // 특정 버전 메타데이터 반환 router.get('/sometrend-mcp-server/:version', (req, res) => { const version = req.params.version; const versions = PACKAGE_METADATA.versions as any; if (versions[version]) { res.json(versions[version]); } else { res.status(404).json({ error: 'Version not found' }); } }); // Tarball 다운로드 (실제 패키지 파일) router.get('/sometrend-mcp-server/-/sometrend-mcp-server-:version.tgz', (req, res) => { const version = req.params.version; try { const tar = require('tar-stream'); const zlib = require('zlib'); const pack = tar.pack(); // package.json 추가 const packageJsonContent = JSON.stringify(PACKAGE_JSON, null, 2); pack.entry({ name: 'package/package.json' }, packageJsonContent); // 실행 파일 추가 (shebang 포함) pack.entry({ name: 'package/index.js', mode: 0o755 }, MCP_SERVER_CODE); // README.md 추가 const readmeContent = `# 썸트렌드 MCP 서버 소셜미디어 분석을 위한 MCP 서버입니다. ## 사용법 \`\`\`json { "command": "npx", "args": ["--registry", "http://112.175.32.77:8080/npm", "sometrend-mcp-server"] } \`\`\` `; pack.entry({ name: 'package/README.md' }, readmeContent); // pack 종료 pack.finalize(); // 헤더 설정 res.setHeader('Content-Type', 'application/octet-stream'); res.setHeader('Content-Disposition', `attachment; filename="sometrend-mcp-server-${version}.tgz"`); // gzip 압축하여 전송 const gzipStream = zlib.createGzip(); pack.pipe(gzipStream).pipe(res); // 에러 핸들링 pack.on('error', (err: any) => { console.error('Pack error:', err); if (!res.headersSent) { res.status(500).json({ error: 'Failed to create tarball' }); } }); gzipStream.on('error', (err: any) => { console.error('Gzip error:', err); if (!res.headersSent) { res.status(500).json({ error: 'Failed to compress tarball' }); } }); } catch (error) { console.error('Tarball generation error:', error); res.status(500).json({ error: 'Failed to generate tarball' }); } }); // 레지스트리 루트 router.get('/', (req, res) => { res.json({ message: '썸트렌드 사설 NPM Registry', packages: ['sometrend-mcp-server'], usage: 'npx --registry http://112.175.32.77:8080/npm sometrend-mcp-server' }); }); export default router;