@@ -46,48 +46,68 @@ add_claude_code_server() {
4646
4747 print_info " Adding $server_name to Claude Code (scope: $scope )..."
4848
49+ # Capture the command output and exit code
50+ local cmd_output
51+ local cmd_exit_code
52+
4953 case " $server_type " in
5054 " node" )
5155 if [[ " $server_name " == " filesystem" ]]; then
52- claude mcp add " $server_name " -s " $scope " node " $server_path " " $HOME "
56+ cmd_output=$( claude mcp add " $server_name " -s " $scope " node " $server_path " " $HOME " 2>&1 )
57+ cmd_exit_code=$?
5358 elif [[ -n " $api_key_var " ]]; then
54- claude mcp add " $server_name " -s " $scope " node " $server_path " --env " ${api_key_var} =${! api_key_var} "
59+ cmd_output=$( claude mcp add " $server_name " -s " $scope " node " $server_path " --env " ${api_key_var} =${! api_key_var} " 2>&1 )
60+ cmd_exit_code=$?
5561 else
56- claude mcp add " $server_name " -s " $scope " node " $server_path "
62+ cmd_output=$( claude mcp add " $server_name " -s " $scope " node " $server_path " 2>&1 )
63+ cmd_exit_code=$?
5764 fi
5865 ;;
5966 " python-uv" )
60- claude mcp add " $server_name " -s " $scope " uv --directory " $server_path " run " mcp-server-$server_name "
67+ # Claude Code requires the command to be passed correctly for Python servers
68+ cmd_output=$( claude mcp add " $server_name " -s " $scope " -- sh -c " cd '$server_path ' && uv run mcp-server-$server_name " 2>&1 )
69+ cmd_exit_code=$?
6170 ;;
6271 " python-uvx" )
6372 if [[ " $server_name " == " semgrep" ]]; then
64- claude mcp add " $server_name " -s " $scope " uvx --with mcp==1.11.0 semgrep-mcp
73+ cmd_output=$( claude mcp add " $server_name " -s " $scope " -- uvx --with mcp==1.11.0 semgrep-mcp 2>&1 )
74+ cmd_exit_code=$?
6575 fi
6676 ;;
6777 " npx" )
6878 local npx_package=" ${MCP_SERVER_NPX_PACKAGES[$server_name]} "
6979 if [[ " $server_name " == " figma" ]]; then
7080 if [[ -n " $api_key_var " ]]; then
71- claude mcp add " $server_name " -s " $scope " --env " ${api_key_var} =${! api_key_var} " -- npx -y " $npx_package " --stdio
81+ cmd_output=$( claude mcp add " $server_name " -s " $scope " --env " ${api_key_var} =${! api_key_var} " -- npx -y " $npx_package " --stdio 2>&1 )
82+ cmd_exit_code=$?
7283 else
73- claude mcp add " $server_name " -s " $scope " -- npx -y " $npx_package " --stdio
84+ cmd_output=$( claude mcp add " $server_name " -s " $scope " -- npx -y " $npx_package " --stdio 2>&1 )
85+ cmd_exit_code=$?
7486 fi
7587 else
7688 if [[ -n " $api_key_var " ]]; then
77- claude mcp add " $server_name " -s " $scope " --env " ${api_key_var} =${! api_key_var} " -- npx -y " $npx_package "
89+ cmd_output=$( claude mcp add " $server_name " -s " $scope " --env " ${api_key_var} =${! api_key_var} " -- npx -y " $npx_package " 2>&1 )
90+ cmd_exit_code=$?
7891 else
79- claude mcp add " $server_name " -s " $scope " -- npx -y " $npx_package "
92+ cmd_output=$( claude mcp add " $server_name " -s " $scope " -- npx -y " $npx_package " 2>&1 )
93+ cmd_exit_code=$?
8094 fi
8195 fi
8296 ;;
8397 esac
8498
85- if [[ $? -eq 0 ]]; then
99+ if [[ $cmd_exit_code -eq 0 ]]; then
86100 print_success " Added $server_name "
87101 return 0
88102 else
89- print_error " Failed to add $server_name "
90- return 1
103+ # Check if the error is because the server already exists
104+ if echo " $cmd_output " | grep -q " already exists" ; then
105+ print_info " Server $server_name already exists in $scope config - skipping"
106+ return 0 # Not really an error, server is already configured
107+ else
108+ print_error " Failed to add $server_name : $cmd_output "
109+ return 1
110+ fi
91111 fi
92112}
93113
@@ -114,14 +134,20 @@ print_usage() {
114134 echo " --no-api-keys Skip servers that require API keys"
115135 echo " --servers LIST Only configure specified servers (comma-separated)"
116136 echo " --remove Remove all MCP servers before adding"
137+ echo " --force Force reconnect all servers (ignores update status)"
117138 echo " --help, -h Show this help message"
118139 echo " "
140+ echo " Behavior:"
141+ echo " By default, only reconnects servers that were actually updated."
142+ echo " Use --force to reconnect all servers regardless of update status."
143+ echo " "
119144 echo " Available servers:"
120145 echo " Official: filesystem, memory, git, fetch, sequentialthinking"
121146 echo " Community: context7, playwright, figma, semgrep, exa"
122147 echo " "
123148 echo " Examples:"
124- echo " $0 # Add all servers to user scope"
149+ echo " $0 # Smart reconnect (only if updated)"
150+ echo " $0 --force # Force reconnect all servers"
125151 echo " $0 --scope project # Add to project scope (.mcp.json)"
126152 echo " $0 --no-api-keys # Skip servers needing API keys"
127153 echo " $0 --servers filesystem,memory,git # Only add specific servers"
@@ -133,8 +159,13 @@ main() {
133159 local SCOPE=" user"
134160 local INCLUDE_API_KEYS=true
135161 local REMOVE_FIRST=false
162+ local FORCE_RECONNECT=false
136163 local SERVERS_TO_INCLUDE=()
137164
165+ # Check for update status file to determine if reconnection is needed
166+ local UPDATE_STATUS_FILE=" /tmp/mcp-update-status"
167+ local UPDATED_SERVERS=()
168+
138169 # Parse command line options
139170 while [[ $# -gt 0 ]]; do
140171 case $1 in
@@ -158,6 +189,11 @@ main() {
158189 REMOVE_FIRST=true
159190 shift
160191 ;;
192+ --force)
193+ FORCE_RECONNECT=true
194+ REMOVE_FIRST=true # Force implies remove first
195+ shift
196+ ;;
161197 --help|-h)
162198 print_usage
163199 exit 0
@@ -182,15 +218,44 @@ main() {
182218 source " $HOME /.config/zsh/51-api-keys.zsh" 2> /dev/null || true
183219 fi
184220
185- # Remove existing servers if requested
186- if [[ " $REMOVE_FIRST " == " true" ]]; then
221+ # Check for updated servers if not forcing
222+ if [[ " $FORCE_RECONNECT " == " false" ]] && [[ -f " $UPDATE_STATUS_FILE " ]]; then
223+ # Read updated servers from file
224+ while IFS= read -r server; do
225+ [[ -n " $server " ]] && UPDATED_SERVERS+=(" $server " )
226+ done < " $UPDATE_STATUS_FILE "
227+
228+ if [[ ${# UPDATED_SERVERS[@]} -eq 0 ]]; then
229+ print_info " No MCP servers were updated, skipping reconnection"
230+ echo " "
231+ print_info " Use --force to force reconnection of all servers"
232+ exit 0
233+ else
234+ print_info " Servers that were updated: ${UPDATED_SERVERS[*]} "
235+ echo " "
236+ fi
237+ fi
238+
239+ # Remove existing servers if requested or if forcing
240+ if [[ " $REMOVE_FIRST " == " true" ]] || [[ " $FORCE_RECONNECT " == " true" ]]; then
187241 remove_all_servers " $SCOPE "
242+ elif [[ ${# UPDATED_SERVERS[@]} -gt 0 ]]; then
243+ # Only remove the servers that were updated
244+ print_info " Removing updated servers for reconnection..."
245+ for server in " ${UPDATED_SERVERS[@]} " ; do
246+ print_info " Removing $server ..."
247+ claude mcp remove " $server " -s " $SCOPE " 2> /dev/null || true
248+ done
188249 fi
189250
190251 # Determine which servers to configure
191252 if [[ ${# SERVERS_TO_INCLUDE[@]} -gt 0 ]]; then
192253 # Use specified servers
193254 servers=(" ${SERVERS_TO_INCLUDE[@]} " )
255+ elif [[ " $FORCE_RECONNECT " == " false" ]] && [[ ${# UPDATED_SERVERS[@]} -gt 0 ]]; then
256+ # Only reconnect updated servers
257+ servers=(" ${UPDATED_SERVERS[@]} " )
258+ print_info " Reconnecting only updated servers: ${servers[*]} "
194259 else
195260 # Use all available servers
196261 servers=(
@@ -210,18 +275,22 @@ main() {
210275 local success_count=0
211276 for server in " ${servers[@]} " ; do
212277 # Skip API key servers if not including them
213- if [[ " $INCLUDE_API_KEYS " == " false" ]] && [[ -n " ${MCP_SERVER_API_KEYS[$server]} " ]]; then
278+ if [[ " $INCLUDE_API_KEYS " == " false" ]] && [[ -n " ${MCP_SERVER_API_KEYS[$server]:- } " ]]; then
214279 print_info " Skipping $server (requires API key)"
215280 continue
216281 fi
217282
218283 if add_claude_code_server " $server " " $SCOPE " ; then
219- (( success_count++ ))
284+ success_count= $ (( success_count + 1 ))
220285 fi
221286 done
222287
223288 echo " "
224- print_success " Successfully configured $success_count MCP servers for Claude Code"
289+ if [[ $success_count -gt 0 ]]; then
290+ print_success " Successfully configured $success_count MCP servers for Claude Code"
291+ else
292+ print_info " All MCP servers were already configured for Claude Code"
293+ fi
225294
226295 # Show current configuration
227296 echo " "
0 commit comments