mcp-code-indexer 3.4.1__tar.gz → 3.4.3__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 (35) hide show
  1. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/PKG-INFO +9 -3
  2. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/README.md +8 -2
  3. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/pyproject.toml +1 -1
  4. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/connection_health.py +2 -7
  5. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/main.py +17 -40
  6. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/server/mcp_server.py +9 -10
  7. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/LICENSE +0 -0
  8. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/__init__.py +0 -0
  9. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/__main__.py +0 -0
  10. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/ask_handler.py +0 -0
  11. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/claude_api_handler.py +0 -0
  12. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/cleanup_manager.py +0 -0
  13. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
  14. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/__init__.py +0 -0
  15. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/database.py +0 -0
  16. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/exceptions.py +0 -0
  17. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/models.py +0 -0
  18. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/retry_executor.py +0 -0
  19. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/deepask_handler.py +0 -0
  20. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/error_handler.py +0 -0
  21. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/file_scanner.py +0 -0
  22. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/git_hook_handler.py +0 -0
  23. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/logging_config.py +0 -0
  24. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/middleware/__init__.py +0 -0
  25. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
  26. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/001_initial.sql +0 -0
  27. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/002_performance_indexes.sql +0 -0
  28. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/003_project_overviews.sql +0 -0
  29. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/004_remove_branch_dependency.sql +0 -0
  30. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/005_remove_git_remotes.sql +0 -0
  31. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/query_preprocessor.py +0 -0
  32. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/server/__init__.py +0 -0
  33. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  34. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/token_counter.py +0 -0
  35. {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/tools/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mcp-code-indexer
3
- Version: 3.4.1
3
+ Version: 3.4.3
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
@@ -40,8 +40,8 @@ Description-Content-Type: text/markdown
40
40
 
41
41
  # MCP Code Indexer 🚀
42
42
 
43
- [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?32)](https://badge.fury.io/py/mcp-code-indexer)
44
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?32)](https://pypi.org/project/mcp-code-indexer/)
43
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?34)](https://badge.fury.io/py/mcp-code-indexer)
44
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?34)](https://pypi.org/project/mcp-code-indexer/)
45
45
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
46
46
 
47
47
  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.
@@ -245,8 +245,14 @@ mcp-code-indexer --githook
245
245
  # Analyze a specific commit
246
246
  mcp-code-indexer --githook abc123def
247
247
 
248
+ # Analyze using HEAD syntax
249
+ mcp-code-indexer --githook HEAD
250
+ mcp-code-indexer --githook HEAD~1
251
+ mcp-code-indexer --githook HEAD~3
252
+
248
253
  # Analyze a commit range (perfect for rebases)
249
254
  mcp-code-indexer --githook abc123 def456
255
+ mcp-code-indexer --githook HEAD~5 HEAD
250
256
  ```
251
257
 
252
258
  **🎯 Perfect for**:
@@ -1,7 +1,7 @@
1
1
  # MCP Code Indexer 🚀
2
2
 
3
- [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?32)](https://badge.fury.io/py/mcp-code-indexer)
4
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?32)](https://pypi.org/project/mcp-code-indexer/)
3
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?34)](https://badge.fury.io/py/mcp-code-indexer)
4
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?34)](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.
@@ -205,8 +205,14 @@ mcp-code-indexer --githook
205
205
  # Analyze a specific commit
206
206
  mcp-code-indexer --githook abc123def
207
207
 
208
+ # Analyze using HEAD syntax
209
+ mcp-code-indexer --githook HEAD
210
+ mcp-code-indexer --githook HEAD~1
211
+ mcp-code-indexer --githook HEAD~3
212
+
208
213
  # Analyze a commit range (perfect for rebases)
209
214
  mcp-code-indexer --githook abc123 def456
215
+ mcp-code-indexer --githook HEAD~5 HEAD
210
216
  ```
211
217
 
212
218
  **🎯 Perfect for**:
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "mcp-code-indexer"
7
- version = "3.4.1"
7
+ version = "3.4.3"
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"]
@@ -336,13 +336,8 @@ class ConnectionHealthMonitor:
336
336
  if retry_executor:
337
337
  health_status["retry_statistics"] = retry_executor.get_retry_stats()
338
338
 
339
- # Include database-level statistics if available
340
- if hasattr(self.database_manager, "get_database_stats"):
341
- try:
342
- db_stats = self.database_manager.get_database_stats()
343
- health_status["database_statistics"] = db_stats
344
- except Exception as e:
345
- logger.warning(f"Failed to get database statistics: {e}")
339
+ # Avoid circular dependency - don't include database stats here
340
+ # (they are included separately in the comprehensive diagnostics)
346
341
 
347
342
  return health_status
348
343
 
@@ -63,7 +63,7 @@ def parse_arguments() -> argparse.Namespace:
63
63
  parser.add_argument(
64
64
  "--getprojects",
65
65
  action="store_true",
66
- help="List all projects with IDs, branches, and description counts",
66
+ help="List all projects with IDs and file description counts",
67
67
  )
68
68
 
69
69
  parser.add_argument(
@@ -75,10 +75,10 @@ def parse_arguments() -> argparse.Namespace:
75
75
  parser.add_argument(
76
76
  "--dumpdescriptions",
77
77
  nargs="+",
78
- metavar=("PROJECT_ID", "BRANCH"),
78
+ metavar="PROJECT_ID",
79
79
  help=(
80
80
  "Export descriptions for a project. Usage: "
81
- "--dumpdescriptions PROJECT_ID [BRANCH]"
81
+ "--dumpdescriptions PROJECT_ID"
82
82
  ),
83
83
  )
84
84
 
@@ -89,8 +89,8 @@ def parse_arguments() -> argparse.Namespace:
89
89
  help=(
90
90
  "Git hook mode: auto-update descriptions based on git diff using "
91
91
  "OpenRouter API. Usage: --githook (current changes), --githook HASH "
92
- "(specific commit), --githook HASH1 HASH2 (commit range from "
93
- "HASH1 to HASH2)"
92
+ "(specific commit), --githook HASH1 HASH2 (commit range). "
93
+ "Supports: commit hashes, HEAD, HEAD~1, HEAD~3, branch names, tags."
94
94
  ),
95
95
  )
96
96
 
@@ -138,17 +138,12 @@ async def handle_getprojects(args: argparse.Namespace) -> None:
138
138
  print(f"ID: {project.id}")
139
139
  print(f"Name: {project.name}")
140
140
 
141
- # Get branch information
141
+ # Get file description count
142
142
  try:
143
- branch_counts = await db_manager.get_branch_file_counts(project.id)
144
- if branch_counts:
145
- print("Branches:")
146
- for branch, count in branch_counts.items():
147
- print(f" - {branch}: {count} descriptions")
148
- else:
149
- print("Branches: No descriptions found")
143
+ file_count = await db_manager.get_file_count(project.id)
144
+ print(f"Files: {file_count} descriptions")
150
145
  except Exception as e:
151
- print(f"Branches: Error loading branch info - {e}")
146
+ print(f"Files: Error loading file count - {e}")
152
147
 
153
148
  print("-" * 80)
154
149
 
@@ -288,11 +283,6 @@ async def handle_runcommand(args: argparse.Namespace) -> None:
288
283
  tool_arguments = json_data
289
284
  logger.info("Auto-detected tool: update_file_description")
290
285
  print("Auto-detected tool: update_file_description", file=sys.stderr)
291
- elif "branch" in json_data:
292
- tool_name = "check_codebase_size"
293
- tool_arguments = json_data
294
- logger.info("Auto-detected tool: check_codebase_size")
295
- print("Auto-detected tool: check_codebase_size", file=sys.stderr)
296
286
  else:
297
287
  logger.error(
298
288
  "Could not auto-detect tool from arguments",
@@ -331,6 +321,7 @@ async def handle_runcommand(args: argparse.Namespace) -> None:
331
321
  "update_codebase_overview": server._handle_update_codebase_overview,
332
322
  "get_word_frequency": server._handle_get_word_frequency,
333
323
  "search_codebase_overview": server._handle_search_codebase_overview,
324
+ "check_database_health": server._handle_check_database_health,
334
325
  }
335
326
 
336
327
  if tool_name not in tool_handlers:
@@ -343,6 +334,7 @@ async def handle_runcommand(args: argparse.Namespace) -> None:
343
334
  }
