mcp-code-indexer 2.2.0__tar.gz → 2.3.0__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-2.2.0/src/mcp_code_indexer.egg-info → mcp_code_indexer-2.3.0}/PKG-INFO +3 -3
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/README.md +2 -2
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/api-reference.md +50 -3
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/pyproject.toml +1 -1
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/database.py +12 -2
- mcp_code_indexer-2.3.0/src/mcp_code_indexer/query_preprocessor.py +181 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/server/mcp_server.py +1 -1
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0/src/mcp_code_indexer.egg-info}/PKG-INFO +3 -3
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/SOURCES.txt +1 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/LICENSE +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/MANIFEST.in +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/architecture.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/configuration.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/contributing.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/database-resilience.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/git-hook-setup.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/monitoring.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/docs/performance-tuning.md +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/migrations/001_initial.sql +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/migrations/002_performance_indexes.sql +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/migrations/003_project_overviews.sql +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/requirements.txt +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/setup.cfg +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/setup.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/__init__.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/__main__.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/ask_handler.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/claude_api_handler.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/data/stop_words_english.txt +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/__init__.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/connection_health.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/exceptions.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/models.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/retry_executor.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/deepask_handler.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/error_handler.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/file_scanner.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/git_hook_handler.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/logging_config.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/main.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/merge_handler.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/middleware/__init__.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/middleware/error_middleware.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/server/__init__.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/token_counter.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/tools/__init__.py +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/dependency_links.txt +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/entry_points.txt +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/requires.txt +0 -0
- {mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-code-indexer
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.3.0
|
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
|
Author: MCP Code Indexer Contributors
|
6
6
|
Maintainer: MCP Code Indexer Contributors
|
@@ -59,8 +59,8 @@ Dynamic: requires-python
|
|
59
59
|
|
60
60
|
# MCP Code Indexer 🚀
|
61
61
|
|
62
|
-
[](https://badge.fury.io/py/mcp-code-indexer)
|
63
|
+
[](https://pypi.org/project/mcp-code-indexer/)
|
64
64
|
[](https://opensource.org/licenses/MIT)
|
65
65
|
|
66
66
|
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
|
-
[](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.
|
@@ -327,7 +327,14 @@ const result = await mcp.callTool("update_missing_descriptions", {
|
|
327
327
|
|
328
328
|
### search_descriptions
|
329
329
|
|
330
|
-
Searches through all file descriptions in a project to find files related to specific functionality
|
330
|
+
Searches through all file descriptions in a project to find files related to specific functionality using intelligent query preprocessing. Features include:
|
331
|
+
|
332
|
+
- **Multi-word search**: `"grpc proto"` finds files containing both terms regardless of order
|
333
|
+
- **Operator escaping**: FTS5 operators (`AND`, `OR`, `NOT`, `NEAR`) are treated as literal search terms
|
334
|
+
- **Whole word matching**: Prevents partial matches for more precise results
|
335
|
+
- **Case insensitive**: Works regardless of case in query or descriptions
|
336
|
+
|
337
|
+
Use this for large codebases instead of loading the entire structure. Returns files ranked by relevance using BM25 scoring.
|
331
338
|
|
332
339
|
#### Parameters
|
333
340
|
|
@@ -394,10 +401,50 @@ const result = await mcp.callTool("search_descriptions", {
|
|
394
401
|
}
|
395
402
|
```
|
396
403
|
|
404
|
+
#### Enhanced Search Examples
|
405
|
+
|
406
|
+
**Multi-word search (order-agnostic):**
|
407
|
+
```javascript
|
408
|
+
// Both queries find the same results
|
409
|
+
await mcp.callTool("search_descriptions", {
|
410
|
+
projectName: "api-service",
|
411
|
+
folderPath: "/projects/api-service",
|
412
|
+
branch: "main",
|
413
|
+
query: "grpc proto" // Finds files with both "grpc" AND "proto"
|
414
|
+
});
|
415
|
+
|
416
|
+
await mcp.callTool("search_descriptions", {
|
417
|
+
projectName: "api-service",
|
418
|
+
folderPath: "/projects/api-service",
|
419
|
+
branch: "main",
|
420
|
+
query: "proto grpc" // Same results as above
|
421
|
+
});
|
422
|
+
```
|
423
|
+
|
424
|
+
**FTS5 operator escaping:**
|
425
|
+
```javascript
|
426
|
+
// Search for files containing literal "AND" as a term
|
427
|
+
await mcp.callTool("search_descriptions", {
|
428
|
+
projectName: "error-handling",
|
429
|
+
folderPath: "/projects/error-handling",
|
430
|
+
branch: "main",
|
431
|
+
query: "logging AND error" // Finds files with all three: "logging", "AND", "error"
|
432
|
+
});
|
433
|
+
```
|
434
|
+
|
435
|
+
**Case insensitive matching:**
|
436
|
+
```javascript
|
437
|
+
// All variations return same results
|
438
|
+
const queries = ["HTTP client", "http CLIENT", "Http Client"];
|
439
|
+
// Each finds files containing both "http" and "client" regardless of case
|
440
|
+
```
|
441
|
+
|
397
442
|
🔍 **Search Tips**:
|
443
|
+
- **Use multiple words**: "grpc proto" finds files with both terms
|
444
|
+
- **Try different orders**: "api client" vs "client api" yield same results
|
398
445
|
- **Be descriptive**: "authentication logic" vs "auth"
|
399
|
-
- **
|
400
|
-
- **
|
446
|
+
- **Don't worry about operators**: "AND", "OR" are treated as literal search terms
|
447
|
+
- **Case doesn't matter**: "HTTP", "http", "Http" all work the same
|
401
448
|
- **Use technical terms**: "middleware", "controller", "utils"
|
402
449
|
- **Search by purpose**: "error handling", "data validation"
|
403
450
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "mcp-code-indexer"
|
7
|
-
version = "2.
|
7
|
+
version = "2.3.0"
|
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
|
readme = "README.md"
|
10
10
|
license = {text = "MIT"}
|
@@ -30,6 +30,7 @@ from mcp_code_indexer.database.exceptions import (
|
|
30
30
|
from mcp_code_indexer.database.connection_health import (
|
31
31
|
ConnectionHealthMonitor, DatabaseMetricsCollector
|
32
32
|
)
|
33
|
+
from mcp_code_indexer.query_preprocessor import preprocess_search_query
|
33
34
|
|
34
35
|
logger = logging.getLogger(__name__)
|
35
36
|
|
@@ -848,7 +849,16 @@ class DatabaseManager:
|
|
848
849
|
query: str,
|
849
850
|
max_results: int = 20
|
850
851
|
) -> List[SearchResult]:
|
851
|
-
"""Search file descriptions using FTS5."""
|
852
|
+
"""Search file descriptions using FTS5 with intelligent query preprocessing."""
|
853
|
+
# Preprocess query for optimal FTS5 search
|
854
|
+
preprocessed_query = preprocess_search_query(query)
|
855
|
+
|
856
|
+
if not preprocessed_query:
|
857
|
+
logger.debug(f"Empty query after preprocessing: '{query}'")
|
858
|
+
return []
|
859
|
+
|
860
|
+
logger.debug(f"Search query preprocessing: '{query}' -> '{preprocessed_query}'")
|
861
|
+
|
852
862
|
async with self.get_connection() as db:
|
853
863
|
cursor = await db.execute(
|
854
864
|
"""
|
@@ -866,7 +876,7 @@ class DatabaseManager:
|
|
866
876
|
ORDER BY bm25(file_descriptions_fts)
|
867
877
|
LIMIT ?
|
868
878
|
""",
|
869
|
-
(
|
879
|
+
(preprocessed_query, project_id, branch, max_results)
|
870
880
|
)
|
871
881
|
rows = await cursor.fetchall()
|
872
882
|
|
@@ -0,0 +1,181 @@
|
|
1
|
+
"""
|
2
|
+
Query preprocessing module for intelligent FTS5 search.
|
3
|
+
|
4
|
+
This module provides intelligent query preprocessing for SQLite FTS5 full-text search
|
5
|
+
to enable multi-word search with case insensitive matching, whole word enforcement,
|
6
|
+
and proper handling of FTS5 operators as literal search terms.
|
7
|
+
|
8
|
+
Key features:
|
9
|
+
- Multi-word queries: "grpc proto" becomes "grpc" AND "proto" for order-agnostic matching
|
10
|
+
- FTS5 operator escaping: "AND OR" becomes '"AND" AND "OR"' to treat operators as literals
|
11
|
+
- Whole word matching: prevents partial matches by relying on proper tokenization
|
12
|
+
- Case insensitive: leverages FTS5 default behavior
|
13
|
+
- Special character handling: preserves special characters in quoted terms
|
14
|
+
"""
|
15
|
+
|
16
|
+
import re
|
17
|
+
import logging
|
18
|
+
from typing import List, Set
|
19
|
+
|
20
|
+
logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
|
23
|
+
class QueryPreprocessor:
|
24
|
+
"""
|
25
|
+
Preprocesses user queries for optimal FTS5 search performance.
|
26
|
+
|
27
|
+
Handles multi-word queries, operator escaping, and special character preservation
|
28
|
+
while maintaining BM25 ranking performance.
|
29
|
+
"""
|
30
|
+
|
31
|
+
# FTS5 operators that need to be escaped when used as literal search terms
|
32
|
+
FTS5_OPERATORS: Set[str] = {
|
33
|
+
'AND', 'OR', 'NOT', 'NEAR'
|
34
|
+
}
|
35
|
+
|
36
|
+
def __init__(self):
|
37
|
+
"""Initialize the query preprocessor."""
|
38
|
+
pass
|
39
|
+
|
40
|
+
def preprocess_query(self, query: str) -> str:
|
41
|
+
"""
|
42
|
+
Preprocess a user query for FTS5 search.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
query: Raw user query string
|
46
|
+
|
47
|
+
Returns:
|
48
|
+
Preprocessed query string optimized for FTS5
|
49
|
+
|
50
|
+
Examples:
|
51
|
+
>>> preprocessor = QueryPreprocessor()
|
52
|
+
>>> preprocessor.preprocess_query("grpc proto")
|
53
|
+
'"grpc" AND "proto"'
|
54
|
+
>>> preprocessor.preprocess_query("error AND handling")
|
55
|
+
'"error" AND "AND" AND "handling"'
|
56
|
+
>>> preprocessor.preprocess_query('config "file system"')
|
57
|
+
'"config" AND "file system"'
|
58
|
+
"""
|
59
|
+
if not query or not query.strip():
|
60
|
+
return ""
|
61
|
+
|
62
|
+
# Normalize whitespace
|
63
|
+
query = query.strip()
|
64
|
+
|
65
|
+
# Split into terms while preserving quoted phrases
|
66
|
+
terms = self._split_terms(query)
|
67
|
+
|
68
|
+
if not terms:
|
69
|
+
return ""
|
70
|
+
|
71
|
+
# Process each term: escape operators and add quotes
|
72
|
+
processed_terms = []
|
73
|
+
for term in terms:
|
74
|
+
processed_term = self._process_term(term)
|
75
|
+
if processed_term: # Skip empty terms
|
76
|
+
processed_terms.append(processed_term)
|
77
|
+
|
78
|
+
if not processed_terms:
|
79
|
+
return ""
|
80
|
+
|
81
|
+
# Join with AND for multi-word matching
|
82
|
+
result = " AND ".join(processed_terms)
|
83
|
+
|
84
|
+
logger.debug(f"Preprocessed query: '{query}' -> '{result}'")
|
85
|
+
return result
|
86
|
+
|
87
|
+
def _split_terms(self, query: str) -> List[str]:
|
88
|
+
"""
|
89
|
+
Split query into terms while preserving quoted phrases.
|
90
|
+
|
91
|
+
Args:
|
92
|
+
query: Input query string
|
93
|
+
|
94
|
+
Returns:
|
95
|
+
List of terms and quoted phrases
|
96
|
+
|
97
|
+
Examples:
|
98
|
+
'grpc proto' -> ['grpc', 'proto']
|
99
|
+
'config "file system"' -> ['config', '"file system"']
|
100
|
+
'error AND handling' -> ['error', 'AND', 'handling']
|
101
|
+
"""
|
102
|
+
terms = []
|
103
|
+
|
104
|
+
# Regex to match quoted phrases or individual words
|
105
|
+
# This pattern captures:
|
106
|
+
# 1. Double-quoted strings (including the quotes)
|
107
|
+
# 2. Single words (sequences of non-whitespace characters)
|
108
|
+
pattern = r'"[^"]*"|\S+'
|
109
|
+
|
110
|
+
matches = re.findall(pattern, query)
|
111
|
+
|
112
|
+
for match in matches:
|
113
|
+
# Skip empty matches
|
114
|
+
if match.strip():
|
115
|
+
terms.append(match)
|
116
|
+
|
117
|
+
return terms
|
118
|
+
|
119
|
+
def _process_term(self, term: str) -> str:
|
120
|
+
"""
|
121
|
+
Process a single term: escape operators and ensure proper quoting.
|
122
|
+
|
123
|
+
Args:
|
124
|
+
term: Single term or quoted phrase
|
125
|
+
|
126
|
+
Returns:
|
127
|
+
Processed term ready for FTS5
|
128
|
+
|
129
|
+
Examples:
|
130
|
+
'grpc' -> '"grpc"'
|
131
|
+
'AND' -> '"AND"'
|
132
|
+
'"file system"' -> '"file system"'
|
133
|
+
'c++' -> '"c++"'
|
134
|
+
"""
|
135
|
+
if not term:
|
136
|
+
return ""
|
137
|
+
|
138
|
+
# If already quoted, return as-is (user intentional phrase)
|
139
|
+
if term.startswith('"') and term.endswith('"') and len(term) >= 2:
|
140
|
+
return term
|
141
|
+
|
142
|
+
# Check if term is an FTS5 operator (case-insensitive)
|
143
|
+
if term.upper() in self.FTS5_OPERATORS:
|
144
|
+
# Escape operator by quoting
|
145
|
+
escaped_term = f'"{term}"'
|
146
|
+
logger.debug(f"Escaped FTS5 operator: '{term}' -> '{escaped_term}'")
|
147
|
+
return escaped_term
|
148
|
+
|
149
|
+
# Quote all terms to ensure whole-word matching and handle special characters
|
150
|
+
return f'"{term}"'
|
151
|
+
|
152
|
+
def _escape_quotes_in_term(self, term: str) -> str:
|
153
|
+
"""
|
154
|
+
Escape internal quotes in a term for FTS5 compatibility.
|
155
|
+
|
156
|
+
Args:
|
157
|
+
term: Term that may contain quotes
|
158
|
+
|
159
|
+
Returns:
|
160
|
+
Term with escaped quotes
|
161
|
+
|
162
|
+
Examples:
|
163
|
+
'say "hello"' -> 'say ""hello""'
|
164
|
+
"test's file" -> "test's file"
|
165
|
+
"""
|
166
|
+
# In FTS5, quotes inside quoted strings are escaped by doubling them
|
167
|
+
return term.replace('"', '""')
|
168
|
+
|
169
|
+
|
170
|
+
def preprocess_search_query(query: str) -> str:
|
171
|
+
"""
|
172
|
+
Convenience function for preprocessing search queries.
|
173
|
+
|
174
|
+
Args:
|
175
|
+
query: Raw user query
|
176
|
+
|
177
|
+
Returns:
|
178
|
+
Preprocessed query ready for FTS5
|
179
|
+
"""
|
180
|
+
preprocessor = QueryPreprocessor()
|
181
|
+
return preprocessor.preprocess_query(query)
|
@@ -324,7 +324,7 @@ class MCPCodeIndexServer:
|
|
324
324
|
),
|
325
325
|
types.Tool(
|
326
326
|
name="search_descriptions",
|
327
|
-
description="Searches through all file descriptions in a project to find files related to specific functionality. Use this for large codebases instead of loading the entire structure. Always start with the fewest terms possible; if the tool returns a lot of results (more than 20) or the results are not relevant, then narrow it down by increasing the number of search
|
327
|
+
description="Searches through all file descriptions in a project to find files related to specific functionality. Use this for large codebases instead of loading the entire structure. Always start with the fewest terms possible (1 to 3 words AT MOST); if the tool returns a lot of results (more than 20) or the results are not relevant, then narrow it down by increasing the number of search words one at a time and calling the tool again. Start VERY broad, then narrow the focus only if needed!",
|
328
328
|
inputSchema={
|
329
329
|
"type": "object",
|
330
330
|
"properties": {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-code-indexer
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.3.0
|
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
|
Author: MCP Code Indexer Contributors
|
6
6
|
Maintainer: MCP Code Indexer Contributors
|
@@ -59,8 +59,8 @@ Dynamic: requires-python
|
|
59
59
|
|
60
60
|
# MCP Code Indexer 🚀
|
61
61
|
|
62
|
-
[](https://badge.fury.io/py/mcp-code-indexer)
|
63
|
+
[](https://pypi.org/project/mcp-code-indexer/)
|
64
64
|
[](https://opensource.org/licenses/MIT)
|
65
65
|
|
66
66
|
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.
|
@@ -26,6 +26,7 @@ src/mcp_code_indexer/git_hook_handler.py
|
|
26
26
|
src/mcp_code_indexer/logging_config.py
|
27
27
|
src/mcp_code_indexer/main.py
|
28
28
|
src/mcp_code_indexer/merge_handler.py
|
29
|
+
src/mcp_code_indexer/query_preprocessor.py
|
29
30
|
src/mcp_code_indexer/token_counter.py
|
30
31
|
src/mcp_code_indexer.egg-info/PKG-INFO
|
31
32
|
src/mcp_code_indexer.egg-info/SOURCES.txt
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/claude_api_handler.py
RENAMED
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/data/stop_words_english.txt
RENAMED
File without changes
|
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/connection_health.py
RENAMED
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/database/exceptions.py
RENAMED
File without changes
|
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/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
|
File without changes
|
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer/middleware/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/dependency_links.txt
RENAMED
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/entry_points.txt
RENAMED
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/requires.txt
RENAMED
File without changes
|
{mcp_code_indexer-2.2.0 → mcp_code_indexer-2.3.0}/src/mcp_code_indexer.egg-info/top_level.txt
RENAMED
File without changes
|