@j0hanz/filesystem-context-mcp 1.0.3 → 1.0.6
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 +27 -26
- package/dist/__tests__/lib/formatters.test.js +0 -3
- package/dist/__tests__/lib/formatters.test.js.map +1 -1
- package/dist/__tests__/lib/image-parsing.test.js +0 -3
- package/dist/__tests__/lib/image-parsing.test.js.map +1 -1
- package/dist/config/types.d.ts +0 -68
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -7
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +2 -17
- package/dist/index.js.map +1 -1
- package/dist/instructions.md +245 -0
- package/dist/lib/constants.d.ts +0 -8
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +14 -19
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors.d.ts +0 -12
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +50 -32
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-operations.d.ts.map +1 -1
- package/dist/lib/file-operations.js +50 -12
- package/dist/lib/file-operations.js.map +1 -1
- package/dist/lib/formatters.d.ts +0 -21
- package/dist/lib/formatters.d.ts.map +1 -1
- package/dist/lib/formatters.js +6 -32
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/fs-helpers.d.ts +0 -4
- package/dist/lib/fs-helpers.d.ts.map +1 -1
- package/dist/lib/fs-helpers.js +24 -23
- package/dist/lib/fs-helpers.js.map +1 -1
- package/dist/lib/image-parsing.d.ts +0 -4
- package/dist/lib/image-parsing.d.ts.map +1 -1
- package/dist/lib/image-parsing.js +1 -4
- package/dist/lib/image-parsing.js.map +1 -1
- package/dist/lib/path-utils.d.ts +0 -10
- package/dist/lib/path-utils.d.ts.map +1 -1
- package/dist/lib/path-utils.js +1 -16
- package/dist/lib/path-utils.js.map +1 -1
- package/dist/lib/path-validation.d.ts +0 -18
- package/dist/lib/path-validation.d.ts.map +1 -1
- package/dist/lib/path-validation.js +3 -60
- package/dist/lib/path-validation.js.map +1 -1
- package/dist/prompts/analyze-codebase.d.ts +3 -0
- package/dist/prompts/analyze-codebase.d.ts.map +1 -0
- package/dist/prompts/analyze-codebase.js +58 -0
- package/dist/prompts/analyze-codebase.js.map +1 -0
- package/dist/prompts/filesystem-query.d.ts +3 -0
- package/dist/prompts/filesystem-query.d.ts.map +1 -0
- package/dist/prompts/filesystem-query.js +113 -0
- package/dist/prompts/filesystem-query.js.map +1 -0
- package/dist/prompts/find-duplicates.d.ts +3 -0
- package/dist/prompts/find-duplicates.d.ts.map +1 -0
- package/dist/prompts/find-duplicates.js +68 -0
- package/dist/prompts/find-duplicates.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +13 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/project-overview.d.ts +3 -0
- package/dist/prompts/project-overview.d.ts.map +1 -0
- package/dist/prompts/project-overview.js +51 -0
- package/dist/prompts/project-overview.js.map +1 -0
- package/dist/prompts/search-and-replace.d.ts +3 -0
- package/dist/prompts/search-and-replace.d.ts.map +1 -0
- package/dist/prompts/search-and-replace.js +83 -0
- package/dist/prompts/search-and-replace.js.map +1 -0
- package/dist/schemas/common.d.ts +0 -4
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +10 -12
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/index.d.ts +0 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +0 -3
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/inputs.d.ts +2 -2
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +15 -1
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/outputs.d.ts +4 -4
- package/dist/schemas/validators.js +2 -2
- package/dist/schemas/validators.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-directory.d.ts.map +1 -1
- package/dist/tools/analyze-directory.js +1 -0
- package/dist/tools/analyze-directory.js.map +1 -1
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +1 -0
- package/dist/tools/directory-tree.js.map +1 -1
- package/dist/tools/get-file-info.d.ts.map +1 -1
- package/dist/tools/get-file-info.js +1 -0
- package/dist/tools/get-file-info.js.map +1 -1
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
- package/dist/tools/list-allowed-dirs.js +1 -0
- package/dist/tools/list-allowed-dirs.js.map +1 -1
- package/dist/tools/list-directory.d.ts.map +1 -1
- package/dist/tools/list-directory.js +1 -0
- package/dist/tools/list-directory.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +1 -0
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-media-file.d.ts.map +1 -1
- package/dist/tools/read-media-file.js +1 -0
- package/dist/tools/read-media-file.js.map +1 -1
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +1 -0
- package/dist/tools/read-multiple-files.js.map +1 -1
- package/dist/tools/search-content.d.ts.map +1 -1
- package/dist/tools/search-content.js +1 -0
- package/dist/tools/search-content.js.map +1 -1
- package/dist/tools/search-files.d.ts.map +1 -1
- package/dist/tools/search-files.js +1 -0
- package/dist/tools/search-files.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// Image format signatures
|
|
1
2
|
const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47];
|
|
2
3
|
const JPEG_SIGNATURE = [0xff, 0xd8];
|
|
3
4
|
const GIF_SIGNATURE = [0x47, 0x49, 0x46];
|
|
@@ -103,10 +104,6 @@ const IMAGE_PARSERS = {
|
|
|
103
104
|
'.bmp': parseBmp,
|
|
104
105
|
'.webp': parseWebp,
|
|
105
106
|
};
|
|
106
|
-
/**
|
|
107
|
-
* Parse image dimensions from common image format headers.
|
|
108
|
-
* Supports PNG, JPEG, GIF, BMP, and WebP.
|
|
109
|
-
*/
|
|
110
107
|
export function parseImageDimensions(buffer, ext) {
|
|
111
108
|
try {
|
|
112
109
|
const parser = IMAGE_PARSERS[ext];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-parsing.js","sourceRoot":"","sources":["../../src/lib/image-parsing.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AACxD,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAC7C,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAClD,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAC5C,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AACpD,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAEtD,SAAS,gBAAgB,CACvB,MAAc,EACd,SAA4B,EAC5B,MAAM,GAAG,CAAC;IAEV,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GACT,MAAM,KAAK,SAAS;YACpB,CAAC,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;gBACjC,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;gBAClC,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;gBAClC,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;aACxC,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM;QACvC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,IACE,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC;QACpC,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,EACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,mCAAmC;IACnC,IACE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EACrB,CAAC;QACD,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,MAAM;YACvC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,MAAM;SACzC,CAAC;IACJ,CAAC;IACD,uCAAuC;IACvC,IACE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EACrB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,uCAAuC;IACvC,IACE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;QACrB,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EACrB,CAAC;QACD,MAAM,KAAK,GACT,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,MAAM,GACV,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"image-parsing.js","sourceRoot":"","sources":["../../src/lib/image-parsing.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/path-utils.d.ts
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Normalize a path to a canonical, absolute form.
|
|
3
|
-
*
|
|
4
|
-
* - Expands ~ to home directory
|
|
5
|
-
* - Resolves to absolute path
|
|
6
|
-
* - On Windows, normalizes drive letter to lowercase for consistent comparison
|
|
7
|
-
*
|
|
8
|
-
* @param p - The path to normalize (relative or absolute)
|
|
9
|
-
* @returns The normalized absolute path
|
|
10
|
-
*/
|
|
11
1
|
export declare function normalizePath(p: string): string;
|
|
12
2
|
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/lib/path-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/lib/path-utils.ts"],"names":[],"mappings":"AAWA,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAU/C"}
|
package/dist/lib/path-utils.js
CHANGED
|
@@ -1,27 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Path normalization utilities for cross-platform consistency.
|
|
3
|
-
*/
|
|
4
1
|
import * as os from 'node:os';
|
|
5
2
|
import * as path from 'node:path';
|
|
6
|
-
/**
|
|
7
|
-
* Expand home directory shorthand (~/) to actual home path.
|
|
8
|
-
*/
|
|
9
3
|
function expandHome(filepath) {
|
|
10
4
|
if (filepath.startsWith('~/') || filepath === '~') {
|
|
11
5
|
return path.join(os.homedir(), filepath.slice(1));
|
|
12
6
|
}
|
|
13
7
|
return filepath;
|
|
14
8
|
}
|
|
15
|
-
|
|
16
|
-
* Normalize a path to a canonical, absolute form.
|
|
17
|
-
*
|
|
18
|
-
* - Expands ~ to home directory
|
|
19
|
-
* - Resolves to absolute path
|
|
20
|
-
* - On Windows, normalizes drive letter to lowercase for consistent comparison
|
|
21
|
-
*
|
|
22
|
-
* @param p - The path to normalize (relative or absolute)
|
|
23
|
-
* @returns The normalized absolute path
|
|
24
|
-
*/
|
|
9
|
+
// Normalize path to canonical absolute form
|
|
25
10
|
export function normalizePath(p) {
|
|
26
11
|
const expanded = expandHome(p);
|
|
27
12
|
const resolved = path.resolve(expanded);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/lib/path-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/lib/path-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,SAAS,UAAU,CAAC,QAAgB;IAClC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,6DAA6D;IAC7D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1,31 +1,13 @@
|
|
|
1
1
|
import type { Root } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Set the list of directories that this server is allowed to access.
|
|
4
|
-
* All paths are normalized before storage.
|
|
5
|
-
*/
|
|
6
2
|
export declare function setAllowedDirectories(dirs: string[]): void;
|
|
7
|
-
/**
|
|
8
|
-
* Get a copy of the current allowed directories list.
|
|
9
|
-
*/
|
|
10
3
|
export declare function getAllowedDirectories(): string[];
|
|
11
4
|
interface ValidatedPathDetails {
|
|
12
|
-
/** Normalized version of the originally requested path (may still be a symlink). */
|
|
13
5
|
requestedPath: string;
|
|
14
|
-
/** Realpath-resolved absolute path (symlinks resolved). */
|
|
15
6
|
resolvedPath: string;
|
|
16
|
-
/** Whether the originally requested path is a symbolic link. */
|
|
17
7
|
isSymlink: boolean;
|
|
18
8
|
}
|
|
19
|
-
/**
|
|
20
|
-
* Like validateExistingPath(), but also returns the normalized requested path and whether it was a symlink.
|
|
21
|
-
* Useful for operations that need to report on symlinks without traversing them.
|
|
22
|
-
*/
|
|
23
9
|
export declare function validateExistingPathDetailed(requestedPath: string): Promise<ValidatedPathDetails>;
|
|
24
10
|
export declare function validateExistingPath(requestedPath: string): Promise<string>;
|
|
25
|
-
/**
|
|
26
|
-
* Validates and extracts valid directory paths from MCP Root objects.
|
|
27
|
-
* Only file:// URIs pointing to existing directories are accepted.
|
|
28
|
-
*/
|
|
29
11
|
export declare function getValidRootDirectories(roots: Root[]): Promise<string[]>;
|
|
30
12
|
export {};
|
|
31
13
|
//# sourceMappingURL=path-validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAO/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAG1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAmBD,UAAU,oBAAoB;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AA0GD,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAGD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCnB"}
|
|
@@ -1,71 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* This module is the SECURITY BOUNDARY of the MCP server.
|
|
5
|
-
* All filesystem operations MUST call validateExistingPath() before accessing any path.
|
|
6
|
-
*
|
|
7
|
-
* Security properties:
|
|
8
|
-
* - Prevents access to paths outside allowed directories
|
|
9
|
-
* - Prevents symlink escapes (validates both requested path and resolved realpath)
|
|
10
|
-
* - Normalizes paths consistently across platforms
|
|
11
|
-
*
|
|
12
|
-
* ## TOCTOU (Time-of-Check-Time-of-Use) Considerations
|
|
13
|
-
*
|
|
14
|
-
* This module validates paths at a point in time. Between validation and actual
|
|
15
|
-
* file operations, the filesystem state may change (race condition). This is an
|
|
16
|
-
* inherent limitation of path-based filesystem access that cannot be fully mitigated
|
|
17
|
-
* without kernel-level support.
|
|
18
|
-
*
|
|
19
|
-
* **Mitigations applied:**
|
|
20
|
-
* 1. **Symlink resolution**: We resolve symlinks during validation via `fs.realpath()`,
|
|
21
|
-
* ensuring the resolved target is within allowed directories at validation time.
|
|
22
|
-
* 2. **Short validation window**: Validation is performed immediately before operations
|
|
23
|
-
* to minimize the race window.
|
|
24
|
-
* 3. **Read-only operations**: This server only performs read operations, limiting the
|
|
25
|
-
* impact of TOCTOU races (no data corruption risk).
|
|
26
|
-
*
|
|
27
|
-
* **Residual risks:**
|
|
28
|
-
* - A file could be replaced with a symlink between validation and read
|
|
29
|
-
* - A directory could be replaced with a symlink junction (Windows)
|
|
30
|
-
* - File permissions could change between validation and access
|
|
31
|
-
*
|
|
32
|
-
* **For higher security requirements:**
|
|
33
|
-
* - Use `O_NOFOLLOW` flag where supported (Linux)
|
|
34
|
-
* - Use file handles (`fs.open()`) and operate on handles instead of paths
|
|
35
|
-
* - Consider sandboxing at the OS level (containers, namespaces)
|
|
36
|
-
*
|
|
37
|
-
* @see https://cwe.mitre.org/data/definitions/367.html - CWE-367: TOCTOU Race Condition
|
|
38
|
-
*/
|
|
1
|
+
// Path validation and security module - the SECURITY BOUNDARY of this server.
|
|
2
|
+
// All filesystem operations MUST call validateExistingPath() before accessing any path.
|
|
39
3
|
import * as fs from 'node:fs/promises';
|
|
40
4
|
import { fileURLToPath } from 'node:url';
|
|
41
5
|
import { ErrorCode, McpError } from './errors.js';
|
|
42
6
|
import { normalizePath } from './path-utils.js';
|
|
43
|
-
/** Internal storage for allowed directories */
|
|
44
7
|
let allowedDirectories = [];
|
|
45
|
-
/**
|
|
46
|
-
* Set the list of directories that this server is allowed to access.
|
|
47
|
-
* All paths are normalized before storage.
|
|
48
|
-
*/
|
|
49
8
|
export function setAllowedDirectories(dirs) {
|
|
50
9
|
const normalized = dirs.map(normalizePath).filter((d) => d.length > 0);
|
|
51
10
|
allowedDirectories = [...new Set(normalized)];
|
|
52
11
|
}
|
|
53
|
-
/**
|
|
54
|
-
* Get a copy of the current allowed directories list.
|
|
55
|
-
*/
|
|
56
12
|
export function getAllowedDirectories() {
|
|
57
13
|
return [...allowedDirectories];
|
|
58
14
|
}
|
|
59
15
|
const PATH_SEPARATOR = process.platform === 'win32' ? '\\' : '/';
|
|
60
|
-
/**
|
|
61
|
-
* Normalize path for comparison (case-insensitive on Windows)
|
|
62
|
-
*/
|
|
63
16
|
function normalizeForComparison(p) {
|
|
64
17
|
return process.platform === 'win32' ? p.toLowerCase() : p;
|
|
65
18
|
}
|
|
66
|
-
/**
|
|
67
|
-
* Check if a normalized path is within allowed directories.
|
|
68
|
-
*/
|
|
69
19
|
function isPathWithinAllowedDirectories(normalizedPath) {
|
|
70
20
|
const candidate = normalizeForComparison(normalizedPath);
|
|
71
21
|
return allowedDirectories.some((allowedDir) => {
|
|
@@ -127,10 +77,6 @@ async function validateExistingPathDetailsInternal(requestedPath) {
|
|
|
127
77
|
isSymlink,
|
|
128
78
|
};
|
|
129
79
|
}
|
|
130
|
-
/**
|
|
131
|
-
* Like validateExistingPath(), but also returns the normalized requested path and whether it was a symlink.
|
|
132
|
-
* Useful for operations that need to report on symlinks without traversing them.
|
|
133
|
-
*/
|
|
134
80
|
export async function validateExistingPathDetailed(requestedPath) {
|
|
135
81
|
return validateExistingPathDetailsInternal(requestedPath);
|
|
136
82
|
}
|
|
@@ -138,10 +84,7 @@ export async function validateExistingPath(requestedPath) {
|
|
|
138
84
|
const details = await validateExistingPathDetailsInternal(requestedPath);
|
|
139
85
|
return details.resolvedPath;
|
|
140
86
|
}
|
|
141
|
-
|
|
142
|
-
* Validates and extracts valid directory paths from MCP Root objects.
|
|
143
|
-
* Only file:// URIs pointing to existing directories are accepted.
|
|
144
|
-
*/
|
|
87
|
+
// Extract valid directory paths from MCP Root objects (file:// URIs only)
|
|
145
88
|
export async function getValidRootDirectories(roots) {
|
|
146
89
|
const validDirs = [];
|
|
147
90
|
for (const root of roots) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-codebase.d.ts","sourceRoot":"","sources":["../../src/prompts/analyze-codebase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkErE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getAllowedDirectories } from '../lib/path-validation.js';
|
|
4
|
+
export function registerAnalyzeCodebasePrompt(server) {
|
|
5
|
+
server.registerPrompt('analyze-codebase', {
|
|
6
|
+
description: 'Deep analysis of code patterns, architecture, and implementation details in a codebase',
|
|
7
|
+
argsSchema: {
|
|
8
|
+
path: completable(z.string().min(1).describe('Root path of the codebase to analyze'), (value) => {
|
|
9
|
+
const dirs = getAllowedDirectories();
|
|
10
|
+
return dirs.filter((d) => d.toLowerCase().includes(value.toLowerCase()) ||
|
|
11
|
+
value.toLowerCase().includes(d.toLowerCase().slice(0, 10)));
|
|
12
|
+
}),
|
|
13
|
+
focus: z
|
|
14
|
+
.enum(['architecture', 'patterns', 'quality', 'security', 'all'])
|
|
15
|
+
.optional()
|
|
16
|
+
.default('all')
|
|
17
|
+
.describe('Analysis focus area (default: all)'),
|
|
18
|
+
filePattern: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.default('**/*.{ts,js,py,java,go,rs}')
|
|
22
|
+
.describe('Glob pattern for files to analyze (default: common source files)'),
|
|
23
|
+
},
|
|
24
|
+
}, ({ path, focus, filePattern }) => ({
|
|
25
|
+
messages: [
|
|
26
|
+
{
|
|
27
|
+
role: 'user',
|
|
28
|
+
content: {
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: `Perform a deep analysis of the codebase at "${path}" with focus on: ${focus}.
|
|
31
|
+
|
|
32
|
+
Use the available filesystem tools systematically:
|
|
33
|
+
|
|
34
|
+
1. **Discovery Phase**
|
|
35
|
+
- Use \`directory_tree\` to understand the overall structure
|
|
36
|
+
- Use \`search_files\` with pattern "${filePattern}" to find source files
|
|
37
|
+
- Use \`analyze_directory\` to get file statistics and identify largest/most recent files
|
|
38
|
+
|
|
39
|
+
2. **Code Inspection Phase**
|
|
40
|
+
- Use \`search_content\` to find key patterns:
|
|
41
|
+
${focus === 'architecture' || focus === 'all' ? '- Search for class/interface definitions, exports, imports' : ''}
|
|
42
|
+
${focus === 'patterns' || focus === 'all' ? '- Search for common design patterns (Factory, Singleton, Observer, etc.)' : ''}
|
|
43
|
+
${focus === 'quality' || focus === 'all' ? '- Search for TODO, FIXME, HACK comments' : ''}
|
|
44
|
+
${focus === 'security' || focus === 'all' ? '- Search for potential security concerns (eval, exec, password, secret, token)' : ''}
|
|
45
|
+
- Use \`read_multiple_files\` to examine key files identified in discovery
|
|
46
|
+
|
|
47
|
+
3. **Analysis Deliverables**
|
|
48
|
+
${focus === 'architecture' || focus === 'all' ? '- **Architecture**: Module organization, dependency flow, layering patterns' : ''}
|
|
49
|
+
${focus === 'patterns' || focus === 'all' ? '- **Design Patterns**: Identified patterns, their usage, and effectiveness' : ''}
|
|
50
|
+
${focus === 'quality' || focus === 'all' ? '- **Code Quality**: Technical debt indicators, documentation coverage, consistency' : ''}
|
|
51
|
+
${focus === 'security' || focus === 'all' ? '- **Security**: Potential vulnerabilities, hardcoded secrets, input validation' : ''}
|
|
52
|
+
- **Recommendations**: Prioritized list of improvements with rationale`,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=analyze-codebase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-codebase.js","sourceRoot":"","sources":["../../src/prompts/analyze-codebase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAG9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,WAAW,EACT,wFAAwF;QAC1F,UAAU,EAAE;YACV,IAAI,EAAE,WAAW,CACf,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC,EAClE,CAAC,KAAK,EAAE,EAAE;gBACR,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;oBAC7C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAC7D,CAAC;YACJ,CAAC,CACF;YACD,KAAK,EAAE,CAAC;iBACL,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;iBAChE,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,oCAAoC,CAAC;YACjD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,4BAA4B,CAAC;iBACrC,QAAQ,CACP,kEAAkE,CACnE;SACJ;KACF,EACD,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,+CAA+C,IAAI,oBAAoB,KAAK;;;;;;0CAMpD,WAAW;;;;;OAK9C,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,4DAA4D,CAAC,CAAC,CAAC,EAAE;OAC/G,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC,CAAC,EAAE;OACzH,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,EAAE;OACvF,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,gFAAgF,CAAC,CAAC,CAAC,EAAE;;;;KAIjI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,6EAA6E,CAAC,CAAC,CAAC,EAAE;KAChI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,4EAA4E,CAAC,CAAC,CAAC,EAAE;KAC3H,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,oFAAoF,CAAC,CAAC,CAAC,EAAE;KAClI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,gFAAgF,CAAC,CAAC,CAAC,EAAE;0EAC1D;iBAC/D;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-query.d.ts","sourceRoot":"","sources":["../../src/prompts/filesystem-query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkIrE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getAllowedDirectories } from '../lib/path-validation.js';
|
|
4
|
+
export function registerFilesystemQueryPrompt(server) {
|
|
5
|
+
server.registerPrompt('filesystem-query', {
|
|
6
|
+
description: 'A guided prompt for performing common filesystem exploration and analysis tasks. Provides structured guidance based on the selected operation type.',
|
|
7
|
+
argsSchema: {
|
|
8
|
+
path: completable(z.string().min(1).describe('Target path for the operation'), (value) => {
|
|
9
|
+
const dirs = getAllowedDirectories();
|
|
10
|
+
return dirs.filter((d) => d.toLowerCase().includes(value.toLowerCase()) ||
|
|
11
|
+
value.toLowerCase().includes(d.toLowerCase().slice(0, 10)));
|
|
12
|
+
}),
|
|
13
|
+
operation: z
|
|
14
|
+
.enum([
|
|
15
|
+
'explore',
|
|
16
|
+
'find-files',
|
|
17
|
+
'search-code',
|
|
18
|
+
'analyze-size',
|
|
19
|
+
'recent-changes',
|
|
20
|
+
])
|
|
21
|
+
.describe('Operation type: explore (structure), find-files (by pattern), search-code (content search), analyze-size (disk usage), recent-changes (modified files)'),
|
|
22
|
+
pattern: z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Search pattern (glob for find-files, regex for search-code)'),
|
|
26
|
+
depth: z
|
|
27
|
+
.number()
|
|
28
|
+
.int()
|
|
29
|
+
.min(1)
|
|
30
|
+
.max(20)
|
|
31
|
+
.optional()
|
|
32
|
+
.default(5)
|
|
33
|
+
.describe('Maximum depth for exploration (default: 5)'),
|
|
34
|
+
},
|
|
35
|
+
}, ({ path, operation, pattern, depth }) => {
|
|
36
|
+
const operationPrompts = {
|
|
37
|
+
explore: `Explore the filesystem structure at "${path}".
|
|
38
|
+
|
|
39
|
+
Use these tools in sequence:
|
|
40
|
+
1. \`directory_tree\` with maxDepth=${String(depth)} to visualize the hierarchy
|
|
41
|
+
2. \`analyze_directory\` to get file statistics (types, sizes, counts)
|
|
42
|
+
3. \`list_directory\` with sortBy="modified" for recent activity
|
|
43
|
+
|
|
44
|
+
Provide:
|
|
45
|
+
- **Structure Overview**: Main directories and their purposes
|
|
46
|
+
- **File Distribution**: Breakdown by type and location
|
|
47
|
+
- **Key Files**: Important configuration or entry point files
|
|
48
|
+
- **Notable Findings**: Unusual patterns or large files`,
|
|
49
|
+
'find-files': `Find files matching pattern "${pattern ?? '**/*'}" in "${path}".
|
|
50
|
+
|
|
51
|
+
Use these tools:
|
|
52
|
+
1. \`search_files\` with pattern="${pattern ?? '**/*'}" to find matching files
|
|
53
|
+
2. \`read_multiple_files\` to examine the most relevant matches
|
|
54
|
+
3. Optionally \`get_file_info\` for detailed metadata on specific files
|
|
55
|
+
|
|
56
|
+
Provide:
|
|
57
|
+
- **Matched Files**: List with paths and sizes
|
|
58
|
+
- **Pattern Analysis**: What the pattern captured
|
|
59
|
+
- **Content Preview**: Summary of matched file contents
|
|
60
|
+
- **Suggestions**: Related patterns that might be useful`,
|
|
61
|
+
'search-code': `Search for code pattern "${pattern ?? ''}" in "${path}".
|
|
62
|
+
|
|
63
|
+
Use these tools:
|
|
64
|
+
1. \`search_content\` with pattern="${pattern ?? ''}" and contextLines=2
|
|
65
|
+
2. \`read_multiple_files\` to get full context for important matches
|
|
66
|
+
3. Group results by file and analyze patterns
|
|
67
|
+
|
|
68
|
+
Provide:
|
|
69
|
+
- **Match Summary**: Total matches, files affected
|
|
70
|
+
- **Code Context**: Key matches with surrounding code
|
|
71
|
+
- **Pattern Usage**: How and where the pattern appears
|
|
72
|
+
- **Related Code**: Suggest related patterns to explore`,
|
|
73
|
+
'analyze-size': `Analyze disk usage and file sizes in "${path}".
|
|
74
|
+
|
|
75
|
+
Use these tools:
|
|
76
|
+
1. \`analyze_directory\` to get size statistics and largest files
|
|
77
|
+
2. \`directory_tree\` with includeSize=true for size visualization
|
|
78
|
+
3. \`search_files\` to find specific file types if needed
|
|
79
|
+
|
|
80
|
+
Provide:
|
|
81
|
+
- **Size Summary**: Total size, file count, directory count
|
|
82
|
+
- **Largest Files**: Top 10 with sizes and paths
|
|
83
|
+
- **Type Breakdown**: Size by file extension
|
|
84
|
+
- **Cleanup Suggestions**: Files that could be removed or compressed`,
|
|
85
|
+
'recent-changes': `Find recently modified files in "${path}".
|
|
86
|
+
|
|
87
|
+
Use these tools:
|
|
88
|
+
1. \`analyze_directory\` to see recentlyModified list
|
|
89
|
+
2. \`list_directory\` with sortBy="modified" for detailed listing
|
|
90
|
+
3. \`read_multiple_files\` to examine recent changes
|
|
91
|
+
|
|
92
|
+
Provide:
|
|
93
|
+
- **Recent Activity**: Files modified in last 24h, week, month
|
|
94
|
+
- **Change Patterns**: Which areas are most active
|
|
95
|
+
- **File Diffs**: Summary of what changed in key files
|
|
96
|
+
- **Activity Insights**: Development patterns or areas of focus`,
|
|
97
|
+
};
|
|
98
|
+
const promptText = operationPrompts[operation] ??
|
|
99
|
+
`Perform "${operation}" operation at "${path}".`;
|
|
100
|
+
return {
|
|
101
|
+
messages: [
|
|
102
|
+
{
|
|
103
|
+
role: 'user',
|
|
104
|
+
content: {
|
|
105
|
+
type: 'text',
|
|
106
|
+
text: promptText,
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=filesystem-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-query.js","sourceRoot":"","sources":["../../src/prompts/filesystem-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAG9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,WAAW,EACT,qJAAqJ;QACvJ,UAAU,EAAE;YACV,IAAI,EAAE,WAAW,CACf,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAC3D,CAAC,KAAK,EAAE,EAAE;gBACR,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;oBAC7C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAC7D,CAAC;YACJ,CAAC,CACF;YACD,SAAS,EAAE,CAAC;iBACT,IAAI,CAAC;gBACJ,SAAS;gBACT,YAAY;gBACZ,aAAa;gBACb,cAAc;gBACd,gBAAgB;aACjB,CAAC;iBACD,QAAQ,CACP,wJAAwJ,CACzJ;YACH,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,6DAA6D,CAC9D;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,4CAA4C,CAAC;SAC1D;KACF,EACD,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QACtC,MAAM,gBAAgB,GAA2B;YAC/C,OAAO,EAAE,wCAAwC,IAAI;;;sCAGvB,MAAM,CAAC,KAAK,CAAC;;;;;;;;wDAQK;YAEhD,YAAY,EAAE,gCAAgC,OAAO,IAAI,MAAM,SAAS,IAAI;;;oCAGhD,OAAO,IAAI,MAAM;;;;;;;;yDAQI;YAEjD,aAAa,EAAE,4BAA4B,OAAO,IAAI,EAAE,SAAS,IAAI;;;sCAGvC,OAAO,IAAI,EAAE;;;;;;;;wDAQK;YAEhD,cAAc,EAAE,yCAAyC,IAAI;;;;;;;;;;;qEAWA;YAE7D,gBAAgB,EAAE,oCAAoC,IAAI;;;;;;;;;;;gEAWF;SACzD,CAAC;QAEF,MAAM,UAAU,GACd,gBAAgB,CAAC,SAAS,CAAC;YAC3B,YAAY,SAAS,mBAAmB,IAAI,IAAI,CAAC;QAEnD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-duplicates.d.ts","sourceRoot":"","sources":["../../src/prompts/find-duplicates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8EpE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getAllowedDirectories } from '../lib/path-validation.js';
|
|
4
|
+
export function registerFindDuplicatesPrompt(server) {
|
|
5
|
+
server.registerPrompt('find-duplicates', {
|
|
6
|
+
description: 'Find duplicate or similar code patterns, files, and potential refactoring opportunities',
|
|
7
|
+
argsSchema: {
|
|
8
|
+
path: completable(z.string().min(1).describe('Root path to search for duplicates'), (value) => {
|
|
9
|
+
const dirs = getAllowedDirectories();
|
|
10
|
+
return dirs.filter((d) => d.toLowerCase().includes(value.toLowerCase()) ||
|
|
11
|
+
value.toLowerCase().includes(d.toLowerCase().slice(0, 10)));
|
|
12
|
+
}),
|
|
13
|
+
pattern: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.default('**/*.{ts,js,tsx,jsx,py,java}')
|
|
17
|
+
.describe('Glob pattern for files to check (default: source files)'),
|
|
18
|
+
searchTerm: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Optional specific pattern or function name to find duplicates of'),
|
|
22
|
+
},
|
|
23
|
+
}, ({ path, pattern, searchTerm }) => ({
|
|
24
|
+
messages: [
|
|
25
|
+
{
|
|
26
|
+
role: 'user',
|
|
27
|
+
content: {
|
|
28
|
+
type: 'text',
|
|
29
|
+
text: `Find duplicate code and refactoring opportunities in "${path}".
|
|
30
|
+
|
|
31
|
+
Use the available filesystem tools:
|
|
32
|
+
|
|
33
|
+
1. **File Discovery**
|
|
34
|
+
- Use \`search_files\` with pattern "${pattern}" to find all relevant files
|
|
35
|
+
- Use \`analyze_directory\` to identify files of similar sizes (potential duplicates)
|
|
36
|
+
|
|
37
|
+
2. **Content Analysis**
|
|
38
|
+
${searchTerm
|
|
39
|
+
? `- Use \`search_content\` to find all occurrences of "${searchTerm}"`
|
|
40
|
+
: `- Use \`search_content\` to find common duplicate patterns:
|
|
41
|
+
- Similar function signatures
|
|
42
|
+
- Repeated import statements
|
|
43
|
+
- Common utility patterns (error handling, logging, validation)
|
|
44
|
+
- Copied configuration blocks`}
|
|
45
|
+
|
|
46
|
+
3. **Detailed Inspection**
|
|
47
|
+
- Use \`read_multiple_files\` to compare files with similar sizes or names
|
|
48
|
+
- Look for:
|
|
49
|
+
- Copy-pasted code blocks
|
|
50
|
+
- Functions with similar logic but different names
|
|
51
|
+
- Repeated patterns that could be abstracted
|
|
52
|
+
- Similar error handling or validation logic
|
|
53
|
+
|
|
54
|
+
4. **Report Findings**
|
|
55
|
+
- **Exact Duplicates**: Files or code blocks that are identical
|
|
56
|
+
- **Near Duplicates**: Similar code with minor variations
|
|
57
|
+
- **Pattern Opportunities**: Repeated patterns that could be abstracted into utilities
|
|
58
|
+
- **Refactoring Suggestions**: Specific recommendations with:
|
|
59
|
+
- Which files are affected
|
|
60
|
+
- Proposed abstraction or consolidation
|
|
61
|
+
- Estimated complexity reduction
|
|
62
|
+
- Potential risks of refactoring`,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=find-duplicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-duplicates.js","sourceRoot":"","sources":["../../src/prompts/find-duplicates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAG9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,cAAc,CACnB,iBAAiB,EACjB;QACE,WAAW,EACT,yFAAyF;QAC3F,UAAU,EAAE;YACV,IAAI,EAAE,WAAW,CACf,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAChE,CAAC,KAAK,EAAE,EAAE;gBACR,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;oBAC7C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAC7D,CAAC;YACJ,CAAC,CACF;YACD,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,8BAA8B,CAAC;iBACvC,QAAQ,CAAC,yDAAyD,CAAC;YACtE,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,kEAAkE,CACnE;SACJ;KACF,EACD,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yDAAyD,IAAI;;;;;0CAKrC,OAAO;;;;KAK5C,UAAU;wBACR,CAAC,CAAC,wDAAwD,UAAU,GAAG;wBACvE,CAAC,CAAC;;;;mCAKN;;;;;;;;;;;;;;;;;;sCAkBmC;iBAC3B;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAM1D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { registerAnalyzeCodebasePrompt } from './analyze-codebase.js';
|
|
2
|
+
import { registerFilesystemQueryPrompt } from './filesystem-query.js';
|
|
3
|
+
import { registerFindDuplicatesPrompt } from './find-duplicates.js';
|
|
4
|
+
import { registerProjectOverviewPrompt } from './project-overview.js';
|
|
5
|
+
import { registerSearchAndReplacePrompt } from './search-and-replace.js';
|
|
6
|
+
export function registerAllPrompts(server) {
|
|
7
|
+
registerProjectOverviewPrompt(server);
|
|
8
|
+
registerAnalyzeCodebasePrompt(server);
|
|
9
|
+
registerFindDuplicatesPrompt(server);
|
|
10
|
+
registerSearchAndReplacePrompt(server);
|
|
11
|
+
registerFilesystemQueryPrompt(server);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-overview.d.ts","sourceRoot":"","sources":["../../src/prompts/project-overview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyDrE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getAllowedDirectories } from '../lib/path-validation.js';
|
|
4
|
+
export function registerProjectOverviewPrompt(server) {
|
|
5
|
+
server.registerPrompt('project-overview', {
|
|
6
|
+
description: 'Get a comprehensive overview of a project directory structure, key files, and organization patterns',
|
|
7
|
+
argsSchema: {
|
|
8
|
+
path: completable(z.string().min(1).describe('Root path of the project to analyze'), (value) => {
|
|
9
|
+
const dirs = getAllowedDirectories();
|
|
10
|
+
return dirs.filter((d) => d.toLowerCase().includes(value.toLowerCase()) ||
|
|
11
|
+
value.toLowerCase().includes(d.toLowerCase().slice(0, 10)));
|
|
12
|
+
}),
|
|
13
|
+
depth: z
|
|
14
|
+
.number()
|
|
15
|
+
.int()
|
|
16
|
+
.min(1)
|
|
17
|
+
.max(10)
|
|
18
|
+
.optional()
|
|
19
|
+
.default(4)
|
|
20
|
+
.describe('Maximum depth to explore (default: 4)'),
|
|
21
|
+
},
|
|
22
|
+
}, ({ path, depth }) => ({
|
|
23
|
+
messages: [
|
|
24
|
+
{
|
|
25
|
+
role: 'user',
|
|
26
|
+
content: {
|
|
27
|
+
type: 'text',
|
|
28
|
+
text: `Please provide a comprehensive overview of the project at "${path}".
|
|
29
|
+
|
|
30
|
+
Use the available filesystem tools to:
|
|
31
|
+
|
|
32
|
+
1. **Directory Structure** - Use \`directory_tree\` with maxDepth=${String(depth)} to visualize the project layout
|
|
33
|
+
2. **Project Analysis** - Use \`analyze_directory\` to get statistics about file types, sizes, and recent activity
|
|
34
|
+
3. **Key Configuration Files** - Use \`read_multiple_files\` to read common config files if they exist:
|
|
35
|
+
- package.json, tsconfig.json, pyproject.toml, Cargo.toml
|
|
36
|
+
- .gitignore, README.md, LICENSE
|
|
37
|
+
- Any config files in the root directory
|
|
38
|
+
|
|
39
|
+
Based on the gathered information, provide:
|
|
40
|
+
- **Project Type**: Identify the language(s), framework(s), and build tools
|
|
41
|
+
- **Directory Organization**: Explain the folder structure and conventions used
|
|
42
|
+
- **Key Entry Points**: Identify main files, entry points, or important modules
|
|
43
|
+
- **Dependencies**: Summarize key dependencies if package manifest is found
|
|
44
|
+
- **Notable Patterns**: Highlight any interesting architectural patterns or conventions
|
|
45
|
+
- **Recommendations**: Suggest any improvements to project organization if applicable`,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=project-overview.js.map
|