mcp-vector-search 0.7.4__py3-none-any.whl → 0.7.5__py3-none-any.whl

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.

Potentially problematic release.


This version of mcp-vector-search might be problematic. Click here for more details.

@@ -1,7 +1,7 @@
1
1
  """MCP Vector Search - CLI-first semantic code search with MCP integration."""
2
2
 
3
- __version__ = "0.7.4"
4
- __build__ = "26"
3
+ __version__ = "0.7.5"
4
+ __build__ = "27"
5
5
  __author__ = "Robert Matsuoka"
6
6
  __email__ = "bobmatnyc@gmail.com"
7
7
 
@@ -1,11 +1,13 @@
1
- """MCP integration commands for Claude Code."""
1
+ """MCP integration commands for multiple AI tools."""
2
2
 
3
3
  import json
4
4
  import os
5
5
  import shutil
6
6
  import subprocess
7
7
  import sys
8
+ import tomllib
8
9
  from pathlib import Path
10
+ from typing import Dict, Any
9
11
 
10
12
  import typer
11
13
  from rich.console import Console
@@ -18,10 +20,57 @@ from ..didyoumean import create_enhanced_typer
18
20
  from ..output import print_error, print_info, print_success, print_warning
19
21
 
20
22
  # Create MCP subcommand app with "did you mean" functionality
21
- mcp_app = create_enhanced_typer(help="Manage Claude Code MCP integration")
23
+ mcp_app = create_enhanced_typer(
24
+ help="""🤖 Manage MCP integration for AI tools
25
+
26
+ Configure mcp-vector-search as an MCP server for various AI coding assistants.
27
+ Each tool has its own configuration format and location.
28
+
29
+ [bold cyan]Supported Tools:[/bold cyan]
30
+ • [green]auggie[/green] - Augment Code AI assistant
31
+ • [green]claude-code[/green] - Claude Code (project-scoped)
32
+ • [green]codex[/green] - OpenAI Codex CLI
33
+ • [green]gemini[/green] - Google Gemini CLI
34
+
35
+ [bold cyan]Quick Start:[/bold cyan]
36
+ 1. List tools: [green]mcp-vector-search mcp list[/green]
37
+ 2. Configure tool: [green]mcp-vector-search mcp <tool>[/green]
38
+ 3. Test setup: [green]mcp-vector-search mcp test[/green]
39
+
40
+ [dim]Use --force to overwrite existing configurations[/dim]
41
+ """
42
+ )
22
43
 
23
44
  console = Console()
24
45
 
46
+ # Supported AI tools and their configuration details
47
+ SUPPORTED_TOOLS = {
48
+ "auggie": {
49
+ "name": "Auggie",
50
+ "config_path": "~/.augment/settings.json",
51
+ "format": "json",
52
+ "description": "Augment Code AI assistant"
53
+ },
54
+ "claude-code": {
55
+ "name": "Claude Code",
56
+ "config_path": ".mcp.json",
57
+ "format": "json",
58
+ "description": "Claude Code (project-scoped)"
59
+ },
60
+ "codex": {
61
+ "name": "Codex",
62
+ "config_path": "~/.codex/config.toml",
63
+ "format": "toml",
64
+ "description": "OpenAI Codex CLI"
65
+ },
66
+ "gemini": {
67
+ "name": "Gemini",
68
+ "config_path": "~/.gemini/mcp.json",
69
+ "format": "json",
70
+ "description": "Google Gemini CLI"
71
+ }
72
+ }
73
+
25
74
 
26
75
  def get_claude_command() -> str | None:
27
76
  """Get the Claude Code command path."""
