@n0zer0d4y/vulcan-file-ops 1.2.9 → 1.2.11

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/CHANGELOG.md CHANGED
@@ -9,6 +9,106 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
 
11
11
 
12
+ ## [1.2.11] - 2026-02-21
13
+
14
+ ### Fixed
15
+
16
+ - **CRITICAL**: Fixed MCP server toggle failure and "no tools configured" error in Claude Desktop and Cursor.
17
+ - **Root Cause**: ES Module execution order caused `parseArguments()` to run before console suppression logic. This allowed warning messages to be emitted to the protocol stream, corrupting JSON-RPC communication.
18
+ - **Solution**: Moved console suppression to the absolute top of `server/index.ts` and deferred argument parsing to the `runServer()` function.
19
+ - Improved MCP mode detection to exclude `--help` and `--version` flags.
20
+ - See `local_docs/RCA-MCP-Toggle-Failure-Stdout-Pollution-2026-02-21.md` for full details.
21
+
22
+ ## [1.2.10] - 2026-01-31
23
+
24
+ ### Fixed
25
+
26
+ - **CRITICAL**: Fixed MCP server toggle failure in Claude Desktop caused by capability mismatch
27
+ - **Root Cause**: Server declared `resources: {}` and `prompts: {}` capabilities but had NO handlers for `resources/list` and `prompts/list` methods
28
+ - Claude Desktop calls these methods after initialization, receives "Method not found" (-32601) errors, and fails to enable the server toggle
29
+ - **Solution**: Removed `resources` and `prompts` capability declarations from both Server constructor and initialize response
30
+ - Per MCP specification: A server MUST NOT declare capabilities for features it does not implement
31
+ - This bug was originally fixed in v1.2.3 but was reintroduced in v1.2.8 when code was restored to v1.2.1 baseline
32
+ - See `local_docs/RCA-Claude-Desktop-MCP-Capability-Mismatch-2026-01-31.md` for complete root cause analysis
33
+
34
+ ### Changed
35
+
36
+ - Server now only declares `tools` capability (which is fully implemented)
37
+ - Removed unused capability declarations that caused protocol compliance issues
38
+
39
+ ### References
40
+
41
+ - [MCPcat Guide: Fix MCP Error -32601](https://mcpcat.io/guides/fixing-method-not-found-32601-error/)
42
+ - MCP Protocol Specification: Capability declaration requirements
43
+
44
+ ## [1.2.9] - 2026-01-31
45
+
46
+ ### Fixed
47
+
48
+ - **CRITICAL**: Fixed protocol version negotiation causing Claude Desktop connection failures
49
+ - Server now returns the protocol version requested by the client instead of hardcoded `LATEST_PROTOCOL_VERSION`
50
+ - Claude Desktop requests `2025-06-18` but previous versions returned `2025-11-25`, causing immediate disconnection
51
+ - This fix ensures compatibility with all MCP clients regardless of their supported protocol version
52
+
53
+ ### Changed
54
+
55
+ - Protocol version in initialize response now mirrors client's requested version
56
+ - Added documentation comments explaining protocol version negotiation requirements
57
+
58
+ ## [1.2.8] - 2026-01-31
59
+
60
+ ### Changed
61
+
62
+ - Restored source code to working v1.2.1 baseline
63
+ - Downgraded `@modelcontextprotocol/sdk` from `^1.25.2` to `1.20.0` for stability
64
+ - Removed experimental console suppression changes that caused issues
65
+
66
+ ### Notes
67
+
68
+ - This release reverts problematic changes while maintaining SDK 1.20.0 compatibility
69
+
70
+ ## [1.2.7] - 2026-01-31
71
+
72
+ ### Fixed
73
+
74
+ - Downgraded `@modelcontextprotocol/sdk` to `1.20.0` to resolve Claude Desktop compatibility issues
75
+ - SDK 1.25.x introduced breaking changes in stdio transport and protocol handling
76
+
77
+ ### Changed
78
+
79
+ - Locked SDK version to exact `1.20.0` (removed caret range)
80
+
81
+ ## [1.2.6] - 2026-01-31
82
+
83
+ ### Fixed
84
+
85
+ - Silenced dotenv debug output that was polluting stdout and corrupting MCP JSON-RPC protocol
86
+ - Added `quiet: true` option to `dotenv.config()` call
87
+ - Improved MCP mode detection logic
88
+ - Changed TTY detection from AND to OR logic: now triggers MCP mode if EITHER stdin OR stdout is piped
89
+ - This fixes edge cases where different shells/platforms report TTY status inconsistently
90
+
91
+ ### Changed
92
+
93
+ - Console suppression now activates when any standard stream is piped, not just when both are piped
94
+
95
+ ## [1.2.5] - 2026-01-31
96
+
97
+ ### Fixed
98
+
99
+ - **CRITICAL**: Fixed ES Module execution order bug causing stdout pollution in MCP mode
100
+ - Console suppression code in `cli.ts` was ineffective due to ES Module static import hoisting
101
+ - Child modules (including `server/index.ts`) were evaluated BEFORE parent module's top-level code
102
+ - Moved console suppression to the top of `server/index.ts` before any imports
103
+ - Deferred `parseArguments()` call from module-level to inside `runServer()` function
104
+ - Added `--help` and `--version` flag detection to preserve CLI functionality
105
+ - See `local_docs/RCA-Claude-Desktop-MCP-Toggle-Failure-2026-01-31.md` for complete root cause analysis
106
+
107
+ ### Changed
108
+
109
+ - MCP mode detection now excludes `--help` and `--version` flags to allow CLI usage
110
+ - Reorganized initialization sequence to ensure console suppression happens before any potential output
111
+
12
112
  ## [1.2.4] - 2026-01-21
13
113
 
14
114
  ### Fixed
package/dist/cli.js CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  // CRITICAL: Detect MCP mode and suppress console output BEFORE any imports
3
3
  // MCP servers use stdin/stdout for JSON-RPC via stdio transport
4
- // Detection: stdin/stdout are NOT TTY (piped/redirected) = MCP mode
5
- const isMCP = (!process.stdin.isTTY && !process.stdout.isTTY) ||
6
- process.argv.some((arg) => arg.includes("mcp") || arg.includes("stdio"));
4
+ // Detection: stdin/stdout are NOT TTY (piped/redirected) OR explicit MCP flags are present.
5
+ // Note: We exclude help/version flags to allow CLI usage even when piped.
6
+ const isMCP = ((!process.stdin.isTTY && !process.stdout.isTTY) ||
7
+ process.argv.some((arg) => arg.includes("mcp") || arg.includes("stdio") || arg.includes("inspector"))) &&
8
+ !process.argv.some((arg) => arg === "--help" || arg === "-h" || arg === "--version" || arg === "-v");
7
9
  if (isMCP) {
8
10
  // Suppress all console methods (but NOT stdout/stderr streams - MCP SDK needs those)
9
11
  const noop = () => { };
@@ -1,4 +1,19 @@
1
1
  #!/usr/bin/env node
2
+ // CRITICAL: Console suppression MUST happen BEFORE any other imports
3
+ // due to ES Module static import execution order (imports are evaluated BEFORE top-level code).
4
+ // Detection: stdin/stdout are NOT TTY (piped/redirected) OR explicit MCP flags are present.
5
+ // Note: We exclude help/version flags to allow CLI usage even when piped.
6
+ const _isMCP = ((!process.stdin.isTTY && !process.stdout.isTTY) ||
7
+ process.argv.some((arg) => arg.includes("mcp") || arg.includes("stdio") || arg.includes("inspector"))) &&
8
+ !process.argv.some((arg) => arg === "--help" || arg === "-h" || arg === "--version" || arg === "-v");
9
+ if (_isMCP) {
10
+ const noop = () => { };
11
+ console.log = noop;
12
+ console.error = noop;
13
+ console.warn = noop;
14
+ console.info = noop;
15
+ console.debug = noop;
16
+ }
2
17
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
18
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
19
  import { CallToolRequestSchema, ListToolsRequestSchema, InitializeRequestSchema, PingRequestSchema, RootsListChangedNotificationSchema, } from "@modelcontextprotocol/sdk/types.js";
@@ -183,21 +198,12 @@ function parseArguments() {
183
198
  }
184
199
  return directories;
185
200
  }
186
- const directoryArgs = parseArguments();
201
+ // Defer parsing until runServer is called
202
+ let directoryArgs = [];
187
203
  // Async initialization function to be called in runServer()
188
204
  async function initializeDirectories() {
189
205
  // Detect MCP mode: stdin/stdout are NOT TTY (piped) = MCP mode
190
- const isMCP = (!process.stdin.isTTY && !process.stdout.isTTY) ||
191
- process.argv.some((arg) => arg.includes("mcp") || arg.includes("stdio"));
192
- // During MCP operation, suppress ALL console output to prevent protocol corruption
193
- if (isMCP) {
194
- const noop = () => { };
195
- console.error = noop;
196
- console.log = noop;
197
- console.warn = noop;
198
- console.info = noop;
199
- console.debug = noop;
200
- }
206
+ const isMCP = _isMCP;
201
207
  if (!isMCP &&
202
208
  (approvedFoldersFromArgs.length > 0 ||
203
209
  directoryArgs.length > 0 ||
@@ -382,8 +388,10 @@ const server = new Server({
382
388
  tools: {
383
389
  listChanged: true,
384
390
  },
385
- resources: {},
386
- prompts: {},
391
+ // CRITICAL: Do NOT declare resources or prompts capabilities
392
+ // We don't implement handlers for resources/list or prompts/list
393
+ // Declaring them causes Claude Desktop to call these methods,
394
+ // receive "Method not found" errors, and fail to enable the toggle
387
395
  },
388
396
  });
389
397
  // Initialize handler - required for MCP protocol
@@ -397,8 +405,7 @@ server.setRequestHandler(InitializeRequestSchema, async (request) => {
397
405
  tools: {
398
406
  listChanged: true,
399
407
  },
400
- resources: {},
401
- prompts: {},
408
+ // CRITICAL: Do NOT declare resources or prompts - we don't implement them
402
409
  },
403
410
  serverInfo: {
404
411
  name: "vulcan-file-ops",
@@ -630,6 +637,7 @@ export async function runServer() {
630
637
  // Initialize directories before starting server
631
638
  // BUT: Don't exit on errors during MCP mode - just log and continue
632
639
  try {
640
+ directoryArgs = parseArguments();
633
641
  await initializeDirectories();
634
642
  }
635
643
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n0zer0d4y/vulcan-file-ops",
3
- "version": "1.2.9",
3
+ "version": "1.2.11",
4
4
  "mcpName": "io.github.n0zer0d4y/vulcan-file-ops",
5
5
  "description": "MCP server for AI assistants: read, write, edit, and manage files securely on local filesystem.",
6
6
  "license": "MIT",