mcp-dev-core es un servidor MCP local, modular y orientado a productividad de desarrollo. Su foco no es exponer una shell universal, sino un conjunto de capacidades seguras, tipadas y auditables para leer contexto, operar sobre Git, ejecutar validaciones controladas y aplicar cambios sensibles con flujo de proposal y approval.
CI: GitHub Actions ejecuta typecheck, lint, test y build en pushes y pull requests sobre main.
Muchos MCP locales empiezan como un conjunto de comandos rapidos y terminan mezclando lectura, escritura y ejecucion arbitraria sin una politica clara. mcp-dev-core existe para empujar el diseño en la direccion contraria:
- tools especificas en vez de comandos universales
- seguridad declarativa por tool
- execution modes globales
- proposal flow para operaciones sensibles
- stores explicitos de contexto en memoria
- persistencia local opcional para sessions, artifacts y proposals
El proyecto ya incluye una base funcional y varias capacidades utiles para flujos reales de desarrollo, pero sigue en etapa temprana. La persistencia externa, el modelo multiusuario, las aprobaciones remotas y el sandbox fuerte de procesos no forman parte de la version actual.
- Node.js
- TypeScript
@modelcontextprotocol/sdk- Zod
- Vitest
- ESLint
- Servidor MCP por
stdio workspaceRootseguro y bloqueo de path traversal- contrato formal de tools con input/output validados
SecurityGatecentral consafe,normalytrusted- auditoria estructurada por invocacion
- tools de lectura de proyecto y codebase
- tools Git read-only y Git write especificas
- ejecucion controlada de tests y linter sin shell arbitrario
write_file_patchcon flujopreview -> approve -> apply- stores en memoria para proposals, artifacts y sessions
src/
├── context/ # Stores explicitos de artifacts y sessions
├── schemas/ # Config, inputs y outputs Zod
├── security/ # Policies, gate, proposals y auditoria
├── server/ # Composicion, config, logger y arranque
├── services/ # Filesystem, git, procesos y deteccion de proyecto
├── tools/ # Definiciones MCP, pipeline y handlers
├── types/ # Tipos compartidos
└── utils/ # Errores y utilidades pequenas
Variables soportadas:
MCP_SERVER_NAMEMCP_SERVER_VERSIONLOG_LEVELMCP_EXECUTION_MODEMCP_WORKSPACE_ROOTMCP_PERSISTENCE_ENABLEDMCP_STATE_DIRMCP_MAX_READ_FILE_BYTESMCP_MAX_READ_MULTIPLE_FILESMCP_MAX_READ_MULTIPLE_FILES_TOTAL_BYTESMCP_PROCESS_TIMEOUT_MSMCP_PROCESS_MAX_STDOUT_BYTESMCP_PROCESS_MAX_STDERR_BYTESMCP_PROPOSAL_TTL_MSMCP_SEARCH_MAX_RESULTSMCP_SEARCH_MAX_FILE_BYTESMCP_OVERVIEW_MAX_ENTRIESMCP_LIST_DIRECTORY_MAX_ENTRIES
Ejemplo:
cp .env.example .envMCP_EXECUTION_MODE=safe
MCP_WORKSPACE_ROOT=/home/tu-usuario/proyecto
MCP_PERSISTENCE_ENABLED=true
MCP_STATE_DIR=.mcp-dev-core/state
MCP_PROPOSAL_TTL_MS=900000Notas sobre persistencia:
- Si
MCP_PERSISTENCE_ENABLED=false, los stores siguen funcionando solo en memoria. - Si
MCP_PERSISTENCE_ENABLED=true, el servidor carga snapshots JSON al iniciar y guarda cambios al mutar sessions, artifacts y proposals. MCP_STATE_DIRse resuelve localmente y se usa solo para estado simple del proceso; no es una base de datos ni un mecanismo de sync.
safe: lectura y contexto de bajo riesgo. Bloquea escritura, procesos y git write.normal: habilita operaciones moderadas comorun_tests,run_linter,save_artifact,create_sessionycreate_branch.trusted: habilita operaciones sensibles que requieren policy mas estricta y, cuando aplica, proposals aprobadas.
Reglas de diseño actuales:
- no existe
run_command - no existe
write_filelibre - no existe
gitarbitrario - toda operacion sensible se modela como capacidad especifica
Protecciones actuales:
workspaceRootrestringido- bloqueo de traversal y escapes fuera del workspace
SecurityGatecentral antes de cada handler- metadata de seguridad por tool
- auditoria estructurada
- proposals explicitas para cambios sensibles
- stores de contexto y sesion explicitos, no memoria magica
- persistencia JSON local opcional restringida al
stateDirconfigurado
Capabilities actuales:
read_filessearch_codecontext_readcontext_writegit_readgit_writeprocess_runproposal_approvewrite_files
Lectura y contexto:
read_project_overviewread_fileread_multiple_filessearch_codebaselist_directory
Git read-only:
git_statusgit_diff_summarygenerate_commit_message_preview
Observabilidad y administracion read-only:
read_system_statuslist_recent_audit_eventslist_pending_proposalsread_state_snapshotread_metrics_summarylist_recent_traces
Git write especifico:
create_branchcommit_changes
Procesos controlados:
run_testsrun_linter
Cambios de archivos:
write_file_patchapprove_proposal
Contexto operativo:
save_artifactlist_artifactsread_artifactcreate_sessionlist_sessionsread_sessionset_active_session
Estas tools administrativas son solo de inspeccion. No existen operaciones administrativas destructivas en la version actual.
Metricas y trazas actuales:
- metricas acumuladas por tool y por outcome
- duracion total y promedio por tool
- trazas recientes en memoria con
traceId,outcome,executionModey referencias opcionales asessionIdyproposalId - todo es local, ligero y sin exportadores externos
Las operaciones sensibles no inventan una aprobacion separada por dominio. Se reutiliza el mismo flujo:
dryRungenera preview o proposalapprove_proposalaprueba la proposal- la tool sensible aplica el cambio real con
proposalId
Actualmente este flujo se usa para:
write_file_patchcommit_changes
Crear una rama:
{
"branchName": "feature/git-workflow",
"checkout": true
}Generar preview de commit:
{}Proponer un commit:
{
"commitMessage": "chore(git): add commit workflow tools",
"dryRun": true
}Crear una sesion:
{
"title": "Refactor auth flow",
"goal": "Separar handlers y servicios",
"setActive": true
}Guardar un artifact:
{
"kind": "note",
"title": "Current plan",
"content": "Implement artifact store and tools",
"sessionId": "11111111-1111-1111-1111-111111111111"
}Leer una sesion:
{
"sessionId": "11111111-1111-1111-1111-111111111111"
}Cambiar la sesion activa:
{
"sessionId": "11111111-1111-1111-1111-111111111111"
}Leer un artifact:
{
"artifactId": "22222222-2222-2222-2222-222222222222"
}Aprobar una proposal:
{
"proposalId": "33333333-3333-3333-3333-333333333333"
}Aplicar write_file_patch:
{
"path": "src/index.ts",
"findText": "before",
"replaceWith": "after",
"proposalId": "33333333-3333-3333-3333-333333333333",
"dryRun": false
}Compatibilidad de cliente:
- las tools realmente sin input aceptan tanto llamada sin
argumentscomoarguments: {} - las tools con argumentos requeridos siguen validando strings, arrays y UUIDs de forma estricta
npm install
cp .env.example .env
npm run devnpm run typecheck
npm run lint
npm run test
npm run build
npm run startLos smoke tests MCP levantan el servidor real por stdio, conectan un cliente MCP del SDK y ejecutan una bateria minima contra un workspace temporal aislado. No dependen del MCP Inspector UI ni modifican este repositorio.
npm run smoke:mcp
npm run smoke:mcp:safe
npm run smoke:mcp:normal
npm run smoke:mcp:trustedCobertura actual:
safe: lectura de proyecto y archivos,search_codebase,read_multiple_files, estado Git read-only, observabilidad read-only y snapshots administrativos.normal: sesiones, artifacts,run_linter,run_tests,create_branchy bloqueos esperados para operaciones sensibles.trusted: proposals dewrite_file_patchycommit_changes,approve_proposal, listado de proposals pendientes y bloqueos por approval cuando corresponde.
Pruebas negativas incluidas:
- bloqueo en
safepararun_tests,run_linter,create_branch,save_artifactywrite_file_patchapply. - bloqueo en
normalparacommit_changesapply ywrite_file_patchapply. - bloqueo en
trustedparacommit_changesapply cuando la proposal sigue pendiente.
Salida esperada:
== Mode safe ==
[PASS] tools/list incluye el set minimo
[PASS] health_check responde
...
Summary safe: 7 passed, 0 failed
== Mode normal ==
[PASS] create_session responde
...
Summary normal: 11 passed, 0 failed
El workflow ci.yml ejecuta en GitHub Actions:
npm cinpm run typechecknpm run lintnpm run testnpm run build
Lee primero CONTRIBUTING.md y SECURITY.md.
En resumen:
- mantener tools especificas, no universales
- cubrir cambios relevantes con tests
- respetar execution modes,
SecurityGatey proposal flow - no introducir capacidades peligrosas sin modelado explicito
- persistencia opcional para proposals, artifacts y sessions
- tools Git adicionales como revert preview o branch summary
- aprobacion interactiva mas rica
- observabilidad y reportes de auditoria mas detallados
- empaquetado y publicacion open-source mas formal