@j0hanz/filesystem-context-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +369 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +88 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/file-operations.test.d.ts +2 -0
- package/dist/__tests__/file-operations.test.d.ts.map +1 -0
- package/dist/__tests__/file-operations.test.js +230 -0
- package/dist/__tests__/file-operations.test.js.map +1 -0
- package/dist/__tests__/lib/errors.test.d.ts +2 -0
- package/dist/__tests__/lib/errors.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors.test.js +156 -0
- package/dist/__tests__/lib/errors.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations.test.js +417 -0
- package/dist/__tests__/lib/file-operations.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers.test.js +183 -0
- package/dist/__tests__/lib/fs-helpers.test.js.map +1 -0
- package/dist/__tests__/lib/path-validation.test.d.ts +2 -0
- package/dist/__tests__/lib/path-validation.test.d.ts.map +1 -0
- package/dist/__tests__/lib/path-validation.test.js +103 -0
- package/dist/__tests__/lib/path-validation.test.js.map +1 -0
- package/dist/__tests__/path-validation.test.d.ts +2 -0
- package/dist/__tests__/path-validation.test.d.ts.map +1 -0
- package/dist/__tests__/path-validation.test.js +92 -0
- package/dist/__tests__/path-validation.test.js.map +1 -0
- package/dist/config/types.d.ts +222 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +23 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/constants.d.ts +16 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +335 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +33 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +205 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-operations.d.ts +69 -0
- package/dist/lib/file-operations.d.ts.map +1 -0
- package/dist/lib/file-operations.js +1003 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/formatters.d.ts +30 -0
- package/dist/lib/formatters.d.ts.map +1 -0
- package/dist/lib/formatters.js +204 -0
- package/dist/lib/formatters.js.map +1 -0
- package/dist/lib/fs-helpers.d.ts +29 -0
- package/dist/lib/fs-helpers.d.ts.map +1 -0
- package/dist/lib/fs-helpers.js +295 -0
- package/dist/lib/fs-helpers.js.map +1 -0
- package/dist/lib/path-utils.d.ts +12 -0
- package/dist/lib/path-utils.d.ts.map +1 -0
- package/dist/lib/path-utils.js +34 -0
- package/dist/lib/path-utils.js.map +1 -0
- package/dist/lib/path-validation.d.ts +31 -0
- package/dist/lib/path-validation.d.ts.map +1 -0
- package/dist/lib/path-validation.js +181 -0
- package/dist/lib/path-validation.js.map +1 -0
- package/dist/lib/roots-utils.d.ts +7 -0
- package/dist/lib/roots-utils.d.ts.map +1 -0
- package/dist/lib/roots-utils.js +39 -0
- package/dist/lib/roots-utils.js.map +1 -0
- package/dist/lib/types.d.ts +6 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/schemas/common.d.ts +41 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +21 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +5 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/inputs.d.ts +72 -0
- package/dist/schemas/inputs.d.ts.map +1 -0
- package/dist/schemas/inputs.js +326 -0
- package/dist/schemas/inputs.js.map +1 -0
- package/dist/schemas/outputs.d.ts +476 -0
- package/dist/schemas/outputs.d.ts.map +1 -0
- package/dist/schemas/outputs.js +181 -0
- package/dist/schemas/outputs.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +83 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyze-directory.d.ts +3 -0
- package/dist/tools/analyze-directory.d.ts.map +1 -0
- package/dist/tools/analyze-directory.js +57 -0
- package/dist/tools/analyze-directory.js.map +1 -0
- package/dist/tools/directory-tree.d.ts +3 -0
- package/dist/tools/directory-tree.d.ts.map +1 -0
- package/dist/tools/directory-tree.js +47 -0
- package/dist/tools/directory-tree.js.map +1 -0
- package/dist/tools/get-file-info.d.ts +3 -0
- package/dist/tools/get-file-info.d.ts.map +1 -0
- package/dist/tools/get-file-info.js +44 -0
- package/dist/tools/get-file-info.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +23 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-allowed-dirs.d.ts +3 -0
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -0
- package/dist/tools/list-allowed-dirs.js +23 -0
- package/dist/tools/list-allowed-dirs.js.map +1 -0
- package/dist/tools/list-directory.d.ts +3 -0
- package/dist/tools/list-directory.d.ts.map +1 -0
- package/dist/tools/list-directory.js +60 -0
- package/dist/tools/list-directory.js.map +1 -0
- package/dist/tools/read-file.d.ts +3 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +55 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/read-media-file.d.ts +3 -0
- package/dist/tools/read-media-file.d.ts.map +1 -0
- package/dist/tools/read-media-file.js +48 -0
- package/dist/tools/read-media-file.js.map +1 -0
- package/dist/tools/read-multiple-files.d.ts +3 -0
- package/dist/tools/read-multiple-files.d.ts.map +1 -0
- package/dist/tools/read-multiple-files.js +53 -0
- package/dist/tools/read-multiple-files.js.map +1 -0
- package/dist/tools/search-content.d.ts +3 -0
- package/dist/tools/search-content.d.ts.map +1 -0
- package/dist/tools/search-content.js +67 -0
- package/dist/tools/search-content.js.map +1 -0
- package/dist/tools/search-files.d.ts +3 -0
- package/dist/tools/search-files.d.ts.map +1 -0
- package/dist/tools/search-files.js +51 -0
- package/dist/tools/search-files.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/response-helpers.d.ts +22 -0
- package/dist/utils/response-helpers.d.ts.map +1 -0
- package/dist/utils/response-helpers.js +24 -0
- package/dist/utils/response-helpers.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
export declare function normalizePath(p: string): string;
|
|
12
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/lib/path-utils.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAU/C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path normalization utilities for cross-platform consistency.
|
|
3
|
+
*/
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
/**
|
|
7
|
+
* Expand home directory shorthand (~/) to actual home path.
|
|
8
|
+
*/
|
|
9
|
+
function expandHome(filepath) {
|
|
10
|
+
if (filepath.startsWith('~/') || filepath === '~') {
|
|
11
|
+
return path.join(os.homedir(), filepath.slice(1));
|
|
12
|
+
}
|
|
13
|
+
return filepath;
|
|
14
|
+
}
|
|
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
|
+
*/
|
|
25
|
+
export function normalizePath(p) {
|
|
26
|
+
const expanded = expandHome(p);
|
|
27
|
+
const resolved = path.resolve(expanded);
|
|
28
|
+
// On Windows, normalize drive letter to lowercase (C: -> c:)
|
|
29
|
+
if (process.platform === 'win32' && /^[A-Z]:/.test(resolved)) {
|
|
30
|
+
return resolved.charAt(0).toLowerCase() + resolved.slice(1);
|
|
31
|
+
}
|
|
32
|
+
return resolved;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/lib/path-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;GAEG;AACH,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;;;;;;;;;GASG;AACH,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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
export declare function setAllowedDirectories(dirs: string[]): void;
|
|
7
|
+
/**
|
|
8
|
+
* Get a copy of the current allowed directories list.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAllowedDirectories(): string[];
|
|
11
|
+
interface ValidatedPathDetails {
|
|
12
|
+
/** Normalized version of the originally requested path (may still be a symlink). */
|
|
13
|
+
requestedPath: string;
|
|
14
|
+
/** Realpath-resolved absolute path (symlinks resolved). */
|
|
15
|
+
resolvedPath: string;
|
|
16
|
+
/** Whether the originally requested path is a symbolic link. */
|
|
17
|
+
isSymlink: boolean;
|
|
18
|
+
}
|
|
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
|
+
export declare function validateExistingPathDetailed(requestedPath: string): Promise<ValidatedPathDetails>;
|
|
24
|
+
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
|
+
export declare function getValidRootDirectories(roots: Root[]): Promise<string[]>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=path-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAQ/D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAG1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAyBD,UAAU,oBAAoB;IAC5B,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;CACpB;AA0GD;;;GAGG;AACH,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;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path validation and security module for filesystem access control.
|
|
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
|
+
*/
|
|
39
|
+
import * as fs from 'node:fs/promises';
|
|
40
|
+
import { fileURLToPath } from 'node:url';
|
|
41
|
+
import { ErrorCode, McpError } from './errors.js';
|
|
42
|
+
import { normalizePath } from './path-utils.js';
|
|
43
|
+
/** Internal storage for allowed directories */
|
|
44
|
+
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
|
+
export function setAllowedDirectories(dirs) {
|
|
50
|
+
const normalized = dirs.map(normalizePath).filter((d) => d.length > 0);
|
|
51
|
+
allowedDirectories = [...new Set(normalized)];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get a copy of the current allowed directories list.
|
|
55
|
+
*/
|
|
56
|
+
export function getAllowedDirectories() {
|
|
57
|
+
return [...allowedDirectories];
|
|
58
|
+
}
|
|
59
|
+
const PATH_SEPARATOR = process.platform === 'win32' ? '\\' : '/';
|
|
60
|
+
/**
|
|
61
|
+
* Normalize path for comparison (case-insensitive on Windows)
|
|
62
|
+
*/
|
|
63
|
+
function normalizeForComparison(p) {
|
|
64
|
+
return process.platform === 'win32' ? p.toLowerCase() : p;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a normalized path is within allowed directories.
|
|
68
|
+
*/
|
|
69
|
+
function isPathWithinAllowedDirectories(normalizedPath) {
|
|
70
|
+
const candidate = normalizeForComparison(normalizedPath);
|
|
71
|
+
return allowedDirectories.some((allowedDir) => {
|
|
72
|
+
const allowed = normalizeForComparison(allowedDir);
|
|
73
|
+
// Exact match or is a child path
|
|
74
|
+
return (candidate === allowed || candidate.startsWith(allowed + PATH_SEPARATOR));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function validateExistingPathDetailsInternal(requestedPath) {
|
|
78
|
+
// Validate input is not empty or only whitespace
|
|
79
|
+
if (!requestedPath || requestedPath.trim().length === 0) {
|
|
80
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, 'Path cannot be empty or whitespace', requestedPath);
|
|
81
|
+
}
|
|
82
|
+
const normalizedRequested = normalizePath(requestedPath);
|
|
83
|
+
if (!isPathWithinAllowedDirectories(normalizedRequested)) {
|
|
84
|
+
throw new McpError(ErrorCode.E_ACCESS_DENIED, `Access denied: Path '${requestedPath}' is outside allowed directories`, requestedPath, { normalizedPath: normalizedRequested });
|
|
85
|
+
}
|
|
86
|
+
let realPath;
|
|
87
|
+
try {
|
|
88
|
+
realPath = await fs.realpath(normalizedRequested);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Distinguish between different error types for better error messages
|
|
92
|
+
const nodeError = error;
|
|
93
|
+
if (nodeError.code === 'ENOENT') {
|
|
94
|
+
throw new McpError(ErrorCode.E_NOT_FOUND, `Path does not exist: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
95
|
+
}
|
|
96
|
+
if (nodeError.code === 'EACCES' || nodeError.code === 'EPERM') {
|
|
97
|
+
throw new McpError(ErrorCode.E_PERMISSION_DENIED, `Permission denied accessing path: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
98
|
+
}
|
|
99
|
+
if (nodeError.code === 'ELOOP') {
|
|
100
|
+
throw new McpError(ErrorCode.E_SYMLINK_NOT_ALLOWED, `Too many symbolic links in path: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
101
|
+
}
|
|
102
|
+
if (nodeError.code === 'ENAMETOOLONG') {
|
|
103
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, `Path name too long: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
104
|
+
}
|
|
105
|
+
// Generic fallback for other errors
|
|
106
|
+
throw new McpError(ErrorCode.E_NOT_FOUND, `Path is not accessible: ${requestedPath}`, requestedPath, { originalCode: nodeError.code, originalMessage: nodeError.message }, error);
|
|
107
|
+
}
|
|
108
|
+
const normalizedReal = normalizePath(realPath);
|
|
109
|
+
if (!isPathWithinAllowedDirectories(normalizedReal)) {
|
|
110
|
+
throw new McpError(ErrorCode.E_ACCESS_DENIED, `Access denied: Path '${requestedPath}' resolves to '${realPath}' which is outside allowed directories (symlink escape attempt)`, requestedPath, { resolvedPath: realPath, normalizedResolvedPath: normalizedReal });
|
|
111
|
+
}
|
|
112
|
+
// Detect if the *requested* path is a symlink without following it.
|
|
113
|
+
// Note: lstat runs after the allowed-directory string check above.
|
|
114
|
+
let isSymlink = false;
|
|
115
|
+
try {
|
|
116
|
+
const lstats = await fs.lstat(normalizedRequested);
|
|
117
|
+
isSymlink = lstats.isSymbolicLink();
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// If lstat fails but realpath succeeded, treat as non-symlink.
|
|
121
|
+
// This can happen on some platforms/filesystems; safe default.
|
|
122
|
+
isSymlink = false;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
requestedPath: normalizedRequested,
|
|
126
|
+
resolvedPath: normalizedReal,
|
|
127
|
+
isSymlink,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
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
|
+
export async function validateExistingPathDetailed(requestedPath) {
|
|
135
|
+
return validateExistingPathDetailsInternal(requestedPath);
|
|
136
|
+
}
|
|
137
|
+
export async function validateExistingPath(requestedPath) {
|
|
138
|
+
const details = await validateExistingPathDetailsInternal(requestedPath);
|
|
139
|
+
return details.resolvedPath;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Validates and extracts valid directory paths from MCP Root objects.
|
|
143
|
+
* Only file:// URIs pointing to existing directories are accepted.
|
|
144
|
+
*/
|
|
145
|
+
export async function getValidRootDirectories(roots) {
|
|
146
|
+
const validDirs = [];
|
|
147
|
+
for (const root of roots) {
|
|
148
|
+
// Only accept file:// URIs
|
|
149
|
+
if (!root.uri.startsWith('file://')) {
|
|
150
|
+
console.error(`Skipping non-file:// root URI: ${root.uri}`);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const dirPath = fileURLToPath(root.uri);
|
|
155
|
+
const normalizedPath = normalizePath(dirPath);
|
|
156
|
+
// Verify the directory exists and is accessible
|
|
157
|
+
const stats = await fs.stat(normalizedPath);
|
|
158
|
+
if (stats.isDirectory()) {
|
|
159
|
+
// Resolve symlinks to get the real path
|
|
160
|
+
try {
|
|
161
|
+
const realPath = await fs.realpath(normalizedPath);
|
|
162
|
+
validDirs.push(normalizePath(realPath));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// If realpath fails, use the normalized path
|
|
166
|
+
validDirs.push(normalizedPath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
console.error(`Skipping root (not a directory): ${normalizedPath}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
175
|
+
console.error(`Skipping inaccessible root ${root.uri}: ${message}`);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return validDirs;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=path-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Root } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates and extracts valid directory paths from MCP Root objects.
|
|
4
|
+
* Only file:// URIs pointing to existing directories are accepted.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getValidRootDirectories(roots: Root[]): Promise<string[]>;
|
|
7
|
+
//# sourceMappingURL=roots-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roots-utils.d.ts","sourceRoot":"","sources":["../../src/lib/roots-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAI/D;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAgCnB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { normalizePath } from './path-utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Validates and extracts valid directory paths from MCP Root objects.
|
|
6
|
+
* Only file:// URIs pointing to existing directories are accepted.
|
|
7
|
+
*/
|
|
8
|
+
export async function getValidRootDirectories(roots) {
|
|
9
|
+
const validDirs = [];
|
|
10
|
+
for (const root of roots) {
|
|
11
|
+
// Only accept file:// URIs
|
|
12
|
+
if (!root.uri.startsWith('file://')) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const dirPath = fileURLToPath(root.uri);
|
|
17
|
+
const normalizedPath = normalizePath(dirPath);
|
|
18
|
+
// Verify the directory exists and is accessible
|
|
19
|
+
const stats = await fs.stat(normalizedPath);
|
|
20
|
+
if (stats.isDirectory()) {
|
|
21
|
+
// Resolve symlinks to get the real path
|
|
22
|
+
try {
|
|
23
|
+
const realPath = await fs.realpath(normalizedPath);
|
|
24
|
+
validDirs.push(normalizePath(realPath));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// If realpath fails, use the normalized path
|
|
28
|
+
validDirs.push(normalizedPath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Skip invalid or inaccessible roots
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return validDirs;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=roots-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roots-utils.js","sourceRoot":"","sources":["../../src/lib/roots-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAa;IAEb,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAE9C,gDAAgD;YAChD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,wCAAwC;gBACxC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;oBACnD,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC;oBACP,6CAA6C;oBAC7C,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;YACrC,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Import types directly from '../config/types.js' instead.
|
|
3
|
+
* This re-export exists only for backward compatibility.
|
|
4
|
+
*/
|
|
5
|
+
export type { AnalyzeDirectoryResult, ContentMatch, DetailedError, DirectoryAnalysis, DirectoryEntry, DirectoryTreeResult, ErrorCode, ErrorResponse, FileInfo, FileType, ListDirectoryResult, MediaFileResult, SearchContentResult, SearchFilesResult, SearchResult, TreeEntry, } from '../config/types.js';
|
|
6
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const FileTypeSchema: z.ZodEnum<["file", "directory", "symlink", "other"]>;
|
|
3
|
+
export declare const ErrorSchema: z.ZodObject<{
|
|
4
|
+
code: z.ZodString;
|
|
5
|
+
message: z.ZodString;
|
|
6
|
+
path: z.ZodOptional<z.ZodString>;
|
|
7
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
path?: string | undefined;
|
|
12
|
+
suggestion?: string | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
code: string;
|
|
15
|
+
message: string;
|
|
16
|
+
path?: string | undefined;
|
|
17
|
+
suggestion?: string | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Schema for tree entries - uses lazy evaluation for recursive structure.
|
|
21
|
+
* The base schema validates name, type, optional size, and optional children array.
|
|
22
|
+
*/
|
|
23
|
+
declare const BaseTreeEntrySchema: z.ZodObject<{
|
|
24
|
+
name: z.ZodString;
|
|
25
|
+
type: z.ZodEnum<["file", "directory"]>;
|
|
26
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
name: string;
|
|
29
|
+
type: "file" | "directory";
|
|
30
|
+
size?: number | undefined;
|
|
31
|
+
}, {
|
|
32
|
+
name: string;
|
|
33
|
+
type: "file" | "directory";
|
|
34
|
+
size?: number | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
type TreeEntryType = z.infer<typeof BaseTreeEntrySchema> & {
|
|
37
|
+
children?: TreeEntryType[];
|
|
38
|
+
};
|
|
39
|
+
export declare const TreeEntrySchema: z.ZodType<TreeEntryType>;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc,sDAAoD,CAAC;AAEhF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;EAKtB,CAAC;AAEH;;;GAGG;AACH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;EAIvB,CAAC;AAEH,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG;IACzD,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAGjD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const FileTypeSchema = z.enum(['file', 'directory', 'symlink', 'other']);
|
|
3
|
+
export const ErrorSchema = z.object({
|
|
4
|
+
code: z.string(),
|
|
5
|
+
message: z.string(),
|
|
6
|
+
path: z.string().optional(),
|
|
7
|
+
suggestion: z.string().optional(),
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Schema for tree entries - uses lazy evaluation for recursive structure.
|
|
11
|
+
* The base schema validates name, type, optional size, and optional children array.
|
|
12
|
+
*/
|
|
13
|
+
const BaseTreeEntrySchema = z.object({
|
|
14
|
+
name: z.string(),
|
|
15
|
+
type: z.enum(['file', 'directory']),
|
|
16
|
+
size: z.number().optional(),
|
|
17
|
+
});
|
|
18
|
+
export const TreeEntrySchema = BaseTreeEntrySchema.extend({
|
|
19
|
+
children: z.lazy(() => z.array(TreeEntrySchema).optional()),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,eAAe,GAC1B,mBAAmB,CAAC,MAAM,CAAC;IACzB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC5D,CAAC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { AnalyzeDirectoryInputSchema, DirectoryTreeInputSchema, GetFileInfoInputSchema, ListDirectoryInputSchema, ReadFileInputSchema, ReadMediaFileInputSchema, ReadMultipleFilesInputSchema, SearchContentInputSchema, SearchFilesInputSchema, } from './inputs.js';
|
|
2
|
+
export { AnalyzeDirectoryOutputSchema, DirectoryTreeOutputSchema, GetFileInfoOutputSchema, ListAllowedDirectoriesOutputSchema, ListDirectoryOutputSchema, ReadFileOutputSchema, ReadMediaFileOutputSchema, ReadMultipleFilesOutputSchema, SearchContentOutputSchema, SearchFilesOutputSchema, } from './outputs.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EACvB,kCAAkC,EAClC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Input schemas
|
|
2
|
+
export { AnalyzeDirectoryInputSchema, DirectoryTreeInputSchema, GetFileInfoInputSchema, ListDirectoryInputSchema, ReadFileInputSchema, ReadMediaFileInputSchema, ReadMultipleFilesInputSchema, SearchContentInputSchema, SearchFilesInputSchema, } from './inputs.js';
|
|
3
|
+
// Output schemas
|
|
4
|
+
export { AnalyzeDirectoryOutputSchema, DirectoryTreeOutputSchema, GetFileInfoOutputSchema, ListAllowedDirectoriesOutputSchema, ListDirectoryOutputSchema, ReadFileOutputSchema, ReadMediaFileOutputSchema, ReadMultipleFilesOutputSchema, SearchContentOutputSchema, SearchFilesOutputSchema, } from './outputs.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EACvB,kCAAkC,EAClC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ListDirectoryInputSchema: {
|
|
3
|
+
path: z.ZodString;
|
|
4
|
+
recursive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
5
|
+
includeHidden: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
6
|
+
maxDepth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
7
|
+
maxEntries: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
sortBy: z.ZodDefault<z.ZodOptional<z.ZodEnum<["name", "size", "modified", "type"]>>>;
|
|
9
|
+
includeSymlinkTargets: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
10
|
+
};
|
|
11
|
+
export declare const SearchFilesInputSchema: {
|
|
12
|
+
path: z.ZodString;
|
|
13
|
+
pattern: z.ZodString;
|
|
14
|
+
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
15
|
+
maxResults: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
sortBy: z.ZodDefault<z.ZodOptional<z.ZodEnum<["name", "size", "modified", "path"]>>>;
|
|
17
|
+
maxDepth: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
};
|
|
19
|
+
export declare const ReadFileInputSchema: {
|
|
20
|
+
path: z.ZodString;
|
|
21
|
+
encoding: z.ZodDefault<z.ZodOptional<z.ZodEnum<["utf-8", "utf8", "ascii", "base64", "hex", "latin1"]>>>;
|
|
22
|
+
maxSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
23
|
+
lineStart: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
lineEnd: z.ZodOptional<z.ZodNumber>;
|
|
25
|
+
head: z.ZodOptional<z.ZodNumber>;
|
|
26
|
+
tail: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
};
|
|
28
|
+
export declare const ReadMultipleFilesInputSchema: {
|
|
29
|
+
paths: z.ZodArray<z.ZodString, "many">;
|
|
30
|
+
encoding: z.ZodDefault<z.ZodOptional<z.ZodEnum<["utf-8", "utf8", "ascii", "base64", "hex", "latin1"]>>>;
|
|
31
|
+
maxSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
32
|
+
head: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
tail: z.ZodOptional<z.ZodNumber>;
|
|
34
|
+
};
|
|
35
|
+
export declare const GetFileInfoInputSchema: {
|
|
36
|
+
path: z.ZodString;
|
|
37
|
+
};
|
|
38
|
+
export declare const SearchContentInputSchema: {
|
|
39
|
+
path: z.ZodString;
|
|
40
|
+
pattern: z.ZodString;
|
|
41
|
+
filePattern: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
42
|
+
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
43
|
+
caseSensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
44
|
+
maxResults: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
45
|
+
maxFileSize: z.ZodOptional<z.ZodNumber>;
|
|
46
|
+
maxFilesScanned: z.ZodOptional<z.ZodNumber>;
|
|
47
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
48
|
+
skipBinary: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
49
|
+
contextLines: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
50
|
+
wholeWord: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
51
|
+
isLiteral: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
52
|
+
};
|
|
53
|
+
export declare const AnalyzeDirectoryInputSchema: {
|
|
54
|
+
path: z.ZodString;
|
|
55
|
+
maxDepth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
56
|
+
topN: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
57
|
+
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
58
|
+
includeHidden: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
59
|
+
};
|
|
60
|
+
export declare const DirectoryTreeInputSchema: {
|
|
61
|
+
path: z.ZodString;
|
|
62
|
+
maxDepth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
63
|
+
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
64
|
+
includeHidden: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
65
|
+
includeSize: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
66
|
+
maxFiles: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
};
|
|
68
|
+
export declare const ReadMediaFileInputSchema: {
|
|
69
|
+
path: z.ZodString;
|
|
70
|
+
maxSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=inputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,wBAAwB;;;;;;;;CAoCpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;CAmClC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;CAgD/B,CAAC;AAEF,eAAO,MAAM,4BAA4B;;;;;;CAiCxC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;CAKlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;CAkFpC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;CAgCvC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;CAoCpC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAapC,CAAC"}
|