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.
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/PKG-INFO +9 -3
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/README.md +8 -2
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/pyproject.toml +1 -1
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/connection_health.py +2 -7
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/main.py +17 -40
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/server/mcp_server.py +9 -10
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/LICENSE +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/__init__.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/__main__.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/ask_handler.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/claude_api_handler.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/cleanup_manager.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/__init__.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/database.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/exceptions.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/models.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/retry_executor.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/deepask_handler.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/error_handler.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/file_scanner.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/git_hook_handler.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/logging_config.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/middleware/__init__.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/001_initial.sql +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/002_performance_indexes.sql +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/003_project_overviews.sql +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/004_remove_branch_dependency.sql +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/005_remove_git_remotes.sql +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/query_preprocessor.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/server/__init__.py +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/token_counter.py +0 -0
- {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.
|
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
|
-
[](https://badge.fury.io/py/mcp-code-indexer)
|
44
|
+
[](https://pypi.org/project/mcp-code-indexer/)
|
45
45
|
[](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
|
-
[](https://badge.fury.io/py/mcp-code-indexer)
|
4
|
+
[](https://pypi.org/project/mcp-code-indexer/)
|
5
5
|
[](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.
|
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"]
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/connection_health.py
RENAMED
@@ -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
|
-
#
|
340
|
-
|
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
|
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=
|
78
|
+
metavar="PROJECT_ID",
|
79
79
|
help=(
|
80
80
|
"Export descriptions for a project. Usage: "
|
81
|
-
"--dumpdescriptions PROJECT_ID
|
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
|
93
|
-
"
|
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
|
141
|
+
# Get file description count
|
142
142
|
try:
|
143
|
-
|
144
|
-
|
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"
|
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
|
-
|
465
|
-
|
466
|
-
|
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,
|
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,
|
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
|
-
"
|
1341
|
-
"
|
1342
|
-
"
|
1343
|
-
|
1344
|
-
"
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
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,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/claude_api_handler.py
RENAMED
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/data/stop_words_english.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/exceptions.py
RENAMED
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/database/retry_executor.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/middleware/__init__.py
RENAMED
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/migrations/001_initial.sql
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_code_indexer-3.4.1 → mcp_code_indexer-3.4.3}/src/mcp_code_indexer/query_preprocessor.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|