mcp-code-indexer 4.2.13__tar.gz → 4.2.15__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.13 → mcp_code_indexer-4.2.15}/PKG-INFO +3 -3
  2. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/README.md +2 -2
  3. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/pyproject.toml +1 -1
  4. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/main.py +66 -1
  5. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/LICENSE +0 -0
  6. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/__init__.py +0 -0
  7. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/__main__.py +0 -0
  8. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/ask_handler.py +0 -0
  9. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/claude_api_handler.py +0 -0
  10. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/cleanup_manager.py +0 -0
  11. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/commands/__init__.py +0 -0
  12. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/commands/makelocal.py +0 -0
  13. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
  14. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/__init__.py +0 -0
  15. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/connection_health.py +0 -0
  16. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/database.py +0 -0
  17. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/database_factory.py +0 -0
  18. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/exceptions.py +0 -0
  19. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/models.py +0 -0
  20. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/path_resolver.py +0 -0
  21. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/database/retry_executor.py +0 -0
  22. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/deepask_handler.py +0 -0
  23. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/error_handler.py +0 -0
  24. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/file_scanner.py +0 -0
  25. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/git_hook_handler.py +0 -0
  26. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/logging_config.py +0 -0
  27. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/middleware/__init__.py +0 -0
  28. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/middleware/auth.py +0 -0
  29. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
  30. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/middleware/logging.py +0 -0
  31. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/middleware/security.py +0 -0
  32. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/migrations/001_initial.sql +0 -0
  33. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/migrations/002_performance_indexes.sql +0 -0
  34. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/migrations/003_project_overviews.sql +0 -0
  35. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/migrations/004_remove_branch_dependency.sql +0 -0
  36. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/migrations/005_remove_git_remotes.sql +0 -0
  37. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/migrations/006_vector_mode.sql +0 -0
  38. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/query_preprocessor.py +0 -0
  39. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/server/__init__.py +0 -0
  40. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/server/mcp_server.py +0 -0
  41. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  42. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/token_counter.py +0 -0
  43. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/tools/__init__.py +0 -0
  44. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/transport/__init__.py +0 -0
  45. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/transport/base.py +0 -0
  46. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/transport/http_transport.py +0 -0
  47. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/transport/stdio_transport.py +0 -0
  48. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/__init__.py +0 -0
  49. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/chunking/__init__.py +0 -0
  50. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/chunking/ast_chunker.py +0 -0
  51. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/chunking/chunk_optimizer.py +0 -0
  52. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/chunking/language_handlers.py +0 -0
  53. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/config.py +0 -0
  54. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/daemon.py +0 -0
  55. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/monitoring/__init__.py +0 -0
  56. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/monitoring/change_detector.py +0 -0
  57. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/monitoring/file_watcher.py +0 -0
  58. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/monitoring/merkle_tree.py +0 -0
  59. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/providers/__init__.py +0 -0
  60. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/providers/turbopuffer_client.py +0 -0
  61. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/providers/voyage_client.py +0 -0
  62. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/security/__init__.py +0 -0
  63. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/src/mcp_code_indexer/vector_mode/security/patterns.py +0 -0
  64. {mcp_code_indexer-4.2.13 → mcp_code_indexer-4.2.15}/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.13
3
+ Version: 4.2.15
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?60)](https://badge.fury.io/py/mcp-code-indexer)
52
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?60)](https://pypi.org/project/mcp-code-indexer/)
51
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?62)](https://badge.fury.io/py/mcp-code-indexer)
52
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?62)](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?60)](https://badge.fury.io/py/mcp-code-indexer)
4
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?60)](https://pypi.org/project/mcp-code-indexer/)
3
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?62)](https://badge.fury.io/py/mcp-code-indexer)
4
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?62)](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.13"
7
+ version = "4.2.15"
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,7 +1095,46 @@ async def main() -> None:
1095
1095
  if transport:
1096
1096
  transport.server = server
1097
1097
 
1098
- await server.run()
1098
+ # If vector mode is enabled, we need to handle signals properly
1099
+ # because server.run() may not respond to KeyboardInterrupt
1100
+ if args.vector and vector_daemon_task:
1101
+ # Setup signal handling for graceful shutdown
1102
+ shutdown_event = asyncio.Event()
1103
+
1104
+ def signal_handler():
1105
+ logger.info("Shutdown signal received")
1106
+ shutdown_event.set()
1107
+
1108
+ # Register signal handlers
1109
+ loop = asyncio.get_running_loop()
1110
+ for sig in [signal.SIGTERM, signal.SIGINT]:
1111
+ loop.add_signal_handler(sig, signal_handler)
1112
+
1113
+ # Run server and wait for shutdown signal
1114
+ server_task = asyncio.create_task(server.run())
1115
+ shutdown_task = asyncio.create_task(shutdown_event.wait())
1116
+
1117
+ try:
1118
+ # Wait for either server completion or shutdown signal
1119
+ done, pending = await asyncio.wait(
1120
+ [server_task, shutdown_task],
1121
+ return_when=asyncio.FIRST_COMPLETED
1122
+ )
1123
+
1124
+ # Cancel remaining tasks
1125
+ for task in pending:
1126
+ task.cancel()
1127
+ try:
1128
+ await task
1129
+ except asyncio.CancelledError:
1130
+ pass
1131
+
1132
+ except Exception as e:
1133
+ logger.error(f"Error during server execution: {e}")
1134
+ raise
1135
+ else:
1136
+ # Normal mode - let server handle KeyboardInterrupt naturally
1137
+ await server.run()
1099
1138
 
1100
1139
  except Exception as e:
1101
1140
  error_handler.log_error(e, context={"phase": "startup"})
@@ -1129,6 +1168,19 @@ async def main() -> None:
1129
1168
  )
1130
1169
  except asyncio.TimeoutError:
1131
1170
  logger.warning("Some tasks did not cancel within timeout")
1171
+
1172
+ # Force close any remaining connections and cleanup resources
1173
+ try:
1174
+ # Give a moment for final cleanup
1175
+ await asyncio.sleep(0.1)
1176
+
1177
+ # Shutdown the event loop executor to stop any background threads
1178
+ loop = asyncio.get_running_loop()
1179
+ if hasattr(loop, '_default_executor') and loop._default_executor:
1180
+ loop._default_executor.shutdown(wait=False)
1181
+
1182
+ except Exception as e:
1183
+ logger.warning(f"Error during final cleanup: {e}")
1132
1184
 
1133
1185
 
1134
1186
  def cli_main() -> None:
@@ -1146,6 +1198,19 @@ def cli_main() -> None:
1146
1198
  print(f"Server failed to start: {e}", file=sys.stderr)
1147
1199
  print(f"Traceback: {traceback.format_exc()}", file=sys.stderr)
1148
1200
  sys.exit(1)
1201
+ finally:
1202
+ # Force cleanup of any remaining resources to prevent hanging
1203
+ import threading
1204
+ import time
1205
+
1206
+ # Give main threads a moment to finish
1207
+ time.sleep(0.1)
1208
+
1209
+ # Force exit if daemon threads are preventing shutdown
1210
+ active_threads = threading.active_count()
1211
+ if active_threads > 1: # More than just the main thread
1212
+ import os
1213
+ os._exit(0)
1149
1214
 
1150
1215
 
1151
1216
  if __name__ == "__main__":