Local MCP server exposing codepreproc's code-context tools to Claude Code
Project description
codepreproc
Servidor MCP local en Python para preprocesar contexto de repos de codigo antes de enviarlo a un agente como Claude Code.
Que hace
codepreproc indexa uno o mas repositorios locales, resuelve el proyecto activo a partir del registro o de los roots enviados por el cliente MCP, y expone tools para:
Gestion de proyectos e indice
list_projects— lista proyectos configurados y estado del indiceswitch_project— fija el proyecto activo para la sesionreindex— corre reindex full o incrementalproject_status— devuelve estado git + indice
Semantic patch pipeline
analyze_request— ejecuta el pipeline completo: intent → retrieval → rerank → graph walk → target locator → planner → synthesizer → merger → materializer → validator →SemanticExecutionPackpreview_semantic_plan— recupera elSemanticEditPlancacheado portask_idpreview_patch— devuelve los patches materializados como unified diffsvalidate_patch— resume el resultado de validacion estructuraldisambiguate_region— reanuda un task ambiguo eligiendo unregion_idconcretoapply_patch— aplica los patches congit applyy restaura CRLF si el archivo original lo usaba
Filesystem reorg pipeline
analyze_filesystem_reorg— genera un plan de moves/renames del arbol del repopreview_filesystem_plan— recupera el plan de filesystem cacheadoapply_filesystem_plan— ejecuta los moves/renames del plan cacheado
Busqueda de contexto y generacion de documentos
search_context— semantic search hibrido (dense + BM25 + reranking): devuelve chunks con file_path, symbol, signature, score y bodygenerate_document— recupera contexto, expande el grafo de dependencias, formatea invariantes y sintetiza un archivo Markdown con LLM; escribe el resultado enoutput_path
Politica LLM y costos
usage_report— resume costo/uso LLM acumulado por proveedorset_llm_policy— override por sesion de la politica de routing LLM del proyecto
Snippet assembly (Fase 4)
list_snippets— lista los snippets disponibles en la biblioteca, filtrables por framework, language o layerassemble_from_snippets— pipeline de dos fases: (1) modelo ligero resuelve intent → selecciona snippets → instancia variables → define scope; (2) modelo de capacidad alta integra los snippets en los archivos target respetando constraints DDD
Requisitos
- Python 3.12
- Qdrant disponible en
http://127.0.0.1:6333 - Un endpoint LLM compatible con OpenAI disponible en
http://127.0.0.1:8080/v1
Los valores por defecto se toman de registry.yaml y pueden sobreescribirse con variables de entorno.
Creacion e instalacion
Desde la raiz del proyecto:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e .
Tambien queda disponible el entrypoint codepreproc-mcp.
Puesta en marcha
Puedes iniciar el servidor MCP por stdio de cualquiera de estas dos formas:
.\.venv\Scripts\python.exe -m codepreproc
.\.venv\Scripts\codepreproc-mcp.exe
Precarga manual de embeddings
Si quieres descargar un modelo de embeddings antes de arrancar el MCP, puedes usar este script:
powershell -ExecutionPolicy Bypass -File .\scripts\preload_embedding.ps1
Por defecto precarga Qwen/Qwen3-Embedding-0.6B en cuda:0 para dejarlo en cache con la misma GPU que usa el MCP durante reindex.
Si quieres precargar otro modelo:
powershell -ExecutionPolicy Bypass -File .\scripts\preload_embedding.ps1 -Model "sentence-transformers/all-MiniLM-L6-v2"
Si quieres forzar otro device:
powershell -ExecutionPolicy Bypass -File .\scripts\preload_embedding.ps1 -Device "cuda:0"
Configuracion del registro de proyectos
Por defecto el servidor carga el registro desde:
%USERPROFILE%\.codepreproc\registry.yaml
Ejemplo:
defaults:
embedding_model: sentence-transformers/all-MiniLM-L6-v2
reranker_model: BAAI/bge-reranker-v2-m3
llm_endpoint: http://127.0.0.1:8080/v1
llm_model: qwen2.5-coder-7b
qdrant_url: http://127.0.0.1:6333
qdrant_grpc: 127.0.0.1:6334
mcp_action_timeout_seconds: 300
mcp_action_heartbeat_seconds: 15
chunking:
max_chunk_chars: 2000
overlap_lines: 0
max_file_size_kb: 50
projects:
wallmart:
root: D:\repos\challenge_one\wallmart
languages: [typescript, tsx, javascript]
qdrant_collection: wallmart_code
branch_aware: false
project_context: |
Proyecto wallmart.
App web orientada a e-commerce.
ignore:
- node_modules
- dist
- build
- .git
Notas:
- El
project_ides la clave del proyecto, por ejemplowallmart. rootdebe ser una ruta absoluta al repo local.- Las
languagessoportadas actualmente son:python,typescript,tsx,javascript,go,rust,yaml,markdown. mcp_action_timeout_secondsdefine el timeout por falta de avance relevante por tool.mcp_action_heartbeat_secondsdefine cada cuánto se emite heartbeat mientras una tool larga sigue viva.CODEPREPROC_MCP_CONNECTION_VERBOSITYcontrola el logging de ciclo de vida MCP:off,basic,verbose. Por defecto usabasic.- Si tienes mas de un proyecto configurado, conviene pasar
projectexplicito en las llamadas MCP.
Configuracion del MCP en Claude Code
Una vez instalado el paquete, registra este servidor en la configuracion MCP de Claude Code:
{
"mcpServers": {
"codepreproc": {
"command": "C:\\Users\\<usuario>\\.codepreproc\\.venv\\Scripts\\python.exe",
"args": ["-m", "codepreproc"]
}
}
}
Si prefieres usar el ejecutable del entrypoint:
{
"mcpServers": {
"codepreproc": {
"command": "C:\\Users\\<usuario>\\.codepreproc\\.venv\\Scripts\\codepreproc-mcp.exe"
}
}
}
Reemplaza la ruta por la ubicacion real de tu entorno virtual.
Logging de conexion MCP
- El servidor escribe eventos de ciclo de vida MCP en
%USERPROFILE%\.codepreproc\logs\mcp_server.logcon prefijomcp_lifecycle. CODEPREPROC_MCP_CONNECTION_VERBOSITY=basicregistra transiciones principales: apertura, inicializacion, cierre y fallos relevantes.CODEPREPROC_MCP_CONNECTION_VERBOSITY=verboseagrega metadatos extra como capabilities, soporte de roots, tiempos de inicializacion y conteos de requests al cerrar.- En transporte
stdio, una "reconexion" significa una nueva sesion/proceso que vuelve a ejecutarinitialize; no hay reanudacion de socket. - Los eventos posteriores a
initializetambien intentan reflejarse al cliente mediantecodepreproc.mcp.lifecycle, pero ese espejo es best-effort. - Si la conexion falla antes de completar
initializeo el transporte se cae abruptamente, revisamcp_server.log: esa es la fuente de verdad.
Flujo recomendado de uso en Claude Code
- Registra el repo en
%USERPROFILE%\.codepreproc\registry.yaml. - Inicia o deja configurado el servidor MCP en Claude Code.
- Ejecuta
list_projectspara confirmar que Claude Code ve el proyecto. - Ejecuta
reindexcon{"project":"wallmart","full":true}la primera vez. - Ejecuta
project_statuspara validarlast_indexed_shay revisar si hay drift. - Ejecuta
analyze_requestcon un prompt concreto y, si aplica, consultapreview_patchcon eltask_iddevuelto. - Si el cambio es mover o renombrar archivos o directorios, usa
analyze_filesystem_reorg, revisapreview_filesystem_plany luego aplica conapply_filesystem_plan. - Para explorar el repo o generar documentacion, usa
search_contextogenerate_documentdirectamente — no requieren un region objetivo y producen su resultado en una sola llamada. - Para generar codigo DDD nuevo a partir de plantillas (NestJS, Flutter, FastAPI), usa
assemble_from_snippetscon un prompt y el framework objetivo.
Flujo de generate_document
generate_document sigue este pipeline (VERIFICADO en codigo):
prompt + output_path
→ HybridRetriever (dense + BM25)
→ Reranker (cross-encoder, top_k ≤ 30)
→ GraphWalker (expande dependencias a depth configurable)
→ _format_doc_context (agrupa por paquete, extrae invariantes: UPPERCASE_CONSTANTS, thresholds, exports)
→ router.chat(task_type="document_generation", schema=None)
→ write_text(output_path)
→ { success, file_path, bytes_written, chunks_used, llm_usage }
Notas:
output_pathpuede ser absoluto o relativo alrootdel proyecto.- El directorio padre se crea automaticamente si no existe.
- El LLM recibe un system prompt que exige secciones estructuradas: vision general, tabla de componentes, flujo ASCII, secciones por componente, contratos, dependencias y entry/exit points.
- Usar cuando no existe una region de codigo objetivo. Para modificar codigo existente, preferir
analyze_request.
Progreso y timeout
- Las tools ahora emiten progreso por
notifications/progresscuando el cliente envíaprogressToken, y duplican el estado connotifications/message. reindexyanalyze_requestreportan etapas visibles comohealth_check,git_sync,chunk_files,embed_batches,qdrant_upsert,planneryvalidate.- Si una acción pasa mas de
mcp_action_timeout_secondssin cambio relevante, falla conerror=action_timed_outy devuelve la etapa donde se quedó. - Los heartbeats no reinician el timeout; solo sirven para indicar que la acción sigue viva.
Estado del índice
project_statusahora devuelveindex_statecon uno de estos valores:ready,building,invalid.- Cuando un incremental falla después de tocar el índice activo, el estado pasa a
invalidy el siguiente flujo semántico fuerzafull reindexantes de recuperar contexto. last_index_errorincluyecode,stageymessagecuando el índice quedó inválido.
Ejemplos:
{
"project": "wallmart",
"full": true
}
{
"project": "wallmart",
"prompt": "Explicame la arquitectura del proyecto y los puntos de entrada principales"
}
Variables de entorno utiles
CODEPREPROC_HOMECODEPREPROC_REGISTRY_PATHCODEPREPROC_INDEXES_DIRCODEPREPROC_LOGS_DIRCODEPREPROC_LLM_ENDPOINTCODEPREPROC_LLM_MODELCODEPREPROC_MCP_CONNECTION_VERBOSITYCODEPREPROC_DEBUG
Preflight del servidor standalone y Docker
Este flujo verifica la frontera HTTP que ya existe entre codepreproc_client
y codepreproc_server: /health, /v1/mint, /v1/promote y
/v1/lease_world_model. Los modulos temporales que todavia importan codigo
del servidor desde codepreproc_client.layer1_business.api_client quedan fuera
de este preflight hasta que se cambien por llamadas HTTP reales.
Local standalone
- Configura PostgreSQL y exporta
CODEPREPROC_PG_DSN. - Crea el schema:
.\.venv\Scripts\codepreproc.exe db-init
- Inserta una licencia de prueba:
.\.venv\Scripts\codepreproc.exe license-add --license-id preflight-license --api-key preflight-api-key --tier pro --max-seats 5 --max-projects 20 --scope promote --scope lease
- Arranca el servidor:
$env:CODEPREPROC_JWT_SIGNING_KEY = "replace-with-a-long-stable-secret"
$env:CODEPREPROC_SERVER_PORT = "8443"
.\.venv\Scripts\codepreproc-server.exe
- En otra terminal, ejecuta el preflight:
.\.venv\Scripts\python.exe scripts\preflight_server_api.py --base-url http://127.0.0.1:8443
Docker
- Arranca solo PostgreSQL:
docker compose up -d postgres
- Crea schema y licencia desde la imagen del servidor:
docker compose run --rm server codepreproc db-init
docker compose run --rm server codepreproc license-add --license-id preflight-license --api-key preflight-api-key --tier pro --max-seats 5 --max-projects 20 --scope promote --scope lease
- Arranca el API:
docker compose up -d server
- Ejecuta el preflight contra Docker:
.\.venv\Scripts\python.exe scripts\preflight_server_api.py --base-url http://127.0.0.1:8443
Para remoto, copia la imagen/compose/env al host Docker, cambia
CODEPREPROC_JWT_SIGNING_KEY por un secreto real, repite el seed de licencia
en el Postgres remoto y ejecuta el mismo preflight apuntando a la URL remota
antes de cambiar clientes reales.
Observaciones
- El proyecto debe existir en
registry.yaml; la implementacion actual no acepta unpatharbitrario como argumento de tool. - Si el cliente MCP envia
roots, el servidor puede resolver el proyecto automaticamente cuando ese root cae dentro de unrootregistrado. analyze_requestno solo recupera contexto: con la implementacion actual tambien intenta construir un execution pack y generar un patch validable.analyze_requestsolo cubre cambios dentro de archivos existentes. Si el prompt implica mover o renombrar archivos o directorios, o reorganizar el arbol del repo, el servidor devuelvefailure.code=OUT_OF_SCOPEy recomienda usaranalyze_filesystem_reorg.target_locatoropera sobre regiones de codigo dentro de archivos, no sobre el filesystem.analyze_filesystem_reorggenera un plan de moves/renames, lo guarda en memoria de sesion con snapshot del arbol actual y valida consistencia antes de permitirapply_filesystem_plan.- El flujo de filesystem solo mueve o renombra paths. No reescribe imports ni divide contenido entre archivos; si el cambio requiere eso, hay que combinarlo despues con el flujo semantico normal.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file codrspot_processor_mcp-0.1.0.tar.gz.
File metadata
- Download URL: codrspot_processor_mcp-0.1.0.tar.gz
- Upload date:
- Size: 172.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd15a96174929d8989e7b7ddff84e86e65d951bdf247502be7423351f228d369
|
|
| MD5 |
50acf6939f903c3f14a3f48e0d5b8b20
|
|
| BLAKE2b-256 |
67d6c69ac2efd9ce05dbc3c1b660ebdc0fda89b904fd94a9249f8975037b13cc
|
File details
Details for the file codrspot_processor_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: codrspot_processor_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 204.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f8c9961989eefad6b3186e0d778f4ad83ba243bc4fa50eb158ba0dace70f65e
|
|
| MD5 |
98c61a48235452b7de5d472e0b41acc2
|
|
| BLAKE2b-256 |
4d15117993a7cdcfc7080fd5d501e75057dc19e1a8cc7a2404bf3510d4d89a74
|