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.
- mcp_vector_search/__init__.py +2 -2
- mcp_vector_search/cli/commands/mcp.py +646 -36
- mcp_vector_search/cli/main.py +2 -2
- {mcp_vector_search-0.7.4.dist-info → mcp_vector_search-0.7.5.dist-info}/METADATA +1 -1
- {mcp_vector_search-0.7.4.dist-info → mcp_vector_search-0.7.5.dist-info}/RECORD +8 -8
- {mcp_vector_search-0.7.4.dist-info → mcp_vector_search-0.7.5.dist-info}/WHEEL +0 -0
- {mcp_vector_search-0.7.4.dist-info → mcp_vector_search-0.7.5.dist-info}/entry_points.txt +0 -0
- {mcp_vector_search-0.7.4.dist-info → mcp_vector_search-0.7.5.dist-info}/licenses/LICENSE +0 -0
mcp_vector_search/__init__.py
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
"""MCP integration commands for
|
|
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(
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
"""
|
|
460
|
+
"""🤖 Configure MCP integration for Auggie AI.
|
|
147
461
|
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
[
|
|
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
|
-
|
|
154
|
-
|
|
521
|
+
Creates .mcp.json to enable semantic code search in Claude Code.
|
|
522
|
+
Configuration is project-scoped for team sharing.
|
|
155
523
|
|
|
156
|
-
[
|
|
157
|
-
$ mcp-vector-search mcp install --name my-search-server
|
|
524
|
+
[bold cyan]Examples:[/bold cyan]
|
|
158
525
|
|
|
159
|
-
[green]
|
|
160
|
-
$ mcp-vector-search mcp
|
|
526
|
+
[green]Configure with defaults:[/green]
|
|
527
|
+
$ mcp-vector-search mcp claude-code
|
|
161
528
|
|
|
162
|
-
[
|
|
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
|
|
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
|
-
|
|
168
|
-
|
|
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
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
733
|
+
success = configure_tool_mcp("claude-code", project_root, server_name, enable_file_watching, force)
|
|
193
734
|
|
|
194
|
-
|
|
195
|
-
|
|
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,
|
mcp_vector_search/cli/main.py
CHANGED
|
@@ -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
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
60
|
-
mcp_vector_search-0.7.
|
|
61
|
-
mcp_vector_search-0.7.
|
|
62
|
-
mcp_vector_search-0.7.
|
|
63
|
-
mcp_vector_search-0.7.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|