@search-docs/mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +219 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +5 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +165 -0
- package/dist/server.test.js.map +1 -0
- package/package.json +56 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 naoto.kato@plaid.co.jp
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# @search-docs/mcp-server
|
|
2
|
+
|
|
3
|
+
Claude Codeから直接search-docsを利用するためのMCP Serverです。
|
|
4
|
+
|
|
5
|
+
## 概要
|
|
6
|
+
|
|
7
|
+
このMCP Serverは、Claude Codeとsearch-docsサーバを接続し、会話から直接ドキュメント検索を実行できるようにします。
|
|
8
|
+
|
|
9
|
+
## 提供機能
|
|
10
|
+
|
|
11
|
+
### ツール一覧
|
|
12
|
+
|
|
13
|
+
#### 1. `search`
|
|
14
|
+
文書を検索します。
|
|
15
|
+
|
|
16
|
+
**パラメータ**:
|
|
17
|
+
- `query` (string, 必須): 検索クエリ
|
|
18
|
+
- `depth` (number | number[], オプション): 検索深度(0-3)
|
|
19
|
+
- `limit` (number, オプション): 結果数制限(デフォルト: 10)
|
|
20
|
+
- `includeCleanOnly` (boolean, オプション): Clean状態のみ検索
|
|
21
|
+
|
|
22
|
+
**例**:
|
|
23
|
+
```
|
|
24
|
+
query: "Vector検索"
|
|
25
|
+
depth: 1
|
|
26
|
+
limit: 5
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
#### 2. `get_document`
|
|
30
|
+
文書の内容を取得します。
|
|
31
|
+
|
|
32
|
+
**パラメータ**:
|
|
33
|
+
- `path` (string, 必須): 文書パス
|
|
34
|
+
|
|
35
|
+
**例**:
|
|
36
|
+
```
|
|
37
|
+
path: "docs/architecture.md"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
#### 3. `index_status`
|
|
41
|
+
インデックスの状態を確認します。
|
|
42
|
+
|
|
43
|
+
**パラメータ**: なし
|
|
44
|
+
|
|
45
|
+
## セットアップ
|
|
46
|
+
|
|
47
|
+
### 前提条件
|
|
48
|
+
|
|
49
|
+
1. search-docsサーバが起動していること
|
|
50
|
+
```bash
|
|
51
|
+
node packages/cli/dist/index.js server start --daemon
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
2. ビルド済みであること
|
|
55
|
+
```bash
|
|
56
|
+
pnpm build
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Claude Code統合
|
|
60
|
+
|
|
61
|
+
Claude Codeの設定ファイル(`claude_desktop_config.json`または`cline_mcp_settings.json`)に以下を追加:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"search-docs": {
|
|
67
|
+
"command": "node",
|
|
68
|
+
"args": [
|
|
69
|
+
"/absolute/path/to/search-docs/packages/mcp-server/dist/server.js",
|
|
70
|
+
"--project-dir",
|
|
71
|
+
"${workspaceFolder}"
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**注意**: `/absolute/path/to/search-docs/` は実際のパスに置き換えてください。
|
|
79
|
+
|
|
80
|
+
## 開発
|
|
81
|
+
|
|
82
|
+
### ビルド
|
|
83
|
+
```bash
|
|
84
|
+
pnpm build
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 開発モード(watch)
|
|
88
|
+
```bash
|
|
89
|
+
pnpm dev
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### テスト起動
|
|
93
|
+
```bash
|
|
94
|
+
node dist/server.js --project-dir /path/to/your/project
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## トラブルシューティング
|
|
98
|
+
|
|
99
|
+
### サーバに接続できない
|
|
100
|
+
|
|
101
|
+
**エラー**: `Failed to connect to search-docs server`
|
|
102
|
+
|
|
103
|
+
**解決方法**:
|
|
104
|
+
1. サーバが起動しているか確認
|
|
105
|
+
```bash
|
|
106
|
+
node packages/cli/dist/index.js server status
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
2. サーバを起動
|
|
110
|
+
```bash
|
|
111
|
+
node packages/cli/dist/index.js server start --daemon
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 設定ファイルが見つからない
|
|
115
|
+
|
|
116
|
+
MCP Serverはプロジェクトディレクトリの `.search-docs.json` を読み込みます。
|
|
117
|
+
|
|
118
|
+
ファイルが存在しない場合はデフォルト設定(`localhost:24280`)を使用します。
|
|
119
|
+
|
|
120
|
+
## 関連パッケージ
|
|
121
|
+
|
|
122
|
+
- `@search-docs/client`: JSON-RPCクライアント
|
|
123
|
+
- `@search-docs/server`: 検索サーバ
|
|
124
|
+
- `@search-docs/cli`: CLIツール
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { SearchDocsClient } from '@search-docs/client';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* デフォルト設定
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
server: {
|
|
14
|
+
host: 'localhost',
|
|
15
|
+
port: 24280,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* 設定ファイルを読み込む
|
|
20
|
+
*/
|
|
21
|
+
async function loadConfig(projectDir) {
|
|
22
|
+
const configPath = path.join(projectDir, '.search-docs.json');
|
|
23
|
+
try {
|
|
24
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
25
|
+
const config = JSON.parse(content);
|
|
26
|
+
return {
|
|
27
|
+
server: {
|
|
28
|
+
host: config.server?.host || DEFAULT_CONFIG.server.host,
|
|
29
|
+
port: config.server?.port || DEFAULT_CONFIG.server.port,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (_error) {
|
|
34
|
+
console.error(`[mcp-server] Config file not found or invalid, using defaults: ${configPath}`);
|
|
35
|
+
return DEFAULT_CONFIG;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* コマンドライン引数を解析
|
|
40
|
+
*/
|
|
41
|
+
function parseArgs() {
|
|
42
|
+
const program = new Command();
|
|
43
|
+
program
|
|
44
|
+
.name('search-docs-mcp')
|
|
45
|
+
.description('MCP Server for search-docs - Claude Code integration')
|
|
46
|
+
.version('0.1.0')
|
|
47
|
+
.requiredOption('--project-dir <path>', 'Project directory path')
|
|
48
|
+
.parse(process.argv);
|
|
49
|
+
const options = program.opts();
|
|
50
|
+
return {
|
|
51
|
+
projectDir: path.resolve(options.projectDir),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* メイン処理
|
|
56
|
+
*/
|
|
57
|
+
async function main() {
|
|
58
|
+
// コマンドライン引数の解析
|
|
59
|
+
const { projectDir } = parseArgs();
|
|
60
|
+
console.error(`[mcp-server] Project directory: ${projectDir}`);
|
|
61
|
+
// 設定ファイルの読み込み
|
|
62
|
+
const config = await loadConfig(projectDir);
|
|
63
|
+
const serverUrl = `http://${config.server.host}:${config.server.port}`;
|
|
64
|
+
console.error(`[mcp-server] Server URL: ${serverUrl}`);
|
|
65
|
+
// SearchDocsClientの初期化
|
|
66
|
+
const client = new SearchDocsClient({ baseUrl: serverUrl });
|
|
67
|
+
// 接続確認
|
|
68
|
+
try {
|
|
69
|
+
await client.healthCheck();
|
|
70
|
+
console.error('[mcp-server] Connection to search-docs server established');
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('[mcp-server] Failed to connect to search-docs server');
|
|
74
|
+
console.error('[mcp-server] Please ensure the server is running with:');
|
|
75
|
+
console.error(`[mcp-server] node packages/cli/dist/index.js server start`);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
// MCPサーバの初期化
|
|
79
|
+
const server = new McpServer({
|
|
80
|
+
name: 'search-docs',
|
|
81
|
+
version: '0.1.0',
|
|
82
|
+
}, {
|
|
83
|
+
capabilities: {
|
|
84
|
+
tools: {},
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
// search ツール
|
|
88
|
+
server.registerTool('search', {
|
|
89
|
+
description: '文書を検索します。クエリに基づいてVector検索を実行し、関連する文書セクションを返します。',
|
|
90
|
+
inputSchema: {
|
|
91
|
+
query: z.string().describe('検索クエリ'),
|
|
92
|
+
depth: z
|
|
93
|
+
.union([z.number(), z.array(z.number())])
|
|
94
|
+
.optional()
|
|
95
|
+
.describe('検索深度(0-3)。配列で複数指定可能'),
|
|
96
|
+
limit: z.number().optional().describe('結果数制限(デフォルト: 10)'),
|
|
97
|
+
includeCleanOnly: z
|
|
98
|
+
.boolean()
|
|
99
|
+
.optional()
|
|
100
|
+
.describe('Clean状態のセクションのみを検索対象とする(デフォルト: false)'),
|
|
101
|
+
},
|
|
102
|
+
}, async (args) => {
|
|
103
|
+
const { query, depth, limit, includeCleanOnly } = args;
|
|
104
|
+
try {
|
|
105
|
+
const response = await client.search({
|
|
106
|
+
query,
|
|
107
|
+
options: {
|
|
108
|
+
depth,
|
|
109
|
+
limit,
|
|
110
|
+
includeCleanOnly,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
// 結果を整形
|
|
114
|
+
let resultText = `検索結果: ${response.total}件\n`;
|
|
115
|
+
resultText += `処理時間: ${response.took}ms\n\n`;
|
|
116
|
+
if (response.results.length === 0) {
|
|
117
|
+
resultText += '該当する結果が見つかりませんでした。';
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
response.results.forEach((result, index) => {
|
|
121
|
+
resultText += `${index + 1}. ${result.documentPath}\n`;
|
|
122
|
+
resultText += ` 見出し: ${result.heading}\n`;
|
|
123
|
+
resultText += ` 深度: ${result.depth}\n`;
|
|
124
|
+
resultText += ` スコア: ${result.score.toFixed(4)}\n`;
|
|
125
|
+
resultText += ` Dirty: ${result.isDirty ? 'Yes' : 'No'}\n`;
|
|
126
|
+
resultText += ` 内容プレビュー: ${result.content.substring(0, 100)}...\n\n`;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
content: [
|
|
131
|
+
{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: resultText,
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw new Error(`検索エラー: ${error.message}`);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// get_document ツール
|
|
143
|
+
server.registerTool('get_document', {
|
|
144
|
+
description: '文書の内容を取得します。パス指定で文書全体またはセクションを取得できます。',
|
|
145
|
+
inputSchema: {
|
|
146
|
+
path: z.string().describe('文書パス'),
|
|
147
|
+
},
|
|
148
|
+
}, async (args) => {
|
|
149
|
+
const { path: documentPath } = args;
|
|
150
|
+
try {
|
|
151
|
+
const response = await client.getDocument({ path: documentPath });
|
|
152
|
+
let resultText = `文書: ${response.document.path}\n`;
|
|
153
|
+
if (response.document.metadata.title) {
|
|
154
|
+
resultText += `タイトル: ${response.document.metadata.title}\n`;
|
|
155
|
+
}
|
|
156
|
+
resultText += `作成日: ${new Date(response.document.metadata.createdAt).toLocaleString()}\n`;
|
|
157
|
+
resultText += `更新日: ${new Date(response.document.metadata.updatedAt).toLocaleString()}\n\n`;
|
|
158
|
+
resultText += `内容:\n${'='.repeat(60)}\n`;
|
|
159
|
+
resultText += response.document.content;
|
|
160
|
+
resultText += `\n${'='.repeat(60)}`;
|
|
161
|
+
return {
|
|
162
|
+
content: [
|
|
163
|
+
{
|
|
164
|
+
type: 'text',
|
|
165
|
+
text: resultText,
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
throw new Error(`文書取得エラー: ${error.message}`);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// index_status ツール
|
|
175
|
+
server.registerTool('index_status', {
|
|
176
|
+
description: 'インデックスの状態を確認します。総文書数、セクション数、Dirtyセクション数などを表示します。',
|
|
177
|
+
inputSchema: {},
|
|
178
|
+
}, async () => {
|
|
179
|
+
try {
|
|
180
|
+
const response = await client.getStatus();
|
|
181
|
+
let statusText = '📊 インデックス状態\n\n';
|
|
182
|
+
statusText += `サーバ情報:\n`;
|
|
183
|
+
statusText += ` バージョン: ${response.server.version}\n`;
|
|
184
|
+
statusText += ` 起動時間: ${(response.server.uptime / 1000).toFixed(1)}秒\n`;
|
|
185
|
+
statusText += ` PID: ${response.server.pid}\n\n`;
|
|
186
|
+
statusText += `インデックス情報:\n`;
|
|
187
|
+
statusText += ` 総文書数: ${response.index.totalDocuments}件\n`;
|
|
188
|
+
statusText += ` 総セクション数: ${response.index.totalSections}件\n`;
|
|
189
|
+
statusText += ` Dirtyセクション: ${response.index.dirtyCount}件\n`;
|
|
190
|
+
if (response.worker) {
|
|
191
|
+
statusText += `\nワーカー情報:\n`;
|
|
192
|
+
statusText += ` 実行中: ${response.worker.running ? 'Yes' : 'No'}\n`;
|
|
193
|
+
statusText += ` 処理中: ${response.worker.processing}件\n`;
|
|
194
|
+
statusText += ` キュー: ${response.worker.queue}件\n`;
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
content: [
|
|
198
|
+
{
|
|
199
|
+
type: 'text',
|
|
200
|
+
text: statusText,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
throw new Error(`ステータス取得エラー: ${error.message}`);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// サーバの起動
|
|
210
|
+
const transport = new StdioServerTransport();
|
|
211
|
+
console.error('[mcp-server] Starting MCP server...');
|
|
212
|
+
await server.connect(transport);
|
|
213
|
+
console.error('[mcp-server] MCP server started');
|
|
214
|
+
}
|
|
215
|
+
main().catch((error) => {
|
|
216
|
+
console.error('[mcp-server] Server error:', error);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
});
|
|
219
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server E2E Tests with mcp-debug
|
|
3
|
+
*/
|
|
4
|
+
import { describe, test, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { createMCPTester } from '@coeiro-operator/mcp-debug';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
describe('search-docs MCP Server E2E Tests', () => {
|
|
11
|
+
let tester;
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
const serverPath = path.resolve(__dirname, '../dist/server.js');
|
|
14
|
+
const projectDir = path.resolve(__dirname, '../../..');
|
|
15
|
+
// MCP Serverを起動
|
|
16
|
+
tester = await createMCPTester({
|
|
17
|
+
serverPath,
|
|
18
|
+
args: ['--project-dir', projectDir],
|
|
19
|
+
});
|
|
20
|
+
// サーバーが準備完了するまで待機
|
|
21
|
+
await tester.waitUntilReady();
|
|
22
|
+
});
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
// テスト環境をクリーンアップ
|
|
25
|
+
if (tester) {
|
|
26
|
+
await tester.cleanup();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
describe('基本的なMCP動作確認', () => {
|
|
30
|
+
test('MCPサーバーの起動と初期化', () => {
|
|
31
|
+
const status = tester.getStatus();
|
|
32
|
+
expect(status.isReady).toBe(true);
|
|
33
|
+
expect(status.state).toBe('ready');
|
|
34
|
+
expect(status.pendingRequests).toBe(0);
|
|
35
|
+
});
|
|
36
|
+
test('利用可能なツールの確認', async () => {
|
|
37
|
+
const response = (await tester.sendRequest('tools/list', {}));
|
|
38
|
+
expect(response.tools).toBeDefined();
|
|
39
|
+
expect(Array.isArray(response.tools)).toBe(true);
|
|
40
|
+
const toolNames = response.tools.map((t) => t.name);
|
|
41
|
+
expect(toolNames).toContain('search');
|
|
42
|
+
expect(toolNames).toContain('get_document');
|
|
43
|
+
expect(toolNames).toContain('index_status');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('index_status ツール', () => {
|
|
47
|
+
test('インデックス状態を取得できる', async () => {
|
|
48
|
+
const result = await tester.callTool('index_status', {});
|
|
49
|
+
expect(result.success).toBe(true);
|
|
50
|
+
expect(result.result).toBeDefined();
|
|
51
|
+
expect(result.duration).toBeLessThan(2000); // 2秒以内に応答
|
|
52
|
+
// レスポンステキストにインデックス情報が含まれる
|
|
53
|
+
const content = result.result?.content?.[0]?.text;
|
|
54
|
+
expect(content).toContain('インデックス状態');
|
|
55
|
+
expect(content).toContain('総文書数');
|
|
56
|
+
expect(content).toContain('総セクション数');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('search ツール', () => {
|
|
60
|
+
test('クエリで検索できる', async () => {
|
|
61
|
+
const result = await tester.callTool('search', {
|
|
62
|
+
query: 'Vector検索',
|
|
63
|
+
limit: 5,
|
|
64
|
+
});
|
|
65
|
+
expect(result.success).toBe(true);
|
|
66
|
+
expect(result.result).toBeDefined();
|
|
67
|
+
const content = result.result?.content?.[0]?.text;
|
|
68
|
+
expect(content).toContain('検索結果');
|
|
69
|
+
});
|
|
70
|
+
test('depth指定で検索できる', async () => {
|
|
71
|
+
const result = await tester.callTool('search', {
|
|
72
|
+
query: 'アーキテクチャ',
|
|
73
|
+
depth: 1,
|
|
74
|
+
limit: 3,
|
|
75
|
+
});
|
|
76
|
+
expect(result.success).toBe(true);
|
|
77
|
+
expect(result.result).toBeDefined();
|
|
78
|
+
});
|
|
79
|
+
test('検索結果が正しく返される', async () => {
|
|
80
|
+
// Vector検索は完全一致でなくても結果を返すため、
|
|
81
|
+
// 結果があることを確認
|
|
82
|
+
const result = await tester.callTool('search', {
|
|
83
|
+
query: 'xyzabc123notexist',
|
|
84
|
+
limit: 5,
|
|
85
|
+
});
|
|
86
|
+
expect(result.success).toBe(true);
|
|
87
|
+
const content = result.result?.content?.[0]?.text;
|
|
88
|
+
// 検索結果フォーマットを確認
|
|
89
|
+
expect(content).toContain('検索結果:');
|
|
90
|
+
expect(content).toContain('処理時間:');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('get_document ツール', () => {
|
|
94
|
+
test('文書を取得できる', async () => {
|
|
95
|
+
// まず検索で有効なパスを見つける
|
|
96
|
+
const searchResult = await tester.callTool('search', {
|
|
97
|
+
query: 'search-docs',
|
|
98
|
+
limit: 1,
|
|
99
|
+
});
|
|
100
|
+
expect(searchResult.success).toBe(true);
|
|
101
|
+
// 検索結果からパスを抽出(簡易的な方法)
|
|
102
|
+
const searchContent = searchResult.result?.content?.[0]?.text || '';
|
|
103
|
+
const pathMatch = searchContent.match(/文書: (.+\.md)/);
|
|
104
|
+
if (pathMatch) {
|
|
105
|
+
const documentPath = pathMatch[1];
|
|
106
|
+
const result = await tester.callTool('get_document', {
|
|
107
|
+
path: documentPath,
|
|
108
|
+
});
|
|
109
|
+
expect(result.success).toBe(true);
|
|
110
|
+
const content = result.result?.content?.[0]?.text;
|
|
111
|
+
expect(content).toContain('文書:');
|
|
112
|
+
expect(content).toContain('内容:');
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
test('存在しない文書を取得するとエラー', async () => {
|
|
116
|
+
const result = await tester.callTool('get_document', {
|
|
117
|
+
path: 'non-existent-document.md',
|
|
118
|
+
});
|
|
119
|
+
// エラーレスポンスまたは空の結果を返す
|
|
120
|
+
// 実装次第で成功するがエラーメッセージを含む場合もある
|
|
121
|
+
if (result.success) {
|
|
122
|
+
const content = result.result?.content?.[0]?.text;
|
|
123
|
+
expect(content).toBeDefined();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
expect(result.error).toBeDefined();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('並行処理のテスト', () => {
|
|
131
|
+
test('複数ツールの並行呼び出し', async () => {
|
|
132
|
+
await tester.waitUntilReady();
|
|
133
|
+
const calls = [
|
|
134
|
+
{ name: 'index_status', args: {} },
|
|
135
|
+
{ name: 'search', args: { query: 'MCP', limit: 3 } },
|
|
136
|
+
{ name: 'search', args: { query: 'クライアント', limit: 3 } },
|
|
137
|
+
];
|
|
138
|
+
const results = await tester.callToolsConcurrently(calls);
|
|
139
|
+
expect(results).toHaveLength(3);
|
|
140
|
+
// 少なくとも1つは成功することを確認
|
|
141
|
+
const successCount = results.filter((r) => r.success).length;
|
|
142
|
+
expect(successCount).toBeGreaterThan(0);
|
|
143
|
+
// 応答時間を確認
|
|
144
|
+
results.forEach((result) => {
|
|
145
|
+
expect(result.duration).toBeLessThan(3000);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe('エラーハンドリング', () => {
|
|
150
|
+
test('存在しないツールの呼び出しエラー処理', async () => {
|
|
151
|
+
const result = await tester.callTool('non_existent_tool', {});
|
|
152
|
+
expect(result.success).toBe(false);
|
|
153
|
+
expect(result.error).toBeDefined();
|
|
154
|
+
});
|
|
155
|
+
test('不正なパラメータでエラー処理', async () => {
|
|
156
|
+
const result = await tester.callTool('search', {
|
|
157
|
+
// queryが必須だが欠けている
|
|
158
|
+
limit: 5,
|
|
159
|
+
});
|
|
160
|
+
expect(result.success).toBe(false);
|
|
161
|
+
expect(result.error).toBeDefined();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@search-docs/mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP Server for search-docs - Claude Code integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/server.js",
|
|
7
|
+
"types": "dist/server.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"search-docs-mcp": "dist/server.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
17
|
+
"commander": "^12.0.0",
|
|
18
|
+
"zod": "^3.22.0",
|
|
19
|
+
"@search-docs/client": "1.0.0",
|
|
20
|
+
"@search-docs/types": "1.0.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@coeiro-operator/mcp-debug": "^1.0.0",
|
|
24
|
+
"@types/node": "^22.0.0"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"claude-code",
|
|
29
|
+
"vector-search",
|
|
30
|
+
"markdown",
|
|
31
|
+
"documentation"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18.0.0"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"author": "naoto.kato@plaid.co.jp",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/otolab/search-docs.git",
|
|
44
|
+
"directory": "packages/mcp-server"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc --build",
|
|
48
|
+
"clean": "tsc --build --clean",
|
|
49
|
+
"dev": "tsc --watch",
|
|
50
|
+
"start": "node dist/server.js",
|
|
51
|
+
"test": "vitest",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"lint": "eslint . --max-warnings 0",
|
|
54
|
+
"lint:fix": "eslint . --fix --max-warnings 0"
|
|
55
|
+
}
|
|
56
|
+
}
|