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.
Files changed (47) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +218 -0
  3. package/dist/config.d.ts +19 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +49 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +34 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/server.d.ts +31 -0
  12. package/dist/server.d.ts.map +1 -0
  13. package/dist/server.js +149 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/services/rokadoc-client.d.ts +97 -0
  16. package/dist/services/rokadoc-client.d.ts.map +1 -0
  17. package/dist/services/rokadoc-client.js +230 -0
  18. package/dist/services/rokadoc-client.js.map +1 -0
  19. package/dist/tools/convert-document.d.ts +32 -0
  20. package/dist/tools/convert-document.d.ts.map +1 -0
  21. package/dist/tools/convert-document.js +91 -0
  22. package/dist/tools/convert-document.js.map +1 -0
  23. package/dist/tools/get-conversion-result.d.ts +33 -0
  24. package/dist/tools/get-conversion-result.d.ts.map +1 -0
  25. package/dist/tools/get-conversion-result.js +84 -0
  26. package/dist/tools/get-conversion-result.js.map +1 -0
  27. package/dist/tools/list-conversions.d.ts +31 -0
  28. package/dist/tools/list-conversions.d.ts.map +1 -0
  29. package/dist/tools/list-conversions.js +68 -0
  30. package/dist/tools/list-conversions.js.map +1 -0
  31. package/dist/tools/search-documents.d.ts +39 -0
  32. package/dist/tools/search-documents.d.ts.map +1 -0
  33. package/dist/tools/search-documents.js +81 -0
  34. package/dist/tools/search-documents.js.map +1 -0
  35. package/dist/types.d.ts +208 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +24 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/error-handler.d.ts +40 -0
  40. package/dist/utils/error-handler.d.ts.map +1 -0
  41. package/dist/utils/error-handler.js +199 -0
  42. package/dist/utils/error-handler.js.map +1 -0
  43. package/dist/utils/url-validator.d.ts +33 -0
  44. package/dist/utils/url-validator.d.ts.map +1 -0
  45. package/dist/utils/url-validator.js +55 -0
  46. package/dist/utils/url-validator.js.map +1 -0
  47. 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":"AAAA;;;;;;;;;GASG;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;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAA2B,EAC3B,MAAwB;IAExB,8CAA8C;IAC9C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,cAAc,CACnB,SAAS,CAAC,gBAAgB,EAC1B,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,IAAI,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;IAErC,6CAA6C;IAC7C,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,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE;YACxD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;YACnC,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,aAAa,EAAE,CAAC,CAAC,QAAQ;YACzB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACxE;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -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":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,kBAAkB;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;QACpE,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;KACpC,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,KAAK,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YACxB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC,CAAC;QACH,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,KAAK,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YACxB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC,CAAC;QACH,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS;IACT,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAID;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,EAAE,CAAC;CACf;AAID;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAKzB,CAAC;AAIX;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,oBAAY,SAAS;IACnB,UAAU,mCAAU;IACpB,OAAO,yCAAW;IAClB,gBAAgB,mCAAU;IAC1B,SAAS,0BAAW;IACpB,gBAAgB,iEAAe;CAChC"}
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"}