mcp-code-indexer 4.2.5__tar.gz → 4.2.6__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.5 → mcp_code_indexer-4.2.6}/PKG-INFO +3 -3
  2. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/README.md +2 -2
  3. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/pyproject.toml +1 -1
  4. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/__init__.py +2 -1
  5. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/daemon.py +18 -11
  6. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/LICENSE +0 -0
  7. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/__init__.py +0 -0
  8. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/__main__.py +0 -0
  9. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/ask_handler.py +0 -0
  10. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/claude_api_handler.py +0 -0
  11. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/cleanup_manager.py +0 -0
  12. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/commands/__init__.py +0 -0
  13. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/commands/makelocal.py +0 -0
  14. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
  15. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/__init__.py +0 -0
  16. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/connection_health.py +0 -0
  17. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/database.py +0 -0
  18. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/database_factory.py +0 -0
  19. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/exceptions.py +0 -0
  20. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/models.py +0 -0
  21. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/path_resolver.py +0 -0
  22. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/database/retry_executor.py +0 -0
  23. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/deepask_handler.py +0 -0
  24. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/error_handler.py +0 -0
  25. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/file_scanner.py +0 -0
  26. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/git_hook_handler.py +0 -0
  27. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/logging_config.py +0 -0
  28. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/main.py +0 -0
  29. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/middleware/__init__.py +0 -0
  30. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/middleware/auth.py +0 -0
  31. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
  32. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/middleware/logging.py +0 -0
  33. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/middleware/security.py +0 -0
  34. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/migrations/001_initial.sql +0 -0
  35. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/migrations/002_performance_indexes.sql +0 -0
  36. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/migrations/003_project_overviews.sql +0 -0
  37. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/migrations/004_remove_branch_dependency.sql +0 -0
  38. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/migrations/005_remove_git_remotes.sql +0 -0
  39. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/migrations/006_vector_mode.sql +0 -0
  40. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/query_preprocessor.py +0 -0
  41. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/server/__init__.py +0 -0
  42. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/server/mcp_server.py +0 -0
  43. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  44. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/token_counter.py +0 -0
  45. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/tools/__init__.py +0 -0
  46. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/transport/__init__.py +0 -0
  47. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/transport/base.py +0 -0
  48. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/transport/http_transport.py +0 -0
  49. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/transport/stdio_transport.py +0 -0
  50. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/chunking/__init__.py +0 -0
  51. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/chunking/ast_chunker.py +0 -0
  52. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/chunking/chunk_optimizer.py +0 -0
  53. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/chunking/language_handlers.py +0 -0
  54. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/config.py +0 -0
  55. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/monitoring/__init__.py +0 -0
  56. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/monitoring/change_detector.py +0 -0
  57. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/monitoring/file_watcher.py +0 -0
  58. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/monitoring/merkle_tree.py +0 -0
  59. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/providers/__init__.py +0 -0
  60. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/providers/turbopuffer_client.py +0 -0
  61. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/providers/voyage_client.py +0 -0
  62. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/security/__init__.py +0 -0
  63. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/src/mcp_code_indexer/vector_mode/security/patterns.py +0 -0
  64. {mcp_code_indexer-4.2.5 → mcp_code_indexer-4.2.6}/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.5
3
+ Version: 4.2.6
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?52)](https://badge.fury.io/py/mcp-code-indexer)
52
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?52)](https://pypi.org/project/mcp-code-indexer/)
51
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?53)](https://badge.fury.io/py/mcp-code-indexer)
52
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?53)](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?52)](https://badge.fury.io/py/mcp-code-indexer)
4
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?52)](https://pypi.org/project/mcp-code-indexer/)
3
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?53)](https://badge.fury.io/py/mcp-code-indexer)
4
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?53)](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.5"
7
+ version = "4.2.6"
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"]
@@ -18,9 +18,10 @@ def is_vector_mode_available() -> bool:
18
18
  import turbopuffer
19
19
  import tree_sitter
20
20
  import watchdog
21
+ # PyYAML package provides yaml module
21
22
  import yaml
22
23
  return True
23
- except ImportError:
24
+ except ImportError as e:
24
25
  return False
25
26
 
26
27
  def get_vector_config_path() -> Path:
@@ -39,6 +39,7 @@ class VectorDaemon:
39
39
  self.cache_dir = cache_dir
40
40
  self.is_running = False
41
41
  self.shutdown_requested = False
42
+ self.shutdown_event = asyncio.Event()
42
43
 
43
44
  # Process tracking
44
45
  self.monitored_projects: Set[str] = set()
@@ -55,23 +56,24 @@ class VectorDaemon:
55
56
  "last_activity": time.time(),
56
57
  }
57
58
 
58
- # Setup signal handlers
59
- self._setup_signal_handlers()
59
+ # Setup signal handlers will be done in start() method to access event loop
60
60
 
61
61
  def _setup_signal_handlers(self) -> None:
62
62
  """Setup signal handlers for graceful shutdown."""
63
63
  try:
64
- signal.signal(signal.SIGTERM, self._signal_handler)
65
- signal.signal(signal.SIGINT, self._signal_handler)
64
+ loop = asyncio.get_running_loop()
65
+ for sig in [signal.SIGTERM, signal.SIGINT]:
66
+ loop.add_signal_handler(sig, self._signal_handler, sig)
66
67
  if hasattr(signal, 'SIGHUP'):
67
- signal.signal(signal.SIGHUP, self._signal_handler)
68
+ loop.add_signal_handler(signal.SIGHUP, self._signal_handler, signal.SIGHUP)
68
69
  except Exception as e:
69
70
  logger.warning(f"Could not setup signal handlers: {e}")
70
71
 
71
- def _signal_handler(self, signum: int, frame) -> None:
72
+ def _signal_handler(self, signum: int) -> None:
72
73
  """Handle shutdown signals."""
73
74
  logger.info(f"Received signal {signum}, initiating graceful shutdown")
74
75
  self.shutdown_requested = True
76
+ self.shutdown_event.set()
75
77
 
76
78
  async def start(self) -> None:
77
79
  """Start the vector daemon."""
@@ -80,6 +82,10 @@ class VectorDaemon:
80
82
  return
81
83
 
82
84
  self.is_running = True
85
+
86
+ # Setup signal handlers now that we have an event loop
87
+ self._setup_signal_handlers()
88
+
83
89
  logger.info(
84
90
  "Starting vector daemon",
85
91
  extra={
@@ -113,13 +119,13 @@ class VectorDaemon:
113
119
  finally:
114
120
  await self._cleanup()
115
121
 
122
+ async def _notify_shutdown(self) -> None:
123
+ """Notify shutdown event (called from signal handler)."""
124
+ self.shutdown_event.set()
125
+
116
126
  async def _run_until_shutdown(self) -> None:
117
127
  """Run daemon until shutdown is requested."""
118
- while not self.shutdown_requested:
119
- try:
120
- await asyncio.sleep(1.0)
121
- except asyncio.CancelledError:
122
- break
128
+ await self.shutdown_event.wait()
123
129
 
124
130
  async def _monitor_projects(self) -> None:
125
131
  """Monitor projects for vector indexing requirements."""
@@ -346,6 +352,7 @@ def main() -> None:
346
352
  asyncio.run(start_vector_daemon(args.config, args.db_path, args.cache_dir))
347
353
  except KeyboardInterrupt:
348
354
  logger.info("Daemon interrupted by user")
355
+ sys.exit(0)
349
356
  except Exception as e:
350
357
  logger.error(f"Daemon failed: {e}", exc_info=True)
351
358
  sys.exit(1)