claude-flow-novice 2.14.36 → 2.15.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.
Files changed (34) hide show
  1. package/.claude/commands/cfn-loop-cli.md +491 -456
  2. package/.claude/commands/switch-api.md +33 -12
  3. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
  4. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
  5. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +24 -6
  6. package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
  7. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +220 -220
  8. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +5 -0
  9. package/claude-assets/agents/custom/claude-code-expert.md +151 -2
  10. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +43 -3
  11. package/claude-assets/commands/cfn-loop-cli.md +491 -456
  12. package/claude-assets/commands/switch-api.md +33 -12
  13. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
  14. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
  15. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +24 -6
  16. package/claude-assets/skills/cfn-error-logging/SKILL.md +339 -0
  17. package/claude-assets/skills/cfn-error-logging/cleanup-error-logs.sh +334 -0
  18. package/claude-assets/skills/cfn-error-logging/integrate-cli.sh +232 -0
  19. package/claude-assets/skills/cfn-error-logging/integrate-docker.sh +294 -0
  20. package/claude-assets/skills/cfn-error-logging/invoke-error-logging.sh +839 -0
  21. package/claude-assets/skills/cfn-error-logging/test-error-logging.sh +475 -0
  22. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
  23. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +5 -3
  24. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +220 -220
  25. package/claude-assets/skills/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +21 -9
  26. package/claude-assets/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh +3 -1
  27. package/dist/hello.js +27 -3
  28. package/dist/hello.js.map +1 -1
  29. package/dist/server.js +194 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/server.test.js +207 -0
  32. package/dist/server.test.js.map +1 -0
  33. package/package.json +2 -1
  34. package/scripts/switch-api.sh +140 -12
