mcp-code-indexer 4.2.7__tar.gz → 4.2.9__tar.gz

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 (64) hide show
  1. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/PKG-INFO +3 -3
  2. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/README.md +2 -2
  3. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/pyproject.toml +1 -1
  4. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/main.py +39 -2
  5. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/daemon.py +11 -31
  6. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/LICENSE +0 -0
  7. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/__init__.py +0 -0
  8. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/__main__.py +0 -0
  9. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/ask_handler.py +0 -0
  10. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/claude_api_handler.py +0 -0
  11. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/cleanup_manager.py +0 -0
  12. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/commands/__init__.py +0 -0
  13. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/commands/makelocal.py +0 -0
  14. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
  15. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/__init__.py +0 -0
  16. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/connection_health.py +0 -0
  17. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/database.py +0 -0
  18. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/database_factory.py +0 -0
  19. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/exceptions.py +0 -0
  20. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/models.py +0 -0
  21. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/path_resolver.py +0 -0
  22. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/database/retry_executor.py +0 -0
  23. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/deepask_handler.py +0 -0
  24. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/error_handler.py +0 -0
  25. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/file_scanner.py +0 -0
  26. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/git_hook_handler.py +0 -0
  27. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/logging_config.py +0 -0
  28. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/middleware/__init__.py +0 -0
  29. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/middleware/auth.py +0 -0
  30. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
  31. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/middleware/logging.py +0 -0
  32. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/middleware/security.py +0 -0
  33. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/migrations/001_initial.sql +0 -0
  34. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/migrations/002_performance_indexes.sql +0 -0
  35. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/migrations/003_project_overviews.sql +0 -0
  36. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/migrations/004_remove_branch_dependency.sql +0 -0
  37. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/migrations/005_remove_git_remotes.sql +0 -0
  38. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/migrations/006_vector_mode.sql +0 -0
  39. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/query_preprocessor.py +0 -0
  40. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/server/__init__.py +0 -0
  41. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/server/mcp_server.py +0 -0
  42. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  43. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/token_counter.py +0 -0
  44. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/tools/__init__.py +0 -0
  45. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/transport/__init__.py +0 -0
  46. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/transport/base.py +0 -0
  47. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/transport/http_transport.py +0 -0
  48. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/transport/stdio_transport.py +0 -0
  49. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/__init__.py +0 -0
  50. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/chunking/__init__.py +0 -0
  51. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/chunking/ast_chunker.py +0 -0
  52. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/chunking/chunk_optimizer.py +0 -0
  53. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/chunking/language_handlers.py +0 -0
  54. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/config.py +0 -0
  55. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/monitoring/__init__.py +0 -0
  56. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/monitoring/change_detector.py +0 -0
  57. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/monitoring/file_watcher.py +0 -0
  58. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/monitoring/merkle_tree.py +0 -0
  59. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/providers/__init__.py +0 -0
  60. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/providers/turbopuffer_client.py +0 -0
  61. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/providers/voyage_client.py +0 -0
  62. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/security/__init__.py +0 -0
  63. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/security/patterns.py +0 -0
  64. {mcp_code_indexer-4.2.7 → mcp_code_indexer-4.2.9}/src/mcp_code_indexer/vector_mode/security/redactor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mcp-code-indexer
3
- Version: 4.2.7
3
+ Version: 4.2.9
4
4
  Summary: MCP server that tracks file descriptions across codebases, enabling AI agents to efficiently navigate and understand code through searchable summaries and token-aware overviews.
5
5
  License: MIT
6
6
  Keywords: mcp,model-context-protocol,code-indexer,ai-tools,codebase-navigation,file-descriptions,llm-tools
@@ -48,8 +48,8 @@ Description-Content-Type: text/markdown
48
48
 
49
49
  # MCP Code Indexer 🚀
50
50
 
