@mario.andreschak/mcp-filesystem 3.39.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/shared.js ADDED
@@ -0,0 +1,161 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import { spawn } from 'node:child_process';
4
+ import { fileURLToPath } from 'node:url';
5
+ function diagnostic(level, scope, message, detail) {
6
+ const suffix = detail === undefined
7
+ ? ''
8
+ : ` ${detail instanceof Error ? detail.stack ?? detail.message : safeStringify(detail)}`;
9
+ process.stderr.write(`[${scope}] ${level}: ${message}${suffix}\n`);
10
+ }
11
+ function safeStringify(value) {
12
+ try {
13
+ return typeof value === 'string' ? value : JSON.stringify(value);
14
+ }
15
+ catch {
16
+ return String(value);
17
+ }
18
+ }
19
+ export function createLogger(scope) {
20
+ return {
21
+ debug: (message, detail) => {
22
+ if (process.env.FLUJO_MCP_DEBUG === '1')
23
+ diagnostic('debug', scope, message, detail);
24
+ },
25
+ info: (message, detail) => diagnostic('info', scope, message, detail),
26
+ warn: (message, detail) => diagnostic('warn', scope, message, detail),
27
+ error: (message, detail) => diagnostic('error', scope, message, detail),
28
+ };
29
+ }
30
+ export function getDataDir() {
31
+ return path.resolve(process.env.FLUJO_DATA_DIR?.trim() || process.cwd());
32
+ }
33
+ export function getHomeDir() {
34
+ return path.resolve(process.env.FLUJO_HOME_DIR?.trim() || os.homedir());
35
+ }
36
+ export function isInside(root, candidate) {
37
+ const rel = path.relative(path.resolve(root), path.resolve(candidate));
38
+ return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
39
+ }
40
+ export function envRoots(envVarNames) {
41
+ const names = Array.isArray(envVarNames) ? envVarNames : [envVarNames];
42
+ for (const name of names) {
43
+ const raw = process.env[name];
44
+ if (!raw?.trim())
45
+ continue;
46
+ const roots = raw.split(path.delimiter).map((root) => root.trim()).filter(Boolean).map((root) => path.resolve(root));
47
+ if (roots.length > 0)
48
+ return roots;
49
+ }
50
+ return null;
51
+ }
52
+ let rootsProvider;
53
+ export function configureRootsProvider(provider) {
54
+ rootsProvider = provider;
55
+ }
56
+ async function clientRoots(dataDir) {
57
+ if (!rootsProvider)
58
+ return [];
59
+ try {
60
+ const roots = await rootsProvider();
61
+ const resolved = [];
62
+ for (const root of roots) {
63
+ const raw = root?.uri?.trim();
64
+ if (!raw)
65
+ continue;
66
+ if (raw.startsWith('file://')) {
67
+ try {
68
+ resolved.push(path.resolve(fileURLToPath(raw)));
69
+ }
70
+ catch {
71
+ // Ignore malformed roots supplied by the client.
72
+ }
73
+ }
74
+ else {
75
+ resolved.push(path.isAbsolute(raw) ? path.resolve(raw) : path.resolve(dataDir, raw));
76
+ }
77
+ }
78
+ return Array.from(new Set(resolved));
79
+ }
80
+ catch (error) {
81
+ createLogger('mcp-shared/roots').debug('Client does not expose roots/list', error);
82
+ return [];
83
+ }
84
+ }
85
+ export async function loadEffectiveRoots(_serverName, envVarNames, _callerNodeId) {
86
+ const dataDir = getDataDir();
87
+ const ceiling = envRoots(envVarNames);
88
+ const configured = await clientRoots(dataDir);
89
+ if (!ceiling)
90
+ return configured.length > 0 ? configured : [dataDir];
91
+ const confined = configured.filter((candidate) => ceiling.some((root) => isInside(root, candidate)));
92
+ return confined.length > 0 ? confined : ceiling;
93
+ }
94
+ function truthy(value) {
95
+ return typeof value === 'string' && /^(1|true|yes|on)$/i.test(value.trim());
96
+ }
97
+ export const ALLOW_PROTECTED_PATHS_ENV = 'FLUJO_ALLOW_PROTECTED_PATHS';
98
+ export async function isProtectedPathsEnabled() {
99
+ if (truthy(process.env[ALLOW_PROTECTED_PATHS_ENV]))
100
+ return false;
101
+ return truthy(process.env.FLUJO_PROTECTED_PATHS_ENABLED);
102
+ }
103
+ function protectedPaths() {
104
+ if (truthy(process.env[ALLOW_PROTECTED_PATHS_ENV]))
105
+ return [];
106
+ const home = getHomeDir();
107
+ const underHome = (...segments) => path.resolve(home, ...segments);
108
+ if (process.platform === 'win32') {
109
+ return ['AppData', 'Downloads', 'Desktop', 'Documents', 'Pictures', 'Music', 'Videos', 'OneDrive'].map((item) => underHome(item));
110
+ }
111
+ if (process.platform === 'darwin') {
112
+ return [
113
+ 'Downloads', 'Desktop', 'Documents', 'Pictures', 'Music', 'Movies',
114
+ 'Library/Mail', 'Library/Messages', 'Library/Safari', 'Library/Cookies',
115
+ 'Library/Calendars', 'Library/Application Support/AddressBook',
116
+ 'Library/Application Support/com.apple.TCC', 'Library/PersonalizationPortrait',
117
+ 'Library/Metadata/CoreSpotlight', 'Library/Suggestions',
118
+ ].map((item) => underHome(item)).concat(['/.Spotlight-V100', '/.fseventsd', '/.DocumentRevisions-V100'].map((item) => path.resolve(item)));
119
+ }
120
+ return ['Documents', 'Downloads', 'Desktop', '.ssh', '.gnupg', '.aws', '.config'].map((item) => underHome(item));
121
+ }
122
+ export function isProtected(candidate) {
123
+ const resolved = path.resolve(candidate);
124
+ const exempt = [getDataDir(), os.tmpdir()].map((item) => path.resolve(item));
125
+ if (exempt.some((root) => isInside(root, resolved)))
126
+ return { denied: false };
127
+ const matchedRoot = protectedPaths().find((root) => isInside(root, resolved));
128
+ return matchedRoot ? { denied: true, matchedRoot } : { denied: false };
129
+ }
130
+ export function killProcessTree(child, graceMs = 2000) {
131
+ const pid = child.pid;
132
+ if (pid === undefined)
133
+ return () => undefined;
134
+ if (process.platform === 'win32') {
135
+ try {
136
+ const killer = spawn('taskkill', ['/pid', String(pid), '/T', '/F']);
137
+ killer.on('error', () => undefined);
138
+ }
139
+ catch {
140
+ // The target is already gone.
141
+ }
142
+ return () => undefined;
143
+ }
144
+ try {
145
+ process.kill(-pid, 'SIGTERM');
146
+ }
147
+ catch {
148
+ // The group is already gone.
149
+ }
150
+ const escalation = setTimeout(() => {
151
+ try {
152
+ process.kill(-pid, 'SIGKILL');
153
+ }
154
+ catch {
155
+ // The group is already gone.
156
+ }
157
+ }, graceMs);
158
+ escalation.unref?.();
159
+ return () => clearTimeout(escalation);
160
+ }
161
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ export declare function filesystemToolDefinitions(): Tool[];
3
+ export declare function filesystemCallTool(toolName: string, args: Record<string, unknown>, callerNodeId?: string): Promise<CallToolResult>;