@idea404/repocontext 0.1.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/dist/server.js ADDED
@@ -0,0 +1,505 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { RootsListChangedNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
4
+ import { z } from 'zod';
5
+ import { setRoots, initializeFallbackRoot, getRoots, makeAllowedPath } from './roots.js';
6
+ import { readSnippet, fileExists } from './files.js';
7
+ import { parseFile, detectLanguageForPath } from './parser.js';
8
+ import { searchFiles, listFiles } from './search.js';
9
+ import { findSymbols, traceSymbol, getImports } from './symbols.js';
10
+ import { gitLog, gitBlame } from './git.js';
11
+ import { errorResult, okResult, log, DEFAULT_SEARCH_LIMIT } from './utils.js';
12
+ import fs from 'node:fs';
13
+ import path from 'node:path';
14
+ const readOnly = { readOnlyHint: true };
15
+ // ─── Tool schemas ───────────────────────────────────────────────────────────
16
+ const listDirectorySchema = z.object({
17
+ path: z.string().describe('Directory path relative to project root'),
18
+ depth: z.number().int().min(1).max(3).optional().describe('How many levels deep to recurse (default: 1)'),
19
+ limit: z.number().int().min(1).max(200).optional().describe('Maximum entries to return'),
20
+ });
21
+ const globFilesSchema = z.object({
22
+ pattern: z.string().describe('Glob pattern (e.g. "**/*.ts", "src/**/*.py")'),
23
+ limit: z.number().int().min(1).max(200).optional().describe('Maximum file paths to return'),
24
+ });
25
+ const getFileOutlineSchema = z.object({
26
+ path: z.string().describe('Path to the source file'),
27
+ });
28
+ const readFileSchema = z.object({
29
+ path: z.string().describe('Path to the file'),
30
+ start_line: z.number().int().optional().describe('First line to read (1-indexed, default: 1)'),
31
+ end_line: z.number().int().optional().describe('Last line to read (1-indexed, default: end of file)'),
32
+ symbol_name: z.string().optional().describe('Name of a symbol to read its definition body (overrides start_line/end_line)'),
33
+ });
34
+ const findSymbolsSchema = z.object({
35
+ query: z.string().describe('Symbol name or substring to search for'),
36
+ kind: z.string().optional().describe('Filter by kind, e.g. function, class, method'),
37
+ language: z.string().optional().describe('Filter by language name'),
38
+ glob: z.string().optional().describe('Glob pattern to scope files'),
39
+ limit: z.number().int().min(1).max(100).optional(),
40
+ });
41
+ const findImportsSchema = z.object({
42
+ path: z.string().describe('Path to the source file'),
43
+ module: z.string().optional().describe('Filter imports by source module'),
44
+ symbol: z.string().optional().describe('Filter imports by symbol name'),
45
+ });
46
+ const traceSymbolSchema = z.object({
47
+ name: z.string().describe('Symbol name'),
48
+ kind: z.string().optional().describe('Kind hint, e.g. function'),
49
+ path: z.string().optional().describe('File where the symbol is defined, if known'),
50
+ });
51
+ const searchCodeSchema = z.object({
52
+ pattern: z.string().describe('Pattern to search for'),
53
+ mode: z.enum(['plain', 'regex', 'fuzzy']).optional().describe('Search mode'),
54
+ glob: z.string().optional().describe('Glob pattern to scope files'),
55
+ case_sensitive: z.boolean().optional(),
56
+ limit: z.number().int().min(1).max(100).optional(),
57
+ context_lines: z.number().int().min(0).max(5).optional().describe('Context lines around each match'),
58
+ });
59
+ const detectLanguageSchema = z.object({
60
+ path: z.string().describe('File path'),
61
+ });
62
+ const getProjectOverviewSchema = z.object({
63
+ path: z.string().optional().describe('Optional sub-path within roots'),
64
+ });
65
+ const listRootsSchema = z.object({});
66
+ // ─── Server start ───────────────────────────────────────────────────────────
67
+ export async function startServer() {
68
+ const server = new McpServer({ name: '@idea404/repocontext', version: '0.1.0' }, { capabilities: {} });
69
+ // ── list_directory ──────────────────────────────────────────────────────
70
+ server.registerTool('list_directory', {
71
+ description: 'List files and subdirectories in a directory. Bounded, root-safe.',
72
+ inputSchema: listDirectorySchema,
73
+ annotations: readOnly,
74
+ }, async (args) => {
75
+ const resolved = makeAllowedPath(args.path);
76
+ if (!resolved)
77
+ return errorResult('Path is outside allowed roots');
78
+ const depth = Math.max(1, Math.min(3, args.depth ?? 1));
79
+ const limit = args.limit ?? 100;
80
+ const prefix = depth === 1 ? '*' : `${'*/'.repeat(depth - 1)}*`;
81
+ const glob = path.posix.join(resolved.replace(/\\/g, '/'), prefix);
82
+ const entries = await listFiles(glob, { limit });
83
+ const lines = entries.map((e) => {
84
+ const rel = path.relative(resolved, e.absolutePath);
85
+ const isDir = fs.statSync(e.absolutePath, { throwIfNoEntry: false })?.isDirectory();
86
+ return isDir ? `📁 ${rel}/` : `📄 ${rel}`;
87
+ });
88
+ return okResult(lines.length > 0
89
+ ? lines.join('\n')
90
+ : 'Directory is empty or no readable files found.');
91
+ });
92
+ // ── glob_files ──────────────────────────────────────────────────────────
93
+ server.registerTool('glob_files', {
94
+ description: 'Find files matching a glob pattern across the project. Returns file paths.',
95
+ inputSchema: globFilesSchema,
96
+ annotations: readOnly,
97
+ }, async (args) => {
98
+ const limit = args.limit ?? 100;
99
+ const entries = await listFiles(args.pattern, { limit });
100
+ if (entries.length === 0)
101
+ return okResult('No files matched.');
102
+ const lines = entries.map((e) => `- ${e.relativePath}`);
103
+ return okResult(lines.join('\n'));
104
+ });
105
+ // ── get_file_outline ────────────────────────────────────────────────────
106
+ server.registerTool('get_file_outline', {
107
+ description: 'Parse a source file and return its structure: functions, classes, imports, exports. Token-efficient alternative to reading the whole file.',
108
+ inputSchema: getFileOutlineSchema,
109
+ annotations: readOnly,
110
+ }, async (args) => {
111
+ const resolved = makeAllowedPath(args.path);
112
+ if (!resolved)
113
+ return errorResult('Path is outside allowed roots');
114
+ if (!(await fileExists(resolved)))
115
+ return errorResult('File not found');
116
+ const parsed = await parseFile(resolved);
117
+ if (!parsed)
118
+ return errorResult('Could not parse file (unsupported or too large)');
119
+ return okResult(JSON.stringify({
120
+ path: resolved,
121
+ language: parsed.language,
122
+ metrics: parsed.metrics,
123
+ structure: parsed.structure?.map((s) => ({
124
+ kind: s.kind,
125
+ name: s.name,
126
+ start_line: s.startLine,
127
+ end_line: s.endLine,
128
+ })),
129
+ imports: parsed.imports?.map((i) => ({
130
+ source: i.source,
131
+ items: i.items,
132
+ is_wildcard: i.isWildcard,
133
+ })),
134
+ exports: parsed.exports?.map((e) => ({
135
+ name: e.name,
136
+ kind: e.kind,
137
+ })),
138
+ }, null, 2));
139
+ });
140
+ // ── read_file ───────────────────────────────────────────────────────────
141
+ server.registerTool('read_file', {
142
+ description: 'Read a file or a range of lines. Line-range reading is token-efficient for large files.',
143
+ inputSchema: readFileSchema,
144
+ annotations: readOnly,
145
+ }, async (args) => {
146
+ const resolved = makeAllowedPath(args.path);
147
+ if (!resolved)
148
+ return errorResult('Path is outside allowed roots');
149
+ let start = args.start_line;
150
+ let end = args.end_line;
151
+ if (args.symbol_name) {
152
+ const parsed = await parseFile(resolved);
153
+ const symbol = parsed?.structure?.find((s) => s.name === args.symbol_name);
154
+ if (!symbol)
155
+ return errorResult(`Symbol "${args.symbol_name}" not found in ${resolved}`);
156
+ start = symbol.startLine;
157
+ end = symbol.endLine;
158
+ }
159
+ const snippet = await readSnippet(resolved, start, end);
160
+ if (!snippet)
161
+ return errorResult('Could not read snippet');
162
+ return okResult(`File: ${snippet.path}\nLanguage: ${snippet.language}\nLines ${snippet.startLine}-${snippet.endLine} of ${snippet.totalLines}:\n\n${snippet.snippet}`);
163
+ });
164
+ // ── find_symbols ────────────────────────────────────────────────────────
165
+ server.registerTool('find_symbols', {
166
+ description: 'Search for symbol definitions across the project. Token-efficient: returns only names, kinds, and locations — not file contents.',
167
+ inputSchema: findSymbolsSchema,
168
+ annotations: readOnly,
169
+ }, async (args) => {
170
+ const symbols = await findSymbols(args.query, {
171
+ kind: args.kind,
172
+ language: args.language,
173
+ glob: args.glob,
174
+ limit: args.limit ?? DEFAULT_SEARCH_LIMIT,
175
+ });
176
+ if (symbols.length === 0)
177
+ return okResult('No symbols found.');
178
+ const lines = symbols.map((s) => `${s.kind} ${s.name} in ${s.file}:${s.startLine}-${s.endLine}`);
179
+ return okResult(lines.join('\n'));
180
+ });
181
+ // ── find_imports ────────────────────────────────────────────────────────
182
+ server.registerTool('find_imports', {
183
+ description: 'List imports in a file, optionally filtered by module or symbol.',
184
+ inputSchema: findImportsSchema,
185
+ annotations: readOnly,
186
+ }, async (args) => {
187
+ const resolved = makeAllowedPath(args.path);
188
+ if (!resolved)
189
+ return errorResult('Path is outside allowed roots');
190
+ const imports = await getImports(resolved);
191
+ if (!imports)
192
+ return errorResult('Could not parse file');
193
+ let filtered = imports;
194
+ if (args.module) {
195
+ filtered = filtered.filter((i) => i.source.includes(args.module));
196
+ }
197
+ if (args.symbol) {
198
+ filtered = filtered.filter((i) => i.items.includes(args.symbol) || i.isWildcard);
199
+ }
200
+ if (filtered.length === 0)
201
+ return okResult('No matching imports found.');
202
+ const lines = filtered.map((i) => {
203
+ const items = i.isWildcard ? '*' : i.items.join(', ');
204
+ return `- from "${i.source}" import ${items}`;
205
+ });
206
+ return okResult(lines.join('\n'));
207
+ });
208
+ // ── trace_symbol ────────────────────────────────────────────────────────
209
+ server.registerTool('trace_symbol', {
210
+ description: 'Find where a symbol is defined and where it is referenced throughout the project.',
211
+ inputSchema: traceSymbolSchema,
212
+ annotations: readOnly,
213
+ }, async (args) => {
214
+ const result = await traceSymbol(args.name, { kind: args.kind, path: args.path });
215
+ const parts = [];
216
+ if (result.definition) {
217
+ const d = result.definition;
218
+ parts.push(`Definition: ${d.kind} ${d.name} at ${d.file}:${d.startLine}-${d.endLine}`);
219
+ if (d.docComment)
220
+ parts.push(`Docstring: ${d.docComment.slice(0, 200)}`);
221
+ }
222
+ else {
223
+ parts.push('Definition: not found');
224
+ }
225
+ if (result.references.length > 0) {
226
+ parts.push(`\nReferences (${result.references.length}):`);
227
+ for (const ref of result.references) {
228
+ parts.push(`\n${ref.absolutePath}:${ref.lineNumber}\n${ref.snippet}\n`);
229
+ }
230
+ }
231
+ else {
232
+ parts.push('\nReferences: none found');
233
+ }
234
+ return okResult(parts.join('\n'));
235
+ });
236
+ // ── search_code ─────────────────────────────────────────────────────────
237
+ server.registerTool('search_code', {
238
+ description: 'Search code across project files with plain text, regex, or fuzzy matching. Returns file paths + matched lines with context.',
239
+ inputSchema: searchCodeSchema,
240
+ annotations: readOnly,
241
+ }, async (args) => {
242
+ const matches = await searchFiles(args.pattern, {
243
+ mode: args.mode ?? 'plain',
244
+ glob: args.glob,
245
+ limit: args.limit ?? DEFAULT_SEARCH_LIMIT,
246
+ contextLines: args.context_lines ?? 1,
247
+ });
248
+ if (matches.length === 0)
249
+ return okResult('No matches found.');
250
+ const contextLines = args.context_lines ?? 1;
251
+ const parts = [`Found ${matches.length} match(es):\n`];
252
+ for (const m of matches) {
253
+ const buffer = await readSnippet(m.absolutePath, m.lineNumber - contextLines, m.lineNumber + contextLines);
254
+ parts.push(`${m.absolutePath}:${m.lineNumber}`);
255
+ if (buffer)
256
+ parts.push(buffer.snippet);
257
+ parts.push('');
258
+ }
259
+ return okResult(parts.join('\n'));
260
+ });
261
+ // ── detect_language ─────────────────────────────────────────────────────
262
+ server.registerTool('detect_language', {
263
+ description: 'Detect what programming language a file is written in based on its extension.',
264
+ inputSchema: detectLanguageSchema,
265
+ annotations: readOnly,
266
+ }, async (args) => {
267
+ const resolved = makeAllowedPath(args.path);
268
+ if (!resolved)
269
+ return errorResult('Path is outside allowed roots');
270
+ const language = detectLanguageForPath(resolved);
271
+ return okResult(JSON.stringify({ path: resolved, language, extension: path.extname(resolved).slice(1) }, null, 2));
272
+ });
273
+ // ── git_log ─────────────────────────────────────────────────────────────
274
+ server.registerTool('git_log', {
275
+ description: 'Show recent commits affecting a file. Lightweight git history for understanding why code changed.',
276
+ inputSchema: z.object({
277
+ path: z.string().describe('Path to the file'),
278
+ max_count: z.number().int().min(1).max(50).optional().describe('Max commits to return (default: 10)'),
279
+ }),
280
+ annotations: readOnly,
281
+ }, async (args) => {
282
+ const resolved = makeAllowedPath(args.path);
283
+ if (!resolved)
284
+ return errorResult('Path is outside allowed roots');
285
+ const result = await gitLog(resolved, args.max_count ?? 10);
286
+ if (!result.isGitRepo)
287
+ return okResult('Not a git repository or git not available.');
288
+ if (result.entries.length === 0)
289
+ return okResult('No commits found for this file.');
290
+ const lines = result.entries.map((e) => `${e.commit} | ${e.author} | ${e.date.slice(0, 10)} | ${e.message}`);
291
+ return okResult(`Git log for ${resolved}:\n\n${lines.join('\n')}`);
292
+ });
293
+ // ── git_blame ───────────────────────────────────────────────────────────
294
+ server.registerTool('git_blame', {
295
+ description: 'Show who last modified each line of a file (git blame). Useful for understanding context around specific code.',
296
+ inputSchema: z.object({
297
+ path: z.string().describe('Path to the file'),
298
+ start_line: z.number().int().optional().describe('Starting line (1-indexed)'),
299
+ end_line: z.number().int().optional().describe('Ending line (1-indexed)'),
300
+ }),
301
+ annotations: readOnly,
302
+ }, async (args) => {
303
+ const resolved = makeAllowedPath(args.path);
304
+ if (!resolved)
305
+ return errorResult('Path is outside allowed roots');
306
+ const result = await gitBlame(resolved, args.start_line, args.end_line);
307
+ if (!result.isGitRepo)
308
+ return okResult('Not a git repository or git not available.');
309
+ if (result.lines.length === 0)
310
+ return okResult('No blame info available.');
311
+ const maxLine = result.lines[result.lines.length - 1].lineNumber;
312
+ const width = String(maxLine).length;
313
+ const lines = result.lines.map((l) => {
314
+ const date = l.authorTime ? new Date(parseInt(l.authorTime, 10) * 1000).toISOString().slice(0, 10) : '';
315
+ return `${String(l.lineNumber).padStart(width)} | ${l.commit} | ${l.author.padEnd(16)} | ${date} | ${l.content}`;
316
+ });
317
+ return okResult(`Git blame for ${resolved}:\n\n${lines.join('\n')}`);
318
+ });
319
+ // ── find_documentation ──────────────────────────────────────────────────
320
+ server.registerTool('find_documentation', {
321
+ description: 'Search project documentation and code comments for a topic. Searches README, markdown files, docs directories, and code comments/docstrings. The go-to tool when you need to understand how to use something, not just where it is defined.',
322
+ inputSchema: z.object({
323
+ query: z.string().describe('Topic or term to find documentation about'),
324
+ scope: z.enum(['all', 'docs', 'code']).optional().describe('Scope to documentation files only or code comments only (default: all)'),
325
+ glob: z.string().optional().describe('Optional glob to narrow search within specific files'),
326
+ limit: z.number().int().min(1).max(30).optional().describe('Max results (default: 10)'),
327
+ }),
328
+ annotations: readOnly,
329
+ }, async (args) => {
330
+ const limit = args.limit ?? 10;
331
+ const results = [];
332
+ // 1. Search markdown documentation files
333
+ if (args.scope !== 'code') {
334
+ const docGlob = args.glob ?? '**/*.md';
335
+ const docMatches = await searchFiles(args.query, {
336
+ mode: 'plain',
337
+ glob: docGlob,
338
+ limit,
339
+ contextLines: 2,
340
+ });
341
+ for (const m of docMatches.slice(0, limit)) {
342
+ const snippet = await readSnippet(m.absolutePath, m.lineNumber - 2, m.lineNumber + 2);
343
+ if (snippet) {
344
+ results.push(`📝 ${m.relativePath}:${m.lineNumber}\n${snippet.snippet}\n`);
345
+ }
346
+ }
347
+ }
348
+ // 2. Search code comments: look for comment-like patterns near the query
349
+ if (args.scope !== 'docs' && results.length < limit) {
350
+ const commentPattern = args.query;
351
+ const codeMatches = await searchFiles(commentPattern, {
352
+ mode: 'plain',
353
+ glob: args.glob ?? '**/*.{ts,js,py,rs,go,java,c,cpp,rb,swift,kt,ex,hs,scala,php,cs,sh}',
354
+ limit: limit - results.length,
355
+ contextLines: 3,
356
+ });
357
+ for (const m of codeMatches.slice(0, limit - results.length)) {
358
+ const snippet = await readSnippet(m.absolutePath, m.lineNumber - 3, m.lineNumber + 3);
359
+ if (snippet && results.length < limit) {
360
+ const isComment = snippet.snippet.includes('//') || snippet.snippet.includes('#')
361
+ || snippet.snippet.includes('/*') || snippet.snippet.includes('"""')
362
+ || snippet.snippet.includes("'''");
363
+ if (isComment) {
364
+ results.push(`💬 ${m.relativePath}:${m.lineNumber}\n${snippet.snippet}\n`);
365
+ }
366
+ }
367
+ }
368
+ }
369
+ if (results.length === 0)
370
+ return okResult('No documentation found for this topic.');
371
+ return okResult(`Found ${results.length} documentation reference(s) about "${args.query}":\n\n${results.join('\n').slice(0, 10000)}`);
372
+ });
373
+ // ── get_project_overview ────────────────────────────────────────────────
374
+ server.registerTool('get_project_overview', {
375
+ description: 'Get a rich project overview in one call: language breakdown, file counts, entry points, config files, and top-level directory structure. The ideal starting point for understanding a new codebase.',
376
+ inputSchema: getProjectOverviewSchema,
377
+ annotations: readOnly,
378
+ }, async () => {
379
+ const roots = getRoots();
380
+ const languages = {};
381
+ let totalFiles = 0;
382
+ let totalLines = 0;
383
+ const entryPoints = [];
384
+ const configFiles = [];
385
+ const dirTree = {};
386
+ const ENTRY_POINT_NAMES = new Set([
387
+ 'main.ts', 'main.js', 'main.py', 'main.rs', 'main.go', 'main.java', 'main.c', 'main.cpp',
388
+ 'index.ts', 'index.js', 'index.py',
389
+ 'app.ts', 'app.js', 'app.py',
390
+ 'cli.ts', 'cli.js', 'cli.py',
391
+ 'server.ts', 'server.js', 'server.py',
392
+ 'api.ts', 'api.js', 'api.py',
393
+ '__main__.py', '__init__.py',
394
+ ]);
395
+ const CONFIG_FILE_NAMES = new Set([
396
+ 'package.json', 'tsconfig.json', 'tsconfig.build.json',
397
+ 'Cargo.toml', 'Cargo.lock',
398
+ 'go.mod', 'go.sum',
399
+ 'pyproject.toml', 'setup.py', 'setup.cfg', 'Pipfile', 'requirements.txt',
400
+ 'Makefile', 'Dockerfile', 'docker-compose.yml', 'docker-compose.yaml',
401
+ '.env', '.env.example', '.gitignore', '.gitattributes',
402
+ '.eslintrc', '.eslintrc.json', '.eslintrc.js', '.eslintrc.yaml',
403
+ '.prettierrc', '.prettierrc.json', '.prettierrc.js',
404
+ 'renovate.json', '.github/', '.gitlab-ci.yml',
405
+ 'Gemfile', 'Rakefile', 'Podfile',
406
+ 'build.gradle', 'pom.xml', 'gradlew',
407
+ 'CMakeLists.txt', 'configure.ac',
408
+ 'composer.json', 'Cask', 'Project.toml',
409
+ ]);
410
+ const entries = await listFiles('**/*', {
411
+ limit: 5000,
412
+ exclude: ['node_modules/', '.git/', 'dist/', 'build/', '.next/', '.turbo/', 'target/', '__pycache__/', 'vendor/', '.venv/', 'venv/'],
413
+ });
414
+ for (const e of entries) {
415
+ const lang = detectLanguageForPath(e.absolutePath);
416
+ if (lang)
417
+ languages[lang] = (languages[lang] ?? 0) + 1;
418
+ totalFiles++;
419
+ try {
420
+ const content = await fs.promises.readFile(e.absolutePath, 'utf-8');
421
+ totalLines += content.split('\n').length;
422
+ }
423
+ catch { /* skip binary/unreadable */ }
424
+ const rel = e.relativePath;
425
+ const parts = rel.split('/');
426
+ if (parts.length >= 1) {
427
+ for (let i = 0; i < Math.min(parts.length - 1, 2); i++) {
428
+ const dir = parts.slice(0, i + 1).join('/');
429
+ if (!dirTree[dir])
430
+ dirTree[dir] = { fileCount: 0, dirCount: 0 };
431
+ dirTree[dir].fileCount++;
432
+ }
433
+ }
434
+ const fileName = parts[parts.length - 1];
435
+ if (ENTRY_POINT_NAMES.has(fileName)) {
436
+ entryPoints.push(rel);
437
+ }
438
+ if (CONFIG_FILE_NAMES.has(fileName) || CONFIG_FILE_NAMES.has(`${fileName}/`)) {
439
+ configFiles.push(rel);
440
+ }
441
+ }
442
+ // Sort directory tree topologically
443
+ const sortedDirs = Object.entries(dirTree)
444
+ .sort(([a], [b]) => a.localeCompare(b))
445
+ .map(([d, counts]) => ({
446
+ path: d,
447
+ fileCount: counts.fileCount,
448
+ }));
449
+ return okResult(JSON.stringify({
450
+ roots: roots.map((r) => ({ path: r.path, uri: r.uri })),
451
+ totalFiles,
452
+ totalLines,
453
+ languages,
454
+ entryPoints: [...new Set(entryPoints)].slice(0, 20),
455
+ configFiles: [...new Set(configFiles)].slice(0, 30),
456
+ directoryStructure: sortedDirs.slice(0, 50),
457
+ }, null, 2));
458
+ });
459
+ // ── list_roots ──────────────────────────────────────────────────────────
460
+ server.registerTool('list_roots', {
461
+ description: 'Show the currently allowed filesystem roots.',
462
+ inputSchema: listRootsSchema,
463
+ annotations: readOnly,
464
+ }, async () => {
465
+ const roots = getRoots();
466
+ return okResult(JSON.stringify(roots.map((r) => ({ uri: r.uri, name: r.name, path: r.path })), null, 2));
467
+ });
468
+ // ── Lifecycle ─────────────────────────────────────────────────────────────
469
+ server.server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {
470
+ log('info', 'Roots changed notification received');
471
+ await refreshRoots(server.server);
472
+ });
473
+ initializeFallbackRoot();
474
+ server.server.oninitialized = async () => {
475
+ await refreshRoots(server.server);
476
+ };
477
+ const transport = new StdioServerTransport();
478
+ await server.connect(transport);
479
+ log('info', '@idea404/repocontext MCP server connected via stdio');
480
+ }
481
+ async function refreshRoots(server) {
482
+ try {
483
+ const clientCapabilities = server.getClientCapabilities();
484
+ if (!clientCapabilities?.roots) {
485
+ initializeFallbackRoot();
486
+ return;
487
+ }
488
+ const rootsResult = await server.listRoots({}, { timeout: 5000 });
489
+ if (rootsResult.roots && rootsResult.roots.length > 0) {
490
+ setRoots(rootsResult.roots.map((r) => ({
491
+ uri: r.uri,
492
+ name: r.name,
493
+ path: '',
494
+ })));
495
+ }
496
+ else {
497
+ initializeFallbackRoot();
498
+ }
499
+ }
500
+ catch (err) {
501
+ log('warning', `Failed to fetch roots: ${err}`);
502
+ initializeFallbackRoot();
503
+ }
504
+ }
505
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type SearchMatch } from './search.js';
2
+ export interface SymbolMatch {
3
+ name: string;
4
+ kind: string;
5
+ file: string;
6
+ startLine: number;
7
+ endLine: number;
8
+ docComment?: string;
9
+ }
10
+ export declare function findSymbols(query: string, options?: {
11
+ kind?: string;
12
+ language?: string;
13
+ glob?: string;
14
+ limit?: number;
15
+ }): Promise<SymbolMatch[]>;
16
+ export declare function traceSymbol(name: string, options?: {
17
+ kind?: string;
18
+ path?: string;
19
+ }): Promise<{
20
+ definition: SymbolMatch | null;
21
+ references: Array<SearchMatch & {
22
+ snippet: string;
23
+ }>;
24
+ }>;
25
+ export declare function getImports(filePath: string): Promise<Array<{
26
+ source: string;
27
+ items: string[];
28
+ isWildcard: boolean;
29
+ }> | null>;
30
+ export declare function getExports(filePath: string): Promise<Array<{
31
+ name: string;
32
+ kind: string;
33
+ }> | null>;
34
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAK5E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,WAAW,EAAE,CAAC,CAkExB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC;IACT,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,KAAK,CAAC,WAAW,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC,CAiDD;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC,CAUjF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC,CASxG"}