51
- [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?54)](https://badge.fury.io/py/mcp-code-indexer)
52
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?54)](https://pypi.org/project/mcp-code-indexer/)
51
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?56)](https://badge.fury.io/py/mcp-code-indexer)
52
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?56)](https://pypi.org/project/mcp-code-indexer/)
53
53
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
54
54
 
55
55
  A production-ready **Model Context Protocol (MCP) server** that revolutionizes how AI agents navigate and understand codebases. Built for high-concurrency environments with advanced database resilience, the server provides instant access to intelligent descriptions, semantic search, and context-aware recommendations while maintaining 800+ writes/sec throughput.
@@ -1,7 +1,7 @@
1
1
  # MCP Code Indexer 🚀
2
2
 
3
- [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?54)](https://badge.fury.io/py/mcp-code-indexer)
4
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?54)](https://pypi.org/project/mcp-code-indexer/)
3
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?56)](https://badge.fury.io/py/mcp-code-indexer)
4
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?56)](https://pypi.org/project/mcp-code-indexer/)
5
5
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
6
6
 
7
7
  A production-ready **Model Context Protocol (MCP) server** that revolutionizes how AI agents navigate and understand codebases. Built for high-concurrency environments with advanced database resilience, the server provides instant access to intelligent descriptions, semantic search, and context-aware recommendations while maintaining 800+ writes/sec throughput.
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "mcp-code-indexer"
7
- version = "4.2.7"
7
+ version = "4.2.9"
8
8
  description = "MCP server that tracks file descriptions across codebases, enabling AI agents to efficiently navigate and understand code through searchable summaries and token-aware overviews."
9
9
  authors = ["MCP Code Indexer Contributors"]
10
10
  maintainers = ["MCP Code Indexer Contributors"]
@@ -8,6 +8,7 @@ Entry point for the mcp-code-indexer package when installed via pip.
8
8
  import argparse
9
9
  import asyncio
10
10
  import json
11
+ import signal
11
12
  import sys
12
13
  from pathlib import Path
13
14
  from typing import Any, Dict, List, Optional
@@ -1094,7 +1095,40 @@ async def main() -> None:
1094
1095
  if transport:
1095
1096
  transport.server = server
1096
1097
 
1097
- await server.run()
1098
+ # Setup signal handling for graceful shutdown
1099
+ shutdown_event = asyncio.Event()
1100
+
1101
+ def signal_handler(signum):
1102
+ logger.info(f"Received shutdown signal {signum}")
1103
+ shutdown_event.set()
1104
+
1105
+ # Register signal handlers
1106
+ loop = asyncio.get_running_loop()
1107
+ for sig in [signal.SIGTERM, signal.SIGINT]:
1108
+ loop.add_signal_handler(sig, signal_handler, sig)
1109
+
1110
+ # Run server and wait for shutdown signal
1111
+ server_task = asyncio.create_task(server.run())
1112
+ shutdown_task = asyncio.create_task(shutdown_event.wait())
1113
+
1114
+ try:
1115
+ # Wait for either server completion or shutdown signal
1116
+ done, pending = await asyncio.wait(
1117
+ [server_task, shutdown_task],
1118
+ return_when=asyncio.FIRST_COMPLETED
1119
+ )
1120
+
1121
+ # Cancel remaining tasks
1122
+ for task in pending:
1123
+ task.cancel()
1124
+ try:
1125
+ await task
1126
+ except asyncio.CancelledError:
1127
+ pass
1128
+
1129
+ except Exception as e:
1130
+ error_handler.log_error(e, context={"phase": "runtime"})
1131
+ raise
1098
1132
 
1099
1133
  except Exception as e:
1100
1134
  error_handler.log_error(e, context={"phase": "startup"})
@@ -1104,10 +1138,13 @@ async def main() -> None:
1104
1138
  if vector_daemon_task and not vector_daemon_task.done():
1105
1139
  logger.info("Cancelling vector daemon")
1106
1140
  vector_daemon_task.cancel()
1141
+
1142
+ # Wait for vector daemon to finish
1143
+ if vector_daemon_task:
1107
1144
  try:
1108
1145
  await vector_daemon_task
1109
1146
  except asyncio.CancelledError:
1110
- pass
1147
+ logger.info("Vector daemon cancelled successfully")
1111
1148
 
1112
1149
 
1113
1150
  def cli_main() -> None:
@@ -38,8 +38,6 @@ class VectorDaemon:
38
38
  self.db_manager = db_manager
39
39
  self.cache_dir = cache_dir
40
40
  self.is_running = False
41
- self.shutdown_requested = False
42
- self.shutdown_event = asyncio.Event()
43
41
 
44
42
  # Process tracking
45
43
  self.monitored_projects: Set[str] = set()
@@ -56,24 +54,7 @@ class VectorDaemon:
56
54
  "last_activity": time.time(),
57
55
  }
