rokadoc-mcp-server 1.1.1
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.md +21 -0
- package/README.md +218 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +31 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/services/rokadoc-client.d.ts +97 -0
- package/dist/services/rokadoc-client.d.ts.map +1 -0
- package/dist/services/rokadoc-client.js +230 -0
- package/dist/services/rokadoc-client.js.map +1 -0
- package/dist/tools/convert-document.d.ts +32 -0
- package/dist/tools/convert-document.d.ts.map +1 -0
- package/dist/tools/convert-document.js +91 -0
- package/dist/tools/convert-document.js.map +1 -0
- package/dist/tools/get-conversion-result.d.ts +33 -0
- package/dist/tools/get-conversion-result.d.ts.map +1 -0
- package/dist/tools/get-conversion-result.js +84 -0
- package/dist/tools/get-conversion-result.js.map +1 -0
- package/dist/tools/list-conversions.d.ts +31 -0
- package/dist/tools/list-conversions.d.ts.map +1 -0
- package/dist/tools/list-conversions.js +68 -0
- package/dist/tools/list-conversions.js.map +1 -0
- package/dist/tools/search-documents.d.ts +39 -0
- package/dist/tools/search-documents.d.ts.map +1 -0
- package/dist/tools/search-documents.js +81 -0
- package/dist/tools/search-documents.js.map +1 -0
- package/dist/types.d.ts +208 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +24 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/error-handler.d.ts +40 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +199 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/url-validator.d.ts +33 -0
- package/dist/utils/url-validator.d.ts.map +1 -0
- package/dist/utils/url-validator.js +55 -0
- package/dist/utils/url-validator.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rokadoc API HTTPクライアント
|
|
3
|
+
*
|
|
4
|
+
* rokadoc APIとの全通信を担当する。
|
|
5
|
+
* - 全リクエストに `api-key` ヘッダーを付与
|
|
6
|
+
* - 送信先をBase URLのホストのみに制限
|
|
7
|
+
* - 30秒タイムアウト設定(AbortController使用)
|
|
8
|
+
* - リトライロジック(5xx/ネットワークエラー: 最大3回、2秒間隔。4xxはリトライなし)
|
|
9
|
+
*/
|
|
10
|
+
import { readFile } from "node:fs/promises";
|
|
11
|
+
import { basename } from "node:path";
|
|
12
|
+
import { DEFAULT_RETRY_CONFIG, } from "../types.js";
|
|
13
|
+
import { isAllowedHost } from "../utils/url-validator.js";
|
|
14
|
+
/** 変換結果ドキュメント */
|
|
15
|
+
// GetConversionResultResponse is imported from types.ts
|
|
16
|
+
/** リクエストタイムアウト(ミリ秒) */
|
|
17
|
+
const REQUEST_TIMEOUT_MS = 30000;
|
|
18
|
+
/**
|
|
19
|
+
* rokadoc APIクライアント
|
|
20
|
+
*
|
|
21
|
+
* コンストラクタで ServerConfig を受け取り、全APIメソッドで共通の
|
|
22
|
+
* ヘッダー付与・ホスト検証・タイムアウト・リトライ処理を適用する。
|
|
23
|
+
*/
|
|
24
|
+
export class RokadocApiClient {
|
|
25
|
+
config;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.config = config;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 共通リクエストメソッド
|
|
31
|
+
*
|
|
32
|
+
* - ホスト検証: Base URLのホスト以外へのリクエストを拒否
|
|
33
|
+
* - api-key ヘッダー付与
|
|
34
|
+
* - 30秒タイムアウト(AbortController)
|
|
35
|
+
* - リトライ: 5xx/ネットワークエラーは最大3回・2秒間隔、4xxはリトライなし
|
|
36
|
+
*/
|
|
37
|
+
async request(url, options) {
|
|
38
|
+
// ホスト検証
|
|
39
|
+
if (!isAllowedHost(url, this.config.baseUrl)) {
|
|
40
|
+
throw new Error(`リクエスト先ホストが許可されていません: ${url}`);
|
|
41
|
+
}
|
|
42
|
+
const { maxRetries, retryDelay, retryableStatuses } = DEFAULT_RETRY_CONFIG;
|
|
43
|
+
let lastError;
|
|
44
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
45
|
+
// リトライ待機(初回は待機なし)
|
|
46
|
+
if (attempt > 0) {
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
48
|
+
}
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(url, {
|
|
53
|
+
...options,
|
|
54
|
+
signal: controller.signal,
|
|
55
|
+
headers: {
|
|
56
|
+
...options.headers,
|
|
57
|
+
"api-key": this.config.apiKey,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
clearTimeout(timeoutId);
|
|
61
|
+
// 成功レスポンス
|
|
62
|
+
if (response.ok) {
|
|
63
|
+
return (await response.json());
|
|
64
|
+
}
|
|
65
|
+
// 4xx: リトライなし、即座にエラー
|
|
66
|
+
if (response.status >= 400 && response.status < 500) {
|
|
67
|
+
const body = await response.text().catch(() => "");
|
|
68
|
+
const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
69
|
+
Object.assign(error, {
|
|
70
|
+
status: response.status,
|
|
71
|
+
body: body.slice(0, 500),
|
|
72
|
+
});
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
// 5xx: リトライ対象か確認
|
|
76
|
+
if (retryableStatuses.includes(response.status)) {
|
|
77
|
+
const body = await response.text().catch(() => "");
|
|
78
|
+
const retryError = new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
79
|
+
Object.assign(retryError, {
|
|
80
|
+
status: response.status,
|
|
81
|
+
body: body.slice(0, 500),
|
|
82
|
+
});
|
|
83
|
+
lastError = retryError;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// その他の5xxステータス(retryableStatusesに含まれない場合)
|
|
87
|
+
const body = await response.text().catch(() => "");
|
|
88
|
+
const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
89
|
+
Object.assign(error, {
|
|
90
|
+
status: response.status,
|
|
91
|
+
body: body.slice(0, 500),
|
|
92
|
+
});
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
clearTimeout(timeoutId);
|
|
97
|
+
// 4xxエラーや意図的にthrowされたエラーはそのまま再throw
|
|
98
|
+
if (error instanceof Error &&
|
|
99
|
+
"status" in error &&
|
|
100
|
+
typeof error.status === "number") {
|
|
101
|
+
const status = error.status;
|
|
102
|
+
if (status >= 400 && status < 500) {
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ネットワークエラー/タイムアウト → リトライ対象
|
|
107
|
+
lastError = error;
|
|
108
|
+
if (attempt < maxRetries) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 全リトライ失敗後、最後のエラーをthrow
|
|
114
|
+
throw lastError;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* ドキュメント変換リクエスト
|
|
118
|
+
*
|
|
119
|
+
* POST /v1/api/conversions (multipart/form-data)
|
|
120
|
+
*
|
|
121
|
+
* @param filePath - 変換対象のファイルパス
|
|
122
|
+
* @param options - ページ範囲指定(任意)
|
|
123
|
+
* @returns 変換ジョブIDとステータス
|
|
124
|
+
*/
|
|
125
|
+
async createConversion(filePath, options) {
|
|
126
|
+
const url = `${this.config.baseUrl}/v1/api/conversions`;
|
|
127
|
+
const fileBuffer = await readFile(filePath);
|
|
128
|
+
const fileName = basename(filePath);
|
|
129
|
+
const formData = new FormData();
|
|
130
|
+
formData.append("upload_file", new Blob([fileBuffer]), fileName);
|
|
131
|
+
formData.append("vllm_name", "null");
|
|
132
|
+
formData.append("layout_algo_names", "miner_layout_text_line");
|
|
133
|
+
formData.append("layout_algo_names", "com_layout_only");
|
|
134
|
+
formData.append("layout_algo_names", "com_layout_text_line");
|
|
135
|
+
if (options?.from_page !== undefined) {
|
|
136
|
+
formData.append("from_page", String(options.from_page));
|
|
137
|
+
}
|
|
138
|
+
if (options?.to_page !== undefined) {
|
|
139
|
+
formData.append("to_page", String(options.to_page));
|
|
140
|
+
}
|
|
141
|
+
if (options?.space_id !== undefined) {
|
|
142
|
+
formData.append("space_id", options.space_id);
|
|
143
|
+
}
|
|
144
|
+
return this.request(url, {
|
|
145
|
+
method: "POST",
|
|
146
|
+
body: formData,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 変換ジョブ一覧取得
|
|
151
|
+
*
|
|
152
|
+
* GET /v1/user/conversions
|
|
153
|
+
*
|
|
154
|
+
* @param spaceId - スペースID(任意)
|
|
155
|
+
* @returns 変換ジョブの配列
|
|
156
|
+
*/
|
|
157
|
+
async listConversions(spaceId) {
|
|
158
|
+
let url = `${this.config.baseUrl}/v1/user/conversions`;
|
|
159
|
+
if (spaceId) {
|
|
160
|
+
url += `?space_id=${encodeURIComponent(spaceId)}`;
|
|
161
|
+
}
|
|
162
|
+
const response = await this.request(url, {
|
|
163
|
+
method: "GET",
|
|
164
|
+
});
|
|
165
|
+
return response.data;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 変換結果取得
|
|
169
|
+
*
|
|
170
|
+
* GET /v1/user/conversions/{id}/document
|
|
171
|
+
*
|
|
172
|
+
* @param conversionId - 変換ジョブID
|
|
173
|
+
* @param spaceId - スペースID(任意)
|
|
174
|
+
* @returns 変換結果レスポンス(status, roka_response等を含む)
|
|
175
|
+
*/
|
|
176
|
+
async getConversionResult(conversionId, spaceId) {
|
|
177
|
+
let url = `${this.config.baseUrl}/v1/user/conversions/${encodeURIComponent(conversionId)}/document`;
|
|
178
|
+
if (spaceId) {
|
|
179
|
+
url += `?space_id=${encodeURIComponent(spaceId)}`;
|
|
180
|
+
}
|
|
181
|
+
return this.request(url, {
|
|
182
|
+
method: "GET",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* ユーザーがアクセス可能なスペース一覧を取得
|
|
187
|
+
*
|
|
188
|
+
* GET /v1/user/spaces/join
|
|
189
|
+
*
|
|
190
|
+
* @returns スペース情報の配列(space_id, space_name)
|
|
191
|
+
*/
|
|
192
|
+
async listSpaces() {
|
|
193
|
+
const url = `${this.config.baseUrl}/v1/user/spaces/join`;
|
|
194
|
+
const response = await this.request(url, {
|
|
195
|
+
method: "GET",
|
|
196
|
+
});
|
|
197
|
+
return response.data;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* RAGドキュメント検索
|
|
201
|
+
*
|
|
202
|
+
* GET /v1/api/search
|
|
203
|
+
*
|
|
204
|
+
* @param query - 検索クエリ(message パラメータとして送信)
|
|
205
|
+
* @param options - 検索オプション(タグフィルタ、最大件数、スペースID)
|
|
206
|
+
* @returns 検索結果の配列
|
|
207
|
+
*/
|
|
208
|
+
async searchDocuments(query, options) {
|
|
209
|
+
const params = new URLSearchParams();
|
|
210
|
+
params.append("message", query);
|
|
211
|
+
if (options?.max_results !== undefined) {
|
|
212
|
+
params.append("search_top_k", String(options.max_results));
|
|
213
|
+
}
|
|
214
|
+
if (options?.tags !== undefined && options.tags.length > 0) {
|
|
215
|
+
for (const tag of options.tags) {
|
|
216
|
+
params.append("tags_filter", tag);
|
|
217
|
+
}
|
|
218
|
+
params.append("tags_filter_include", String(options.tags_filter_include ?? true));
|
|
219
|
+
}
|
|
220
|
+
if (options?.space_id !== undefined) {
|
|
221
|
+
params.append("space_id", options.space_id);
|
|
222
|
+
}
|
|
223
|
+
const url = `${this.config.baseUrl}/v1/api/search?${params.toString()}`;
|
|
224
|
+
const response = await this.request(url, {
|
|
225
|
+
method: "GET",
|
|
226
|
+
});
|
|
227
|
+
return response.search_result;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=rokadoc-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rokadoc-client.js","sourceRoot":"","sources":["../../src/services/rokadoc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* convert_document ツール
|
|
3
|
+
*
|
|
4
|
+
* ファイルをrokadoc APIに送信してMarkdownへの変換を開始する。
|
|
5
|
+
* - Zodスキーマによる入力バリデーション
|
|
6
|
+
* - ファイル形式チェック(PDF, Word, Excel, PowerPoint)
|
|
7
|
+
* - ページ範囲バリデーション
|
|
8
|
+
* - ファイル存在チェック
|
|
9
|
+
* - RokadocApiClientを介したAPI呼び出し
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { RokadocApiClient } from "../services/rokadoc-client.js";
|
|
13
|
+
import { McpToolResult } from "../types.js";
|
|
14
|
+
/** Zod入力スキーマ */
|
|
15
|
+
export declare const convertDocumentInputSchema: z.ZodObject<{
|
|
16
|
+
file_path: z.ZodString;
|
|
17
|
+
from_page: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
to_page: z.ZodOptional<z.ZodNumber>;
|
|
19
|
+
space_id: z.ZodOptional<z.ZodString>;
|
|
20
|
+
space_name: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
/** 入力型 */
|
|
23
|
+
export type ConvertDocumentInput = z.infer<typeof convertDocumentInputSchema>;
|
|
24
|
+
/**
|
|
25
|
+
* convert_document ツールハンドラー
|
|
26
|
+
*
|
|
27
|
+
* @param input - バリデーション済み入力パラメータ
|
|
28
|
+
* @param client - rokadoc APIクライアント
|
|
29
|
+
* @returns MCP形式のツール結果
|
|
30
|
+
*/
|
|
31
|
+
export declare function handleConvertDocument(input: ConvertDocumentInput, client: RokadocApiClient): Promise<McpToolResult>;
|
|
32
|
+
//# sourceMappingURL=convert-document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-document.d.ts","sourceRoot":"","sources":["../../src/tools/convert-document.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAa,MAAM,aAAa,CAAC;AAcvD,gBAAgB;AAChB,eAAO,MAAM,0BAA0B;;;;;;iBAMrC,CAAC;AAEH,UAAU;AACV,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,aAAa,CAAC,CAiExB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* convert_document ツール
|
|
3
|
+
*
|
|
4
|
+
* ファイルをrokadoc APIに送信してMarkdownへの変換を開始する。
|
|
5
|
+
* - Zodスキーマによる入力バリデーション
|
|
6
|
+
* - ファイル形式チェック(PDF, Word, Excel, PowerPoint)
|
|
7
|
+
* - ページ範囲バリデーション
|
|
8
|
+
* - ファイル存在チェック
|
|
9
|
+
* - RokadocApiClientを介したAPI呼び出し
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { access } from "node:fs/promises";
|
|
13
|
+
import { extname } from "node:path";
|
|
14
|
+
import { ErrorType } from "../types.js";
|
|
15
|
+
import { formatMcpError, handleApiError } from "../utils/error-handler.js";
|
|
16
|
+
/** サポートされるファイル拡張子 */
|
|
17
|
+
const SUPPORTED_EXTENSIONS = [
|
|
18
|
+
".pdf",
|
|
19
|
+
".doc",
|
|
20
|
+
".docx",
|
|
21
|
+
".xls",
|
|
22
|
+
".xlsx",
|
|
23
|
+
".ppt",
|
|
24
|
+
".pptx",
|
|
25
|
+
];
|
|
26
|
+
/** Zod入力スキーマ */
|
|
27
|
+
export const convertDocumentInputSchema = z.object({
|
|
28
|
+
file_path: z.string().min(1, "ファイルパスは必須です"),
|
|
29
|
+
from_page: z.number().int().positive().optional(),
|
|
30
|
+
to_page: z.number().int().positive().optional(),
|
|
31
|
+
space_id: z.string().optional(),
|
|
32
|
+
space_name: z.string().optional(),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* convert_document ツールハンドラー
|
|
36
|
+
*
|
|
37
|
+
* @param input - バリデーション済み入力パラメータ
|
|
38
|
+
* @param client - rokadoc APIクライアント
|
|
39
|
+
* @returns MCP形式のツール結果
|
|
40
|
+
*/
|
|
41
|
+
export async function handleConvertDocument(input, client) {
|
|
42
|
+
const filePath = input.file_path;
|
|
43
|
+
// 1. ファイル拡張子チェック
|
|
44
|
+
const ext = extname(filePath).toLowerCase();
|
|
45
|
+
if (!SUPPORTED_EXTENSIONS.includes(ext)) {
|
|
46
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `未対応のファイル形式です: ${ext}\n---\n指定されたファイル: ${filePath}\n---\nサポートされるファイル形式: PDF (.pdf), Word (.doc, .docx), Excel (.xls, .xlsx), PowerPoint (.ppt, .pptx)`);
|
|
47
|
+
}
|
|
48
|
+
// 2. ページ範囲バリデーション
|
|
49
|
+
if (input.from_page !== undefined &&
|
|
50
|
+
input.to_page !== undefined &&
|
|
51
|
+
input.from_page > input.to_page) {
|
|
52
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `無効なページ範囲です: from_page (${input.from_page}) が to_page (${input.to_page}) より大きい値です。\n---\nfrom_page=${input.from_page}, to_page=${input.to_page}\n---\nfrom_page には to_page 以下の値を指定してください。`);
|
|
53
|
+
}
|
|
54
|
+
// 3. ファイル存在チェック
|
|
55
|
+
try {
|
|
56
|
+
await access(filePath);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `ファイルが見つかりません: ${filePath}\n---\n指定されたパスにファイルが存在しません。\n---\nファイルパスが正しいことを確認してください。`);
|
|
60
|
+
}
|
|
61
|
+
// 4. スペースIDの解決
|
|
62
|
+
let resolvedSpaceId = input.space_id;
|
|
63
|
+
if (input.space_name && !resolvedSpaceId) {
|
|
64
|
+
try {
|
|
65
|
+
const spaces = await client.listSpaces();
|
|
66
|
+
const matched = spaces.find((s) => s.space_name === input.space_name);
|
|
67
|
+
if (!matched) {
|
|
68
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `指定されたスペース名が見つかりません: "${input.space_name}"\n---\nアクセス可能なスペース一覧に該当するスペースが存在しません。\n---\nスペース名が正しいことを確認してください。`);
|
|
69
|
+
}
|
|
70
|
+
resolvedSpaceId = matched.space_id;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return handleApiError(error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 5. API呼び出し
|
|
77
|
+
try {
|
|
78
|
+
const result = await client.createConversion(filePath, {
|
|
79
|
+
from_page: input.from_page,
|
|
80
|
+
to_page: input.to_page,
|
|
81
|
+
space_id: resolvedSpaceId,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return handleApiError(error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=convert-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-document.js","sourceRoot":"","sources":["../../src/tools/convert-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_conversion_result ツール
|
|
3
|
+
*
|
|
4
|
+
* 指定されたconversion_idの変換結果ドキュメントを取得する。
|
|
5
|
+
* - Zodスキーマによる入力バリデーション(conversion_id: 必須文字列)
|
|
6
|
+
* - RokadocApiClientを介した変換結果取得
|
|
7
|
+
* - ジョブ未存在時(HTTP 404)のエラーメッセージ返却
|
|
8
|
+
* - ジョブ未完了時(HTTP 200 + roka_response: null)のエラーメッセージ + 現在ステータス返却
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { RokadocApiClient } from "../services/rokadoc-client.js";
|
|
12
|
+
import { McpToolResult } from "../types.js";
|
|
13
|
+
/**
|
|
14
|
+
* get_conversion_result ツール入力スキーマ
|
|
15
|
+
*/
|
|
16
|
+
export declare const getConversionResultInputSchema: z.ZodObject<{
|
|
17
|
+
conversion_id: z.ZodString;
|
|
18
|
+
space_id: z.ZodOptional<z.ZodString>;
|
|
19
|
+
space_name: z.ZodOptional<z.ZodString>;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
export type GetConversionResultInput = z.infer<typeof getConversionResultInputSchema>;
|
|
22
|
+
/**
|
|
23
|
+
* get_conversion_result ツールハンドラー
|
|
24
|
+
*
|
|
25
|
+
* 指定されたconversion_idの変換結果を取得し、MCP形式で返却する。
|
|
26
|
+
* APIは未完了時もHTTP 200を返し、data.roka_responseがnullになる。
|
|
27
|
+
*
|
|
28
|
+
* @param input - バリデーション済み入力(conversion_id)
|
|
29
|
+
* @param client - rokadoc APIクライアント
|
|
30
|
+
* @returns 変換結果ドキュメントまたはエラーレスポンス
|
|
31
|
+
*/
|
|
32
|
+
export declare function handleGetConversionResult(input: GetConversionResultInput, client: RokadocApiClient): Promise<McpToolResult>;
|
|
33
|
+
//# sourceMappingURL=get-conversion-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-conversion-result.d.ts","sourceRoot":"","sources":["../../src/tools/get-conversion-result.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAa,MAAM,aAAa,CAAC;AAGvD;;GAEG;AACH,eAAO,MAAM,8BAA8B;;;;iBAIzC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAC5C,OAAO,8BAA8B,CACtC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,aAAa,CAAC,CAiExB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_conversion_result ツール
|
|
3
|
+
*
|
|
4
|
+
* 指定されたconversion_idの変換結果ドキュメントを取得する。
|
|
5
|
+
* - Zodスキーマによる入力バリデーション(conversion_id: 必須文字列)
|
|
6
|
+
* - RokadocApiClientを介した変換結果取得
|
|
7
|
+
* - ジョブ未存在時(HTTP 404)のエラーメッセージ返却
|
|
8
|
+
* - ジョブ未完了時(HTTP 200 + roka_response: null)のエラーメッセージ + 現在ステータス返却
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { ErrorType } from "../types.js";
|
|
12
|
+
import { formatMcpError, handleApiError } from "../utils/error-handler.js";
|
|
13
|
+
/**
|
|
14
|
+
* get_conversion_result ツール入力スキーマ
|
|
15
|
+
*/
|
|
16
|
+
export const getConversionResultInputSchema = z.object({
|
|
17
|
+
conversion_id: z.string().min(1, "conversion_idは必須です"),
|
|
18
|
+
space_id: z.string().optional(),
|
|
19
|
+
space_name: z.string().optional(),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* get_conversion_result ツールハンドラー
|
|
23
|
+
*
|
|
24
|
+
* 指定されたconversion_idの変換結果を取得し、MCP形式で返却する。
|
|
25
|
+
* APIは未完了時もHTTP 200を返し、data.roka_responseがnullになる。
|
|
26
|
+
*
|
|
27
|
+
* @param input - バリデーション済み入力(conversion_id)
|
|
28
|
+
* @param client - rokadoc APIクライアント
|
|
29
|
+
* @returns 変換結果ドキュメントまたはエラーレスポンス
|
|
30
|
+
*/
|
|
31
|
+
export async function handleGetConversionResult(input, client) {
|
|
32
|
+
// スペースIDの解決
|
|
33
|
+
let resolvedSpaceId = input.space_id;
|
|
34
|
+
if (input.space_name && !resolvedSpaceId) {
|
|
35
|
+
try {
|
|
36
|
+
const spaces = await client.listSpaces();
|
|
37
|
+
const matched = spaces.find((s) => s.space_name === input.space_name);
|
|
38
|
+
if (!matched) {
|
|
39
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `指定されたスペース名が見つかりません: "${input.space_name}"\n---\nアクセス可能なスペース一覧に該当するスペースが存在しません。\n---\nスペース名が正しいことを確認してください。`);
|
|
40
|
+
}
|
|
41
|
+
resolvedSpaceId = matched.space_id;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return handleApiError(error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const result = await client.getConversionResult(input.conversion_id, resolvedSpaceId);
|
|
49
|
+
// ジョブ未完了: roka_responseがnullの場合
|
|
50
|
+
if (result.data.roka_response === null) {
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: `ジョブが未完了です。\n\nconversion_id: ${input.conversion_id}\n現在のステータス: ${result.data.status}\n\nジョブの完了後に再度お試しください。`,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// 変換結果を整形して返却
|
|
61
|
+
const output = {
|
|
62
|
+
conversion_id: result.data.conversion_id,
|
|
63
|
+
document_name: result.data.document_name,
|
|
64
|
+
status: result.data.status,
|
|
65
|
+
roka_response: result.data.roka_response,
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: "text", text: JSON.stringify(output, null, 2) }],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// HTTPステータスコードに基づくエラー分類
|
|
73
|
+
if (error && typeof error === "object" && "status" in error) {
|
|
74
|
+
const status = error.status;
|
|
75
|
+
// HTTP 404: ジョブが見つからない
|
|
76
|
+
if (status === 404) {
|
|
77
|
+
return formatMcpError(ErrorType.API_ERROR, `指定されたジョブが見つかりません。\n---\nconversion_id: ${input.conversion_id}\n---\nconversion_idが正しいことを確認してください。`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// その他のエラー(認証エラー、タイムアウト、接続エラー等)は共通ハンドラーに委譲
|
|
81
|
+
return handleApiError(error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=get-conversion-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-conversion-result.js","sourceRoot":"","sources":["../../src/tools/get-conversion-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_conversions ツール
|
|
3
|
+
*
|
|
4
|
+
* ユーザーの変換ジョブ一覧を取得し、
|
|
5
|
+
* conversion_id、ステータス、作成日時を含むレスポンスを返す。
|
|
6
|
+
* - space_id または space_name でスペースを指定可能
|
|
7
|
+
* - 未指定時は全スペースのジョブを取得
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { RokadocApiClient } from "../services/rokadoc-client.js";
|
|
11
|
+
import { McpToolResult } from "../types.js";
|
|
12
|
+
/**
|
|
13
|
+
* list_conversions ツール入力スキーマ
|
|
14
|
+
*/
|
|
15
|
+
export declare const listConversionsInputSchema: z.ZodObject<{
|
|
16
|
+
space_id: z.ZodOptional<z.ZodString>;
|
|
17
|
+
space_name: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type ListConversionsInput = z.infer<typeof listConversionsInputSchema>;
|
|
20
|
+
/**
|
|
21
|
+
* list_conversions ツールハンドラー
|
|
22
|
+
*
|
|
23
|
+
* RokadocApiClientを介してジョブ一覧を取得し、
|
|
24
|
+
* conversion_id、status、document_name、created_date、updated_date を含むフォーマットで返却する。
|
|
25
|
+
*
|
|
26
|
+
* @param input - バリデーション済み入力(space_id/space_name任意)
|
|
27
|
+
* @param client - rokadoc APIクライアント
|
|
28
|
+
* @returns MCP形式のツール結果
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleListConversions(input: ListConversionsInput, client: RokadocApiClient): Promise<McpToolResult>;
|
|
31
|
+
//# sourceMappingURL=list-conversions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-conversions.d.ts","sourceRoot":"","sources":["../../src/tools/list-conversions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAa,MAAM,aAAa,CAAC;AAGvD;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;iBAGrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,aAAa,CAAC,CA0CxB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_conversions ツール
|
|
3
|
+
*
|
|
4
|
+
* ユーザーの変換ジョブ一覧を取得し、
|
|
5
|
+
* conversion_id、ステータス、作成日時を含むレスポンスを返す。
|
|
6
|
+
* - space_id または space_name でスペースを指定可能
|
|
7
|
+
* - 未指定時は全スペースのジョブを取得
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { ErrorType } from "../types.js";
|
|
11
|
+
import { formatMcpError, handleApiError } from "../utils/error-handler.js";
|
|
12
|
+
/**
|
|
13
|
+
* list_conversions ツール入力スキーマ
|
|
14
|
+
*/
|
|
15
|
+
export const listConversionsInputSchema = z.object({
|
|
16
|
+
space_id: z.string().optional(),
|
|
17
|
+
space_name: z.string().optional(),
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* list_conversions ツールハンドラー
|
|
21
|
+
*
|
|
22
|
+
* RokadocApiClientを介してジョブ一覧を取得し、
|
|
23
|
+
* conversion_id、status、document_name、created_date、updated_date を含むフォーマットで返却する。
|
|
24
|
+
*
|
|
25
|
+
* @param input - バリデーション済み入力(space_id/space_name任意)
|
|
26
|
+
* @param client - rokadoc APIクライアント
|
|
27
|
+
* @returns MCP形式のツール結果
|
|
28
|
+
*/
|
|
29
|
+
export async function handleListConversions(input, client) {
|
|
30
|
+
// スペースIDの解決
|
|
31
|
+
let resolvedSpaceId = input.space_id;
|
|
32
|
+
if (input.space_name && !resolvedSpaceId) {
|
|
33
|
+
try {
|
|
34
|
+
const spaces = await client.listSpaces();
|
|
35
|
+
const matched = spaces.find((s) => s.space_name === input.space_name);
|
|
36
|
+
if (!matched) {
|
|
37
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `指定されたスペース名が見つかりません: "${input.space_name}"\n---\nアクセス可能なスペース一覧に該当するスペースが存在しません。\n---\nスペース名が正しいことを確認してください。`);
|
|
38
|
+
}
|
|
39
|
+
resolvedSpaceId = matched.space_id;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return handleApiError(error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const conversions = await client.listConversions(resolvedSpaceId);
|
|
47
|
+
// Format response with conversion_id, status, document_name, created_date, updated_date
|
|
48
|
+
const formatted = conversions.map((job) => ({
|
|
49
|
+
conversion_id: job.conversion_id,
|
|
50
|
+
status: job.status,
|
|
51
|
+
document_name: job.document_name,
|
|
52
|
+
created_date: job.created_date,
|
|
53
|
+
updated_date: job.updated_date,
|
|
54
|
+
}));
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: "text",
|
|
59
|
+
text: JSON.stringify({ conversions: formatted }, null, 2),
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return handleApiError(error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=list-conversions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-conversions.js","sourceRoot":"","sources":["../../src/tools/list-conversions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3E;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAA2B,EAC3B,MAAwB;IAExB,YAAY;IACZ,IAAI,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;IACrC,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,cAAc,CACnB,SAAS,CAAC,gBAAgB,EAC1B,wBAAwB,KAAK,CAAC,UAAU,oEAAoE,CAC7G,CAAC;YACJ,CAAC;YACD,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAElE,wFAAwF;QACxF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC1C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,YAAY,EAAE,GAAG,CAAC,YAAY;SAC/B,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1D;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_documents ツール
|
|
3
|
+
*
|
|
4
|
+
* RAGドキュメント検索を実行し、関連ドキュメントのコンテキスト・ページ番号等を返す。
|
|
5
|
+
* - Zodスキーマによる入力バリデーション
|
|
6
|
+
* - 空白のみクエリのバリデーションエラー
|
|
7
|
+
* - space_name指定時はスペース一覧から対応するspace_idを解決
|
|
8
|
+
* - space_id/space_name未指定時は全スペースから検索
|
|
9
|
+
* - RokadocApiClientを介した検索実行
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { RokadocApiClient } from "../services/rokadoc-client.js";
|
|
13
|
+
import { McpToolResult } from "../types.js";
|
|
14
|
+
/**
|
|
15
|
+
* search_documents ツール入力スキーマ
|
|
16
|
+
*
|
|
17
|
+
* - query: 必須、1〜1000文字(APIの message パラメータに対応)
|
|
18
|
+
* - tags: 任意、文字列配列(APIの tags_filter パラメータに対応、AND条件フィルタ)
|
|
19
|
+
* - max_results: 任意、正の整数、最大5、デフォルト3(APIの search_top_k パラメータに対応)
|
|
20
|
+
* - space_id: 任意、スペースID文字列(直接指定)
|
|
21
|
+
* - space_name: 任意、スペース名(名前からspace_idを解決する)
|
|
22
|
+
*/
|
|
23
|
+
export declare const searchDocumentsInputSchema: z.ZodObject<{
|
|
24
|
+
query: z.ZodString;
|
|
25
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
26
|
+
max_results: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
27
|
+
space_id: z.ZodOptional<z.ZodString>;
|
|
28
|
+
space_name: z.ZodOptional<z.ZodString>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type SearchDocumentsInput = z.infer<typeof searchDocumentsInputSchema>;
|
|
31
|
+
/**
|
|
32
|
+
* search_documents ツールハンドラー
|
|
33
|
+
*
|
|
34
|
+
* @param input - バリデーション済みの検索入力
|
|
35
|
+
* @param client - rokadoc APIクライアント
|
|
36
|
+
* @returns MCP形式のツール結果
|
|
37
|
+
*/
|
|
38
|
+
export declare function handleSearchDocuments(input: SearchDocumentsInput, client: RokadocApiClient): Promise<McpToolResult>;
|
|
39
|
+
//# sourceMappingURL=search-documents.d.ts.map
|