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 @@
|
|
|
1
|
+
{"version":3,"file":"search-documents.d.ts","sourceRoot":"","sources":["../../src/tools/search-documents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;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;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B;;;;;;iBAMrC,CAAC;AAEH,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,CAoDxB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
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 { ErrorType } from "../types.js";
|
|
13
|
+
import { formatMcpError, handleApiError } from "../utils/error-handler.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 const searchDocumentsInputSchema = z.object({
|
|
24
|
+
query: z.string().min(1).max(1000),
|
|
25
|
+
tags: z.array(z.string()).optional(),
|
|
26
|
+
max_results: z.number().int().positive().max(5).default(3).optional(),
|
|
27
|
+
space_id: z.string().optional(),
|
|
28
|
+
space_name: z.string().optional(),
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* search_documents ツールハンドラー
|
|
32
|
+
*
|
|
33
|
+
* @param input - バリデーション済みの検索入力
|
|
34
|
+
* @param client - rokadoc APIクライアント
|
|
35
|
+
* @returns MCP形式のツール結果
|
|
36
|
+
*/
|
|
37
|
+
export async function handleSearchDocuments(input, client) {
|
|
38
|
+
// 空白のみクエリチェック(Zod min(1) は空文字を弾くが空白のみは通過するため)
|
|
39
|
+
if (input.query.trim() === "") {
|
|
40
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `検索クエリが空白のみです。\n---\n有効な検索テキストを入力してください。\n---\n1文字以上1000文字以下の検索クエリを指定してください。`);
|
|
41
|
+
}
|
|
42
|
+
// スペースIDの解決
|
|
43
|
+
let resolvedSpaceId = input.space_id;
|
|
44
|
+
// space_nameが指定されている場合、スペース一覧からspace_idを解決する
|
|
45
|
+
if (input.space_name && !resolvedSpaceId) {
|
|
46
|
+
try {
|
|
47
|
+
const spaces = await client.listSpaces();
|
|
48
|
+
const matched = spaces.find((s) => s.space_name === input.space_name);
|
|
49
|
+
if (!matched) {
|
|
50
|
+
return formatMcpError(ErrorType.VALIDATION_ERROR, `指定されたスペース名が見つかりません: "${input.space_name}"\n---\nアクセス可能なスペース一覧に該当するスペースが存在しません。\n---\nスペース名が正しいことを確認してください。`);
|
|
51
|
+
}
|
|
52
|
+
resolvedSpaceId = matched.space_id;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return handleApiError(error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const results = await client.searchDocuments(input.query, {
|
|
60
|
+
tags: input.tags,
|
|
61
|
+
max_results: input.max_results ?? 3,
|
|
62
|
+
space_id: resolvedSpaceId,
|
|
63
|
+
});
|
|
64
|
+
const formatted = results.map((r) => ({
|
|
65
|
+
document_name: r.pdf_name,
|
|
66
|
+
context: r.context,
|
|
67
|
+
page_number: r.page_number,
|
|
68
|
+
conversion_id: r.conversion_id,
|
|
69
|
+
tags: r.tags,
|
|
70
|
+
}));
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{ type: "text", text: JSON.stringify({ results: formatted }, null, 2) },
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return handleApiError(error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=search-documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-documents.js","sourceRoot":"","sources":["../../src/tools/search-documents.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rokadoc MCPサーバー 型定義
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* サーバー設定インターフェース
|
|
6
|
+
* 環境変数から読み込まれ、正規化された設定値を保持する
|
|
7
|
+
*/
|
|
8
|
+
export interface ServerConfig {
|
|
9
|
+
/** 正規化済みrokadoc API URL(末尾スラッシュなし、https://) */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/** rokadoc API Key(空白除去済み) */
|
|
12
|
+
apiKey: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* convert_document ツール入力
|
|
16
|
+
*/
|
|
17
|
+
export interface ConvertDocumentInput {
|
|
18
|
+
/** 必須: ファイルパス */
|
|
19
|
+
file_path: string;
|
|
20
|
+
/** 任意: 開始ページ(正の整数) */
|
|
21
|
+
from_page?: number;
|
|
22
|
+
/** 任意: 終了ページ(正の整数) */
|
|
23
|
+
to_page?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* convert_document ツール出力
|
|
27
|
+
*/
|
|
28
|
+
export interface ConvertDocumentOutput {
|
|
29
|
+
code: number;
|
|
30
|
+
status: string;
|
|
31
|
+
conversion_id: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* list_conversions APIレスポンス全体
|
|
35
|
+
*/
|
|
36
|
+
export interface ListConversionsResponse {
|
|
37
|
+
code: number;
|
|
38
|
+
total_count: number;
|
|
39
|
+
last_page_number: number;
|
|
40
|
+
data: ConversionJob[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 変換ジョブ情報
|
|
44
|
+
*/
|
|
45
|
+
export interface ConversionJob {
|
|
46
|
+
conversion_id: string;
|
|
47
|
+
status: "Pending" | "Running" | "Succeeded" | "Failed" | "Retrying";
|
|
48
|
+
document_name: string;
|
|
49
|
+
/** 作成日時(例: "202502051314") */
|
|
50
|
+
created_date: string;
|
|
51
|
+
/** 更新日時(例: "202502051315") */
|
|
52
|
+
updated_date: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* get_conversion_result ツール入力
|
|
56
|
+
*/
|
|
57
|
+
export interface GetConversionResultInput {
|
|
58
|
+
/** 必須: 変換ジョブID */
|
|
59
|
+
conversion_id: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* get_conversion_result ツール出力(APIレスポンス)
|
|
63
|
+
*/
|
|
64
|
+
export interface GetConversionResultResponse {
|
|
65
|
+
code: number;
|
|
66
|
+
data: {
|
|
67
|
+
status: "Pending" | "Running" | "Succeeded" | "Failed" | "Retrying";
|
|
68
|
+
conversion_id: string;
|
|
69
|
+
document_name: string;
|
|
70
|
+
roka_response: RokaResponse | null;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* rokadocドキュメント解析結果
|
|
75
|
+
*/
|
|
76
|
+
export interface RokaResponse {
|
|
77
|
+
meta: {
|
|
78
|
+
separate_method: string;
|
|
79
|
+
};
|
|
80
|
+
document_summary: string;
|
|
81
|
+
units: Array<{
|
|
82
|
+
unit: number;
|
|
83
|
+
title: string;
|
|
84
|
+
body: string;
|
|
85
|
+
chunk_context: string;
|
|
86
|
+
elements: Array<{
|
|
87
|
+
type: string;
|
|
88
|
+
coordinates: number[][];
|
|
89
|
+
text: string;
|
|
90
|
+
page: number;
|
|
91
|
+
reading_order: number;
|
|
92
|
+
}>;
|
|
93
|
+
description: string;
|
|
94
|
+
width: number;
|
|
95
|
+
height: number;
|
|
96
|
+
}>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* search_documents ツール入力
|
|
100
|
+
*/
|
|
101
|
+
export interface SearchDocumentsInput {
|
|
102
|
+
/** 必須: 検索クエリ(1〜1000文字) */
|
|
103
|
+
query: string;
|
|
104
|
+
/** 任意: タグフィルタ(AND条件) */
|
|
105
|
+
tags?: string[];
|
|
106
|
+
/** 任意: 最大取得件数(デフォルト: 3、最大: 5) */
|
|
107
|
+
max_results?: number;
|
|
108
|
+
/** 任意: スペースID */
|
|
109
|
+
space_id?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 検索結果(rokadoc APIレスポンスの各要素)
|
|
113
|
+
*/
|
|
114
|
+
export interface SearchResult {
|
|
115
|
+
/** チャンク化されたテキスト */
|
|
116
|
+
context: string;
|
|
117
|
+
/** ユニット情報 */
|
|
118
|
+
unit: {
|
|
119
|
+
unit: number;
|
|
120
|
+
title: string;
|
|
121
|
+
body: string;
|
|
122
|
+
chunk_context: string;
|
|
123
|
+
elements: Array<{
|
|
124
|
+
type: string;
|
|
125
|
+
coordinates: number[][];
|
|
126
|
+
text: string;
|
|
127
|
+
page: number;
|
|
128
|
+
reading_order: number;
|
|
129
|
+
}>;
|
|
130
|
+
description: string;
|
|
131
|
+
width: number;
|
|
132
|
+
height: number;
|
|
133
|
+
};
|
|
134
|
+
/** ドキュメント名 */
|
|
135
|
+
pdf_name: string;
|
|
136
|
+
/** ページ番号 */
|
|
137
|
+
page_number: number;
|
|
138
|
+
/** 使用されたアルゴリズム */
|
|
139
|
+
roka_algorithm: string | null;
|
|
140
|
+
/** 変換ジョブID */
|
|
141
|
+
conversion_id: string;
|
|
142
|
+
/** ユーザーID */
|
|
143
|
+
user_id: string;
|
|
144
|
+
/** タグ */
|
|
145
|
+
tags: string[];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 検索APIレスポンス全体
|
|
149
|
+
*/
|
|
150
|
+
export interface SearchResponse {
|
|
151
|
+
search_result: SearchResult[];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* スペース情報
|
|
155
|
+
*/
|
|
156
|
+
export interface Space {
|
|
157
|
+
space_id: string;
|
|
158
|
+
space_name: string;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* スペース一覧APIレスポンス
|
|
162
|
+
*/
|
|
163
|
+
export interface ListSpacesResponse {
|
|
164
|
+
code: number;
|
|
165
|
+
data: Space[];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* APIリクエスト共通ヘッダー
|
|
169
|
+
*/
|
|
170
|
+
export interface ApiRequestHeaders {
|
|
171
|
+
"api-key": string;
|
|
172
|
+
"Content-Type"?: string;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* リトライ設定
|
|
176
|
+
*/
|
|
177
|
+
export interface RetryConfig {
|
|
178
|
+
maxRetries: number;
|
|
179
|
+
/** ミリ秒 */
|
|
180
|
+
retryDelay: number;
|
|
181
|
+
retryableStatuses: readonly number[];
|
|
182
|
+
nonRetryableStatuses: readonly number[];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* デフォルトリトライ設定値
|
|
186
|
+
*/
|
|
187
|
+
export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
|
|
188
|
+
/**
|
|
189
|
+
* MCPツール結果型
|
|
190
|
+
*/
|
|
191
|
+
export interface McpToolResult {
|
|
192
|
+
content: Array<{
|
|
193
|
+
type: "text";
|
|
194
|
+
text: string;
|
|
195
|
+
}>;
|
|
196
|
+
isError?: boolean;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* エラー種別列挙型
|
|
200
|
+
*/
|
|
201
|
+
export declare enum ErrorType {
|
|
202
|
+
AUTH_ERROR = "\u8A8D\u8A3C\u30A8\u30E9\u30FC",
|
|
203
|
+
TIMEOUT = "\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8",
|
|
204
|
+
CONNECTION_ERROR = "\u63A5\u7D9A\u30A8\u30E9\u30FC",
|
|
205
|
+
API_ERROR = "API\u30A8\u30E9\u30FC",
|
|
206
|
+
VALIDATION_ERROR = "\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u30A8\u30E9\u30FC"
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rokadoc MCPサーバー 型定義
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* デフォルトリトライ設定値
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_RETRY_CONFIG = {
|
|
8
|
+
maxRetries: 3,
|
|
9
|
+
retryDelay: 2000,
|
|
10
|
+
retryableStatuses: [500, 502, 503, 504],
|
|
11
|
+
nonRetryableStatuses: [400, 401, 403, 404, 409, 422],
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* エラー種別列挙型
|
|
15
|
+
*/
|
|
16
|
+
export var ErrorType;
|
|
17
|
+
(function (ErrorType) {
|
|
18
|
+
ErrorType["AUTH_ERROR"] = "\u8A8D\u8A3C\u30A8\u30E9\u30FC";
|
|
19
|
+
ErrorType["TIMEOUT"] = "\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8";
|
|
20
|
+
ErrorType["CONNECTION_ERROR"] = "\u63A5\u7D9A\u30A8\u30E9\u30FC";
|
|
21
|
+
ErrorType["API_ERROR"] = "API\u30A8\u30E9\u30FC";
|
|
22
|
+
ErrorType["VALIDATION_ERROR"] = "\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u30A8\u30E9\u30FC";
|
|
23
|
+
})(ErrorType || (ErrorType = {}));
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6MH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,IAAI;IAChB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACvC,oBAAoB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC5C,CAAC;AAYX;;GAEG;AACH,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,0DAAoB,CAAA;IACpB,6DAAkB,CAAA;IAClB,gEAA0B,CAAA;IAC1B,gDAAoB,CAAA;IACpB,8FAA+B,CAAA;AACjC,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラーハンドリング・フォーマット
|
|
3
|
+
*
|
|
4
|
+
* HTTPステータスコードに基づくエラー分類、MCP形式エラーレスポンス生成、
|
|
5
|
+
* およびAPI Key値のサニタイズ処理を提供する。
|
|
6
|
+
*/
|
|
7
|
+
import { ErrorType, McpToolResult } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* API Key値をエラーメッセージから除去するサニタイズ処理
|
|
10
|
+
* @param message - サニタイズ対象の文字列
|
|
11
|
+
* @param apiKey - 除去対象のAPI Key値
|
|
12
|
+
* @returns API Key値が "***" に置換された文字列
|
|
13
|
+
*/
|
|
14
|
+
export declare function sanitizeApiKey(message: string, apiKey: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* MCP形式のエラーレスポンスを生成する
|
|
17
|
+
*
|
|
18
|
+
* メッセージ構造: [エラー種別] 説明文\n---\n詳細情報\n---\n対処法
|
|
19
|
+
*
|
|
20
|
+
* @param type - エラー種別(ErrorType列挙型の値)
|
|
21
|
+
* @param message - エラー説明文(詳細情報と対処法を含む場合は "\n---\n" で区切る)
|
|
22
|
+
* @returns isError: true を含むMcpToolResult
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatMcpError(type: ErrorType, message: string): McpToolResult;
|
|
25
|
+
/**
|
|
26
|
+
* 未知のエラーをHTTPステータスコードに基づいて分類し、
|
|
27
|
+
* MCP形式のエラーレスポンスを生成する
|
|
28
|
+
*
|
|
29
|
+
* 分類ルール:
|
|
30
|
+
* - HTTP 401/403 → 認証エラー
|
|
31
|
+
* - タイムアウト(AbortError、"timeout"含むメッセージ) → タイムアウト
|
|
32
|
+
* - DNS/TCP失敗(ECONNREFUSED, ENOTFOUND等) → 接続エラー
|
|
33
|
+
* - その他4xx/5xx → APIエラー(ステータスコード + ボディ先頭500文字)
|
|
34
|
+
* - その他 → APIエラー
|
|
35
|
+
*
|
|
36
|
+
* @param error - 分類対象のエラー(unknown型)
|
|
37
|
+
* @returns MCP形式エラーレスポンス
|
|
38
|
+
*/
|
|
39
|
+
export declare function handleApiError(error: unknown): McpToolResult;
|
|
40
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,GACd,aAAa,CAMf;AAqID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CA6C5D"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラーハンドリング・フォーマット
|
|
3
|
+
*
|
|
4
|
+
* HTTPステータスコードに基づくエラー分類、MCP形式エラーレスポンス生成、
|
|
5
|
+
* およびAPI Key値のサニタイズ処理を提供する。
|
|
6
|
+
*/
|
|
7
|
+
import { ErrorType } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* API Key値をエラーメッセージから除去するサニタイズ処理
|
|
10
|
+
* @param message - サニタイズ対象の文字列
|
|
11
|
+
* @param apiKey - 除去対象のAPI Key値
|
|
12
|
+
* @returns API Key値が "***" に置換された文字列
|
|
13
|
+
*/
|
|
14
|
+
export function sanitizeApiKey(message, apiKey) {
|
|
15
|
+
if (!apiKey) {
|
|
16
|
+
return message;
|
|
17
|
+
}
|
|
18
|
+
// グローバル置換で全出現箇所をマスク
|
|
19
|
+
return message.split(apiKey).join("***");
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* MCP形式のエラーレスポンスを生成する
|
|
23
|
+
*
|
|
24
|
+
* メッセージ構造: [エラー種別] 説明文\n---\n詳細情報\n---\n対処法
|
|
25
|
+
*
|
|
26
|
+
* @param type - エラー種別(ErrorType列挙型の値)
|
|
27
|
+
* @param message - エラー説明文(詳細情報と対処法を含む場合は "\n---\n" で区切る)
|
|
28
|
+
* @returns isError: true を含むMcpToolResult
|
|
29
|
+
*/
|
|
30
|
+
export function formatMcpError(type, message) {
|
|
31
|
+
const formattedMessage = `[${type}] ${message}`;
|
|
32
|
+
return {
|
|
33
|
+
content: [{ type: "text", text: formattedMessage }],
|
|
34
|
+
isError: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 未知のエラーからHTTPステータスコードを抽出する
|
|
39
|
+
*/
|
|
40
|
+
function getStatusCode(error) {
|
|
41
|
+
if (error && typeof error === "object") {
|
|
42
|
+
// response.status パターン(fetch API等)
|
|
43
|
+
if ("response" in error) {
|
|
44
|
+
const response = error.response;
|
|
45
|
+
if (response && typeof response === "object" && "status" in response) {
|
|
46
|
+
const status = response.status;
|
|
47
|
+
if (typeof status === "number") {
|
|
48
|
+
return status;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// status プロパティ直接保持パターン
|
|
53
|
+
if ("status" in error) {
|
|
54
|
+
const status = error.status;
|
|
55
|
+
if (typeof status === "number") {
|
|
56
|
+
return status;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// statusCode プロパティパターン
|
|
60
|
+
if ("statusCode" in error) {
|
|
61
|
+
const statusCode = error.statusCode;
|
|
62
|
+
if (typeof statusCode === "number") {
|
|
63
|
+
return statusCode;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* エラーからレスポンスボディ(先頭500文字)を抽出する
|
|
71
|
+
*/
|
|
72
|
+
function getResponseBody(error) {
|
|
73
|
+
if (error && typeof error === "object") {
|
|
74
|
+
// response.data パターン
|
|
75
|
+
if ("response" in error) {
|
|
76
|
+
const response = error.response;
|
|
77
|
+
if (response && typeof response === "object") {
|
|
78
|
+
if ("data" in response) {
|
|
79
|
+
const data = response.data;
|
|
80
|
+
const text = typeof data === "string" ? data : JSON.stringify(data);
|
|
81
|
+
return text.slice(0, 500);
|
|
82
|
+
}
|
|
83
|
+
if ("body" in response) {
|
|
84
|
+
const body = response.body;
|
|
85
|
+
const text = typeof body === "string" ? body : JSON.stringify(body);
|
|
86
|
+
return text.slice(0, 500);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// body プロパティ直接保持パターン
|
|
91
|
+
if ("body" in error) {
|
|
92
|
+
const body = error.body;
|
|
93
|
+
const text = typeof body === "string" ? body : JSON.stringify(body);
|
|
94
|
+
return text.slice(0, 500);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return "";
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* エラーメッセージ文字列を取得する
|
|
101
|
+
*/
|
|
102
|
+
function getErrorMessage(error) {
|
|
103
|
+
if (error instanceof Error) {
|
|
104
|
+
return error.message;
|
|
105
|
+
}
|
|
106
|
+
if (typeof error === "string") {
|
|
107
|
+
return error;
|
|
108
|
+
}
|
|
109
|
+
return String(error);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* タイムアウトエラーかどうかを判定する
|
|
113
|
+
*/
|
|
114
|
+
function isTimeoutError(error) {
|
|
115
|
+
if (error instanceof Error) {
|
|
116
|
+
// AbortError(fetch API のタイムアウト)
|
|
117
|
+
if (error.name === "AbortError") {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
// メッセージに "timeout" を含む
|
|
121
|
+
if (error.message.toLowerCase().includes("timeout")) {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
126
|
+
const code = error.code;
|
|
127
|
+
if (code === "ETIMEDOUT" || code === "ESOCKETTIMEDOUT") {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* ネットワーク接続エラーかどうかを判定する
|
|
135
|
+
*/
|
|
136
|
+
function isConnectionError(error) {
|
|
137
|
+
if (error instanceof Error) {
|
|
138
|
+
const message = error.message.toLowerCase();
|
|
139
|
+
if (message.includes("econnrefused") ||
|
|
140
|
+
message.includes("enotfound") ||
|
|
141
|
+
message.includes("dns") ||
|
|
142
|
+
message.includes("getaddrinfo") ||
|
|
143
|
+
message.includes("enetunreach") ||
|
|
144
|
+
message.includes("ehostunreach")) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
149
|
+
const code = error.code;
|
|
150
|
+
if (code === "ECONNREFUSED" ||
|
|
151
|
+
code === "ENOTFOUND" ||
|
|
152
|
+
code === "ENETUNREACH" ||
|
|
153
|
+
code === "EHOSTUNREACH") {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 未知のエラーをHTTPステータスコードに基づいて分類し、
|
|
161
|
+
* MCP形式のエラーレスポンスを生成する
|
|
162
|
+
*
|
|
163
|
+
* 分類ルール:
|
|
164
|
+
* - HTTP 401/403 → 認証エラー
|
|
165
|
+
* - タイムアウト(AbortError、"timeout"含むメッセージ) → タイムアウト
|
|
166
|
+
* - DNS/TCP失敗(ECONNREFUSED, ENOTFOUND等) → 接続エラー
|
|
167
|
+
* - その他4xx/5xx → APIエラー(ステータスコード + ボディ先頭500文字)
|
|
168
|
+
* - その他 → APIエラー
|
|
169
|
+
*
|
|
170
|
+
* @param error - 分類対象のエラー(unknown型)
|
|
171
|
+
* @returns MCP形式エラーレスポンス
|
|
172
|
+
*/
|
|
173
|
+
export function handleApiError(error) {
|
|
174
|
+
// HTTPステータスコードベースの判定
|
|
175
|
+
const statusCode = getStatusCode(error);
|
|
176
|
+
if (statusCode !== undefined) {
|
|
177
|
+
// 認証エラー: HTTP 401/403
|
|
178
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
179
|
+
return formatMcpError(ErrorType.AUTH_ERROR, `rokadoc APIへの認証に失敗しました。\n---\nHTTP ${statusCode} ${statusCode === 401 ? "Unauthorized" : "Forbidden"}\n---\n環境変数 ROKADOC_API_KEY に設定されたAPIキーが正しいことを確認してください。`);
|
|
180
|
+
}
|
|
181
|
+
// その他 4xx/5xx → APIエラー
|
|
182
|
+
if (statusCode >= 400) {
|
|
183
|
+
const body = getResponseBody(error);
|
|
184
|
+
const bodyInfo = body ? `\nレスポンスボディ: ${body}` : "";
|
|
185
|
+
return formatMcpError(ErrorType.API_ERROR, `rokadoc APIがエラーを返却しました。\n---\nHTTP ${statusCode}${bodyInfo}\n---\nリクエスト内容を確認し、再度お試しください。`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// タイムアウトエラー
|
|
189
|
+
if (isTimeoutError(error)) {
|
|
190
|
+
return formatMcpError(ErrorType.TIMEOUT, `rokadoc APIへの接続がタイムアウトしました。\n---\n${getErrorMessage(error)}\n---\n環境変数 ROKADOC_BASE_URL に設定された接続先URLが正しいことを確認してください。`);
|
|
191
|
+
}
|
|
192
|
+
// 接続エラー(DNS/TCP)
|
|
193
|
+
if (isConnectionError(error)) {
|
|
194
|
+
return formatMcpError(ErrorType.CONNECTION_ERROR, `rokadoc APIへの接続に失敗しました。\n---\n${getErrorMessage(error)}\n---\nネットワーク接続および ROKADOC_BASE_URL に設定されたURLが正しいことを確認してください。`);
|
|
195
|
+
}
|
|
196
|
+
// その他のエラー → APIエラーとして処理
|
|
197
|
+
return formatMcpError(ErrorType.API_ERROR, `予期しないエラーが発生しました。\n---\n${getErrorMessage(error)}\n---\nエラーが継続する場合は、設定とネットワーク接続を確認してください。`);
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL検証・正規化ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* rokadoc MCPサーバーのBase URL検証、正規化、
|
|
5
|
+
* およびリクエスト送信先のホスト制限チェックを提供する。
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Base URLを正規化する。
|
|
9
|
+
* - 末尾スラッシュを除去する
|
|
10
|
+
* - "http://" スキームを "https://" に変換し、標準エラー出力に警告を出力する
|
|
11
|
+
*
|
|
12
|
+
* @param url - 正規化対象のURL文字列
|
|
13
|
+
* @returns 正規化済みのURL文字列
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizeBaseUrl(url: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* URL形式を検証する。
|
|
18
|
+
* "http://" または "https://" で始まる場合のみ有効とする。
|
|
19
|
+
*
|
|
20
|
+
* @param url - 検証対象のURL文字列
|
|
21
|
+
* @returns URL形式が有効であればtrue、そうでなければfalse
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateUrlFormat(url: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* リクエストURLのホストがBase URLのホストと一致するかを検証する。
|
|
26
|
+
* 送信先をBase URLのホストのみに制限するためのセキュリティチェック。
|
|
27
|
+
*
|
|
28
|
+
* @param requestUrl - リクエスト送信先のURL文字列
|
|
29
|
+
* @param baseUrl - 許可されたBase URL文字列
|
|
30
|
+
* @returns ホストが一致すればtrue、そうでなければfalse
|
|
31
|
+
*/
|
|
32
|
+
export declare function isAllowedHost(requestUrl: string, baseUrl: string): boolean;
|
|
33
|
+
//# sourceMappingURL=url-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-validator.d.ts","sourceRoot":"","sources":["../../src/utils/url-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAepD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAS1E"}
|