mcp-local-rag 0.12.0 → 0.13.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/README.md +14 -3
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +1 -0
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/read-neighbors.d.ts +11 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +222 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli-main.js +5 -1
- package/dist/cli-main.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/parser/html-parser.js +1 -1
- package/dist/parser/html-parser.js.map +1 -1
- package/dist/server/index.d.ts +13 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +90 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/tool-definitions.d.ts.map +1 -1
- package/dist/server/tool-definitions.js +30 -0
- package/dist/server/tool-definitions.js.map +1 -1
- package/dist/server/types.d.ts +37 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/vectordb/index.d.ts +26 -1
- package/dist/vectordb/index.d.ts.map +1 -1
- package/dist/vectordb/index.js +48 -1
- package/dist/vectordb/index.js.map +1 -1
- package/dist/vectordb/types.d.ts +31 -0
- package/dist/vectordb/types.d.ts.map +1 -1
- package/dist/vectordb/types.js +32 -0
- package/dist/vectordb/types.js.map +1 -1
- package/package.json +14 -14
- package/skills/mcp-local-rag/SKILL.md +21 -1
- package/skills/mcp-local-rag/references/cli-reference.md +62 -0
- package/dist/bin/ingest.d.ts +0 -53
- package/dist/bin/ingest.d.ts.map +0 -1
- package/dist/bin/ingest.js +0 -283
- package/dist/bin/ingest.js.map +0 -1
- package/dist/server/raw-data-utils.d.ts +0 -116
- package/dist/server/raw-data-utils.d.ts.map +0 -1
- package/dist/server/raw-data-utils.js +0 -202
- package/dist/server/raw-data-utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -107,7 +107,7 @@ mcp-local-rag provides two interfaces: an **MCP server** for AI coding tools and
|
|
|
107
107
|
|
|
108
108
|
### Using with MCP
|
|
109
109
|
|
|
110
|
-
The MCP server provides
|
|
110
|
+
The MCP server provides 7 tools: `ingest_file`, `ingest_data`, `query_documents`, `read_chunk_neighbors`, `list_files`, `delete_file`, `status`.
|
|
111
111
|
|
|
112
112
|
#### Ingesting Documents
|
|
113
113
|
|
|
@@ -148,6 +148,16 @@ Search uses semantic similarity with keyword boost. This means `useEffect` finds
|
|
|
148
148
|
|
|
149
149
|
Results include text content, source file, document title, and relevance score. The document title provides context for each chunk, helping identify which document a result belongs to. Adjust result count with `limit` (1-20, default 10).
|
|
150
150
|
|
|
151
|
+
#### Expanding Context Around a Result
|
|
152
|
+
|
|
153
|
+
When a search result needs more surrounding context, use `read_chunk_neighbors` to read the chunks before and after it:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
"That result about authentication looks relevant — read the surrounding chunks for the full explanation"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Pass the `filePath` and `chunkIndex` from the search result. The response includes the target chunk (marked `isTarget: true`) plus its neighbors, sorted by chunk index. Defaults to 2 chunks before and 2 after (adjustable up to 50 each).
|
|
160
|
+
|
|
151
161
|
#### Managing Files
|
|
152
162
|
|
|
153
163
|
```
|
|
@@ -163,13 +173,14 @@ All MCP tools are also available as CLI commands — no MCP server needed:
|
|
|
163
173
|
```bash
|
|
164
174
|
npx mcp-local-rag ingest ./docs/ # Bulk ingest files
|
|
165
175
|
npx mcp-local-rag query "authentication API" # Search documents
|
|
176
|
+
npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5 # Expand context
|
|
166
177
|
npx mcp-local-rag list # Show ingestion status
|
|
167
178
|
npx mcp-local-rag status # Database stats
|
|
168
179
|
npx mcp-local-rag delete ./docs/old.pdf # Remove content
|
|
169
180
|
npx mcp-local-rag delete --source "https://..." # Remove by source URL
|
|
170
181
|
```
|
|
171
182
|
|
|
172
|
-
`query`, `list`, `status`, and `delete` output JSON to stdout for piping (e.g., `| jq`). `ingest` outputs progress to stderr. Global options (`--db-path`, `--cache-dir`, `--model-name`) go before the subcommand. Run `npx mcp-local-rag --help` for details.
|
|
183
|
+
`query`, `read-neighbors`, `list`, `status`, and `delete` output JSON to stdout for piping (e.g., `| jq`). `ingest` outputs progress to stderr. Global options (`--db-path`, `--cache-dir`, `--model-name`) go before the subcommand. Run `npx mcp-local-rag --help` for details.
|
|
173
184
|
|
|
174
185
|
> ⚠️ The CLI does **not** read your MCP client config (`mcp.json`, `config.toml`, etc.). Configure the CLI via flags or environment variables as shown below.
|
|
175
186
|
|
|
@@ -476,7 +487,7 @@ pnpm run check:all # Full quality check
|
|
|
476
487
|
src/
|
|
477
488
|
index.ts # Entry point
|
|
478
489
|
server/ # MCP tool handlers
|
|
479
|
-
cli/ # CLI subcommands (ingest)
|
|
490
|
+
cli/ # CLI subcommands (ingest, query, list, delete, read-neighbors, etc.)
|
|
480
491
|
parser/ # PDF, DOCX, TXT, MD parsing
|
|
481
492
|
chunker/ # Text splitting
|
|
482
493
|
embedder/ # Transformers.js embeddings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuBhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,eAAe;;;;CAIlB,CAAA;AAMV,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuBhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,eAAe;;;;CAIlB,CAAA;AAMV,eAAO,MAAM,cAAc,QAeiC,CAAA;AAM5D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAqErE;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,oBAAoB,CA0BhF"}
|
package/dist/cli/options.js
CHANGED
|
@@ -89,6 +89,7 @@ Options:
|
|
|
89
89
|
Commands:
|
|
90
90
|
ingest <path> Ingest files into the vector database
|
|
91
91
|
query <text> Search ingested documents
|
|
92
|
+
read-neighbors Read N chunks before and after a target chunk within the same document
|
|
92
93
|
list List files and ingestion status
|
|
93
94
|
status Show database status
|
|
94
95
|
delete <path> Delete ingested content
|
package/dist/cli/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GlobalOptions } from './options.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run the read-neighbors CLI subcommand.
|
|
4
|
+
* Reads chunks adjacent to a target chunkIndex within a single document.
|
|
5
|
+
* Does NOT perform any search; this is an index-adjacent retrieval utility.
|
|
6
|
+
*
|
|
7
|
+
* @param args - Arguments after "read-neighbors"
|
|
8
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
9
|
+
*/
|
|
10
|
+
export declare function runReadNeighbors(args: string[], globalOptions?: GlobalOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=read-neighbors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-neighbors.d.ts","sourceRoot":"","sources":["../../src/cli/read-neighbors.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAqIjD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CAsGf"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// CLI read-neighbors subcommand — read N chunks before/after a target chunk within one document
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { extractSourceFromPath, generateRawDataPath, isRawDataPath, } from '../utils/raw-data-utils.js';
|
|
4
|
+
import { createVectorStore } from './common.js';
|
|
5
|
+
import { resolveGlobalConfig, validatePath } from './options.js';
|
|
6
|
+
// ============================================
|
|
7
|
+
// Defaults
|
|
8
|
+
// ============================================
|
|
9
|
+
const READ_NEIGHBORS_DEFAULTS = {
|
|
10
|
+
before: 2,
|
|
11
|
+
after: 2,
|
|
12
|
+
};
|
|
13
|
+
// ============================================
|
|
14
|
+
// Help
|
|
15
|
+
// ============================================
|
|
16
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] read-neighbors [options]
|
|
17
|
+
|
|
18
|
+
Read N chunks before and after a target chunk within the same document.
|
|
19
|
+
|
|
20
|
+
Either --file-path or --source is required, not both.
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
--file-path <abs-path> File path of ingested content (absolute path)
|
|
24
|
+
--source <id> Source identifier (for content ingested via ingest_data)
|
|
25
|
+
--chunk-index <n> Target chunk index (zero-based, required, non-negative integer)
|
|
26
|
+
--before <n> Number of chunks before the target (default: ${READ_NEIGHBORS_DEFAULTS.before}, non-negative integer)
|
|
27
|
+
--after <n> Number of chunks after the target (default: ${READ_NEIGHBORS_DEFAULTS.after}, non-negative integer)
|
|
28
|
+
-h, --help Show this help
|
|
29
|
+
|
|
30
|
+
Defaults: before=${READ_NEIGHBORS_DEFAULTS.before}, after=${READ_NEIGHBORS_DEFAULTS.after} (grep -C 2 convention)
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
npx mcp-local-rag read-neighbors --file-path /abs/path/file.md --chunk-index 12 --before 3 --after 3
|
|
34
|
+
|
|
35
|
+
Global options (must appear before "read-neighbors"):
|
|
36
|
+
--db-path <path> LanceDB database path
|
|
37
|
+
--cache-dir <path> Model cache directory
|
|
38
|
+
--model-name <name> Embedding model`;
|
|
39
|
+
/**
|
|
40
|
+
* Parse a value expected to be a non-negative integer flag value.
|
|
41
|
+
* Throws a descriptive Error on malformed input; the outer runReadNeighbors
|
|
42
|
+
* try/catch converts this into `console.error` + `process.exit(1)`.
|
|
43
|
+
*/
|
|
44
|
+
function parseNonNegativeInteger(flag, rawValue) {
|
|
45
|
+
if (rawValue === undefined || rawValue.startsWith('-')) {
|
|
46
|
+
throw new Error(`Missing value for ${flag}`);
|
|
47
|
+
}
|
|
48
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
49
|
+
if (!Number.isInteger(parsed) || parsed < 0 || String(parsed) !== rawValue) {
|
|
50
|
+
throw new Error(`${flag} must be a non-negative integer`);
|
|
51
|
+
}
|
|
52
|
+
return parsed;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse read-neighbors CLI arguments.
|
|
56
|
+
* Flags: --file-path, --source, --chunk-index, --before, --after, -h/--help.
|
|
57
|
+
* Integer flags are validated syntactically (must be non-negative integer).
|
|
58
|
+
* Semantic validation (required-ness, XOR) is performed in runReadNeighbors.
|
|
59
|
+
*/
|
|
60
|
+
function parseArgs(args) {
|
|
61
|
+
let help = false;
|
|
62
|
+
let filePath;
|
|
63
|
+
let source;
|
|
64
|
+
let chunkIndex;
|
|
65
|
+
let before;
|
|
66
|
+
let after;
|
|
67
|
+
let i = 0;
|
|
68
|
+
while (i < args.length) {
|
|
69
|
+
const arg = args[i];
|
|
70
|
+
if (arg === '-h' || arg === '--help') {
|
|
71
|
+
help = true;
|
|
72
|
+
i++;
|
|
73
|
+
}
|
|
74
|
+
else if (arg === '--file-path') {
|
|
75
|
+
const value = args[++i];
|
|
76
|
+
if (value === undefined || value.startsWith('-')) {
|
|
77
|
+
throw new Error('Missing value for --file-path');
|
|
78
|
+
}
|
|
79
|
+
filePath = value;
|
|
80
|
+
i++;
|
|
81
|
+
}
|
|
82
|
+
else if (arg === '--source') {
|
|
83
|
+
const value = args[++i];
|
|
84
|
+
if (value === undefined || value.startsWith('-')) {
|
|
85
|
+
throw new Error('Missing value for --source');
|
|
86
|
+
}
|
|
87
|
+
source = value;
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
else if (arg === '--chunk-index') {
|
|
91
|
+
chunkIndex = parseNonNegativeInteger('--chunk-index', args[++i]);
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
else if (arg === '--before') {
|
|
95
|
+
before = parseNonNegativeInteger('--before', args[++i]);
|
|
96
|
+
i++;
|
|
97
|
+
}
|
|
98
|
+
else if (arg === '--after') {
|
|
99
|
+
after = parseNonNegativeInteger('--after', args[++i]);
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
else if (arg.startsWith('-')) {
|
|
103
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
throw new Error(`Unexpected argument: ${arg}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const result = { help };
|
|
110
|
+
if (filePath !== undefined)
|
|
111
|
+
result.filePath = filePath;
|
|
112
|
+
if (source !== undefined)
|
|
113
|
+
result.source = source;
|
|
114
|
+
if (chunkIndex !== undefined)
|
|
115
|
+
result.chunkIndex = chunkIndex;
|
|
116
|
+
if (before !== undefined)
|
|
117
|
+
result.before = before;
|
|
118
|
+
if (after !== undefined)
|
|
119
|
+
result.after = after;
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
// ============================================
|
|
123
|
+
// Main Entry Point
|
|
124
|
+
// ============================================
|
|
125
|
+
/**
|
|
126
|
+
* Run the read-neighbors CLI subcommand.
|
|
127
|
+
* Reads chunks adjacent to a target chunkIndex within a single document.
|
|
128
|
+
* Does NOT perform any search; this is an index-adjacent retrieval utility.
|
|
129
|
+
*
|
|
130
|
+
* @param args - Arguments after "read-neighbors"
|
|
131
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
132
|
+
*/
|
|
133
|
+
export async function runReadNeighbors(args, globalOptions = {}) {
|
|
134
|
+
// Parse CLI options (parse errors are caught and converted to exit(1) below).
|
|
135
|
+
let parsed;
|
|
136
|
+
try {
|
|
137
|
+
parsed = parseArgs(args);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
141
|
+
console.error(`Error: ${reason}`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
// Handle --help OUTSIDE the main try/catch so exit(0) is not converted to exit(1).
|
|
145
|
+
// Mirrors src/cli/delete.ts and src/cli/query.ts.
|
|
146
|
+
if (parsed.help) {
|
|
147
|
+
console.error(HELP_TEXT);
|
|
148
|
+
process.exit(0);
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
// Validation order: chunkIndex → before → after → XOR (matches handler per Design Doc).
|
|
152
|
+
if (parsed.chunkIndex === undefined) {
|
|
153
|
+
throw new Error('--chunk-index is required and must be a non-negative integer');
|
|
154
|
+
}
|
|
155
|
+
const chunkIndex = parsed.chunkIndex;
|
|
156
|
+
const before = parsed.before ?? READ_NEIGHBORS_DEFAULTS.before;
|
|
157
|
+
if (before > 50) {
|
|
158
|
+
throw new Error(`before must be between 0 and 50 (got ${before})`);
|
|
159
|
+
}
|
|
160
|
+
const after = parsed.after ?? READ_NEIGHBORS_DEFAULTS.after;
|
|
161
|
+
if (after > 50) {
|
|
162
|
+
throw new Error(`after must be between 0 and 50 (got ${after})`);
|
|
163
|
+
}
|
|
164
|
+
// XOR: exactly one of --file-path / --source
|
|
165
|
+
const hasFilePath = parsed.filePath !== undefined;
|
|
166
|
+
const hasSource = parsed.source !== undefined;
|
|
167
|
+
if (!hasFilePath && !hasSource) {
|
|
168
|
+
throw new Error('Either --file-path or --source is required');
|
|
169
|
+
}
|
|
170
|
+
if (hasFilePath && hasSource) {
|
|
171
|
+
throw new Error('Cannot specify both --file-path and --source');
|
|
172
|
+
}
|
|
173
|
+
// Resolve global config
|
|
174
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
175
|
+
// Determine target file path (dual-input resolution).
|
|
176
|
+
let targetPath;
|
|
177
|
+
if (parsed.source !== undefined) {
|
|
178
|
+
// Generate raw-data path from source identifier.
|
|
179
|
+
targetPath = generateRawDataPath(globalConfig.dbPath, parsed.source, 'markdown');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Resolve to absolute path and validate (mirrors runDelete).
|
|
183
|
+
targetPath = resolve(parsed.filePath);
|
|
184
|
+
const pathError = validatePath(targetPath, '--file-path');
|
|
185
|
+
if (pathError) {
|
|
186
|
+
console.error(pathError);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Create and initialize VectorStore (no embedder needed for index-only read).
|
|
191
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
192
|
+
await vectorStore.initialize();
|
|
193
|
+
// Range composition (handler-side clamp; primitive stays feature-agnostic).
|
|
194
|
+
const minIdx = Math.max(0, chunkIndex - before);
|
|
195
|
+
const maxIdx = chunkIndex + after;
|
|
196
|
+
// Primitive call.
|
|
197
|
+
const rows = await vectorStore.getChunksByRange(targetPath, minIdx, maxIdx);
|
|
198
|
+
// Post-fetch marking: isTarget per item; source attached for raw-data rows.
|
|
199
|
+
const isRaw = isRawDataPath(targetPath);
|
|
200
|
+
const sourceForAll = isRaw ? extractSourceFromPath(targetPath) : null;
|
|
201
|
+
const items = rows.map((row) => {
|
|
202
|
+
const item = {
|
|
203
|
+
filePath: row.filePath,
|
|
204
|
+
chunkIndex: row.chunkIndex,
|
|
205
|
+
text: row.text,
|
|
206
|
+
isTarget: row.chunkIndex === chunkIndex,
|
|
207
|
+
fileTitle: row.fileTitle ?? null,
|
|
208
|
+
};
|
|
209
|
+
if (sourceForAll)
|
|
210
|
+
item.source = sourceForAll;
|
|
211
|
+
return item;
|
|
212
|
+
});
|
|
213
|
+
// Output JSON to stdout (2-space indent per query.ts convention).
|
|
214
|
+
process.stdout.write(`${JSON.stringify(items, null, 2)}\n`);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
218
|
+
console.error(`Error: ${reason}`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=read-neighbors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-neighbors.js","sourceRoot":"","sources":["../../src/cli/read-neighbors.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-main.d.ts","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli-main.d.ts","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAKrD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDhG"}
|
package/dist/cli-main.js
CHANGED
|
@@ -4,6 +4,7 @@ import { runDelete } from './cli/delete.js';
|
|
|
4
4
|
import { runIngest } from './cli/ingest.js';
|
|
5
5
|
import { runList } from './cli/list.js';
|
|
6
6
|
import { runQuery } from './cli/query.js';
|
|
7
|
+
import { runReadNeighbors } from './cli/read-neighbors.js';
|
|
7
8
|
import { runStatus } from './cli/status.js';
|
|
8
9
|
/**
|
|
9
10
|
* Handle CLI subcommands
|
|
@@ -39,9 +40,12 @@ export async function handleCli(args, globalOptions = {}) {
|
|
|
39
40
|
case 'delete':
|
|
40
41
|
await runDelete(args.slice(1), globalOptions);
|
|
41
42
|
break;
|
|
43
|
+
case 'read-neighbors':
|
|
44
|
+
await runReadNeighbors(args.slice(1), globalOptions);
|
|
45
|
+
break;
|
|
42
46
|
default:
|
|
43
47
|
console.error(`Unknown command: ${subcommand}`);
|
|
44
|
-
console.error('Available commands: skills, ingest, list, query, status, delete');
|
|
48
|
+
console.error('Available commands: skills, ingest, list, query, status, delete, read-neighbors');
|
|
45
49
|
process.exit(1);
|
|
46
50
|
}
|
|
47
51
|
}
|
package/dist/cli-main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,gBAA+B,EAAE;IAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IAE1B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,8EAA8E,CAC/E,CAAA;gBACD,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAA;gBACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAK;QAEP,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAK;QAEP,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC3C,MAAK;QAEP,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC5C,MAAK;QAEP,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAK;QAEP,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAK;QAEP;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAA;YAC/C,OAAO,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,gBAA+B,EAAE;IAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IAE1B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,8EAA8E,CAC/E,CAAA;gBACD,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAA;gBACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAK;QAEP,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAK;QAEP,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC3C,MAAK;QAEP,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC5C,MAAK;QAEP,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAK;QAEP,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAK;QAEP,KAAK,gBAAgB;YACnB,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YACpD,MAAK;QAEP;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAA;YAC/C,OAAO,CAAC,KAAK,CACX,iFAAiF,CAClF,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,15 @@ import { startServer } from './server-main.js';
|
|
|
7
7
|
// ============================================
|
|
8
8
|
// Routing
|
|
9
9
|
// ============================================
|
|
10
|
-
const SUBCOMMANDS = new Set([
|
|
10
|
+
const SUBCOMMANDS = new Set([
|
|
11
|
+
'skills',
|
|
12
|
+
'ingest',
|
|
13
|
+
'list',
|
|
14
|
+
'query',
|
|
15
|
+
'status',
|
|
16
|
+
'delete',
|
|
17
|
+
'read-neighbors',
|
|
18
|
+
]);
|
|
11
19
|
const { globalOptions, remainingArgs } = parseGlobalOptions(process.argv.slice(2));
|
|
12
20
|
const firstArg = remainingArgs[0];
|
|
13
21
|
if (firstArg && SUBCOMMANDS.has(firstArg)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,gCAAgC;AAChC,qDAAqD;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,+CAA+C;AAC/C,UAAU;AACV,+CAA+C;AAE/C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,gCAAgC;AAChC,qDAAqD;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,+CAA+C;AAC/C,UAAU;AACV,+CAA+C;AAE/C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,gBAAgB;CACjB,CAAC,CAAA;AAEF,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAClF,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;AAEjC,IAAI,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1C,iBAAiB;IACjB,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC;KAAM,CAAC;IACN,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACnD,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACxC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,WAAW,EAAE,CAAA;AACf,CAAC"}
|
|
@@ -67,7 +67,7 @@ export async function parseHtml(html, url) {
|
|
|
67
67
|
});
|
|
68
68
|
const article = reader.parse();
|
|
69
69
|
// If Readability couldn't extract content, fall back to body text
|
|
70
|
-
if (!article
|
|
70
|
+
if (!article?.content) {
|
|
71
71
|
// Try to get body content directly
|
|
72
72
|
const bodyContent = document.body?.innerHTML || '';
|
|
73
73
|
if (!bodyContent.trim()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../../src/parser/html-parser.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,2DAA2D;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,eAAe,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAcvD,+CAA+C;AAC/C,iCAAiC;AACjC,+CAA+C;AAE/C;;GAEG;AACH,SAAS,qBAAqB;IAC5B,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC;QAC1C,YAAY,EAAE,KAAK,EAAE,uBAAuB;QAC5C,cAAc,EAAE,QAAQ,EAAE,0BAA0B;QACpD,gBAAgB,EAAE,GAAG,EAAE,yBAAyB;QAChD,WAAW,EAAE,GAAG,EAAE,qBAAqB;QACvC,eAAe,EAAE,IAAI,EAAE,kBAAkB;KAC1C,CAAC,CAAA;IAEF,0BAA0B;IAC1B,eAAe,CAAC,OAAO,CAAC,YAAY,EAAE;QACpC,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAe,CAAA;YAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YACjD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAA;YACxE,MAAM,QAAQ,GAAG,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;YACvE,OAAO,WAAW,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAA;QAC/D,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,GAAW;IAEX,uCAAuC;IACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE;YAC1B,GAAG;YACH,yCAAyC;YACzC,UAAU,EAAE,cAAc;SAC3B,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAA;QAEpC,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;YACvC,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAA8B,CAAA;QAE1D,kEAAkE;QAClE,IAAI,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../../src/parser/html-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Annotations } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type { DeleteFileInput, IngestDataInput, IngestFileInput, QueryDocumentsInput, RAGServerConfig } from './types.js';
|
|
2
|
+
import type { DeleteFileInput, IngestDataInput, IngestFileInput, QueryDocumentsInput, RAGServerConfig, ReadChunkNeighborsInput } from './types.js';
|
|
3
3
|
/** RAG server compliant with MCP Protocol */
|
|
4
4
|
export declare class RAGServer {
|
|
5
5
|
private readonly server;
|
|
@@ -92,6 +92,18 @@ export declare class RAGServer {
|
|
|
92
92
|
text: string;
|
|
93
93
|
}];
|
|
94
94
|
}>;
|
|
95
|
+
/**
|
|
96
|
+
* read_chunk_neighbors tool handler
|
|
97
|
+
* Returns chunks around a target chunkIndex within a single ingested document.
|
|
98
|
+
* Context-expansion utility — not a search tool. Mirrors handleDeleteFile's
|
|
99
|
+
* dual-input (filePath XOR source) resolution pattern.
|
|
100
|
+
*/
|
|
101
|
+
handleReadChunkNeighbors(args: ReadChunkNeighborsInput): Promise<{
|
|
102
|
+
content: [{
|
|
103
|
+
type: 'text';
|
|
104
|
+
text: string;
|
|
105
|
+
}];
|
|
106
|
+
}>;
|
|
95
107
|
/**
|
|
96
108
|
* Start the server
|
|
97
109
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,oCAAoC,CAAA;AAoB3C,OAAO,KAAK,EACV,eAAe,EAEf,eAAe,EACf,eAAe,EAGf,mBAAmB,EAEnB,eAAe,EACf,uBAAuB,EAGxB,MAAM,YAAY,CAAA;AAEnB,6CAA6C;AAC7C,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;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,MAAM,EAAE,eAAe;IA8CnC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACG,oBAAoB,CACxB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAiDzF;;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;IA4JzD;;;;;;;;OAQG;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;IAyEzD;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAmD/E;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC;QAC5B,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,CAAC,CAAA;KAC1E,CAAC;IAoBF;;;;OAIG;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;IAiEzD;;;;;OAKG;IACG,wBAAwB,CAC5B,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IA0FzD;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK3B"}
|
package/dist/server/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { DocumentParser, SUPPORTED_EXTENSIONS } from '../parser/index.js';
|
|
|
12
12
|
import { extractMarkdownTitle, extractTxtTitle } from '../parser/title-extractor.js';
|
|
13
13
|
import { extractSourceFromPath, generateMetaJsonPath, generateRawDataPath, isRawDataPath, loadMetaJson, saveMetaJson, saveRawData, } from '../utils/raw-data-utils.js';
|
|
14
14
|
import { VectorStore } from '../vectordb/index.js';
|
|
15
|
+
import { DatabaseError } from '../vectordb/types.js';
|
|
15
16
|
import { formatErrorMessage } from './error-utils.js';
|
|
16
17
|
import { toolDefinitions } from './tool-definitions.js';
|
|
17
18
|
/** RAG server compliant with MCP Protocol */
|
|
@@ -103,6 +104,8 @@ export class RAGServer {
|
|
|
103
104
|
return await this.handleIngestData(request.params.arguments);
|
|
104
105
|
case 'delete_file':
|
|
105
106
|
return await this.handleDeleteFile(request.params.arguments);
|
|
107
|
+
case 'read_chunk_neighbors':
|
|
108
|
+
return await this.handleReadChunkNeighbors(request.params.arguments);
|
|
106
109
|
case 'list_files':
|
|
107
110
|
return await this.handleListFiles();
|
|
108
111
|
case 'status':
|
|
@@ -513,6 +516,93 @@ export class RAGServer {
|
|
|
513
516
|
throw new Error(`Failed to delete file: ${errorMessage}`);
|
|
514
517
|
}
|
|
515
518
|
}
|
|
519
|
+
/**
|
|
520
|
+
* read_chunk_neighbors tool handler
|
|
521
|
+
* Returns chunks around a target chunkIndex within a single ingested document.
|
|
522
|
+
* Context-expansion utility — not a search tool. Mirrors handleDeleteFile's
|
|
523
|
+
* dual-input (filePath XOR source) resolution pattern.
|
|
524
|
+
*/
|
|
525
|
+
async handleReadChunkNeighbors(args) {
|
|
526
|
+
try {
|
|
527
|
+
// Validation (all before DB access, per Design Doc §Main Components → Handler).
|
|
528
|
+
// Intentional: use McpError(InvalidParams) (upgrade from handleDeleteFile's plain Error).
|
|
529
|
+
// See Design Doc §Main Components → Handler and §Risks — this asymmetry is documented;
|
|
530
|
+
// do not "fix" it.
|
|
531
|
+
if (!Number.isInteger(args.chunkIndex) || args.chunkIndex < 0) {
|
|
532
|
+
throw new McpError(ErrorCode.InvalidParams, 'chunkIndex must be a non-negative integer');
|
|
533
|
+
}
|
|
534
|
+
const before = args.before ?? 2;
|
|
535
|
+
if (!Number.isInteger(before) || before < 0) {
|
|
536
|
+
throw new McpError(ErrorCode.InvalidParams, 'before must be a non-negative integer');
|
|
537
|
+
}
|
|
538
|
+
if (before > 50) {
|
|
539
|
+
throw new McpError(ErrorCode.InvalidParams, `before must be between 0 and 50 (got ${before})`);
|
|
540
|
+
}
|
|
541
|
+
const after = args.after ?? 2;
|
|
542
|
+
if (!Number.isInteger(after) || after < 0) {
|
|
543
|
+
throw new McpError(ErrorCode.InvalidParams, 'after must be a non-negative integer');
|
|
544
|
+
}
|
|
545
|
+
if (after > 50) {
|
|
546
|
+
throw new McpError(ErrorCode.InvalidParams, `after must be between 0 and 50 (got ${after})`);
|
|
547
|
+
}
|
|
548
|
+
const hasFilePath = args.filePath !== undefined;
|
|
549
|
+
const hasSource = args.source !== undefined;
|
|
550
|
+
if (hasFilePath === hasSource) {
|
|
551
|
+
throw new McpError(ErrorCode.InvalidParams, 'Either filePath or source must be provided, not both');
|
|
552
|
+
}
|
|
553
|
+
// Dual-input resolution (mirrors handleDeleteFile).
|
|
554
|
+
let targetPath;
|
|
555
|
+
let skipValidation = false;
|
|
556
|
+
if (args.source !== undefined) {
|
|
557
|
+
targetPath = generateRawDataPath(this.dbPath, args.source, 'markdown');
|
|
558
|
+
skipValidation = true;
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
// XOR above guarantees filePath is defined here.
|
|
562
|
+
targetPath = args.filePath;
|
|
563
|
+
}
|
|
564
|
+
if (!skipValidation) {
|
|
565
|
+
await this.parser.validateFilePath(targetPath);
|
|
566
|
+
}
|
|
567
|
+
// Range composition (handler-side clamp; primitive stays feature-agnostic).
|
|
568
|
+
const minIdx = Math.max(0, args.chunkIndex - before);
|
|
569
|
+
const maxIdx = args.chunkIndex + after;
|
|
570
|
+
// Primitive call.
|
|
571
|
+
const rows = await this.vectorStore.getChunksByRange(targetPath, minIdx, maxIdx);
|
|
572
|
+
// Post-fetch marking: isTarget per item; source attached for raw-data rows.
|
|
573
|
+
const isRaw = isRawDataPath(targetPath);
|
|
574
|
+
const sourceForAll = isRaw ? extractSourceFromPath(targetPath) : null;
|
|
575
|
+
const items = rows.map((row) => {
|
|
576
|
+
const item = {
|
|
577
|
+
filePath: row.filePath,
|
|
578
|
+
chunkIndex: row.chunkIndex,
|
|
579
|
+
text: row.text,
|
|
580
|
+
isTarget: row.chunkIndex === args.chunkIndex,
|
|
581
|
+
fileTitle: row.fileTitle ?? null,
|
|
582
|
+
};
|
|
583
|
+
if (sourceForAll)
|
|
584
|
+
item.source = sourceForAll;
|
|
585
|
+
return item;
|
|
586
|
+
});
|
|
587
|
+
return {
|
|
588
|
+
content: [
|
|
589
|
+
{
|
|
590
|
+
type: 'text',
|
|
591
|
+
text: JSON.stringify(items, null, 2),
|
|
592
|
+
},
|
|
593
|
+
],
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
catch (error) {
|
|
597
|
+
// Re-throw McpError / DatabaseError as-is to preserve semantics.
|
|
598
|
+
if (error instanceof McpError || error instanceof DatabaseError) {
|
|
599
|
+
throw error;
|
|
600
|
+
}
|
|
601
|
+
const errorMessage = formatErrorMessage(error);
|
|
602
|
+
console.error('Failed to read chunk neighbors:', errorMessage);
|
|
603
|
+
throw new Error(`Failed to read chunk neighbors: ${errorMessage}`);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
516
606
|
/**
|
|
517
607
|
* Start the server
|
|
518
608
|
*/
|