mcp-code-indexer 4.2.8__tar.gz → 4.2.10__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.8 → mcp_code_indexer-4.2.10}/PKG-INFO +3 -3
  2. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/README.md +2 -2
  3. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/pyproject.toml +1 -1
  4. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/main.py +5 -35
  5. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/daemon.py +11 -31
  6. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/LICENSE +0 -0
  7. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/__init__.py +0 -0
  8. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/__main__.py +0 -0
  9. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/ask_handler.py +0 -0
  10. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/claude_api_handler.py +0 -0
  11. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/cleanup_manager.py +0 -0
  12. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/commands/__init__.py +0 -0
  13. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/commands/makelocal.py +0 -0
  14. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
  15. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/__init__.py +0 -0
  16. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/connection_health.py +0 -0
  17. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/database.py +0 -0
  18. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/database_factory.py +0 -0
  19. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/exceptions.py +0 -0
  20. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/models.py +0 -0
  21. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/path_resolver.py +0 -0
  22. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/database/retry_executor.py +0 -0
  23. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/deepask_handler.py +0 -0
  24. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/error_handler.py +0 -0
  25. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/file_scanner.py +0 -0
  26. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/git_hook_handler.py +0 -0
  27. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/logging_config.py +0 -0
  28. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/middleware/__init__.py +0 -0
  29. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/middleware/auth.py +0 -0
  30. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
  31. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/middleware/logging.py +0 -0
  32. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/middleware/security.py +0 -0
  33. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/migrations/001_initial.sql +0 -0
  34. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/migrations/002_performance_indexes.sql +0 -0
  35. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/migrations/003_project_overviews.sql +0 -0
  36. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/migrations/004_remove_branch_dependency.sql +0 -0
  37. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/migrations/005_remove_git_remotes.sql +0 -0
  38. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/migrations/006_vector_mode.sql +0 -0
  39. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/query_preprocessor.py +0 -0
  40. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/server/__init__.py +0 -0
  41. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/server/mcp_server.py +0 -0
  42. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  43. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/token_counter.py +0 -0
  44. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/tools/__init__.py +0 -0
  45. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/transport/__init__.py +0 -0
  46. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/transport/base.py +0 -0
  47. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/transport/http_transport.py +0 -0
  48. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/transport/stdio_transport.py +0 -0
  49. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/__init__.py +0 -0
  50. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/chunking/__init__.py +0 -0
  51. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/chunking/ast_chunker.py +0 -0
  52. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/chunking/chunk_optimizer.py +0 -0
  53. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/chunking/language_handlers.py +0 -0
  54. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/config.py +0 -0
  55. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/monitoring/__init__.py +0 -0
  56. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/monitoring/change_detector.py +0 -0
  57. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/monitoring/file_watcher.py +0 -0
  58. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/monitoring/merkle_tree.py +0 -0
  59. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/providers/__init__.py +0 -0
  60. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/providers/turbopuffer_client.py +0 -0
  61. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/providers/voyage_client.py +0 -0
  62. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/security/__init__.py +0 -0
  63. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/src/mcp_code_indexer/vector_mode/security/patterns.py +0 -0
  64. {mcp_code_indexer-4.2.8 → mcp_code_indexer-4.2.10}/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.8
3
+ Version: 4.2.10
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?55)](https://badge.fury.io/py/mcp-code-indexer)
52
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?55)](https://pypi.org/project/mcp-code-indexer/)
51
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?57)](https://badge.fury.io/py/mcp-code-indexer)
52
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?57)](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?55)](https://badge.fury.io/py/mcp-code-indexer)
4
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?55)](https://pypi.org/project/mcp-code-indexer/)
3
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?57)](https://badge.fury.io/py/mcp-code-indexer)
4
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?57)](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.8"
7
+ version = "4.2.10"
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"]
@@ -1095,40 +1095,7 @@ async def main() -> None:
1095
1095
  if transport:
1096
1096
  transport.server = server
1097
1097
 
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
+ await server.run()
1132
1099
 
1133
1100
  except Exception as e:
1134
1101
  error_handler.log_error(e, context={"phase": "startup"})
@@ -1138,10 +1105,13 @@ async def main() -> None:
1138
1105
  if vector_daemon_task and not vector_daemon_task.done():
1139
1106
  logger.info("Cancelling vector daemon")
1140
1107
  vector_daemon_task.cancel()
1108
+
1109
+ # Wait for vector daemon to finish
1110
+ if vector_daemon_task:
1141
1111
  try:
1142
1112
  await vector_daemon_task
1143
1113
  except asyncio.CancelledError:
1144
- pass
1114
+ logger.info("Vector daemon cancelled successfully")
1145
1115
 
1146
1116
 
1147
1117
  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