github-wiki-mcp-server
Version:
GitHub WikiをModel Context Protocolサーバーとして提供するサービス
73 lines (60 loc) • 2.05 kB
JavaScript
const express = require('express');
const cors = require('cors');
const dotenv = require('dotenv');
const fs = require('fs-extra');
const path = require('path');
const config = require('../config/default');
const wikiService = require('./services/wikiService');
const minimist = require('minimist');
// コマンドライン引数の解析
const argv = minimist(process.argv.slice(2));
// 環境変数を読み込む
dotenv.config();
// CLIオプションを設定に反映
if (argv.port) {
config.server.port = argv.port;
}
if (argv.wiki) {
config.wiki.path = argv.wiki;
}
const app = express();
// ミドルウェア設定
app.use(cors());
app.use(express.json());
// MCPエンドポイント
app.post('/mcp', async (req, res) => {
try {
console.log('MCPエンドポイントへのリクエスト:', req.body);
const { query } = req.body;
if (!query) {
return res.status(400).json({ error: 'クエリが必要です' });
}
console.log(`検索クエリ: "${query}"`);
const results = await wikiService.searchWikiContent(query);
console.log(`検索結果: ${results.length}件見つかりました`);
return res.json({
contexts: results.map(result => ({
content: result.content,
source: result.source
}))
});
} catch (error) {
console.error('MCPエンドポイントエラー:', error);
return res.status(500).json({ error: '内部サーバーエラー' });
}
});
// ヘルスチェックエンドポイント
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
// Wikiのパスが存在するか確認
const wikiPath = config.wiki.path;
if (!fs.existsSync(wikiPath)) {
console.warn(`警告: Wikiパス ${wikiPath} が存在しません。有効なGitHub Wikiのパスを設定してください。`);
}
// サーバー起動
const PORT = config.server.port;
app.listen(PORT, () => {
console.log(`GitHub Wiki MCPサーバーがポート ${PORT} で起動しました`);
console.log(`Wikiパス: ${wikiPath}`);
});