mcp-local-rag 0.1.4 → 0.2.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/README.md +26 -6
- package/dist/embedder/index.d.ts +6 -0
- package/dist/embedder/index.d.ts.map +1 -1
- package/dist/embedder/index.js +34 -7
- package/dist/embedder/index.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +49 -1
- package/dist/server/index.js.map +1 -1
- package/dist/vectordb/index.js +2 -2
- package/dist/vectordb/index.js.map +1 -1
- package/package.json +2 -4
- package/dist/chunker.d.ts +0 -42
- package/dist/chunker.d.ts.map +0 -1
- package/dist/chunker.js +0 -68
- package/dist/chunker.js.map +0 -1
- package/dist/embedder.d.ts +0 -48
- package/dist/embedder.d.ts.map +0 -1
- package/dist/embedder.js +0 -108
- package/dist/embedder.js.map +0 -1
- package/dist/parser.d.ts +0 -92
- package/dist/parser.d.ts.map +0 -1
- package/dist/parser.js +0 -186
- package/dist/parser.js.map +0 -1
- package/dist/server.d.ts +0 -125
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -300
- package/dist/server.js.map +0 -1
- package/dist/test-helpers/test-data.d.ts +0 -31
- package/dist/test-helpers/test-data.d.ts.map +0 -1
- package/dist/test-helpers/test-data.js +0 -53
- package/dist/test-helpers/test-data.js.map +0 -1
- package/dist/test-helpers/test-utils.d.ts +0 -21
- package/dist/test-helpers/test-utils.d.ts.map +0 -1
- package/dist/test-helpers/test-utils.js +0 -35
- package/dist/test-helpers/test-utils.js.map +0 -1
- package/dist/vectordb.d.ts +0 -121
- package/dist/vectordb.d.ts.map +0 -1
- package/dist/vectordb.js +0 -243
- package/dist/vectordb.js.map +0 -1
package/dist/embedder.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// src/embedder.ts - Embedder implementation with Transformers.js
|
|
3
|
-
// Design Doc: rag-mcp-server-design.md (v1.1)
|
|
4
|
-
// ADR-0002: Transformers.js選定とエンベディング戦略
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Embedder = exports.EmbeddingError = void 0;
|
|
7
|
-
const transformers_1 = require("@xenova/transformers");
|
|
8
|
-
// ============================================
|
|
9
|
-
// エラークラス
|
|
10
|
-
// ============================================
|
|
11
|
-
/**
|
|
12
|
-
* 埋め込み生成エラー
|
|
13
|
-
*/
|
|
14
|
-
class EmbeddingError extends Error {
|
|
15
|
-
constructor(message, cause) {
|
|
16
|
-
super(message);
|
|
17
|
-
this.cause = cause;
|
|
18
|
-
this.name = 'EmbeddingError';
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
exports.EmbeddingError = EmbeddingError;
|
|
22
|
-
// ============================================
|
|
23
|
-
// Embedderクラス
|
|
24
|
-
// ============================================
|
|
25
|
-
/**
|
|
26
|
-
* Transformers.jsを活用した埋め込み生成クラス
|
|
27
|
-
*
|
|
28
|
-
* 責務:
|
|
29
|
-
* - 埋め込みベクトル生成(384次元)
|
|
30
|
-
* - Transformers.jsラッパー
|
|
31
|
-
* - バッチ処理(サイズ8)
|
|
32
|
-
*/
|
|
33
|
-
class Embedder {
|
|
34
|
-
constructor(config) {
|
|
35
|
-
this.model = null;
|
|
36
|
-
this.config = config;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Transformers.jsモデルを初期化する
|
|
40
|
-
*/
|
|
41
|
-
async initialize() {
|
|
42
|
-
try {
|
|
43
|
-
console.log(`Embedder: モデル "${this.config.modelPath}" をロード中...`);
|
|
44
|
-
this.model = await (0, transformers_1.pipeline)('feature-extraction', this.config.modelPath);
|
|
45
|
-
console.log('Embedder: モデルのロードが完了しました');
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
throw new EmbeddingError(`Failed to initialize Embedder: ${error.message}`, error);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 単一のテキストを埋め込みベクトルに変換する
|
|
53
|
-
*
|
|
54
|
-
* @param text - テキスト
|
|
55
|
-
* @returns 384次元のベクトル
|
|
56
|
-
*/
|
|
57
|
-
async embed(text) {
|
|
58
|
-
if (!this.model) {
|
|
59
|
-
throw new EmbeddingError('Embedder is not initialized. Call initialize() first.');
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
// 空文字列の場合、ゼロベクトルを返す
|
|
63
|
-
if (text.length === 0) {
|
|
64
|
-
return new Array(384).fill(0);
|
|
65
|
-
}
|
|
66
|
-
// Transformers.jsの複雑な型定義を回避するため、型アサーションを使用
|
|
67
|
-
// これは外部ライブラリの型定義の制約によるものであり、実行時の動作は保証されている
|
|
68
|
-
const options = { pooling: 'mean', normalize: true };
|
|
69
|
-
const modelCall = this.model;
|
|
70
|
-
const output = await modelCall(text, options);
|
|
71
|
-
// .data プロパティで生データにアクセス
|
|
72
|
-
const embedding = Array.from(output.data);
|
|
73
|
-
return embedding;
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
throw new EmbeddingError(`Failed to generate embedding: ${error.message}`, error);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* 複数のテキストをバッチ処理で埋め込みベクトルに変換する
|
|
81
|
-
*
|
|
82
|
-
* @param texts - テキストの配列
|
|
83
|
-
* @returns 384次元のベクトルの配列
|
|
84
|
-
*/
|
|
85
|
-
async embedBatch(texts) {
|
|
86
|
-
if (!this.model) {
|
|
87
|
-
throw new EmbeddingError('Embedder is not initialized. Call initialize() first.');
|
|
88
|
-
}
|
|
89
|
-
if (texts.length === 0) {
|
|
90
|
-
return [];
|
|
91
|
-
}
|
|
92
|
-
try {
|
|
93
|
-
const embeddings = [];
|
|
94
|
-
// バッチサイズごとに分割して処理
|
|
95
|
-
for (let i = 0; i < texts.length; i += this.config.batchSize) {
|
|
96
|
-
const batch = texts.slice(i, i + this.config.batchSize);
|
|
97
|
-
const batchEmbeddings = await Promise.all(batch.map((text) => this.embed(text)));
|
|
98
|
-
embeddings.push(...batchEmbeddings);
|
|
99
|
-
}
|
|
100
|
-
return embeddings;
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
throw new EmbeddingError(`Failed to generate batch embeddings: ${error.message}`, error);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
exports.Embedder = Embedder;
|
|
108
|
-
//# sourceMappingURL=embedder.js.map
|
package/dist/embedder.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DocumentParser設定
|
|
3
|
-
*/
|
|
4
|
-
export interface ParserConfig {
|
|
5
|
-
/** セキュリティ: 許可されたベースディレクトリ */
|
|
6
|
-
baseDir: string;
|
|
7
|
-
/** 最大ファイルサイズ(100MB) */
|
|
8
|
-
maxFileSize: number;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* バリデーションエラー(400相当)
|
|
12
|
-
*/
|
|
13
|
-
export declare class ValidationError extends Error {
|
|
14
|
-
readonly cause?: Error | undefined;
|
|
15
|
-
constructor(message: string, cause?: Error | undefined);
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* ファイル操作エラー(500相当)
|
|
19
|
-
*/
|
|
20
|
-
export declare class FileOperationError extends Error {
|
|
21
|
-
readonly cause?: Error | undefined;
|
|
22
|
-
constructor(message: string, cause?: Error | undefined);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* ドキュメントパーサークラス(PDF/DOCX/TXT/MD対応)
|
|
26
|
-
*
|
|
27
|
-
* 責務:
|
|
28
|
-
* - ファイルパス検証(パストラバーサル防止)
|
|
29
|
-
* - ファイルサイズ検証(100MB制限)
|
|
30
|
-
* - 4形式パース(PDF/DOCX/TXT/MD)
|
|
31
|
-
*/
|
|
32
|
-
export declare class DocumentParser {
|
|
33
|
-
private readonly config;
|
|
34
|
-
constructor(config: ParserConfig);
|
|
35
|
-
/**
|
|
36
|
-
* ファイルパス検証(パストラバーサル防止)
|
|
37
|
-
*
|
|
38
|
-
* @param filePath - 検証対象のファイルパス
|
|
39
|
-
* @throws ValidationError - パストラバーサル攻撃検出時
|
|
40
|
-
*/
|
|
41
|
-
validateFilePath(filePath: string): void;
|
|
42
|
-
/**
|
|
43
|
-
* ファイルサイズ検証(100MB制限)
|
|
44
|
-
*
|
|
45
|
-
* @param filePath - 検証対象のファイルパス
|
|
46
|
-
* @throws ValidationError - ファイルサイズ超過時
|
|
47
|
-
* @throws FileOperationError - ファイル読み込み失敗時
|
|
48
|
-
*/
|
|
49
|
-
validateFileSize(filePath: string): void;
|
|
50
|
-
/**
|
|
51
|
-
* ファイルパース(フォーマット自動判定)
|
|
52
|
-
*
|
|
53
|
-
* @param filePath - パース対象のファイルパス
|
|
54
|
-
* @returns パースされたテキスト
|
|
55
|
-
* @throws ValidationError - パストラバーサル、サイズ超過、未対応フォーマット
|
|
56
|
-
* @throws FileOperationError - ファイル読み込み失敗、パース失敗
|
|
57
|
-
*/
|
|
58
|
-
parseFile(filePath: string): Promise<string>;
|
|
59
|
-
/**
|
|
60
|
-
* PDFパース(pdf-parse v2使用)
|
|
61
|
-
*
|
|
62
|
-
* @param filePath - PDFファイルパス
|
|
63
|
-
* @returns パースされたテキスト
|
|
64
|
-
* @throws FileOperationError - ファイル読み込み失敗、パース失敗
|
|
65
|
-
*/
|
|
66
|
-
private parsePdf;
|
|
67
|
-
/**
|
|
68
|
-
* DOCXパース(mammoth使用)
|
|
69
|
-
*
|
|
70
|
-
* @param filePath - DOCXファイルパス
|
|
71
|
-
* @returns パースされたテキスト
|
|
72
|
-
* @throws FileOperationError - ファイル読み込み失敗、パース失敗
|
|
73
|
-
*/
|
|
74
|
-
private parseDocx;
|
|
75
|
-
/**
|
|
76
|
-
* TXTパース(fs.readFile使用)
|
|
77
|
-
*
|
|
78
|
-
* @param filePath - TXTファイルパス
|
|
79
|
-
* @returns パースされたテキスト
|
|
80
|
-
* @throws FileOperationError - ファイル読み込み失敗
|
|
81
|
-
*/
|
|
82
|
-
private parseTxt;
|
|
83
|
-
/**
|
|
84
|
-
* MDパース(fs.readFile使用)
|
|
85
|
-
*
|
|
86
|
-
* @param filePath - MDファイルパス
|
|
87
|
-
* @returns パースされたテキスト
|
|
88
|
-
* @throws FileOperationError - ファイル読み込み失敗
|
|
89
|
-
*/
|
|
90
|
-
private parseMd;
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=parser.d.ts.map
|
package/dist/parser.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAMD;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,EAAE,YAAY;IAIhC;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASxC;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgBxC;;;;;;;OAOG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBlD;;;;;;OAMG;YACW,QAAQ;IAYtB;;;;;;OAMG;YACW,SAAS;IAUvB;;;;;;OAMG;YACW,QAAQ;IAUtB;;;;;;OAMG;YACW,OAAO;CAStB"}
|
package/dist/parser.js
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// src/parser.ts - DocumentParser implementation with PDF/DOCX/TXT/MD support
|
|
3
|
-
// Design Doc: rag-mcp-server-design.md (v1.1)
|
|
4
|
-
// Task: TASK-005, TASK-008
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.DocumentParser = exports.FileOperationError = exports.ValidationError = void 0;
|
|
10
|
-
const node_fs_1 = require("node:fs");
|
|
11
|
-
const promises_1 = require("node:fs/promises");
|
|
12
|
-
const node_path_1 = require("node:path");
|
|
13
|
-
const pdf_parse_1 = require("pdf-parse");
|
|
14
|
-
const mammoth_1 = __importDefault(require("mammoth"));
|
|
15
|
-
/**
|
|
16
|
-
* バリデーションエラー(400相当)
|
|
17
|
-
*/
|
|
18
|
-
class ValidationError extends Error {
|
|
19
|
-
constructor(message, cause) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.cause = cause;
|
|
22
|
-
this.name = 'ValidationError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.ValidationError = ValidationError;
|
|
26
|
-
/**
|
|
27
|
-
* ファイル操作エラー(500相当)
|
|
28
|
-
*/
|
|
29
|
-
class FileOperationError extends Error {
|
|
30
|
-
constructor(message, cause) {
|
|
31
|
-
super(message);
|
|
32
|
-
this.cause = cause;
|
|
33
|
-
this.name = 'FileOperationError';
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
exports.FileOperationError = FileOperationError;
|
|
37
|
-
// ============================================
|
|
38
|
-
// DocumentParserクラス
|
|
39
|
-
// ============================================
|
|
40
|
-
/**
|
|
41
|
-
* ドキュメントパーサークラス(PDF/DOCX/TXT/MD対応)
|
|
42
|
-
*
|
|
43
|
-
* 責務:
|
|
44
|
-
* - ファイルパス検証(パストラバーサル防止)
|
|
45
|
-
* - ファイルサイズ検証(100MB制限)
|
|
46
|
-
* - 4形式パース(PDF/DOCX/TXT/MD)
|
|
47
|
-
*/
|
|
48
|
-
class DocumentParser {
|
|
49
|
-
constructor(config) {
|
|
50
|
-
this.config = config;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* ファイルパス検証(パストラバーサル防止)
|
|
54
|
-
*
|
|
55
|
-
* @param filePath - 検証対象のファイルパス
|
|
56
|
-
* @throws ValidationError - パストラバーサル攻撃検出時
|
|
57
|
-
*/
|
|
58
|
-
validateFilePath(filePath) {
|
|
59
|
-
const resolvedPath = (0, node_path_1.resolve)(this.config.baseDir, filePath);
|
|
60
|
-
const baseDir = (0, node_path_1.resolve)(this.config.baseDir);
|
|
61
|
-
if (!resolvedPath.startsWith(baseDir)) {
|
|
62
|
-
throw new ValidationError(`Path traversal detected: ${filePath}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* ファイルサイズ検証(100MB制限)
|
|
67
|
-
*
|
|
68
|
-
* @param filePath - 検証対象のファイルパス
|
|
69
|
-
* @throws ValidationError - ファイルサイズ超過時
|
|
70
|
-
* @throws FileOperationError - ファイル読み込み失敗時
|
|
71
|
-
*/
|
|
72
|
-
validateFileSize(filePath) {
|
|
73
|
-
try {
|
|
74
|
-
const stats = (0, node_fs_1.statSync)(filePath);
|
|
75
|
-
if (stats.size > this.config.maxFileSize) {
|
|
76
|
-
throw new ValidationError(`File size exceeds limit: ${stats.size} > ${this.config.maxFileSize}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
if (error instanceof ValidationError) {
|
|
81
|
-
throw error;
|
|
82
|
-
}
|
|
83
|
-
throw new FileOperationError(`Failed to check file size: ${filePath}`, error);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* ファイルパース(フォーマット自動判定)
|
|
88
|
-
*
|
|
89
|
-
* @param filePath - パース対象のファイルパス
|
|
90
|
-
* @returns パースされたテキスト
|
|
91
|
-
* @throws ValidationError - パストラバーサル、サイズ超過、未対応フォーマット
|
|
92
|
-
* @throws FileOperationError - ファイル読み込み失敗、パース失敗
|
|
93
|
-
*/
|
|
94
|
-
async parseFile(filePath) {
|
|
95
|
-
// バリデーション
|
|
96
|
-
this.validateFilePath(filePath);
|
|
97
|
-
const resolvedPath = (0, node_path_1.resolve)(this.config.baseDir, filePath);
|
|
98
|
-
this.validateFileSize(resolvedPath);
|
|
99
|
-
// フォーマット判定
|
|
100
|
-
const ext = (0, node_path_1.extname)(resolvedPath).toLowerCase();
|
|
101
|
-
switch (ext) {
|
|
102
|
-
case '.pdf':
|
|
103
|
-
return await this.parsePdf(resolvedPath);
|
|
104
|
-
case '.docx':
|
|
105
|
-
return await this.parseDocx(resolvedPath);
|
|
106
|
-
case '.txt':
|
|
107
|
-
return await this.parseTxt(resolvedPath);
|
|
108
|
-
case '.md':
|
|
109
|
-
return await this.parseMd(resolvedPath);
|
|
110
|
-
default:
|
|
111
|
-
throw new ValidationError(`Unsupported file format: ${ext}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* PDFパース(pdf-parse v2使用)
|
|
116
|
-
*
|
|
117
|
-
* @param filePath - PDFファイルパス
|
|
118
|
-
* @returns パースされたテキスト
|
|
119
|
-
* @throws FileOperationError - ファイル読み込み失敗、パース失敗
|
|
120
|
-
*/
|
|
121
|
-
async parsePdf(filePath) {
|
|
122
|
-
try {
|
|
123
|
-
const buffer = await (0, promises_1.readFile)(filePath);
|
|
124
|
-
const parser = new pdf_parse_1.PDFParse({ data: buffer });
|
|
125
|
-
const result = await parser.getText();
|
|
126
|
-
console.log(`Parsed PDF: ${filePath} (${result.text.length} characters)`);
|
|
127
|
-
return result.text;
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
throw new FileOperationError(`Failed to parse PDF: ${filePath}`, error);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* DOCXパース(mammoth使用)
|
|
135
|
-
*
|
|
136
|
-
* @param filePath - DOCXファイルパス
|
|
137
|
-
* @returns パースされたテキスト
|
|
138
|
-
* @throws FileOperationError - ファイル読み込み失敗、パース失敗
|
|
139
|
-
*/
|
|
140
|
-
async parseDocx(filePath) {
|
|
141
|
-
try {
|
|
142
|
-
const result = await mammoth_1.default.extractRawText({ path: filePath });
|
|
143
|
-
console.log(`Parsed DOCX: ${filePath} (${result.value.length} characters)`);
|
|
144
|
-
return result.value;
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
throw new FileOperationError(`Failed to parse DOCX: ${filePath}`, error);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* TXTパース(fs.readFile使用)
|
|
152
|
-
*
|
|
153
|
-
* @param filePath - TXTファイルパス
|
|
154
|
-
* @returns パースされたテキスト
|
|
155
|
-
* @throws FileOperationError - ファイル読み込み失敗
|
|
156
|
-
*/
|
|
157
|
-
async parseTxt(filePath) {
|
|
158
|
-
try {
|
|
159
|
-
const text = await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
160
|
-
console.log(`Parsed TXT: ${filePath} (${text.length} characters)`);
|
|
161
|
-
return text;
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
throw new FileOperationError(`Failed to parse TXT: ${filePath}`, error);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* MDパース(fs.readFile使用)
|
|
169
|
-
*
|
|
170
|
-
* @param filePath - MDファイルパス
|
|
171
|
-
* @returns パースされたテキスト
|
|
172
|
-
* @throws FileOperationError - ファイル読み込み失敗
|
|
173
|
-
*/
|
|
174
|
-
async parseMd(filePath) {
|
|
175
|
-
try {
|
|
176
|
-
const text = await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
177
|
-
console.log(`Parsed MD: ${filePath} (${text.length} characters)`);
|
|
178
|
-
return text;
|
|
179
|
-
}
|
|
180
|
-
catch (error) {
|
|
181
|
-
throw new FileOperationError(`Failed to parse MD: ${filePath}`, error);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
exports.DocumentParser = DocumentParser;
|
|
186
|
-
//# sourceMappingURL=parser.js.map
|
package/dist/parser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAGServer設定
|
|
3
|
-
*/
|
|
4
|
-
export interface RAGServerConfig {
|
|
5
|
-
/** LanceDBデータベースパス */
|
|
6
|
-
dbPath: string;
|
|
7
|
-
/** Transformers.jsモデルパス */
|
|
8
|
-
modelName: string;
|
|
9
|
-
/** モデルキャッシュディレクトリ */
|
|
10
|
-
cacheDir: string;
|
|
11
|
-
/** ドキュメントベースディレクトリ */
|
|
12
|
-
baseDir: string;
|
|
13
|
-
/** 最大ファイルサイズ(100MB) */
|
|
14
|
-
maxFileSize: number;
|
|
15
|
-
/** チャンクサイズ */
|
|
16
|
-
chunkSize: number;
|
|
17
|
-
/** チャンクオーバーラップ */
|
|
18
|
-
chunkOverlap: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* query_documentsツール入力
|
|
22
|
-
*/
|
|
23
|
-
export interface QueryDocumentsInput {
|
|
24
|
-
/** 自然言語クエリ */
|
|
25
|
-
query: string;
|
|
26
|
-
/** 取得件数(デフォルト5) */
|
|
27
|
-
limit?: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* ingest_fileツール入力
|
|
31
|
-
*/
|
|
32
|
-
export interface IngestFileInput {
|
|
33
|
-
/** ファイルパス */
|
|
34
|
-
filePath: string;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* ingest_fileツール出力
|
|
38
|
-
*/
|
|
39
|
-
export interface IngestResult {
|
|
40
|
-
/** ファイルパス */
|
|
41
|
-
filePath: string;
|
|
42
|
-
/** チャンク数 */
|
|
43
|
-
chunkCount: number;
|
|
44
|
-
/** タイムスタンプ */
|
|
45
|
-
timestamp: string;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* query_documentsツール出力
|
|
49
|
-
*/
|
|
50
|
-
export interface QueryResult {
|
|
51
|
-
/** ファイルパス */
|
|
52
|
-
filePath: string;
|
|
53
|
-
/** チャンクインデックス */
|
|
54
|
-
chunkIndex: number;
|
|
55
|
-
/** テキスト */
|
|
56
|
-
text: string;
|
|
57
|
-
/** 類似度スコア */
|
|
58
|
-
score: number;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* MCP Protocol準拠のRAGサーバー
|
|
62
|
-
*
|
|
63
|
-
* 責務:
|
|
64
|
-
* - MCPツール統合(4つのツール)
|
|
65
|
-
* - ツールハンドラ実装
|
|
66
|
-
* - エラーハンドリング
|
|
67
|
-
* - 初期化処理(LanceDB、Transformers.js)
|
|
68
|
-
*/
|
|
69
|
-
export declare class RAGServer {
|
|
70
|
-
private readonly server;
|
|
71
|
-
private readonly vectorStore;
|
|
72
|
-
private readonly embedder;
|
|
73
|
-
private readonly chunker;
|
|
74
|
-
private readonly parser;
|
|
75
|
-
constructor(config: RAGServerConfig);
|
|
76
|
-
/**
|
|
77
|
-
* MCPハンドラをセットアップする
|
|
78
|
-
*/
|
|
79
|
-
private setupHandlers;
|
|
80
|
-
/**
|
|
81
|
-
* 初期化処理
|
|
82
|
-
*/
|
|
83
|
-
initialize(): Promise<void>;
|
|
84
|
-
/**
|
|
85
|
-
* query_documentsツールハンドラ
|
|
86
|
-
*/
|
|
87
|
-
handleQueryDocuments(args: QueryDocumentsInput): Promise<{
|
|
88
|
-
content: [{
|
|
89
|
-
type: 'text';
|
|
90
|
-
text: string;
|
|
91
|
-
}];
|
|
92
|
-
}>;
|
|
93
|
-
/**
|
|
94
|
-
* ingest_fileツールハンドラ(ファイル再取り込み対応、トランザクション処理、ロールバック機能)
|
|
95
|
-
*/
|
|
96
|
-
handleIngestFile(args: IngestFileInput): Promise<{
|
|
97
|
-
content: [{
|
|
98
|
-
type: 'text';
|
|
99
|
-
text: string;
|
|
100
|
-
}];
|
|
101
|
-
}>;
|
|
102
|
-
/**
|
|
103
|
-
* list_filesツールハンドラ(Phase 1: 基本実装)
|
|
104
|
-
*/
|
|
105
|
-
handleListFiles(): Promise<{
|
|
106
|
-
content: [{
|
|
107
|
-
type: 'text';
|
|
108
|
-
text: string;
|
|
109
|
-
}];
|
|
110
|
-
}>;
|
|
111
|
-
/**
|
|
112
|
-
* statusツールハンドラ(Phase 1: 基本実装)
|
|
113
|
-
*/
|
|
114
|
-
handleStatus(): Promise<{
|
|
115
|
-
content: [{
|
|
116
|
-
type: 'text';
|
|
117
|
-
text: string;
|
|
118
|
-
}];
|
|
119
|
-
}>;
|
|
120
|
-
/**
|
|
121
|
-
* サーバーを起動する
|
|
122
|
-
*/
|
|
123
|
-
run(): Promise<void>;
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,cAAc;IACd,KAAK,EAAE,MAAM,CAAA;IACb,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAMD;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,eAAe;IAqBnC;;OAEG;IACH,OAAO,CAAC,aAAa;IAgErB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACG,oBAAoB,CACxB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IA8BzD;;OAEG;IACG,gBAAgB,CACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAuHzD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAiB/E;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAiB5E;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK3B"}
|