@@ -1,221 +1,221 @@
1
- #!/bin/bash
2
- #
3
- # Invoke Waiting Mode - Agent Coordination for CFN Loop
4
- # Purpose: Handle coordination between agents using waiting mode and collection
5
- # Usage: invoke-waiting-mode.sh <collect|wait|signal> [task-id] [agent-id] [timeout]
6
- #
7
-
8
- set -euo pipefail
9
-
10
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
- REDIS_COORD_SKILL="$SCRIPT_DIR"
12
-
13
- # Parse arguments
14
- COMMAND=${1:-"collect"}
15
- TASK_ID=${2:-""}
16
- AGENT_ID=${3:-""}
17
- TIMEOUT=${4:-120}
18
-
19
- # Redis configuration
20
- REDIS_HOST=${REDIS_HOST:-"localhost"}
21
- REDIS_PORT=${REDIS_PORT:-6379}
22
- REDIS_DB=${REDIS_DB:-0}
23
-
24
- # Debug output
25
- DEBUG=${DEBUG:-false}
26
- if [[ "$DEBUG" == "true" ]]; then
27
- echo "DEBUG: invoke-waiting-mode called with: $*" >&2
28
- echo "DEBUG: REDIS_HOST=$REDIS_HOST, REDIS_PORT=$REDIS_PORT, REDIS_DB=$REDIS_DB" >&2
29
- fi
30
-
31
- # Function to connect to Redis with error handling
32
- redis_cmd() {
33
- local cmd="$1"
34
- shift
35
-
36
- if command -v redis-cli >/dev/null 2>&1; then
37
- redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" "$cmd" "$@" 2>/dev/null
38
- else
39
- echo "Warning: redis-cli not available, using mock mode" >&2
40
- return 0
41
- fi
42
- }
43
-
44
- # Function to collect agent signals
45
- collect_signals() {
46
- local task_id="$1"
47
- local agent_type="$2"
48
- local timeout="${3:-120}"
49
-
50
- echo "📡 Collecting ${agent_type} signals for task: $task_id (timeout: ${timeout}s)" >&2
51
-
52
- local signals_key="swarm:${task_id}:signals:${agent_type}"
53
- local start_time=$(date +%s)
54
- local signals_collected=()
55
-
56
- while true; do
57
- # Get all available signals
58
- local signals=($(redis_cmd SMEMBERS "$signals_key" 2>/dev/null || echo ""))
59
-
60
- if [[ ${#signals[@]} -gt 0 ]]; then
61
- for signal in "${signals[@]}"; do
62
- if [[ ! " ${signals_collected[@]} " =~ " ${signal} " ]]; then
63
- signals_collected+=("$signal")
64
- echo " ✓ Signal collected: $signal" >&2
65
-
66
- # Get detailed signal data
67
- local signal_key="swarm:${task_id}:agent:${signal}:data"
68
- local signal_data=$(redis_cmd HGETALL "$signal_key" 2>/dev/null || echo "")
69
-
70
- if [[ -n "$signal_data" ]]; then
71
- echo " Data: $signal_data" >&2
72
- fi
73
- fi
74
- done
75
- fi
76
-
77
- # Check if we have all expected signals (this would be based on agent count)
78
- local expected_signals=${EXPECTED_AGENTS:-1}
79
- if [[ ${#signals_collected[@]} -ge $expected_signals ]]; then
80
- echo "✅ All signals collected" >&2
81
- break
82
- fi
83
-
84
- # Check timeout
85
- local current_time=$(date +%s)
86
- if [[ $((current_time - start_time)) -ge $timeout ]]; then
87
- echo "⚠️ Timeout reached, proceeding with collected signals" >&2
88
- break
89
- fi
90
-
91
- sleep 2
92
- done
93
-
94
- # Return collected signals as JSON
95
- local json_output="{"
96
- json_output+="\"task_id\":\"$task_id\","
97
- json_output+="\"agent_type\":\"$agent_type\","
98
- json_output+="\"signals\":["
99
-
100
- for i in "${!signals_collected[@]}"; do
101
- if [[ $i -gt 0 ]]; then
102
- json_output+=","
103
- fi
104
- json_output+='"'"${signals_collected[$i]}"'"'
105
- done
106
-
107
- json_output+="],"
108
- json_output+="\"count\":${#signals_collected[@]},"
109
- json_output+="\"timeout\":$timeout"
110
- json_output+="}"
111
-
112
- echo "$json_output"
113
- }
114
-
115
- # Function to wait for specific condition
116
- wait_for_signal() {
117
- local task_id="$1"
118
- local condition="$2"
119
- local timeout="${3:-120}"
120
-
121
- echo "⏳ Waiting for signal: $condition (timeout: ${timeout}s)" >&2
122
-
123
- local start_time=$(date +%s)
124
- local condition_key="swarm:${task_id}:condition:${condition}"
125
-
126
- while true; do
127
- local condition_met=$(redis_cmd GET "$condition_key" 2>/dev/null || echo "")
128
-
129
- if [[ "$condition_met" == "true" ]]; then
130
- echo "✅ Condition met: $condition" >&2
131
- redis_cmd DEL "$condition_key" 2>/dev/null
132
- echo "true"
133
- return 0
134
- fi
135
-
136
- # Check timeout
137
- local current_time=$(date +%s)
138
- if [[ $((current_time - start_time)) -ge $timeout ]]; then
139
- echo "⚠️ Timeout waiting for: $condition" >&2
140
- echo "false"
141
- return 1
142
- fi
143
-
144
- sleep 2
145
- done
146
- }
147
-
148
- # Function to signal completion
149
- signal_completion() {
150
- local task_id="$1"
151
- local agent_id="$2"
152
- local status="${3:-complete}"
153
-
154
- echo "📤 Signaling completion: $agent_id -> $status" >&2
155
-
156
- # Add to completed set
157
- redis_cmd SADD "swarm:${task_id}:completed" "$agent_id" 2>/dev/null || true
158
-
159
- # Set completion status
160
- redis_cmd HSET "swarm:${task_id}:agent:${agent_id}:status" "status" "$status" 2>/dev/null || true
161
- redis_cmd HSET "swarm:${task_id}:agent:${agent_id}:status" "completed_at" "$(date +%s)" 2>/dev/null || true
162
-
163
- # Broadcast completion signal
164
- redis_cmd PUBLISH "swarm:${task_id}:signals" "agent:$agent_id:status:$status" 2>/dev/null || true
165
-
166
- echo "✅ Signal sent: $agent_id completed"
167
- }
168
-
169
- # Main command routing
170
- case "$COMMAND" in
171
- "collect")
172
- if [[ -z "$TASK_ID" ]]; then
173
- echo "Error: collect command requires task-id" >&2
174
- echo "Usage: $0 collect <task-id> <agent-type> [timeout]" >&2
175
- exit 1
176
- fi
177
- collect_signals "$TASK_ID" "${AGENT_ID:-"loop3"}" "$TIMEOUT"
178
- ;;
179
- "wait")
180
- if [[ -z "$TASK_ID" ]] || [[ -z "$AGENT_ID" ]]; then
181
- echo "Error: wait command requires task-id and condition" >&2
182
- echo "Usage: $0 wait <task-id> <condition> [timeout]" >&2
183
- exit 1
184
- fi
185
- wait_for_signal "$TASK_ID" "$AGENT_ID" "$TIMEOUT"
186
- ;;
187
- "signal")
188
- if [[ -z "$TASK_ID" ]] || [[ -z "$AGENT_ID" ]]; then
189
- echo "Error: signal command requires task-id and agent-id" >&2
190
- echo "Usage: $0 signal <task-id> <agent-id> [status]" >&2
191
- exit 1
192
- fi
193
- signal_completion "$TASK_ID" "$AGENT_ID" "$TIMEOUT"
194
- ;;
195
- "help"|"-h"|"--help")
196
- cat <<EOF
197
- Usage: $0 <command> [arguments]
198
-
199
- Commands:
200
- collect <task-id> <agent-type> [timeout] Collect signals from agents
201
- wait <task-id> <condition> [timeout] Wait for condition to be met
202
- signal <task-id> <agent-id> [status] Signal agent completion
203
-
204
- Examples:
205
- $0 collect cfn-cli-12345 loop3 300
206
- $0 wait cfn-cli-12345 gate-passed 60
207
- $0 signal cfn-cli-12345 backend-developer-1 complete
208
-
209
- Environment Variables:
210
- REDIS_HOST Redis host (default: localhost)
211
- REDIS_PORT Redis port (default: 6379)
212
- REDIS_DB Redis database (default: 0)
213
- DEBUG Enable debug output (true/false)
214
- EOF
215
- ;;
216
- *)
217
- echo "Error: Unknown command '$COMMAND'" >&2
218
- echo "Use '$0 help' for usage information" >&2
219
- exit 1
220
- ;;
1
+ #!/bin/bash
2
+ #
3
+ # Invoke Waiting Mode - Agent Coordination for CFN Loop
4
+ # Purpose: Handle coordination between agents using waiting mode and collection
5
+ # Usage: invoke-waiting-mode.sh <collect|wait|signal> [task-id] [agent-id] [timeout]
6
+ #
7
+
8
+ set -euo pipefail
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
+ REDIS_COORD_SKILL="$SCRIPT_DIR"
12
+
13
+ # Parse arguments
14
+ COMMAND=${1:-"collect"}
15
+ TASK_ID=${2:-""}
16
+ AGENT_ID=${3:-""}
17
+ TIMEOUT=${4:-120}
18
+
19
+ # Redis configuration
20
+ REDIS_HOST=${REDIS_HOST:-"localhost"}
21
+ REDIS_PORT=${REDIS_PORT:-6379}
22
+ REDIS_DB=${REDIS_DB:-0}
23
+
24
+ # Debug output
25
+ DEBUG=${DEBUG:-false}
26
+ if [[ "$DEBUG" == "true" ]]; then
27
+ echo "DEBUG: invoke-waiting-mode called with: $*" >&2
28
+ echo "DEBUG: REDIS_HOST=$REDIS_HOST, REDIS_PORT=$REDIS_PORT, REDIS_DB=$REDIS_DB" >&2
29
+ fi
30
+
31
+ # Function to connect to Redis with error handling
32
+ redis_cmd() {
33
+ local cmd="$1"
34
+ shift
35
+
36
+ if command -v redis-cli >/dev/null 2>&1; then
37
+ redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" "$cmd" "$@" 2>/dev/null
38
+ else
39
+ echo "Warning: redis-cli not available, using mock mode" >&2
40
+ return 0
41
+ fi
42
+ }
43
+
44
+ # Function to collect agent signals
45
+ collect_signals() {
46
+ local task_id="$1"
47
+ local agent_type="$2"
48
+ local timeout="${3:-120}"
49
+
50
+ echo "📡 Collecting ${agent_type} signals for task: $task_id (timeout: ${timeout}s)" >&2
51
+
52
+ local signals_key="swarm:${task_id}:signals:${agent_type}"
53
+ local start_time=$(date +%s)
54
+ local signals_collected=()
55
+
56
+ while true; do
57
+ # Get all available signals
58
+ local signals=($(redis_cmd SMEMBERS "$signals_key" 2>/dev/null || echo ""))
59
+
60
+ if [[ ${#signals[@]} -gt 0 ]]; then
61
+ for signal in "${signals[@]}"; do
62
+ if [[ ! " ${signals_collected[@]} " =~ " ${signal} " ]]; then
63
+ signals_collected+=("$signal")
64
+ echo " ✓ Signal collected: $signal" >&2
65
+
66
+ # Get detailed signal data
67
+ local signal_key="swarm:${task_id}:agent:${signal}:data"
68
+ local signal_data=$(redis_cmd HGETALL "$signal_key" 2>/dev/null || echo "")
69
+
70
+ if [[ -n "$signal_data" ]]; then
71
+ echo " Data: $signal_data" >&2
72
+ fi
73
+ fi
74
+ done
75
+ fi
76
+
77
+ # Check if we have all expected signals (this would be based on agent count)
78
+ local expected_signals=${EXPECTED_AGENTS:-1}
79
+ if [[ ${#signals_collected[@]} -ge $expected_signals ]]; then
80
+ echo "✅ All signals collected" >&2
81
+ break
82
+ fi
83
+
84
+ # Check timeout
85
+ local current_time=$(date +%s)
86
+ if [[ $((current_time - start_time)) -ge $timeout ]]; then
87
+ echo "⚠️ Timeout reached, proceeding with collected signals" >&2
88
+ break
89
+ fi
90
+
91
+ sleep 2
92
+ done
93
+
94
+ # Return collected signals as JSON
95
+ local json_output="{"
96
+ json_output+="\"task_id\":\"$task_id\","
97
+ json_output+="\"agent_type\":\"$agent_type\","
98
+ json_output+="\"signals\":["
99
+
100
+ for i in "${!signals_collected[@]}"; do
101
+ if [[ $i -gt 0 ]]; then
102
+ json_output+=","
103
+ fi
104
+ json_output+='"'"${signals_collected[$i]}"'"'
105
+ done
106
+
107
+ json_output+="],"
108
+ json_output+="\"count\":${#signals_collected[@]},"
109
+ json_output+="\"timeout\":$timeout"
110
+ json_output+="}"
111
+
112
+ echo "$json_output"
113
+ }
114
+
115
+ # Function to wait for specific condition
116
+ wait_for_signal() {
117
+ local task_id="$1"
118
+ local condition="$2"
119
+ local timeout="${3:-120}"
120
+
121
+ echo "⏳ Waiting for signal: $condition (timeout: ${timeout}s)" >&2
122
+
123
+ local start_time=$(date +%s)
124
+ local condition_key="swarm:${task_id}:condition:${condition}"
125
+
126
+ while true; do
127
+ local condition_met=$(redis_cmd GET "$condition_key" 2>/dev/null || echo "")
128
+
129
+ if [[ "$condition_met" == "true" ]]; then
130
+ echo "✅ Condition met: $condition" >&2
131
+ redis_cmd DEL "$condition_key" 2>/dev/null
132
+ echo "true"
133
+ return 0
134
+ fi
135
+
136
+ # Check timeout
137
+ local current_time=$(date +%s)
138
+ if [[ $((current_time - start_time)) -ge $timeout ]]; then
139
+ echo "⚠️ Timeout waiting for: $condition" >&2
140
+ echo "false"
141
+ return 1
142
+ fi
143
+
144
+ sleep 2
145
+ done
146
+ }
147
+
148
+ # Function to signal completion
149
+ signal_completion() {
150
+ local task_id="$1"
151
+ local agent_id="$2"
152
+ local status="${3:-complete}"
153
+
154
+ echo "📤 Signaling completion: $agent_id -> $status" >&2
155
+
156
+ # Add to completed set
157
+ redis_cmd SADD "swarm:${task_id}:completed" "$agent_id" 2>/dev/null || true
158
+
159
+ # Set completion status
160
+ redis_cmd HSET "swarm:${task_id}:agent:${agent_id}:status" "status" "$status" 2>/dev/null || true
161
+ redis_cmd HSET "swarm:${task_id}:agent:${agent_id}:status" "completed_at" "$(date +%s)" 2>/dev/null || true
162
+
163
+ # Broadcast completion signal
164
+ redis_cmd PUBLISH "swarm:${task_id}:signals" "agent:$agent_id:status:$status" 2>/dev/null || true
165
+
166
+ echo "✅ Signal sent: $agent_id completed"
167
+ }
168
+
169
+ # Main command routing
170
+ case "$COMMAND" in
171
+ "collect")
172
+ if [[ -z "$TASK_ID" ]]; then
173
+ echo "Error: collect command requires task-id" >&2
174
+ echo "Usage: $0 collect <task-id> <agent-type> [timeout]" >&2
175
+ exit 1
176
+ fi
177
+ collect_signals "$TASK_ID" "${AGENT_ID:-"loop3"}" "$TIMEOUT"
178
+ ;;
179
+ "wait")
180
+ if [[ -z "$TASK_ID" ]] || [[ -z "$AGENT_ID" ]]; then
181
+ echo "Error: wait command requires task-id and condition" >&2
182
+ echo "Usage: $0 wait <task-id> <condition> [timeout]" >&2
183
+ exit 1
184
+ fi
185
+ wait_for_signal "$TASK_ID" "$AGENT_ID" "$TIMEOUT"
186
+ ;;
187
+ "signal")
188
+ if [[ -z "$TASK_ID" ]] || [[ -z "$AGENT_ID" ]]; then
189
+ echo "Error: signal command requires task-id and agent-id" >&2
190
+ echo "Usage: $0 signal <task-id> <agent-id> [status]" >&2
191
+ exit 1
192
+ fi
193
+ signal_completion "$TASK_ID" "$AGENT_ID" "$TIMEOUT"
194
+ ;;
195
+ "help"|"-h"|"--help")
196
+ cat <<EOF
197
+ Usage: $0 <command> [arguments]
198
+
199
+ Commands:
200
+ collect <task-id> <agent-type> [timeout] Collect signals from agents
201
+ wait <task-id> <condition> [timeout] Wait for condition to be met
202
+ signal <task-id> <agent-id> [status] Signal agent completion
203
+
204
+ Examples:
205
+ $0 collect cfn-cli-12345 loop3 300
206
+ $0 wait cfn-cli-12345 gate-passed 60
207
+ $0 signal cfn-cli-12345 backend-developer-1 complete
208
+
209
+ Environment Variables:
210
+ REDIS_HOST Redis host (default: localhost)
211
+ REDIS_PORT Redis port (default: 6379)
212
+ REDIS_DB Redis database (default: 0)
213
+ DEBUG Enable debug output (true/false)
214
+ EOF
215
+ ;;
216
+ *)
217
+ echo "Error: Unknown command '$COMMAND'" >&2
218
+ echo "Use '$0 help' for usage information" >&2
219
+ exit 1
220
+ ;;
221
221
  esac
@@ -10,6 +10,11 @@ validation_hooks:
10
10
  - test-coverage-validator
11
11
  ---
12
12
 
13
+ <!-- PROVIDER_PARAMETERS
14
+ provider: zai
15
+ model: glm-4.6
16
+ -->
17
+
13
18
  # Backend Developer Agent
14
19
 
15
20
  ## Core Responsibilities
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: claude-code-expert
3
- description: MUST BE USED when answering questions about Claude Code features, documentation, and best practices. Use PROACTIVELY for Claude Code guidance, sub-agent creation, workflow questions. Keywords - claude-code, sub-agents, documentation, guides, best-practices, workflows
4
- tools: [WebFetch, Read, Grep, Glob]
3
+ description: MUST BE USED when answering questions about Claude Code features, documentation, and best practices or adding/removing MCPs. Use PROACTIVELY for Claude Code guidance, sub-agent creation, workflow questions. Keywords - claude-code, sub-agents, documentation, guides, best-practices, workflows, MCP
4
+ tools: [WebFetch, Read, Grep, Glob, Bash, Write]
5
5
  model: sonnet
6
6
  type: specialist
7
7
  capabilities:
@@ -80,6 +80,155 @@ You are a specialized agent with deep expertise in Claude Code, Anthropic's offi
80
80
  - "How do I use MCP tools in Claude Code?"
81
81
  - "How do I monitor agent execution?"
82
82
 
83
+ ## MCP Server Configuration
84
+
85
+ ### Configuration Files
86
+ MCP servers are configured in two locations:
87
+ 1. **Global config**: `~/.claude.json` (user-level, applies to all projects)
88
+ 2. **Project config**: `.claude/settings.json` (project-specific overrides)
89
+
90
+ ### Adding MCP Servers Globally
91
+
92
+ **Location**: `~/.claude.json`
93
+
94
+ Add to the `mcpServers` object:
95
+ ```json
96
+ {
97
+ "mcpServers": {
98
+ "server-name": {
99
+ "type": "stdio",
100
+ "command": "npx",
101
+ "args": ["-y", "@package/mcp-server"],
102
+ "env": {}
103
+ }
104
+ }
105
+ }
106
+ ```
107
+
108
+ **HTTP-based MCP servers**:
109
+ ```json
110
+ {
111
+ "mcpServers": {
112
+ "shadcn": {
113
+ "type": "http",
114
+ "url": "https://www.shadcn.io/api/mcp"
115
+ }
116
+ }
117
+ }
118
+ ```
119
+
120
+ ### Enabling/Disabling MCP Servers
121
+
122
+ **Enable globally** (add to `enabledMcpjsonServers` array):
123
+ ```json
124
+ {
125
+ "enabledMcpjsonServers": ["sequential-thinking", "n8n-mcp"]
126
+ }
127
+ ```
128
+
129
+ **Disable globally** (add to `disabledMcpjsonServers` array):
130
+ ```json
131
+ {
132
+ "disabledMcpjsonServers": ["playwright", "shadcn", "chrome-devtools"]
133
+ }
134
+ ```
135
+
136
+ **Disable for specific project** (in `~/.claude.json` under `projects` key):
137
+ ```json
138
+ {
139
+ "projects": {
140
+ "/path/to/project": {
141
+ "disabledMcpServers": ["claude-flow", "ruv-swarm", "playwright"]
142
+ }
143
+ }
144
+ }
145
+ ```
146
+
147
+ ### Project-Level MCP Configuration
148
+
149
+ **Location**: `.claude/settings.json` (in project root)
150
+
151
+ ```json
152
+ {
153
+ "mcpServers": {
154
+ "n8n-mcp": {
155
+ "command": "npx",
156
+ "args": ["-y", "n8n-mcp"],
157
+ "env": {
158
+ "N8N_API_KEY": "${N8N_API_KEY}"
159
+ }
160
+ }
161
+ },
162
+ "enabledMcpjsonServers": ["n8n-mcp"]
163
+ }
164
+ ```
165
+
166
+ ### Configuration Precedence
167
+ 1. Project-level `disabledMcpServers` overrides global settings
168
+ 2. Project-level `mcpServers` supplements global servers
169
+ 3. `enabledMcpjsonServers` must explicitly list servers to enable
170
+
171
+ ### Common MCP Servers
172
+
173
+ **Sequential Thinking** (multi-step reasoning):
174
+ ```json
175
+ {
176
+ "sequential-thinking": {
177
+ "type": "stdio",
178
+ "command": "npx",
179
+ "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"],
180
+ "env": {}
181
+ }
182
+ }
183
+ ```
184
+
185
+ **Playwright** (browser automation):
186
+ ```json
187
+ {
188
+ "playwright": {
189
+ "type": "stdio",
190
+ "command": "npx",
191
+ "args": ["-y", "@playwright/mcp"],
192
+ "env": {}
193
+ }
194
+ }
195
+ ```
196
+
197
+ **Chrome DevTools** (browser debugging):
198
+ ```json
199
+ {
200
+ "chrome-devtools": {
201
+ "type": "stdio",
202
+ "command": "npx",
203
+ "args": ["-y", "chrome-devtools-mcp@latest"],
204
+ "env": {}
205
+ }
206
+ }
207
+ ```
208
+
209
+ **Z.ai MCP** (AI routing):
210
+ ```json
211
+ {
212
+ "zai-mcp-server": {
213
+ "type": "stdio",
214
+ "command": "npx",
215
+ "args": ["-y", "@z_ai/mcp-server"],
216
+ "env": {
217
+ "Z_AI_API_KEY": "${Z_AI_API_KEY}",
218
+ "Z_AI_MODE": "ZAI"
219
+ }
220
+ }
221
+ }
222
+ ```
223
+
224
+ ### Auto-Discovery
225
+ Claude Code auto-discovers MCP servers from:
226
+ - Globally installed npm packages with MCP exports
227
+ - Tool permissions (e.g., `mcp__package-name__tool`)
228
+ - `.mcp.json` files in project roots
229
+
230
+ To prevent auto-discovered servers from connecting, add them to `disabledMcpServers`.
231
+
83
232
  ## Documentation URLs to Reference
84
233
 
85
234
  Primary resources: