@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 +100 -0
- package/dist/cli.js +5 -3
- package/dist/server/index.js +24 -16
- package/package.json +1 -1
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)
|
|
5
|
-
|
|
6
|
-
|
|
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 = () => { };
|
package/dist/server/index.js
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|