Repository navigation
Release v1.3.1
Changelog
All notable changes to Code-Index-MCP will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[Unreleased]: # placeholder for post-rc5 work
[1.3.1] — 2026-07-10 (Unpublished)
Fixed
- Enforced the FastAPI JWT boundary independently from the optional local
STDIO handshake and removed ambiguous repository-selector fallback. - Made staged index recovery atomic and fail closed, unified summarization
results, and bounded sandbox worker lifecycle and request handling. - Restored deterministic local quality gates, release-critical typing, and
hermetic test execution across the supported release matrix. - Split release preparation from protected-main publication and pinned every
external GitHub Action to an immutable upstream commit.
Release status
- Package, runtime, active documentation, installers, and local build artifacts
are prepared as1.3.1/v1.3.1. - No tag, GitHub release, container image, attestation, or PyPI package was
published by this hardening phase.
[1.3.0] — 2026-07-06
Added
- Added the public
mcp_server.clientPython API with typed local search,
symbol lookup, reindex, and status operations for programmatic use without
starting MCP STDIO or FastAPI. - Added source metadata filters for ordinary code, friction signals, and
historical GitHub issue context across the direct client, MCP tool handlers,
and FastAPI/search.
Changed
- Advanced the repo-owned package, runtime, release automation, installer, and
active public documentation surface from1.2.0/v1.2.0to1.3.0/
v1.3.0. - Preserved
index-it-mcpas the canonical Python distribution while keeping
code-index-mcplimited to repository, client-local server, and container
naming surfaces.
[1.2.0] — 2026-04-25
Changed (GAREL — stable surface preparation)
- Prepared the stable
1.2.0/v1.2.0repo-owned release surface across
package metadata, runtime metadata, release automation defaults, active
install docs, support docs, and Docker installer helpers. - Preserved
v1.2.0-rc8as historical prerelease soak evidence only while
routing the actual stable dispatch and GA release evidence to downstream
GADISP.
Known limitations
- This phase did not dispatch the stable release; GitHub Latest and Docker
latestremain stable-only outputs that are still verified inGADISP. - Beta, experimental, unsupported, and disabled-by-default support-tier limits
remain governed bydocs/SUPPORT_MATRIX.md; stable surface prep does not
broaden product topology or runtime claims.
[1.2.0-rc8] — 2026-04-25
Changed (GARECUT — post-remediation RC recut freeze)
- Advanced the active remediated RC recut contract to
1.2.0-rc8/
v1.2.0-rc8across package metadata, runtime metadata, release automation
defaults, and installer helpers without widening into GA channel changes. - Froze the rc8 recut evidence and final-decision handoff expectations so a
blocked or successful prerelease proof can route the next work either back
through renewed GAREL or into a GARECUT rerun without silently authorizing
GA.
Known limitations
v1.2.0-rc8remains a prerelease RC/public-alpha or beta channel artifact;- it does not authorize GA wording, GitHub Latest promotion, or stable Docker
latest; GitHub Latest is not the RC policy source. - GARECUT dispatch still requires a clean enough release worktree,
HEAD == origin/main, and unused local plus remotev1.2.0-rc8tags before
gh workflow runmay execute.
[1.2.0-rc7] — 2026-04-24
[1.2.0-rc6] — 2026-04-24
Changed (GARC — follow-up RC soak freeze)
- Advanced the active follow-up RC contract to
1.2.0-rc6/v1.2.0-rc6
across package metadata, runtime metadata, release automation defaults,
installer helpers, README status, and the active Docker/MCP configuration
docs. - Added explicit follow-up RC soak operator guidance and evidence reduction for
GARC so dispatch prerequisites, workflow observation fields, and blocked-stop
handling are frozen before any new release mutation.
Known limitations
v1.2.0-rc6remains a prerelease RC/public-alpha or beta channel artifact;
it does not authorize GA wording, GitHub Latest promotion, or stable Docker
latest; GitHub Latest is not the RC policy source.- GARC dispatch still requires a clean worktree plus fresh upstream
governance/E2E/operations evidence beforegh workflow runmay execute.
[1.2.0-rc5] — 2026-04-23
Fixed (P27-P33 — v3 multi-repo blocker closeout)
- Added fail-closed readiness handling for missing, empty, stale, building,
wrong-branch, and unsupported-worktree indexes. Query tools now return
index_unavailablewithsafe_fallback: "native_search"instead of
dispatching against an unsafe index. - Hardened the v3 repository model around many unrelated repositories on one
machine, one registered worktree per git common directory, and tracked/default
branch indexing only. - Added the P33 production multi-repo matrix for unrelated repo isolation,
same-repo worktree rejection, wrong-branch safety, stale/missing index
fallback, incremental repair, rename/delete/revert, force-push recovery, and
wrong-artifact rejection.
Changed (P34 — public alpha recut)
- Recut the public-alpha release contract to
1.2.0-rc5/v1.2.0-rc5across
package metadata, runtime metadata, release automation, README status,
Docker/MCP setup docs, anddocs/SUPPORT_MATRIX.md. - Aligned outside-developer docs, operator runbooks, and agent handoffs on the
readiness contract: indexed MCP results are authoritative only when readiness
isready; otherwise users should use native search or follow the returned
remediation. - Updated
docs/operations/deployment-runbook.mdto require P27-P33 gates,
make alpha-production-matrix, docs truth tests, release metadata tests, and
clean-checkout wheel/container smoke before public-alpha promotion.
Known limitations
- Same-repo sibling worktrees and non-default branch queries are not independent
indexed-search contexts in v3; they returnindex_unavailablewith
safe_fallback: "native_search"until a future release expands the topology
contract. - Language/runtime support remains scoped by
docs/SUPPORT_MATRIX.md, release
promotion remains gated bydocs/operations/deployment-runbook.md, and the
public-alpha go/no-go evidence remains linked from
docs/validation/private-alpha-decision.md.
[1.2.0-rc4] — 2026-04-22
Added (P26 — private alpha evidence and public alpha decision)
- Added the P26 private-alpha evidence contract:
docs/validation/private-alpha-decision.md,
docs/validation/private-alpha-evidence.schema.json, and the ignored
private-alpha-evidence/raw-output boundary. - Added
scripts/private_alpha_evidence.pyfor local private fixture runs across
python_repo,typescript_js_repo,mixed_docs_code_repo,
multi_repo_workspace, andlarge_ignored_vendor_repobefore public alpha. - Documented public-alpha release truth: supported install paths are
uv sync --locked/STDIO andghcr.io/viperjuice/code-index-mcp; language
support is scoped bydocs/SUPPORT_MATRIX.md; beta warnings and rollback
instructions remain indocs/operations/deployment-runbook.md.
[1.2.0-rc3] — 2026-04-21
Changed (P21 — release contract and dependency unification)
- Unified the P21 release contract across runtime metadata, package metadata,
README status, changelog, and release automation around1.2.0-rc3. - Removed active workflow and Docker dependency references to retired
requirements*.txtinputs in favor of the lockedpyproject.toml/uv.lock
dependency source. - Expanded release metadata and requirements-consolidation tests to guard the
P21 contract surfaces consumed by P22.
Added (P25 — blocking release gates and automation)
- Added explicit public alpha gate jobs for dependency sync, focused format/lint,
unit plus release smoke, integration smoke, Docker build/smoke, docs truth, and
required-gate aggregation. - Added release automation preflight refusal before version mutation, release
branch creation, artifact build, tag creation, GitHub release creation, PyPI
publish, or container publish. - Documented the operator gate checklist and private-alpha authenticated
attestation fallback for missingATTESTATION_GH_TOKENor repository
attestation settings.
[1.2.0-rc2] — 2026-04-20
Fixed (P20 — sandbox/OpenBLAS hotfix, observability bugs)
- (P20 SL-0) Raised
CapabilitySet.mem_mbdefault from 512 to 2048
so sandbox-default-on plugins that transitively import numpy/OpenBLAS
no longer abort onRLIMIT_AS. Closes IF-0-P20-3. - (P20 SL-2b) Prometheus
/metricsendpoint now exposes
mcp_tool_calls_total,mcp_rate_limit_sleeps_total, and
mcp_artifact_errors_by_class_total. Previously a registry split
meant the counters lived on the default REGISTRY while the exporter
served a private one. - (P20 SL-2b)
SecretRedactionResponseMiddlewareis now applied
on subprocess uvicorn boot. Previously it was registered in a startup
hook that ran after FastAPI sealed its middleware stack, so subprocess
gateways never redactedBearer ...tokens in HTTP responses.
Added (P20 — validation harness, runbook, observability smoke)
- (P20 SL-1) New
tests/integration/multi_repo/harness — pytest
fixture spawns ≥2 live uvicorn gateway subprocesses sharing one
registry; tests cover concurrency (200 entries), cross-repo delta
resolution, and dispatcher repo_id isolation. Closes IF-0-P20-1. - (P20 SL-2) New
tests/integration/obs/smoke — docker-compose
Prom+Loki stack proves JSON log parse rate, counter scrape, and
secret redaction over HTTP. Skips cleanly without docker. - (P20 SL-3) New
docs/operations/deployment-runbook.mdwith
measurable bake-pass criteria, bake windows, and rollback procedures
per stage (dev/staging/canary/full-prod). Closes IF-0-P20-2.
[1.2.0-rc1] — 2026-04-20
Added (P18 — Enforcement, Artifact Resilience & Ops)
- Route auth enforcement (IF-0-P18-4):
validate_production_config()body fills weak-JWT, CORS-wildcard, permissive rate-limit, and weak-admin-password checks.render_validation_errors_to_stderr()emits[FATAL]/[WARN]-prefixed listings. Gateway startup exits non-zero on any fatal validation error in production; WARN-continues in dev/test. Auth added to/search/capabilities,/graph/context,/graph/search. (mcp_server/gateway.py,mcp_server/config/validation.py,tests/security/test_route_auth_coverage.py,tests/security/test_startup_config_validation.py) - Artifact pipeline resilience: publisher try/finally rollback via
gh release deleteon downstream failure;artifact_downloaddelta-base-missing fallback to full artifact;_respect_rate_limitparsesRetry-After(int-seconds or HTTP-date, capped 300s) and distinguishes 403 (TerminalArtifactError) from 429 (backoff + retry); attestation preflight checksattestations:writescope. (mcp_server/artifacts/publisher.py,artifact_download.py,providers/github_actions.py,attestation.py) - Retention janitor CLI (IF-0-P18-2):
python -m mcp_server.cli retention prune --repo OWNER/REPO [--dry-run] [--older-than-days N] [--keep-latest-n N]. Protectsindex-latestandisLatest=truereleases. Newmcp_server/artifacts/retention.pypolicy module; newmcp_server/cli/retention_commands.pyclick group. - JSON logging: hand-rolled
JSONFormatterinmcp_server/core/logging.py; emits{"timestamp","level","name","message", ...extras}. Gated onMCP_ENVIRONMENT=productionorMCP_LOG_FORMAT=json. - Secret redaction middleware (IF-0-P18-1):
SecretRedactionResponseMiddlewarerewritesBearer \S+,JWT_SECRET_KEY=\S+,GITHUB_TOKEN=\S+to[REDACTED]in 4xx/5xx response bodies. Streaming bodies pass through unmodified (documented limitation). (mcp_server/security/security_middleware.py) - Prometheus counters:
mcp_rate_limit_sleeps_total(no labels) andmcp_artifact_errors_by_class_total{error_class}. Scrapeable on/metrics. (mcp_server/metrics/prometheus_exporter.py) - Attestation boot probe:
probe_gh_attestation_support()(lru_cache'd) runsgh attestation --help. Boot banner emitsATTESTATION_PREREQWARN if the subcommand is unavailable andMCP_ATTESTATION_MODE=enforce. (mcp_server/artifacts/attestation.py,mcp_server/cli/stdio_runner.py) - stdio_runner module surface (IF-0-P18-3):
initialize_services()andcall_tool(name, arguments)hoisted from_serve()closures to top-level async functions. Seven runtime state variables (dispatcher,plugin_manager,sqlite_store,initialization_error,_file_watcher,_indexing_thread,_fts_rebuild_thread) promoted to module globals. Restores the pre-P2B test surface on the post-P2B file layout. (mcp_server/cli/stdio_runner.py)
Changed (P18)
- Plugin sandbox default (behavioural change):
MCP_PLUGIN_SANDBOX_ENABLED=1is no longer required — sandboxing is now ON by default. SetMCP_PLUGIN_SANDBOX_DISABLE=1to opt out. Seedocs/security/sandbox.mdfor migration notes. (mcp_server/plugins/plugin_factory.py)
Fixed (P18 — P17 straggler burn-down)
- Full-suite failure count closed from 19 (P17 SL-4b close) to 4. The 17
tests/test_mcp_server_cli.pyfailures and 2tests/test_benchmarks.pySLO failures now pass; residual 4 are pre-existing integration tests gated onghCLIattestations:writescope and an unrelated P16 vocabulary signature mismatch. (mcp_server/cli/stdio_runner.py,mcp_server/benchmarks/benchmark_suite.py,mcp_server/plugins/sandboxed_plugin.py)
Added (P17 — Durability & Multi-Instance Safety)
- Registry flock protocol (IF-0-P17-1):
RepositoryRegistry.save()acquires
fcntl.flock(LOCK_EX)on a sibling.lockfile, then performs a read-merge-write
with an atomicrename(). Two concurrent processes callingsave()against the same
file no longer lose each other's writes. (mcp_server/storage/repository_registry.py,
tests/test_registry_concurrency.py) - Singleton reset wired:
reset_process_singletons()(P16 IF-0-P16-4 stub) is now
called at the top ofinitialize_stateless_services(). Repeat-init in the same
Python process yields fresh managers. (mcp_server/cli/bootstrap.py,
tests/test_singleton_reset.py) - Ref-poller edge-case handling (SL-2):
RefPollerdetects detached HEAD,
force-push, and branch-rename; each triggersenqueue_full_rescan(repo_id)to prevent
incremental indexing on a rewritten history. (mcp_server/watcher/ref_poller.py,
tests/test_ref_poller_edges.py) - Sweeper observability (SL-2):
WatcherSweeperexceptions emitWARNINGlog and
incrementmcp_watcher_sweep_errors_totalPrometheus counter.
(mcp_server/watcher/sweeper.py,tests/test_sweeper_observability.py) - MCP_MAX_FILE_SIZE_BYTES enforced (SL-2): Dispatcher walker (
index_directory)
now skips files larger thanMCP_MAX_FILE_SIZE_BYTES(default 10 MiB); oversize
files are logged and skipped without stalling the indexer.
(mcp_server/dispatcher/dispatcher_enhanced.py) - Checkpoint clears on clean exit (SL-2):
IncrementalIndexerclears the
checkpoint file even whenerrorsis non-empty on clean exit; a re-run starts fresh
rather than resuming from a stale error state.
(mcp_server/indexing/incremental_indexer.py) - ENOSPC → read-only store (SL-3):
SQLiteStorecatchesOSError(ENOSPC)on
commit(), transitions to read-only mode, and increments
mcp_storage_readonly_total. The server keeps serving reads without crashing.
(mcp_server/storage/sqlite_store.py,tests/test_disk_full.py) - Schema migration backup (SL-3):
SchemaMigrator.migrate_artifact()writes a
timestamped.backupcopy of the DB before any migration; rollback-on-failure
restores from backup. (mcp_server/storage/schema_migrator.py,
tests/test_schema_migration_backup.py) - UnknownSchemaVersionError in core/errors.py (SL-3):
UnknownSchemaVersionError
promoted fromschema_migrator.pytomcp_server/core/errors.py, extending the P16
IF-0-P16-1 taxonomy by one class. - RerankerFactory.create_default() (SL-4):
RerankerFactory.create_default()
returns a functional reranker; resolves the P14 carry-over.
(mcp_server/plugins/reranker_factory.py) - Ruff F401 clean (SL-4):
ruff F401count acrossmcp_server/dispatcher,
mcp_server/storage,mcp_server/watcheris 0. - Multi-instance runbook (SL-docs):
docs/operations/multi-instance.md— flock
protocol, singleton-reset semantics, DR/recovery procedure. - Vocabulary freeze (IF-0-P17-1): Registry flock + read-merge-write pattern is
frozen as a named interface for cross-phase reference. - Test-debt ledger (SL-docs):
docs/operations/known-test-debt.mdenumerates
residual failures after P17 close (56 total; 9 cross-repo coordinator carry-over +
47 pre-existing in other modules).
Added (P16 — Shared Vocabulary Preamble)
- Frozen error taxonomy (IF-0-P16-1): New error classes
TransientArtifactError,TerminalArtifactError, andSchemaMigrationErrorinmcp_server/core/errors.pyfor structured error handling in artifact operations. Stubs only — no consumer wiring. - Lazy env-var getters (IF-0-P16-2): Five new environment variable getters in
mcp_server/config/env_vars.py—get_max_file_size_bytes(),get_artifact_retention_count(),get_artifact_retention_days(),get_disk_readonly_threshold_mb(), andget_publish_rollback_enabled()— with sensible defaults. Stubs only — no consumer wiring. - ValidationError dataclass + validate_production_config (IF-0-P16-3): New
ValidationErrordataclass and keyword-onlyvalidate_production_config(environment: str = "production")function inmcp_server/config/validation.py. Stubs only — no consumer wiring. - reset_process_singletons (IF-0-P16-4): New utility function in
mcp_server/cli/bootstrap.pyfor test isolation and graceful restarts. Stubs only — no consumer wiring.
Added (P15 — Security Hardening)
- Plugin sandboxing (IF-0-P15-1): Plugins execute in isolated worker processes with JSON-line IPC, 30s timeout, and capability-based restrictions. New
mcp_server/sandbox/package with supervisor and adapter;SandboxedPluginwraps instances withCapabilitySet(filesystem, network, subprocess, env_read). (mcp_server/sandbox/supervisor.py,mcp_server/plugins/sandboxed_plugin.py,tests/security/test_plugin_sandbox.py) - Metrics endpoint auth (IF-0-P15-2):
/metricsrequiresAuthorization: Bearer <token>(app-level) or NetworkPolicy restriction (k8s-only). Wired viarequire_auth("metrics")middleware. (mcp_server/security/security_middleware.py,mcp_server/api/gateway.py) - Artifact attestation (IF-0-P15-3): Published artifacts are signed with
gh attestation signand verified withgh attestation verify(requiresGITHUB_TOKENwithattestations:writescope). Mode controlled byMCP_ATTESTATION_MODE(enforce/warn/skip). (mcp_server/artifacts/attestation.py,mcp_server/artifacts/publisher.py,mcp_server/artifacts/artifact_download.py) - Path traversal guard + token validator (IF-0-P15-4): Search results filtered through
PathTraversalGuard.normalize_and_check(path, allowed_roots)(controlled byMCP_ALLOWED_ROOTSenv). Startup validatesGITHUB_TOKENfor all five required scopes viaTokenValidator.validate_scopes()(soft-fail default; hard-fail withMCP_REQUIRE_TOKEN_SCOPES=1). Rate-limit backoff on cross-repo artifact fetches. (mcp_server/security/path_guard.py,mcp_server/security/token_validator.py)
Added (P14 — Multi-Repo Completeness + Schema Evolution)
- Reranker wiring (IF-0-P14-1):
CrossRepoCoordinator.__init__now accepts an injectedIReranker(mcp_server/indexer/reranker.py); falls back toRerankerFactory.create_default()with graceful degradation toNone. (mcp_server/dispatcher/cross_repo_coordinator.py,tests/test_cross_repo_reranker.py) - Dependency graph (IF-0-P14-2): New
mcp_server/dependency_graph/package withparsers.py,aggregator.py, and ecosystem parsers (Python/npm/Go/Cargo)._get_repository_dependenciesreturns resolved repo IDs. (mcp_server/dispatcher/cross_repo_coordinator.py) - Schema migrator (IF-0-P14-3): New
mcp_server/storage/schema_migrator.pywithSchemaMigrator,UnknownSchemaVersionError, andSchemaMigrationError. Artifact manifests carryschema_version;check_compatibilitygates downloads by version. (mcp_server/artifacts/artifact_download.py) - Auto-delta artifacts (IF-0-P14-4): New
mcp_server/artifacts/delta_policy.pywithDeltaPolicy/DeltaDecision. Publisher switches to delta mode when artifact exceedsMCP_ARTIFACT_FULL_SIZE_LIMIT(default 500 MB)._get_chunk_ids_for_pathacceptslimit/offsetpagination. (mcp_server/artifacts/publisher.py,mcp_server/artifacts/artifact_upload.py) - Watcher sweep + rename atomicity (IF-0-P14-5): New
mcp_server/watcher/sweeper.py::WatcherSweeperruns full-tree scans everyMCP_WATCHER_SWEEP_MINUTES(default 60) to recover dropped inotify/FSEvents events.move_filewrapped intwo_phase_commit; raisesIndexingErroron semantic failure. (mcp_server/dispatcher/dispatcher_enhanced.py,mcp_server/watcher_multi_repo.py)
[1.1.0] - 2026-04-14
Security
- #40 Removed hardcoded
JWT_SECRET_KEYandDEFAULT_ADMIN_PASSWORDdefaults from
gateway.py. Server now raisesRuntimeErrorat startup if either env var is unset,
preventing silent production deployments with known-weak credentials.
docker-compose.ymland.env.exampleupdated to use env var substitution with no
insecure literal fallbacks. (mcp_server/gateway.py,docker-compose.yml,.env.example)
Fixed
- #41
get_index_status()symbols_countfield now returns the actual number of
symbols stored for the file (was always0). AddedSQLiteStore.count_symbols_for_file()
and wired it intoIndexEngine.get_index_status().
(mcp_server/storage/sqlite_store.py,mcp_server/indexer/index_engine.py) - #41 Reference storage in
_store_parse_result()now callsget_symbol()+
store_reference()instead of silently passing; references are persisted in
symbol_referencesand queryable viaget_references().
(mcp_server/indexer/index_engine.py) - #42 Removed broken
curl .../install-mcp.shline from README (script does not
exist). Replaced silent TODO inwatcher_multi_repo._create_and_upload_artifact()with
an explicitlogger.warningdirecting users to the CI workflow for artifact upload.
(README.md,mcp_server/watcher_multi_repo.py) - Windows CI compatibility: forward-slash path normalization in
SQLiteStore.store_file(),
signal.SIGALRMguard inmcp_server_cli.py, double-quoted git commit messages in
tests,>= 0timing assertions for low-resolution Windows clocks.
(mcp_server/storage/sqlite_store.py,scripts/cli/mcp_server_cli.py,
tests/test_utilities.py,tests/test_repository_management.py,
tests/test_multi_repo_search.py,tests/test_dispatcher_advanced.py) - Benchmark scripts updated to current SQLiteStore/plugin API: replaced removed
store.add_symbol()withcreate_repository+store_file+store_symbol, and
replaced obsoleteplugin.extract_symbols()withplugin.indexFile()with
IndexSharddict-style access.
(benchmarks/symbol_lookup_benchmark.py,benchmarks/semantic_search_benchmark.py,
benchmarks/indexing_speed_benchmark.py)
Added
- Backstage catalog registration (
catalog-info.yaml) and standard repo layout
(docs/,mkdocs.yml). (04ea8ff) - Consiliency maintenance worker trigger workflow for scheduled index health checks.
(.github/workflows/,72f15a5)
Added
- Query-intent routing: symbol-pattern queries (
class Foo,def bar, CamelCase,
snake_case) route directly to the symbols table, bypassing BM25. Fixes retrieval for
class/function lookups that previously returned wrong files.
(mcp_server/dispatcher/query_intent.py,dispatcher_enhanced.py) FlashRankRerankerandCrossEncoderReranker(OSS, lazy-loaded); all three rerankers
share a unified sync interface. Configured viaRERANKER_TYPEenv var.
(mcp_server/dispatcher/reranker.py)- Matrix benchmark: 17-query suite covering all mode × embedding × reranker combinations.
(scripts/run_matrix_benchmark.py) - LLM chunk summarization:
ChunkWriter/LazyChunkWriter/ComprehensiveChunkWriter;
per-profile config viasummarization:block incode-index-mcp.profiles.yaml.
(mcp_server/indexing/summarization.py) - Initial project structure with plugin-based architecture
- FastAPI-based MCP server implementation
- Python plugin with Jedi integration for advanced code analysis
- Tree-sitter wrapper for language parsing
- Semantic indexer with Voyage AI integration
- C4 architecture diagrams using Structurizr DSL
- Comprehensive documentation structure
- Plugin base class for language extensions
- File watcher skeleton for real-time updates
- Cloud sync stub implementation
Changed
- Enhanced Python plugin with proper AST analysis
- Improved error handling in gateway endpoints
- Updated project documentation and README
Added
- MCP
InitializeResult.instructionsfield populated: every connecting client receives
search-first guidance at handshake time, over any transport (stdio, SSE, HTTP).
(scripts/cli/mcp_server_cli.py) last_indexedfield added tosearch_coderesults, surfacing the index timestamp so
agents can assess line-number freshness. (scripts/cli/mcp_server_cli.py,
mcp_server/storage/sqlite_store.py)FileWatchernow auto-starts insideinitialize_services()after the dispatcher is
ready, so the index stays current without any manual setup. Stopped automatically in
main()finallyblock on server exit. Only active when usingEnhancedDispatcher
(not BM25-onlySimpleDispatchermode). (scripts/cli/mcp_server_cli.py)- Auto-index on first run: when no index exists,
initialize_services()creates
.mcp-index/code_index.dband indexes the repository in a background thread. The MCP
server is immediately responsive; search results populate as indexing progresses.
SetMCP_AUTO_INDEX=falseto disable for large repos and run thereindextool
manually. (scripts/cli/mcp_server_cli.py) search_coderesponses now include"indexing_in_progress": truewhen the initial
background index is still running, preventing agents from concluding "no results"
prematurely while the index is being built. (scripts/cli/mcp_server_cli.py)FileWatcherstart deferred until after background initial index completes, eliminating
concurrent SQLite write contention between the bulkindex_directory()pass and the
watchdog event handler on first-run repos. (scripts/cli/mcp_server_cli.py).gitignoreentries for.mcp-index/code_index.db-shmand.mcp-index/code_index.db-wal
(SQLite WAL mode sidecar files) added toinstall.shand written automatically during
auto-init so WAL files never appear as untracked. (mcp-index-kit/install.sh,
scripts/cli/mcp_server_cli.py)code-index-mcp.profiles.yamldiscovery now searchesMCP_PROFILES_PATHenv var →
CWD → server package directory in that order. Previously the file was only found at CWD,
so semantic profiles silently vanished whencwdwas set to another repo. Fallback to the
server's own installation means semantic search and summarization work out-of-the-box in
any repo. (mcp_server/config/settings.py)${VAR:default}env-var substitution supported in allbase_urlfields of
code-index-mcp.profiles.yaml. SetVLLM_EMBEDDING_BASE_URLor
VLLM_SUMMARIZATION_BASE_URLto point at any server without editing the YAML.
(mcp_server/config/settings.py,code-index-mcp.profiles.yaml)- File-count guard before auto-index: if the target repo exceeds
MCP_AUTO_INDEX_MAX_FILES
(default 100 000), auto-indexing is skipped and a warning is logged. Prevents indefinite
startup I/O on very large monorepos. (scripts/cli/mcp_server_cli.py) - BM25 FTS auto-heal: on startup, if an existing index has tracked files but an empty
fts_codetable (e.g. after a migration or partial corruption), a background thread
callsrebuild_fts_code()automatically. Previously the empty state persisted until
a manualreindextool call. (scripts/cli/mcp_server_cli.py)
Fixed
scripts/cli/mcp_server_cli.pywas calling undefinedget_settings()on every tool
invocation, crashing the server before any tool could execute. Replaced with
Settings.from_environment(). (scripts/cli/mcp_server_cli.py)LazyChunkWriter.__init__was missing thesummarization_configparameter despite
the base classChunkWriteraccepting it, causing aTypeErroron every server
startup. (mcp_server/indexing/summarization.py)- File watcher
trigger_reindex()now callsremove_file()beforeindex_file(),
preventing stale chunks from persisting when a file edit changes chunk boundaries.
(mcp_server/watcher.py) EnhancedDispatcher.remove_file()now evicts_file_cachebefore SQLite deletion,
preventing a skip-on-reindex race where an unchanged-hash file would be left absent
from the index after a forced removal. (mcp_server/dispatcher/dispatcher_enhanced.py)SQLiteStore.remove_file()now deletessymbol_trigramsbeforesymbols, fixing a
FK constraint failure that silently left file rows in the DB on removal.
(mcp_server/storage/sqlite_store.py)SQLiteStore.remove_file()now clearsfts_codeentries regardless of whether
file_idwas stored as an integer, absolute path, or relative path string.
(mcp_server/storage/sqlite_store.py)SQLiteStore.search_bm25()now includeslast_modifiedin result rows so the
last_indexedfield is non-null in search results. (mcp_server/storage/sqlite_store.py)- Semantic rebuild (
_build_semantic_baseline) now usesIgnorePatternManager, respecting
.gitignoreand.mcp-index-ignore. Previously indexedtest_workspace/(20,803 Django
fixture files), causing 7-hour rebuilds. (mcp_server/cli/index_management.py) - Default ignore patterns expanded:
test_workspace/,test_repos/,vendor/,
third_party/,baml_client/,*_pb2.py,*_pb2_grpc.py.
(mcp_server/core/ignore_patterns.py) code-index-mcp.profiles.yamlbase_urlnow takes precedence overOPENAI_API_BASE
env default (was reversed, routing oss_high embeddings to wrong endpoint).
(mcp_server/config/settings.py)- Corrected
oss_highvLLMbase_urlfrom127.0.0.1:8001toai:8001.
(code-index-mcp.profiles.yaml) - Resolved merge conflicts in treesitter_wrapper.py
- Fixed Python plugin implementation issues
- Tree-sitter byte-offset/char-offset mismatch in Python plugin: symbol names were corrupted in files
containing multi-byte characters (e.g. em-dashes in docstrings) before the first class/function
definition. Fixed by usingnode.text.decode("utf-8")inplugin.pyandplugin_semantic.py. - BM25/FTS path was bypassed when
semantic=Truebut no Qdrant indexer was initialized. Fixed in
dispatcher_enhanced.pyso the FTS path runs whenever the semantic indexer is absent. - Python plugin
_preindex()now excludeshtmlcov,.venv,venv,node_modules,__pycache__,
.git,dist,builddirectories to prevent junk results from polluting in-memory indexes.
Security
- Added input validation for file paths
- Implemented basic security checks in API endpoints
- Added secret detection patterns
[0.1.0] - TBD
Planned Features
- Complete implementation of C, C++, JavaScript, Dart, and HTML/CSS plugins
- SQLite-based local storage with FTS5
- Full file system watcher implementation
- Performance optimizations and caching
- Authentication and authorization system
- Comprehensive test suite
- Production deployment guide
Version History
Pre-release Development
- Project inception and architecture design
- Core infrastructure setup
- Initial plugin system implementation