sometrend-mcp-server
Version:
TM2 기반의 썸트렌드(sometrend) MCP 서버 - 트렌드 분석 및 데이터 처리
271 lines (237 loc) • 8.55 kB
text/typescript
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;