344
335
  },
345
336
  )
337
+
346
338
  error_result = {
347
339
  "error": {"code": -32601, "message": f"Unknown tool: {tool_name}"}
348
340
  }
@@ -449,7 +441,6 @@ async def handle_dumpdescriptions(args: argparse.Namespace) -> None:
449
441
  sys.exit(1)
450
442
 
451
443
  project_id = args.dumpdescriptions[0]
452
- branch = args.dumpdescriptions[1] if len(args.dumpdescriptions) > 1 else None
453
444
 
454
445
  db_manager = None
455
446
  try:
@@ -461,16 +452,10 @@ async def handle_dumpdescriptions(args: argparse.Namespace) -> None:
461
452
  token_counter = TokenCounter(args.token_limit)
462
453
 
463
454
  # Get file descriptions
464
- if branch:
465
- file_descriptions = await db_manager.get_all_file_descriptions(
466
- project_id=project_id, branch=branch
467
- )
468
- print(f"File descriptions for project {project_id}, branch {branch}:")
469
- else:
470
- file_descriptions = await db_manager.get_all_file_descriptions(
471
- project_id=project_id
472
- )
473
- print(f"File descriptions for project {project_id} (all branches):")
455
+ file_descriptions = await db_manager.get_all_file_descriptions(
456
+ project_id=project_id
457
+ )
458
+ print(f"File descriptions for project {project_id}:")
474
459
 