@@ -74,6 +123,48 @@ def get_mcp_server_command(
74
123
  return f"{python_exe} -m mcp_vector_search.mcp.server{watch_flag} {project_root}"
75
124
 
76
125
 
126
+ def get_mcp_server_config_for_tool(
127
+ project_root: Path, tool_name: str, server_name: str, enable_file_watching: bool = True
128
+ ) -> Dict[str, Any]:
129
+ """Generate MCP server configuration for a specific tool."""
130
+ base_config = {
131
+ "command": "uv",
132
+ "args": ["run", "mcp-vector-search", "mcp"],
133
+ "env": {
134
+ "MCP_ENABLE_FILE_WATCHING": "true" if enable_file_watching else "false"
135
+ }
136
+ }
137
+
138
+ if tool_name == "auggie":
139
+ # Auggie uses stdio transport
140
+ return base_config
141
+ elif tool_name == "claude-code":
142
+ # Claude Code requires type: stdio and no cwd
143
+ return {
144
+ "type": "stdio",
145
+ **base_config
146
+ }
147
+ elif tool_name == "codex":
148
+ # Codex uses TOML format with different structure
149
+ return {
150
+ "command": base_config["command"],
151
+ "args": base_config["args"],
152
+ "env": base_config["env"]
153
+ }
154
+ elif tool_name == "gemini":
155
+ # Gemini uses standard format with cwd
156
+ return {
157
+ **base_config,
158
+ "cwd": str(project_root.absolute())
159
+ }
160
+ else:
161
+ # Default configuration
162
+ return {
163
+ **base_config,
164
+ "cwd": str(project_root.absolute())
165
+ }
166
+
167
+
77
168
  def create_project_claude_config(
78
169
  project_root: Path, server_name: str, enable_file_watching: bool = True
79
170
  ) -> None:
@@ -119,9 +210,232 @@ def create_project_claude_config(
119
210
  print_info("File watching is disabled")
120
211
 
121
212
 
122
- @mcp_app.command("install")
123
- @mcp_app.command("init", hidden=False) # Add 'init' as an alias
124
- def install_mcp_integration(
213
+ def configure_tool_mcp(
214
+ tool_name: str,
215
+ project_root: Path,
216
+ server_name: str = "mcp-vector-search",
217
+ enable_file_watching: bool = True,
218
+ force: bool = False
219
+ ) -> bool:
220
+ """Configure MCP integration for a specific AI tool."""
221
+ if tool_name not in SUPPORTED_TOOLS:
222
+ print_error(f"Unsupported tool: {tool_name}")
223
+ print_info(f"Supported tools: {', '.join(SUPPORTED_TOOLS.keys())}")
224
+ return False
225
+
226
+ tool_info = SUPPORTED_TOOLS[tool_name]
227
+ config_path_str = tool_info["config_path"]
228
+
229
+ # Handle path expansion
230
+ if config_path_str.startswith("~/"):
231
+ config_path = Path.home() / config_path_str[2:]
232
+ elif config_path_str.startswith("."):
233
+ config_path = project_root / config_path_str
234
+ else:
235
+ config_path = Path(config_path_str)
236
+
237
+ try:
238
+ if tool_name == "auggie":
239
+ return configure_auggie_mcp(config_path, project_root, server_name, enable_file_watching, force)
240
+ elif tool_name == "claude-code":
241
+ return configure_claude_code_mcp(config_path, project_root, server_name, enable_file_watching, force)
242
+ elif tool_name == "codex":
243
+ return configure_codex_mcp(config_path, project_root, server_name, enable_file_watching, force)
244
+ elif tool_name == "gemini":
245
+ return configure_gemini_mcp(config_path, project_root, server_name, enable_file_watching, force)
246
+ else:
247
+ print_error(f"Configuration for {tool_name} not implemented yet")
248
+ return False
249
+ except Exception as e:
250
+ print_error(f"Failed to configure {tool_name}: {e}")
251
+ return False
252
+
253
+
254
+ def configure_auggie_mcp(
255
+ config_path: Path,
256
+ project_root: Path,
257
+ server_name: str,
258
+ enable_file_watching: bool,
259
+ force: bool
260
+ ) -> bool:
261
+ """Configure Auggie MCP integration."""
262
+ # Create backup if file exists
263
+ backup_path = config_path.with_suffix(config_path.suffix + ".backup")
264
+
265
+ # Load existing config or create new one
266
+ if config_path.exists():
267
+ if not force:
268
+ with open(config_path) as f:
269
+ config = json.load(f)
270
+ if config.get("mcpServers", {}).get(server_name):
271
+ print_warning(f"MCP server '{server_name}' already exists in Auggie config")
272
+ print_info("Use --force to overwrite")
273
+ return False
274
+ shutil.copy2(config_path, backup_path)
275
+ with open(config_path) as f:
276
+ config = json.load(f)
277
+ else:
278
+ config_path.parent.mkdir(parents=True, exist_ok=True)
279
+ config = {}
280
+
281
+ # Ensure mcpServers section exists
282
+ if "mcpServers" not in config:
283
+ config["mcpServers"] = {}
284
+
285
+ # Get server configuration
286
+ server_config = get_mcp_server_config_for_tool(project_root, "auggie", server_name, enable_file_watching)
287
+ config["mcpServers"][server_name] = server_config
288
+
289
+ # Write updated config
290
+ with open(config_path, "w") as f:
291
+ json.dump(config, f, indent=2)
292
+
293
+ print_success(f"✅ Configured Auggie at {config_path}")
294
+ return True
295
+
296
+
297
+ def configure_claude_code_mcp(
298
+ config_path: Path,
299
+ project_root: Path,
300
+ server_name: str,
301
+ enable_file_watching: bool,
302
+ force: bool
303
+ ) -> bool:
304
+ """Configure Claude Code MCP integration."""
305
+ # Use existing function for Claude Code
306
+ if config_path.exists() and not force:
307
+ with open(config_path) as f:
308
+ config = json.load(f)
309
+ if config.get("mcpServers", {}).get(server_name):
310
+ print_warning(f"MCP server '{server_name}' already exists in Claude Code config")
311
+ print_info("Use --force to overwrite")
312
+ return False
313
+
314
+ create_project_claude_config(project_root, server_name, enable_file_watching)
315
+ print_success(f"✅ Configured Claude Code at {config_path}")
316
+ return True
317
+
318
+
319
+ def configure_codex_mcp(
320
+ config_path: Path,
321
+ project_root: Path,
322
+ server_name: str,
323
+ enable_file_watching: bool,
324
+ force: bool
325
+ ) -> bool:
326
+ """Configure Codex MCP integration."""
327
+ # Create backup if file exists
328
+ backup_path = config_path.with_suffix(config_path.suffix + ".backup")
329
+
330
+ # Load existing config or create new one
331
+ if config_path.exists():
332
+ if not force:
333
+ try:
334
+ with open(config_path, "rb") as f:
335
+ config = tomllib.load(f)
336
+ if config.get("mcp_servers", {}).get(server_name):
337
+ print_warning(f"MCP server '{server_name}' already exists in Codex config")
338
+ print_info("Use --force to overwrite")
339
+ return False
340
+ except Exception as e:
341
+ print_warning(f"Could not parse existing Codex config: {e}")
342
+
343
+ shutil.copy2(config_path, backup_path)
344
+ # Read as text to preserve existing content
345
+ with open(config_path, "r") as f:
346
+ config_text = f.read()
347
+ else:
348
+ config_path.parent.mkdir(parents=True, exist_ok=True)
349
+ config_text = ""
350
+
351
+ # Get server configuration
352
+ server_config = get_mcp_server_config_for_tool(project_root, "codex", server_name, enable_file_watching)
353
+
354
+ # Generate TOML section for the server
355
+ toml_section = f"\n[mcp_servers.{server_name}]\n"
356
+ toml_section += f'command = "{server_config["command"]}"\n'
357
+ toml_section += f'args = {server_config["args"]}\n'
358
+
359
+ if server_config.get("env"):
360
+ toml_section += f"\n[mcp_servers.{server_name}.env]\n"
361
+ for key, value in server_config["env"].items():
362
+ toml_section += f'{key} = "{value}"\n'
363
+
364
+ # Append or replace the section
365
+ if f"[mcp_servers.{server_name}]" in config_text:
366
+ # Replace existing section (simple approach)
367
+ lines = config_text.split('\n')
368
+ new_lines = []
369
+ skip_section = False
370
+
371
+ for line in lines:
372
+ if line.strip() == f"[mcp_servers.{server_name}]":
373
+ skip_section = True
374
+ continue
375
+ elif line.strip().startswith("[") and skip_section:
376
+ skip_section = False
377
+ new_lines.append(line)
378
+ elif not skip_section:
379
+ new_lines.append(line)
380
+
381
+ config_text = '\n'.join(new_lines) + toml_section
382
+ else:
383
+ config_text += toml_section
384
+
385
+ # Write updated config
386
+ with open(config_path, "w") as f:
387
+ f.write(config_text)
388
+
389
+ print_success(f"✅ Configured Codex at {config_path}")
390
+ return True
391
+
392
+
393
+ def configure_gemini_mcp(
394
+ config_path: Path,
395
+ project_root: Path,
396
+ server_name: str,
397
+ enable_file_watching: bool,
398
+ force: bool
399
+ ) -> bool:
400
+ """Configure Gemini MCP integration."""
401
+ # Create backup if file exists
402
+ backup_path = config_path.with_suffix(config_path.suffix + ".backup")
403
+
404
+ # Load existing config or create new one
405
+ if config_path.exists():
406
+ if not force:
407
+ with open(config_path) as f:
408
+ config = json.load(f)
409
+ if config.get("mcpServers", {}).get(server_name):
410
+ print_warning(f"MCP server '{server_name}' already exists in Gemini config")
411
+ print_info("Use --force to overwrite")
412
+ return False
413
+ shutil.copy2(config_path, backup_path)
414
+ with open(config_path) as f:
415
+ config = json.load(f)
416
+ else:
417
+ config_path.parent.mkdir(parents=True, exist_ok=True)
418
+ config = {}
419
+
420
+ # Ensure mcpServers section exists
421
+ if "mcpServers" not in config:
422
+ config["mcpServers"] = {}
423
+
424
+ # Get server configuration
425
+ server_config = get_mcp_server_config_for_tool(project_root, "gemini", server_name, enable_file_watching)
426
+ config["mcpServers"][server_name] = server_config
427
+
428
+ # Write updated config
429
+ with open(config_path, "w") as f:
430
+ json.dump(config, f, indent=2)
431
+
432
+ print_success(f"✅ Configured Gemini at {config_path}")
433
+ return True
434
+
435
+
436
+ # Tool-specific commands
437
+ @mcp_app.command("auggie")
438
+ def configure_auggie(
125
439
  ctx: typer.Context,
126
440
  server_name: str = typer.Option(
127
441
  "mcp-vector-search",
@@ -143,58 +457,283 @@ def install_mcp_integration(
143
457
  rich_help_panel="⚙️ Advanced Options",
144
458
  ),
145
459
  ) -> None:
146
- """🔗 Install MCP integration for Claude Code in the current project.
460
+ """🤖 Configure MCP integration for Auggie AI.
147
461
 
148
- Creates .mcp.json to enable semantic code search in Claude Code.
149
- The integration provides AI-powered semantic search tools directly in Claude Code.
462
+ Sets up mcp-vector-search as an MCP server for Auggie AI assistant.
463
+ Configuration is stored in ~/.augment/settings.json.
464
+
465
+ [bold cyan]Examples:[/bold cyan]
466
+
467
+ [green]Configure with defaults:[/green]
468
+ $ mcp-vector-search mcp auggie
150
469
 
151
- [bold cyan]Basic Examples:[/bold cyan]
470
+ [green]Force overwrite existing config:[/green]
471
+ $ mcp-vector-search mcp auggie --force
472
+
473
+ [green]Disable file watching:[/green]
474
+ $ mcp-vector-search mcp auggie --no-watch
475
+ """
476
+ try:
477
+ project_root = ctx.obj.get("project_root") or Path.cwd()
478
+ project_manager = ProjectManager(project_root)
479
+ if not project_manager.is_initialized():
480
+ print_error("Project not initialized. Run 'mcp-vector-search init' first.")
481
+ raise typer.Exit(1)
482
+
483
+ enable_file_watching = not no_watch
484
+ success = configure_tool_mcp("auggie", project_root, server_name, enable_file_watching, force)
485
+
486
+ if success:
487
+ print_info("Auggie will automatically detect the server when restarted")
488
+ else:
489
+ raise typer.Exit(1)
490
+
491
+ except Exception as e:
492
+ print_error(f"Configuration failed: {e}")
493
+ raise typer.Exit(1)
494
+
495
+
496
+ @mcp_app.command("claude-code")
497
+ def configure_claude_code(
498
+ ctx: typer.Context,
499
+ server_name: str = typer.Option(
500
+ "mcp-vector-search",
501
+ "--name",
502
+ help="Name for the MCP server",
503
+ rich_help_panel="📁 Configuration",
504
+ ),
505
+ force: bool = typer.Option(
506
+ False,
507
+ "--force",
508
+ "-f",
509
+ help="Force installation even if server already exists",
510
+ rich_help_panel="⚙️ Advanced Options",
511
+ ),
512
+ no_watch: bool = typer.Option(
513
+ False,
514
+ "--no-watch",
515
+ help="Disable file watching for automatic reindexing",
516
+ rich_help_panel="⚙️ Advanced Options",
517
+ ),
518
+ ) -> None:
519
+ """🤖 Configure MCP integration for Claude Code.
152
520
 
153
- [green]Install with defaults:[/green]
154
- $ mcp-vector-search mcp install
521
+ Creates .mcp.json to enable semantic code search in Claude Code.
522
+ Configuration is project-scoped for team sharing.
155
523
 
156
- [green]Install with custom server name:[/green]
157
- $ mcp-vector-search mcp install --name my-search-server
524
+ [bold cyan]Examples:[/bold cyan]
158
525
 
159
- [green]Reinstall/update configuration:[/green]
160
- $ mcp-vector-search mcp install --force
526
+ [green]Configure with defaults:[/green]
527
+ $ mcp-vector-search mcp claude-code
161
528
 
162
- [bold cyan]Advanced:[/bold cyan]
529
+ [green]Force overwrite existing config:[/green]
530
+ $ mcp-vector-search mcp claude-code --force
163
531
 
164
532
  [green]Disable file watching:[/green]
165
- $ mcp-vector-search mcp install --no-watch
533
+ $ mcp-vector-search mcp claude-code --no-watch
534
+ """
535
+ try:
536
+ project_root = ctx.obj.get("project_root") or Path.cwd()
537
+ project_manager = ProjectManager(project_root)
538
+ if not project_manager.is_initialized():
539
+ print_error("Project not initialized. Run 'mcp-vector-search init' first.")
540
+ raise typer.Exit(1)
166
541
 
167
- [dim]💡 Tip: The .mcp.json file can be committed to share
168
- MCP integration with your team.[/dim]
542
+ enable_file_watching = not no_watch
543
+ success = configure_tool_mcp("claude-code", project_root, server_name, enable_file_watching, force)
544
+
545
+ if success:
546
+ print_info("Claude Code will automatically detect the server when you open this project")
547
+ else:
548
+ raise typer.Exit(1)
549
+
550
+ except Exception as e:
551
+ print_error(f"Configuration failed: {e}")
552
+ raise typer.Exit(1)
553
+
554
+
555
+ @mcp_app.command("codex")
556
+ def configure_codex(
557
+ ctx: typer.Context,
558
+ server_name: str = typer.Option(
559
+ "mcp-vector-search",
560
+ "--name",
561
+ help="Name for the MCP server",
562
+ rich_help_panel="📁 Configuration",
563
+ ),
564
+ force: bool = typer.Option(
565
+ False,
566
+ "--force",
567
+ "-f",
568
+ help="Force installation even if server already exists",
569
+ rich_help_panel="⚙️ Advanced Options",
570
+ ),
571
+ no_watch: bool = typer.Option(
572
+ False,
573
+ "--no-watch",
574
+ help="Disable file watching for automatic reindexing",
575
+ rich_help_panel="⚙️ Advanced Options",
576
+ ),
577
+ ) -> None:
578
+ """🤖 Configure MCP integration for OpenAI Codex.
579
+
580
+ Sets up mcp-vector-search as an MCP server for OpenAI Codex CLI.
581
+ Configuration is stored in ~/.codex/config.toml.
582
+
583
+ [bold cyan]Examples:[/bold cyan]
584
+
585
+ [green]Configure with defaults:[/green]
586
+ $ mcp-vector-search mcp codex
587
+
588
+ [green]Force overwrite existing config:[/green]
589
+ $ mcp-vector-search mcp codex --force
590
+
591
+ [green]Disable file watching:[/green]
592
+ $ mcp-vector-search mcp codex --no-watch
169
593
  """
170
594
  try:
171
- # Get project root for checking initialization
172
595
  project_root = ctx.obj.get("project_root") or Path.cwd()
596
+ project_manager = ProjectManager(project_root)
597
+ if not project_manager.is_initialized():
598
+ print_error("Project not initialized. Run 'mcp-vector-search init' first.")
599
+ raise typer.Exit(1)
600
+
601
+ enable_file_watching = not no_watch
602
+ success = configure_tool_mcp("codex", project_root, server_name, enable_file_watching, force)
603
+
604
+ if success:
605
+ print_info("Codex will automatically detect the server when restarted")
606
+ else:
607
+ raise typer.Exit(1)
608
+
609
+ except Exception as e:
610
+ print_error(f"Configuration failed: {e}")
611
+ raise typer.Exit(1)
612
+
173
613
 
174
- # Check if project is initialized
614
+ @mcp_app.command("gemini")
615
+ def configure_gemini(
616
+ ctx: typer.Context,
617
+ server_name: str = typer.Option(
618
+ "mcp-vector-search",
619
+ "--name",
620
+ help="Name for the MCP server",
621
+ rich_help_panel="📁 Configuration",
622
+ ),
623
+ force: bool = typer.Option(
624
+ False,
625
+ "--force",
626
+ "-f",
627
+ help="Force installation even if server already exists",
628
+ rich_help_panel="⚙️ Advanced Options",
629
+ ),
630
+ no_watch: bool = typer.Option(
631
+ False,
632
+ "--no-watch",
633
+ help="Disable file watching for automatic reindexing",
634
+ rich_help_panel="⚙️ Advanced Options",
635
+ ),
636
+ ) -> None:
637
+ """🤖 Configure MCP integration for Google Gemini.
638
+
639
+ Sets up mcp-vector-search as an MCP server for Google Gemini CLI.
640
+ Configuration is stored in ~/.gemini/mcp.json.
641
+
642
+ [bold cyan]Examples:[/bold cyan]
643
+
644
+ [green]Configure with defaults:[/green]
645
+ $ mcp-vector-search mcp gemini
646
+
647
+ [green]Force overwrite existing config:[/green]
648
+ $ mcp-vector-search mcp gemini --force
649
+
650
+ [green]Disable file watching:[/green]
651
+ $ mcp-vector-search mcp gemini --no-watch
652
+ """
653
+ try:
654
+ project_root = ctx.obj.get("project_root") or Path.cwd()
175
655
  project_manager = ProjectManager(project_root)
176
656
  if not project_manager.is_initialized():
177
657
  print_error("Project not initialized. Run 'mcp-vector-search init' first.")
178
658
  raise typer.Exit(1)
179
659
 
180
- # Check if .mcp.json already has the server configuration
181
- mcp_config_path = project_root / ".mcp.json"
182
- if mcp_config_path.exists() and not force:
183
- with open(mcp_config_path) as f:
184
- config = json.load(f)
185
- if config.get("mcpServers", {}).get(server_name):
186
- print_warning(f"MCP server '{server_name}' already exists in .mcp.json")
187
- print_info("Use --force to overwrite")
188
- raise typer.Exit(1)
660
+ enable_file_watching = not no_watch
661
+ success = configure_tool_mcp("gemini", project_root, server_name, enable_file_watching, force)
662
+
663
+ if success:
664
+ print_info("Gemini will automatically detect the server when restarted")
665
+ else:
666
+ raise typer.Exit(1)
667
+
668
+ except Exception as e:
669
+ print_error(f"Configuration failed: {e}")
670
+ raise typer.Exit(1)
671
+
672
+
673
+ # Legacy install command (deprecated)
674
+ @mcp_app.command("install", hidden=True)
675
+ @mcp_app.command("init", hidden=True) # Add 'init' as an alias
676
+ def install_mcp_integration(
677
+ ctx: typer.Context,
678
+ server_name: str = typer.Option(
679
+ "mcp-vector-search",
680
+ "--name",
681
+ help="Name for the MCP server",
682
+ rich_help_panel="📁 Configuration",
683
+ ),
684
+ force: bool = typer.Option(
685
+ False,
686
+ "--force",
687
+ "-f",
688
+ help="Force installation even if server already exists",
689
+ rich_help_panel="⚙️ Advanced Options",
690
+ ),
691
+ no_watch: bool = typer.Option(
692
+ False,
693
+ "--no-watch",
694
+ help="Disable file watching for automatic reindexing",
695
+ rich_help_panel="⚙️ Advanced Options",
696
+ ),
697
+ ) -> None:
698
+ """[DEPRECATED] Use tool-specific commands instead.
699
+
700
+ This command is deprecated. Use the tool-specific commands instead:
701
+
702
+ [bold cyan]New Commands:[/bold cyan]
703
+
704
+ [green]For Auggie:[/green]
705
+ $ mcp-vector-search mcp auggie
706
+
707
+ [green]For Claude Code:[/green]
708
+ $ mcp-vector-search mcp claude-code
709
+
710
+ [green]For Codex:[/green]
711
+ $ mcp-vector-search mcp codex
712
+
713
+ [green]For Gemini:[/green]
714
+ $ mcp-vector-search mcp gemini
715
+ """
716
+ print_warning("⚠️ The 'mcp install' command is deprecated.")
717
+ print_info("Use tool-specific commands instead:")
718
+ print_info(" • mcp-vector-search mcp auggie")
719
+ print_info(" • mcp-vector-search mcp claude-code")
720
+ print_info(" • mcp-vector-search mcp codex")
721
+ print_info(" • mcp-vector-search mcp gemini")
722
+ print_info("")
723
+ print_info("Defaulting to Claude Code configuration...")
724
+
725
+ try:
726
+ project_root = ctx.obj.get("project_root") or Path.cwd()
727
+ project_manager = ProjectManager(project_root)
728
+ if not project_manager.is_initialized():
729
+ print_error("Project not initialized. Run 'mcp-vector-search init' first.")
730
+ raise typer.Exit(1)
189
731
 
190
- # Create configuration in project root
191
732
  enable_file_watching = not no_watch
192
- create_project_claude_config(project_root, server_name, enable_file_watching)
733
+ success = configure_tool_mcp("claude-code", project_root, server_name, enable_file_watching, force)
193
734
 
194
- print_info(f"MCP server '{server_name}' installed in {mcp_config_path}")
195
- print_info(
196
- "Claude Code will automatically detect the server when you open this project"
197
- )
735
+ if success:
736
+ print_info("Claude Code will automatically detect the server when you open this project")
198
737
 
199
738
  # Test the server (using project_root for the server command)
200
739
  print_info("Testing server startup...")
@@ -277,6 +816,77 @@ def install_mcp_integration(
277
816
  raise typer.Exit(1)
278
817
 
279
818
 
819
+ @mcp_app.command("list")
820
+ def list_tools() -> None:
821
+ """📋 List supported AI tools and their configuration status.
822
+
823
+ Shows all supported AI tools, their configuration paths, and whether
824
+ they are currently configured with mcp-vector-search.
825
+
826
+ [bold cyan]Examples:[/bold cyan]
827
+
828
+ [green]List all tools:[/green]
829
+ $ mcp-vector-search mcp list
830
+ """
831
+ console.print("\n[bold blue]🤖 Supported AI Tools[/bold blue]\n")
832
+
833
+ table = Table(show_header=True, header_style="bold magenta")
834
+ table.add_column("Tool", style="cyan", no_wrap=True)
835
+ table.add_column("Name", style="white")
836
+ table.add_column("Config Path", style="dim")
837
+ table.add_column("Status", justify="center")
838
+
839
+ for tool_id, tool_info in SUPPORTED_TOOLS.items():
840
+ config_path_str = tool_info["config_path"]
841
+
842
+ # Handle path expansion
843
+ if config_path_str.startswith("~/"):
844
+ config_path = Path.home() / config_path_str[2:]
845
+ elif config_path_str.startswith("."):
846
+ config_path = Path.cwd() / config_path_str
847
+ else:
848
+ config_path = Path(config_path_str)
849
+
850
+ # Check if configured
851
+ status = "❌ Not configured"
852
+ try:
853
+ if config_path.exists():
854
+ if tool_info["format"] == "json":
855
+ with open(config_path) as f:
856
+ config = json.load(f)
857
+ if config.get("mcpServers", {}).get("mcp-vector-search"):
858
+ status = "✅ Configured"
859
+ else:
860
+ status = "⚠️ Config exists"
861
+ elif tool_info["format"] == "toml":
862
+ with open(config_path, "rb") as f:
863
+ config = tomllib.load(f)
864
+ if config.get("mcp_servers", {}).get("mcp-vector-search"):
865
+ status = "✅ Configured"
866
+ else:
867
+ status = "⚠️ Config exists"
868
+ else:
869
+ status = "❌ No config file"
870
+ except Exception:
871
+ status = "❓ Unknown"
872
+
873
+ table.add_row(
874
+ tool_id,
875
+ tool_info["name"],
876
+ str(config_path),
877
+ status
878
+ )
879
+
880
+ console.print(table)
881
+ console.print("\n[dim]💡 Use 'mcp-vector-search mcp <tool>' to configure a specific tool[/dim]")
882
+
883
+
884
+ @mcp_app.command("tools")
885
+ def list_tools_alias() -> None:
886
+ """📋 Alias for 'list' command."""
887
+ list_tools()
888
+
889
+
280
890
  @mcp_app.command("test")
281
891
  def test_mcp_integration(
282
892
  ctx: typer.Context,
@@ -39,7 +39,7 @@ unfamiliar codebases, finding similar patterns, and integrating with AI tools.
39
39
  status 📊 Show project status
40
40
  search 🔍 Search code semantically
41
41
  index 📇 Index codebase
42
- mcp 🤖 MCP integration
42
+ mcp 🤖 MCP integration for AI tools
43
43
  config ⚙️ Configure settings
44
44
  help ❓ Get help
45
45
  version ℹ️ Show version
@@ -84,7 +84,7 @@ app.add_typer(search_app, name="search", help="🔍 Search code semantically")
84
84
  app.add_typer(index_app, name="index", help="📇 Index codebase for semantic search")
85
85
 
86
86
  # 7. MCP - MCP integration
87
- app.add_typer(mcp_app, name="mcp", help="🤖 Manage Claude Code MCP integration")
87
+ app.add_typer(mcp_app, name="mcp", help="🤖 Manage MCP integration for AI tools")
88
88
 
89
89
  # 8. CONFIG - Configuration
90
90
  app.add_typer(config_app, name="config", help="⚙️ Manage project configuration")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-vector-search
3
- Version: 0.7.4
3
+ Version: 0.7.5
4
4
  Summary: CLI-first semantic code search with MCP integration
5
5
  Project-URL: Homepage, https://github.com/bobmatnyc/mcp-vector-search
6
6
  Project-URL: Documentation, https://mcp-vector-search.readthedocs.io
@@ -1,11 +1,11 @@
1
- mcp_vector_search/__init__.py,sha256=dwjtm9sE-mB8ai4WJ0qaTi2dWD55TXfdknB0YzqYGzQ,299
1
+ mcp_vector_search/__init__.py,sha256=dZBJd61xdNTaijMxlEUMhBGLWPSCGNuFPxIzXBRWJ68,299
2
2
  mcp_vector_search/py.typed,sha256=lCKeV9Qcn9sGtbRsgg-LJO2ZwWRuknnnlmomq3bJFH0,43
3
3
  mcp_vector_search/cli/__init__.py,sha256=TNB7CaOASz8u3yHWLbNmo8-GtHF0qwUjVKWAuNphKgo,40
4
4
  mcp_vector_search/cli/didyoumean.py,sha256=F_ss-EX4F9RgnMsEhdTwLpyNCah9SqnBZc2tBtzASck,15918
5
5
  mcp_vector_search/cli/export.py,sha256=iluxuRT2KELdKlQeDAlVkteiel4GGrng153UAw9H0as,10804
6
6
  mcp_vector_search/cli/history.py,sha256=6wRrSfxpUe9hJXuaEeVxOVkFlcpqkIiGfwzDgd5N6c8,9323
7
7
  mcp_vector_search/cli/interactive.py,sha256=T7P4dAdvbglznzQYgiePv5YNyOx9FeE57Y3OKYnnbYE,12744
8
- mcp_vector_search/cli/main.py,sha256=5BJeueirPMGqNNf9NYZ8x6NhKOgu_EUkuRYNaP25I80,14495
8
+ mcp_vector_search/cli/main.py,sha256=5UnZufgKBUSMgxe7WDIl5tYI8fEONf1jNnhFjBvsnW0,14509
9
9
  mcp_vector_search/cli/output.py,sha256=7ShIk_UKzhDzRGxI6JluPu0gGkbmKOevqgIAKR4oCa0,12560
10
10
  mcp_vector_search/cli/suggestions.py,sha256=h-UaxoLcHmFbhZSm0WG7nKJXAIRIqhv7aGsXijp7vA8,13273
11
11
  mcp_vector_search/cli/commands/__init__.py,sha256=vQls-YKZ54YEwmf7g1dL0T2SS9D4pdQljXzsUChG_V4,42
@@ -15,7 +15,7 @@ mcp_vector_search/cli/commands/demo.py,sha256=HOa5g4vDu_zjSq77bMcFaCck7RN9YsYgsI
15
15
  mcp_vector_search/cli/commands/index.py,sha256=tqn6KjDygAHam5mINthYFBm-hA6I8QYDjrSVRmUtXLE,18213
16
16
  mcp_vector_search/cli/commands/init.py,sha256=2kdjtIPPeutKUXs65-6W1VQPF_BQrbV6_U3TCE7U5mw,23242
17
17
  mcp_vector_search/cli/commands/install.py,sha256=phk7Eb7UOU5IsRfJyaDPdOfdUWli9gyA4cHjhgXcNEI,24609
18
- mcp_vector_search/cli/commands/mcp.py,sha256=FKZNxYrDc7HfPTFBUEypCv-8atsrHEdbtU6Yfg9QUMA,18569
18
+ mcp_vector_search/cli/commands/mcp.py,sha256=LGk9AfQ8d3QOl38u7LnTLOq6tR1DLah_X0ZuzCBNhYI,38606
19
19
  mcp_vector_search/cli/commands/reset.py,sha256=bsIT6zjDf6gsvIkVaRaUClYzlTyNe--8t0NWkBY0ldU,13724
20
20
  mcp_vector_search/cli/commands/search.py,sha256=yyou7wO9qZ_w2oiKdyOrk2WUxvkFpc-Up8hpflxYlyw,24802
21
21
  mcp_vector_search/cli/commands/status.py,sha256=7ro6M3aifV0cuCqqxJ278P9g-fbhzvjoOABUoitMrPo,18929
@@ -56,8 +56,8 @@ mcp_vector_search/utils/__init__.py,sha256=Eq6lY-oPMfCt-GpPUbg9QbmTHuQVmTaVDBMU2
56
56
  mcp_vector_search/utils/gitignore.py,sha256=bzie3V5gOGIN7j3FNVLLCx8O_hfZJDUqqAy5T3lT3Ek,7685
57
57
  mcp_vector_search/utils/timing.py,sha256=THC7mfbTYnUpnnDcblgQacYMzbEkfFoIShx6plmhCgg,11285
58
58
  mcp_vector_search/utils/version.py,sha256=d7fS-CLemxb8UzZ9j18zH0Y0Ud097ljKKYYOPulnGPE,1138
59
- mcp_vector_search-0.7.4.dist-info/METADATA,sha256=k-RZl6CDcmhMyiS_w4oNCUzkrg7syOyIeKyCdYoereo,19120
60
- mcp_vector_search-0.7.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
61
- mcp_vector_search-0.7.4.dist-info/entry_points.txt,sha256=y3Ygtc_JiBchNEIL-tPABo7EbzBExGAxwGdkkeP5D2I,86
62
- mcp_vector_search-0.7.4.dist-info/licenses/LICENSE,sha256=FqZUgGJH_tZKZLQsMCpXaLawRyLmyFKRVfMwYyEcyTs,1072
63
- mcp_vector_search-0.7.4.dist-info/RECORD,,
59
+ mcp_vector_search-0.7.5.dist-info/METADATA,sha256=7K-LZqTr2XyHrFVwuUBGM0AxKku3b-a0HEWNkUTnYMo,19120
60
+ mcp_vector_search-0.7.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
61
+ mcp_vector_search-0.7.5.dist-info/entry_points.txt,sha256=y3Ygtc_JiBchNEIL-tPABo7EbzBExGAxwGdkkeP5D2I,86
62
+ mcp_vector_search-0.7.5.dist-info/licenses/LICENSE,sha256=FqZUgGJH_tZKZLQsMCpXaLawRyLmyFKRVfMwYyEcyTs,1072
63
+ mcp_vector_search-0.7.5.dist-info/RECORD,,