58
56
 
59
- # Setup signal handlers will be done in start() method to access event loop
60
-
61
- def _setup_signal_handlers(self) -> None:
62
- """Setup signal handlers for graceful shutdown."""
63
- try:
64
- loop = asyncio.get_running_loop()
65
- for sig in [signal.SIGTERM, signal.SIGINT]:
66
- loop.add_signal_handler(sig, self._signal_handler, sig)
67
- if hasattr(signal, 'SIGHUP'):
68
- loop.add_signal_handler(signal.SIGHUP, self._signal_handler, signal.SIGHUP)
69
- except Exception as e:
70
- logger.warning(f"Could not setup signal handlers: {e}")
71
-
72
- def _signal_handler(self, signum: int) -> None:
73
- """Handle shutdown signals."""
74
- logger.info(f"Received signal {signum}, initiating graceful shutdown")
75
- self.shutdown_requested = True
76
- self.shutdown_event.set()
57
+ # Signal handling is delegated to the parent process
77
58
 
78
59
  async def start(self) -> None:
79
60
  """Start the vector daemon."""
@@ -83,9 +64,6 @@ class VectorDaemon:
83
64
 
84
65
  self.is_running = True
85
66
 
86
- # Setup signal handlers now that we have an event loop
87
- self._setup_signal_handlers()
88
-
89
67
  logger.info(
90
68
  "Starting vector daemon",
91
69
  extra={
@@ -119,19 +97,21 @@ class VectorDaemon:
119
97
  finally:
120
98
  await self._cleanup()
121
99
 
122
- async def _notify_shutdown(self) -> None:
123
- """Notify shutdown event (called from signal handler)."""
124
- self.shutdown_event.set()
125
-
126
100
  async def _run_until_shutdown(self) -> None:
127
101
  """Run daemon until shutdown is requested."""
128
- await self.shutdown_event.wait()
102
+ # Wait indefinitely until task is cancelled by parent process
103
+ try:
104
+ while True:
105
+ await asyncio.sleep(1.0)
106
+ except asyncio.CancelledError:
107
+ logger.info("Vector daemon shutdown requested")
108
+ raise
129
109
 
130
110
  async def _monitor_projects(self) -> None:
131
111
  """Monitor projects for vector indexing requirements."""
132
112
  logger.info("Starting project monitoring")
133
113
 
134
- while not self.shutdown_requested:
114
+ while self.is_running:
135
115
  try:
136
116
  # Get all projects that need vector indexing
137
117
  projects = await self.db_manager.get_all_projects()
@@ -176,7 +156,7 @@ class VectorDaemon:
176
156
  """Worker task to process queued items."""
177
157
  logger.info(f"Starting worker: {worker_id}")
178
158
 
179
- while not self.shutdown_requested:
159
+ while self.is_running:
180
160
  try:
181
161
  # Get task from queue with timeout
182
162
  try:
@@ -245,7 +225,7 @@ class VectorDaemon:
245
225
 
246
226
  async def _stats_reporter(self) -> None:
247
227
  """Periodically report daemon statistics."""
248
- while not self.shutdown_requested:
228
+ while self.is_running:
249
229
  try:
250
230
  uptime = time.time() - self.stats["start_time"]
251
231