475
460
  print("=" * 80)
476
461
 
@@ -481,8 +466,6 @@ async def handle_dumpdescriptions(args: argparse.Namespace) -> None:
481
466
  total_tokens = 0
482
467
  for desc in file_descriptions:
483
468
  print(f"File: {desc.file_path}")
484
- if branch is None:
485
- print(f"Branch: {desc.branch}")
486
469
  print(f"Description: {desc.description}")
487
470
  print("-" * 40)
488
471
 
@@ -714,7 +697,6 @@ async def handle_map(args: argparse.Namespace) -> None:
714
697
  sys.exit(1)
715
698
 
716
699
  project = project_data["project"]
717
- branch = project_data["branch"]
718
700
  overview = project_data["overview"]
719
701
  files = project_data["files"]
720
702
 
@@ -723,7 +705,6 @@ async def handle_map(args: argparse.Namespace) -> None:
723
705
  extra={
724
706
  "structured_data": {
725
707
  "project_name": project.name,
726
- "branch": branch,
727
708
  "file_count": len(files),
728
709
  "has_overview": overview is not None,
729
710
  }
@@ -732,7 +713,7 @@ async def handle_map(args: argparse.Namespace) -> None:
732
713
 
733
714
  # Generate markdown
734
715
  markdown_content = generate_project_markdown(
735
- project, branch, overview, files, logger
716
+ project, overview, files, logger
736
717
  )
737
718
 
738
719
  # Output the markdown
@@ -766,7 +747,7 @@ async def handle_map(args: argparse.Namespace) -> None:
766
747
  logger.removeHandler(handler)
767
748
 
768
749
 
769
- def generate_project_markdown(project, branch, overview, files, logger):
750
+ def generate_project_markdown(project, overview, files, logger):
770
751
  """Generate the markdown content for the project map."""
771
752
  import re
772
753
  from collections import defaultdict
@@ -779,10 +760,6 @@ def generate_project_markdown(project, branch, overview, files, logger):
779
760
  markdown_lines.append(f"# {project_name}")
780
761
  markdown_lines.append("")
781
762
 
782
- # Project metadata
783
- markdown_lines.append(f"**Branch:** {branch}")
784
- markdown_lines.append("")
785
-
786
763
  # Project overview (with header demotion if needed)
787
764
  if overview and overview.overview:
788
765
  markdown_lines.append("## Project Overview")
@@ -1337,16 +1337,15 @@ class MCPCodeIndexServer:
1337
1337
  database_stats = self.db_manager.get_database_stats()
1338
1338
 
1339
1339
  return {
1340
- "comprehensive_diagnostics": comprehensive_diagnostics,
1341
- "database_statistics": database_stats,
1342
- "configuration": {
1343
- **self.db_config,
1344
- "retry_executor_config": (
1345
- self.db_manager._retry_executor.config.__dict__
1346
- if hasattr(self.db_manager, "_retry_executor")
1347
- and self.db_manager._retry_executor
1348
- else {}
1349
- ),
1340
+ "is_healthy": comprehensive_diagnostics.get("current_status", {}).get("is_healthy", True),
1341
+ "status": comprehensive_diagnostics.get("current_status", {}),
1342
+ "performance": {
1343
+ "avg_response_time_ms": comprehensive_diagnostics.get("metrics", {}).get("avg_response_time_ms", 0),
1344
+ "success_rate": comprehensive_diagnostics.get("current_status", {}).get("recent_success_rate_percent", 100)
1345
+ },
1346
+ "database": {
1347
+ "total_operations": database_stats.get("retry_executor", {}).get("total_operations", 0),
1348
+ "pool_size": database_stats.get("connection_pool", {}).get("current_size", 0)
1350
1349
  },
1351
1350
  "server_info": {
1352
1351
  "token_limit": self.token_limit,