Lifecycle MCP Server
Un servidor MCP para gestionar el ciclo de vida del desarrollo de software, con soporte para una base de datos SQLite externa opcional.
Documentación
Servidor Lifecycle MCP
Un servidor de Protocolo de Contexto de Modelo (MCP) para la gestión integral del ciclo de vida del software. Este servidor proporciona un seguimiento estructurado de requisitos, tareas y decisiones de arquitectura a través de una base de datos SQLite con trazabilidad completa y gestión automatizada de estados.
Características
- Gestión de Requisitos: Cree y gestione requisitos de software con validación y seguimiento del ciclo de vida
- Gestión de Tareas: Realice un seguimiento de las tareas de implementación con estructura jerárquica y estimación de esfuerzo
- Decisiones de Arquitectura: Registre ADR (Registros de Decisiones de Arquitectura) con contexto completo
- Paneles de Proyecto: Métricas de salud del proyecto en tiempo real e informes de estado
- Trazabilidad de Requisitos: Trazabilidad completa desde los requisitos hasta la implementación
- Validación de Estados: Validación automática de las transiciones de estados del ciclo de vida
- Edición Segura e Historial: Edite registros en el lugar con historial por campo, razones para requisitos aprobados y comprobaciones de revisión; elimine registros creados por error
- Seguimiento de Relaciones: Relaciones de muchos a muchos entre requisitos, tareas y arquitectura
Inicio Rápido
# 1. Clone the repository
git clone https://github.com/heffrey78/lifecycle-mcp.git
cd lifecycle-mcp
# 2. Install globally (easiest for using across projects)
uv tool install . # or: pip install -e .
# 3. Go to any project where you want to use lifecycle management
cd /path/to/your/project
# 4. Add the MCP server to Claude
claude mcp add lifecycle lifecycle-mcp -e LIFECYCLE_DB=/path/to/your/project/lifecycle.db
# 5. Start using lifecycle tools in Claude!
Opciones de Instalación
Requisitos Previos (Opcional)
Si desea utilizar uv (gestor de paquetes de Python más rápido):
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Or with homebrew
brew install uv
Clonar el Repositorio
git clone https://github.com/heffrey78/lifecycle-mcp.git
cd lifecycle-mcp
Uso con Claude Code
Para ejemplos y escenarios detallados, consulte USAGE_EXAMPLES.md.
Opción 1: Instalación Global (Recomendada para Múltiples Proyectos)
Instale el servidor globalmente para que pueda usarse desde cualquier proyecto:
# From the lifecycle-mcp directory (add --editable to pick up source changes)
uv tool install . # or: pip install -e .
# Now from ANY project directory, add the server:
claude mcp add lifecycle lifecycle-mcp -e LIFECYCLE_DB=./lifecycle.db
Nota: Cada proyecto obtiene su propio archivo de base de datos en su directorio.
Opción 2: Ejecutar desde el Código Fuente con uv
Si prefiere no instalar globalmente:
# Get the full path to the lifecycle-mcp directory
LIFECYCLE_PATH="/path/to/lifecycle-mcp" # Replace with your actual path
# From any project directory:
claude mcp add lifecycle $(which uv) -- --directory $LIFECYCLE_PATH run server.py -e LIFECYCLE_DB=./lifecycle.db
Opción 3: Ejecución Directa con Python
Para máxima compatibilidad:
# Get the full path to the server
LIFECYCLE_PATH="/path/to/lifecycle-mcp" # Replace with your actual path
# From any project directory:
claude mcp add lifecycle $(which python) $LIFECYCLE_PATH/server.py -e LIFECYCLE_DB=./lifecycle.db
Configuración Manual
También puede editar manualmente su archivo de configuración de Claude Desktop:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"lifecycle": {
"command": "lifecycle-mcp",
"env": {
"LIFECYCLE_DB": "./lifecycle.db"
}
}
}
}
Buenas Prácticas
Ubicación de la Base de Datos
- Cada proyecto debe tener su propio archivo
lifecycle.db - Use
LIFECYCLE_DB=./lifecycle.dbpara crear la base de datos en el proyecto actual - O use una ruta absoluta para una base de datos compartida:
LIFECYCLE_DB=/path/to/shared/lifecycle.db
Entorno Virtual (Recomendado)
# Create a virtual environment for lifecycle-mcp
cd /path/to/lifecycle-mcp
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install in the virtual environment
pip install -e .
# Find the venv's lifecycle-mcp command
which lifecycle-mcp # Copy this path
# Use the full path when adding to Claude
claude mcp add lifecycle /path/to/venv/bin/lifecycle-mcp -e LIFECYCLE_DB=./lifecycle.db
Visualización del Seguimiento
Cada herramienta devuelve texto para que un agente lo transmita. Para ver un seguimiento usted mismo, genere una vista HTML de solo lectura:
make viewer # this repository's tracker
make viewer DB=~/work/quire/lifecycle.db # another project's
make viewer OUT=/tmp/tracker.html # somewhere other than exports/
Esto escribe exports/<project>-tracker.html — un archivo que se abre con doble clic, en cualquier navegador, en cualquier máquina,
sin nada instalado y sin obtener nada de la red. Contiene:
- el panel: trabajo bloqueado y en espera, trabajo completado y pendiente de decisión, qué está listo para comenzar, qué necesita verificación y qué cambió desde la revisión, cada uno calculado con las mismas definiciones que usan las herramientas del servidor
- cada requisito, tarea y decisión con cada campo que contiene y sus comentarios, buscable en todos ellos
- los enlaces de cada registro desde su propio extremo, con cada enlace saltando al registro que nombra
Es una instantánea, no una vista en vivo. Muestra el seguimiento tal como estaba cuando se generó y dice cuándo fue eso en la parte superior.
Ejecute make viewer nuevamente para ver cambios posteriores.
Es de solo lectura. La página no contiene base de datos ni forma de escribir en una; nada hecho en ella puede cambiar un seguimiento.
Es tan sensible como la base de datos. La página incrusta todo el seguimiento como texto plano. Trátelo como lifecycle.db
antes de adjuntarlo o publicarlo.
make viewer lee el lifecycle.db de este repositorio a menos que DB nombre otro. No consulta LIFECYCLE_DB: eso
a menudo apunta a un proyecto diferente, y un comando que dice mostrar este repositorio no debería mostrar silenciosamente otro.
Una ruta que no existe se informa, nunca se crea. La salida termina en exports/, que está en gitignore, por lo que generarla
nunca aparece en git status.
Referencia de Herramientas MCP
El servidor expone 23 herramientas MCP (24 con integración de GitHub activada) en 7 módulos de manejo para la gestión integral del ciclo de vida. Cada herramienta rechaza campos que no declara, y el error nombra el campo. CHANGELOG.md enumera las herramientas que fueron eliminadas o renombradas, con sus reemplazos.
Los resultados son texto para que el modelo los lea. La mayoría de las herramientas también devuelven los mismos hechos como datos en structuredContent: las herramientas de creación devuelven el nuevo ID y estado, las de edición los campos cambiados y la nueva revisión, las de estado el estado anterior y nuevo (una lista de IDs obtiene un resultado por ID), y las de consulta los registros completos. Ninguna herramienta declara un outputSchema.
Lista de Herramientas
Requisitos
create_requirement- Crear nuevos requisitosupdate_requirement- Editar el contenido de un requisito (se requiere una razón en Aprobado o posterior)update_requirement_status- Mover uno o muchos requisitos a través de los estados del ciclo de vida, avanzando por la ruta permitidaquery_requirements- Buscar y filtrar requisitos, incluidos aquellos cuyo trabajo está hecho y solo falta la decisión; los registros coincidentes también vuelven como datos estructuradostrace_requirement- Trazar requisito a través de la implementación
Tareas
create_task- Crear tareas de implementación a partir de requisitosupdate_task- Editar el contenido de una tarea, moverla a otro padre o cambiar sus requisitosupdate_task_status- Actualizar el progreso de una o muchas tareas; el comentario en un movimiento a Bloqueado se conserva como la razónquery_tasks- Buscar y filtrar tareas, incluidas las listas para comenzar; los registros coincidentes también vuelven como datos estructuradossync_github_tasks- Sincronizar una tarea, o cada tarea vinculada, desde problemas de GitHub (listado solo cuandoLIFECYCLE_GITHUB=on)
Decisiones de arquitectura
create_architecture_decision- Registrar decisiones de arquitectura (ADR)update_architecture- Editar una decisión de arquitectura Propuesta, o registrar una enmienda fechada contra una Aceptadaupdate_architecture_status- Actualizar el estado de una o muchas decisiones de arquitectura; Superada proviene de un enlace de superaquery_architecture_decisions- Buscar y filtrar decisiones de arquitectura; los registros coincidentes también vuelven como datos estructurados
Cualquier registro (requisito, tarea o decisión de arquitectura, por ID)
get_details- Detalles completos de un registro, con sus enlaces y comentariosdelete_record- Eliminar un requisito Borrador, tarea No Iniciada o decisión de arquitectura Propuesta creada por erroradd_comment- Comentar sobre un registro; los comentarios aparecen en sus detalles e historial
Relaciones e historial
create_relationship- Vincular dos registros: dependencias, refinamientos, bloqueos, una tarea que implementa una decisión de arquitectura, una decisión más nueva que supera a una más antigua, y másdelete_relationship- Eliminar un enlace entre dos registrosquery_relationships- Consultar enlaces: los enlaces de un registro por dirección y tipo, o cada enlace como JSON para un gráficoget_entity_history- Mostrar cómo cambió un registro: creación, ediciones con valores antes y después, cambios de estado, comentarios y eliminación
Estado y exportación
get_project_status- Panel de salud del proyecto; las métricas también vuelven como datos estructuradosexport_project_documentation- Exportar documentación integral en markdowncreate_architectural_diagrams- Generar diagramas Mermaid para visualización de proyectos
Edición, Eliminación e Historial
Estas reglas se aplican a update_requirement, update_task, update_architecture y delete_record:
- Las ediciones ocurren en el lugar. Las herramientas de actualización cambian solo el contenido; los movimientos de estado permanecen con las herramientas
update_*_status, y los IDs de registro nunca cambian. - Cada cambio se registra. Cada campo cambiado se registra con sus valores antes y después, el actor y la razón.
get_entity_historymuestra el registro. - Las revisiones protegen contra actualizaciones perdidas. Cada registro tiene una revisión, mostrada en sus detalles, que aumenta en uno con cada actualización que cambia algo. Pase
if_revisionpara que la actualización sea rechazada, sin escribir nada, cuando el registro ha cambiado desde que lo leyó. - Los requisitos aprobados necesitan una razón. Editar un requisito en Aprobado o posterior requiere
reason. El requisito entonces se muestra como Cambiado Desde la Última Revisión enget_details,trace_requirementyget_project_status, enumerando los campos editados. - El siguiente cambio de estado es el reconocimiento. No hay un paso de reconocimiento separado: la siguiente transición de estado del requisito limpia la marca, y el comentario de esa transición registra la revisión.
- La arquitectura decidida no se reescribe. Las decisiones de arquitectura solo se pueden editar mientras están Propuestas. Para cambiar una decidida, registre una nueva decisión con
create_architecture_decisiony vincúlela concreate_relationship(supersedes, de más nueva a más antigua), lo que mueve la anterior a Superada. Para corregir una decisión aceptada sin cambiar la dirección — un número que el trabajo luego midió diferente, por ejemplo — paseamendmentaupdate_architecture. Registra una nota fechada y atribuida junto a la decisión y nunca toca el texto propio de la decisión, por lo que esto es una adición a la regla más que una excepción a ella. - Eliminar es para errores. Solo los requisitos Borrador, las tareas No Iniciadas y las decisiones de arquitectura Propuestas se pueden eliminar, y solo cuando nada depende de ellas. Los rechazos nombran los registros bloqueantes. Los enlaces propios de un registro eliminado van con él, y su historial permanece.
get_entity_history
Muestre cómo un requisito, tarea o decisión de arquitectura cambió con el tiempo, del más antiguo al más reciente.
Parámetros:
entity_id(obligatorio): ID de requisito, tarea o decisión de arquitectura
Devuelve: Creación, ediciones de campos con valores antes y después y razones, cambios de estado, comentarios y eliminación. Aún disponible después de que el registro sea eliminado.
get_details
Detalles completos de un requisito, tarea o decisión de arquitectura. El prefijo del ID (REQ-, TASK-, ADR-) le dice al servidor qué tipo de registro es.
Parámetros:
entity_id(obligatorio): ID de requisito, tarea o decisión de arquitectura
Devuelve: Los campos del registro, revisión, enlaces (tareas vinculadas, subtareas y padre, requisitos vinculados, las tareas que implementan una decisión, las decisiones que una tarea implementa, las decisiones que una decisión supera o por las que es superada, y las tareas de las que una tarea depende o bloquea) y comentarios. Una tarea Bloqueada muestra su razón de bloqueo. Un requisito revisado editado desde su último cambio de estado está marcado como Cambiado Desde la Última Revisión.
delete_record
Elimine un registro creado por error.
Parámetros:
entity_id(obligatorio): ID de requisito, tarea o decisión de arquitectura
Solo los requisitos Borrador, las tareas No Iniciadas y las decisiones de arquitectura Propuestas se pueden eliminar. Rechazado, nombrando qué lo bloquea, cuando:
- Requisito: tareas, decisiones de arquitectura u otros requisitos enlazan a él.
- Tarea: tiene subtareas, otras tareas dependen de ella, o está vinculada a un problema de GitHub.
- Decisión de arquitectura: otra decisión es superada por ella, o registros distintos de sus propios enlaces de requisito apuntan a ella.
Cualquier cosa más allá de su etapa temprana cambia de estado en su lugar (Obsoleto, Abandonado, Rechazado o Superado).
add_comment
Comente sobre un requisito, tarea o decisión de arquitectura.
Parámetros:
entity_id(obligatorio): ID de requisito, tarea o decisión de arquitecturacomment(obligatorio): El comentarioauthor(opcional): Quién lo escribió (predeterminado: Usuario MCP)
Devuelve: Confirmación. El comentario aparece en los detalles del registro bajo Comentarios y en get_entity_history.
Gestión de Requisitos
create_requirement
Cree un nuevo requisito. Parámetros:
type(obligatorio): Tipo de requisito - "FUNC", "NFUNC", "TECH", "BUS", "INTF"title(obligatorio): Título descriptivopriority(obligatorio): Nivel de prioridad - "P0", "P1", "P2", "P3"current_state(obligatorio): Estado actual del sistemadesired_state(obligatorio): Estado objetivo del sistemafunctional_requirements(opcional): Matriz de requisitos funcionalesacceptance_criteria(opcional): Matriz de criterios de aceptaciónbusiness_value(opcional): Justificación de negociorisk_level(opcional): Evaluación de riesgos - "Alto", "Medio", "Bajo"author(opcional): Autor del requisitononfunctional_requirements(opcional): Matriz de requisitos no funcionales (rendimiento, seguridad, ...)technical_constraints(opcional): Matriz de restricciones técnicasbusiness_rules(opcional): Matriz de reglas de negociovalidation_metrics(opcional): Matriz de métricas que demuestran que el requisito se cumpleout_of_scope(opcional): Matriz de elementos explícitamente no cubiertos
Ejemplo:
{
"type": "FUNC",
"title": "User Authentication System",
"priority": "P1",
"current_state": "No user authentication exists",
"desired_state": "Secure user login with JWT tokens",
"functional_requirements": ["Login with email/password", "JWT token generation"],
"acceptance_criteria": ["User can login successfully", "Token expires after 24 hours"],
"business_value": "Enables secure user access to protected features",
"risk_level": "Medium"
}
update_requirement_status
Mueve uno o varios requisitos a lo largo de su ciclo de vida con validación.
Parámetros:
requirement_id: ID del requisito (p. ej., "REQ-0001-FUNC-00")requirement_ids: En lugar derequirement_id, una lista de IDs de requisitos para mover al mismo estadonew_status(obligatorio): Estado objetivo - "Borrador", "En revisión", "Aprobado", "Arquitectura", "Listo", "Implementado", "Validado", "Obsoleto"comment(opcional): Comentario de revisión o justificación, añadido una vez a cada requisito movido
Pasa requirement_id o requirement_ids, no ambos. Cada ID en una lista se mueve por separado: el resultado lista cada ID, y structuredContent contiene results (una entrada por ID, con error cuando se rechaza), moved y refused. Algunos rechazos lo convierten en una advertencia mientras los otros IDs aún se mueven; solo es un error cuando ninguno se movió.
Cuando new_status está a más de un paso de distancia, el requisito recorre la ruta permitida más corta y cada paso se registra como su propio cambio de estado: Borrador → Aprobado pasa por En revisión, y Aprobado → Validado pasa por Listo e Implementado. Un movimiento nunca pasa por Aprobado o Validado; esos solo pueden ser el destino final. Las compuertas se aplican antes de cualquier cambio, por lo que un movimiento rechazado deja el requisito donde estaba. Los resultados de múltiples pasos incluyen el path.
Transiciones de estado válidas:
- Borrador → En revisión, Obsoleto
- En revisión → Borrador, Aprobado, Obsoleto
- Aprobado → Arquitectura, Listo, Obsoleto
- Arquitectura → Listo, Aprobado
- Listo → Implementado, Obsoleto
- Implementado → Validado, Listo
- Validado → Obsoleto
query_requirements
Busca y filtra requisitos por varios criterios.
Parámetros:
status(opcional): Filtrar por estadopriority(opcional): Filtrar por nivel de prioridadtype(opcional): Filtrar por tipo de requisitosearch_text(opcional): Búsqueda de texto en título y estado deseadowork_complete(opcional):truepara los requisitos cuyas tareas vinculadas están todas Completas pero que no han alcanzado Implementado: el trabajo está hecho y solo falta la decisión
trace_requirement
Rastrea un requisito a lo largo de su ciclo de vida completo de implementación.
Parámetros:
requirement_id(obligatorio): ID del requisito
Devuelve: Rastreo completo que incluye detalles del requisito, tareas de implementación y decisiones de arquitectura.
update_requirement
Edita el contenido de un requisito en su lugar. Consulta Edición, eliminación e historial para conocer las reglas.
Parámetros:
requirement_id(obligatorio): ID del requisitotitle,priority,risk_level,current_state,desired_state,functional_requirements,acceptance_criteria,business_value,nonfunctional_requirements,technical_constraints,business_rules,validation_metrics,out_of_scope(al menos uno): Nuevos valores, con los mismos tipos que encreate_requirementreason(obligatorio en Aprobado o posterior): Por qué se realiza el cambioactor(opcional): Quién realiza el cambio (predeterminado: Usuario MCP)if_revision(opcional): Rechazar la edición a menos que el requisito siga en esta revisión
Ejemplo:
{
"requirement_id": "REQ-0001-FUNC-00",
"acceptance_criteria": ["User can login successfully", "Token expires after 1 hour"],
"reason": "Security review shortened token lifetime",
"if_revision": 2
}
Gestión de tareas
create_task
Crea tareas de implementación vinculadas a requisitos.
Parámetros:
requirement_ids(obligatorio): Matriz de IDs de requisitos para vinculartitle(obligatorio): Título de la tareapriority(obligatorio): Nivel de prioridad - "P0", "P1", "P2", "P3"effort(opcional): Estimación de esfuerzo - "XS", "S", "M", "L", "XL"user_story(opcional): Descripción de historia de usuarioacceptance_criteria(opcional): Matriz de criterios de aceptaciónparent_task_id(opcional): Tarea principal para subtareasassignee(opcional): Persona asignada a la tareaimplementation_plan(opcional): Matriz de pasos de implementacióntest_plan(opcional): Matriz de pruebas o comprobaciones a ejecutardefinition_of_done(opcional): Matriz de condiciones para considerar la tarea completada
Ejemplo:
{
"requirement_ids": ["REQ-0001-FUNC-00"],
"title": "Implement JWT token generation",
"priority": "P1",
"effort": "M",
"user_story": "As a developer, I need JWT token generation so users can authenticate securely",
"acceptance_criteria": ["Generate JWT with user claims", "Token expires in 24 hours"],
"assignee": "john.doe@company.com"
}
update_task_status
Actualiza el progreso y la asignación de tareas.
Parámetros:
task_id: ID de la tarea (p. ej., "TASK-0001-00-00")task_ids: En lugar detask_id, una lista de IDs de tareas para mover al mismo estado, con un resultado por ID como enupdate_requirement_statusnew_status(obligatorio): Nuevo estado - "No iniciada", "En progreso", "Bloqueada", "Completa", "Abandonada"comment(opcional): Comentario de actualización de estado. Al mover a Bloqueada, se conserva como motivo de bloqueo de la tarea hasta que la tarea salga de Bloqueada; mover una tarea Bloqueada a Bloqueada nuevamente sin comentario conserva el motivoassignee(opcional): Nueva persona asignadacommit(opcional): El commit detrás de este movimiento, conservado en la tareaevidence(opcional): El resultado de prueba o comprobación detrás de este movimiento, conservado en la tarea
commit y evidence permanecen en la tarea después del movimiento: un cambio de estado posterior que los omita los deja en su lugar, y pasar nuevos valores los reemplaza. Ambos aparecen en los detalles de la tarea y en la documentación de tareas exportada, por lo que el razonamiento detrás de una tarea completada sobrevive a la transferencia.
query_tasks
Busca y filtra tareas por varios criterios.
Parámetros:
status(opcional): Filtrar por estadopriority(opcional): Filtrar por nivel de prioridadassignee(opcional): Filtrar por persona asignadarequirement_id(opcional): Filtrar por requisito vinculadoready(opcional):truepara tareas No iniciadas cuyas dependencias están todas Completas, primero la prioridad más alta. Una tarea espera a las tareas de las que depende o que requiere, y a las tareas que la bloquean
Los filtros se combinan.
Cuando ready no encuentra nada, la respuesta indica qué caso es en lugar de que no se encontraron tareas: no quedan tareas, cada tarea restante está esperando (con cuántas están Bloqueadas y cuántas esperan dependencias), o el único trabajo iniciable ya está En progreso.
sync_github_tasks
Sincroniza tareas desde sus issues de GitHub vinculados, con detección de conflictos. Se lista solo cuando LIFECYCLE_GITHUB=on.
Parámetros:
task_id(opcional): Tarea para sincronizar con su issue de GitHub vinculado; omítelo para sincronizar cada tarea vinculada a un issue
Devuelve: Estado de sincronización y cualquier actualización aplicada desde los datos del issue de GitHub.
update_task
Edita el contenido de una tarea, muévela bajo otro padre o cambia los requisitos que implementa. El ID de la tarea nunca cambia.
Parámetros:
task_id(obligatorio): ID de la tareatitle,priority,effort,user_story,acceptance_criteria,assignee,implementation_plan,test_plan,definition_of_done(opcional): Nuevos valores, con los mismos tipos que encreate_taskparent_task_id(opcional): Nueva tarea principal; una cadena vacía la convierte en tarea de nivel superior. Una tarea no puede convertirse en su propio padre ni moverse bajo una de sus subtareasrequirement_ids(opcional): Reemplaza los requisitos que implementa la tarea; los requisitos que se añaden deben estar aprobados, como encreate_taskreason,actor,if_revision(opcional): Como enupdate_requirement
Pasa al menos un campo para cambiar. Los cambios no se envían a un issue de GitHub vinculado.
Gestión de arquitectura
create_architecture_decision
Registra decisiones de arquitectura (ADR) con contexto completo.
Parámetros:
requirement_ids(obligatorio): Matriz de IDs de requisitos abordadostitle(obligatorio): Título de la decisióncontext(obligatorio): Contexto y antecedentes de la decisióndecision(obligatorio): La decisión tomadaconsequences(opcional): Objeto de consecuencias de la decisióndecision_drivers(opcional): Matriz de factores que impulsan la decisiónconsidered_options(opcional): Matriz de alternativas consideradasauthors(opcional): Matriz de autores de la decisióndeciders(opcional): Matriz de personas que tomaron la decisiónimplementation_notes(opcional): Notas para implementar la decisiónvalidation_criteria(opcional): Matriz de comprobaciones que demuestran que la decisión funcionarisk_assessment(opcional): Matriz de riesgos, cada uno con probabilidad, impacto y mitigación
Ejemplo:
{
"requirement_ids": ["REQ-0001-FUNC-00"],
"title": "Use JWT for authentication tokens",
"context": "Need secure, stateless authentication for API access",
"decision": "Implement JWT tokens with RS256 signing",
"consequences": {
"positive": ["Stateless authentication", "Industry standard"],
"negative": ["Token size overhead", "Key management complexity"]
},
"decision_drivers": ["Security requirements", "Scalability needs"],
"considered_options": ["Session cookies", "OAuth2", "JWT tokens"]
}
update_architecture_status
Actualiza el estado de una o varias decisiones de arquitectura.
Parámetros:
architecture_id: ID de arquitectura (p. ej., "ADR-0001")architecture_ids: En lugar dearchitecture_id, una lista de IDs de decisiones para mover al mismo estado, con un resultado por ID como enupdate_requirement_statusnew_status(obligatorio): Nuevo estado - "Propuesta", "Aceptada", "Rechazada", "Obsoleta", "Superada", "Borrador", "En revisión", "Aprobada", "Implementada"comment(opcional): Comentario de cambio de estado
Superada proviene de un enlace: create_relationship con la decisión más nueva como source_id, la más antigua como target_id y relationship_type supersedes mueve la más antigua a Superada y establece su superseded_by. Esta herramienta rechaza Superada sin ese enlace, y rechaza mover una decisión superada a otro lugar hasta que el enlace se elimine.
query_architecture_decisions
Busca y filtra decisiones de arquitectura por varios criterios.
Parámetros:
status(opcional): Filtrar por estadotype(opcional): Filtrar por tipo (ADR, TDD, INTG)requirement_id(opcional): Filtrar por requisito vinculadosearch_text(opcional): Búsqueda de texto en título y contexto
update_architecture
Edita el contenido de una decisión de arquitectura mientras está Propuesta. Las decisiones en cualquier otro estado se rechazan: registra una nueva decisión con create_architecture_decision y vincúlala a la anterior con una relación supersedes, lo que mueve la anterior a Superada.
Una decisión Aceptada puede en su lugar ser enmendada: amendment registra una corrección fechada y atribuida, que lleva su reason, contra la decisión. Nada sobre la decisión se edita: su texto, revisión y marca de tiempo se dejan exactamente como estaban, y la enmienda se almacena como un evento del ciclo de vida, por lo que get_entity_history la muestra como su propio tipo de entrada. Las enmiendas se muestran directamente debajo de la decisión que corrigen en get_details y en la documentación de arquitectura exportada, marcadas como correcciones posteriores, para que un lector no pueda asimilar el texto desactualizado sin verlas. Pasa amendment por sí solo; enmendar una decisión Propuesta se rechaza, señalando la edición que debería usarse.
Parámetros:
architecture_id(obligatorio): ID de arquitecturatitle,context,decision,consequences,decision_drivers,considered_options,authors,deciders,implementation_notes,validation_criteria,risk_assessment(al menos uno, al editar): Nuevos valores, con los mismos tipos que encreate_architecture_decisionamendment(en lugar de los campos anteriores): Una corrección fechada a una decisión Aceptadareason,actor,if_revision(opcional): Como enupdate_requirement.reasonse traslada en la enmienda
Monitoreo de Proyecto
get_project_status
Obtén métricas completas de salud del proyecto y paneles de control.
Parámetros:
include_blocked(opcional): Incluir análisis de elementos bloqueados (predeterminado: true)
Devuelve: Panel con resumen de requisitos, estadísticas de tareas, porcentajes de finalización y elementos bloqueados: cada tarea Bloqueada con su motivo, y cada tarea o requisito que aún espera una dependencia con lo que espera. structuredContent contiene las métricas y, cuando include_blocked está activado, los mismos elementos bajo blocked.
Herramientas de Exportación de Documentación
export_project_documentation
Exporta documentación completa del proyecto en formato markdown estructurado.
Parámetros:
project_name(opcional): Nombre para el proyecto usado en nombres de archivo (predeterminado: "project")include_requirements(opcional): Incluir documentación de requisitos (predeterminado: true)include_tasks(opcional): Incluir documentación de tareas (predeterminado: true)include_architecture(opcional): Incluir documentación de arquitectura (predeterminado: true)output_directory(opcional): Directorio para guardar archivos exportados (predeterminado: ".")
Devuelve: Lista de archivos exportados con sus rutas.
Archivos Generados:
{project_name}-requirements.md- Documentación completa de requisitos agrupada por tipo{project_name}-tasks.md- Documentación de tareas agrupada por estado, con requisitos vinculados, el commit y evidencia de cada tarea, y sus comentarios{project_name}-architecture.md- Decisiones de arquitectura con contexto, decisiones y consecuencias
Ejemplo:
{
"project_name": "ecommerce-platform",
"include_requirements": true,
"include_tasks": true,
"include_architecture": true,
"output_directory": "./docs"
}
create_architectural_diagrams
Genera diagramas Mermaid para visualización de arquitectura y relaciones del proyecto.
Parámetros:
diagram_type(opcional): Tipo de diagrama - "requirements", "tasks", "architecture", "full_project", "dependencies" (predeterminado: "full_project")limit(opcional): Limita cada tipo de registro. La respuesta indica qué se dibujó y qué dejó fuera el límite; sin él, nada se limitarequirement_ids(opcional): Matriz de IDs de requisitos específicos para incluirinclude_relationships(opcional): Incluir flechas de relación en diagramas (predeterminado: true)output_format(opcional): Formato de salida - "mermaid", "markdown_with_mermaid" (predeterminado: "mermaid")
Devuelve: Código de diagrama Mermaid o diagrama envuelto en markdown.
Tipos de Diagrama:
- requirements: Requisitos agrupados por tipo, con bordes de padre y dependencia, en colores de estado
- tasks: Tareas con bordes de subtarea, dependencia y bloqueo, en colores de estado
- architecture: Decisiones, lo que reemplazan, y los requisitos que cada una aborda
- full_project: El gráfico completo - requisitos, tareas y decisiones con cada enlace entre ellos
- dependencies: Las tareas que esperan otras tareas, nombradas en lugar de IDs simples
Cada borde lee de origen a destino con una etiqueta, por lo que una dependencia apunta a lo que espera. Los requisitos y decisiones obsoletos se omiten, y la respuesta indica cuántos fueron. Cada tipo escribe un archivo, {diagram_type}-diagram.mmd o .md, sobrescrito en cada renderizado.
Colores de Estado:
- Requisitos: Borrador (rojo), En Revisión (naranja), Aprobado (azul), Listo (verde), etc.
- Tareas: No Iniciado (rojo), En Progreso (naranja), Bloqueado (rojo oscuro), Completo (verde), etc.
- Arquitectura: Propuesto (naranja), Aceptado (verde), Rechazado (rojo), Obsoleto (gris), etc.
Ejemplo:
{
"diagram_type": "requirements",
"include_relationships": true,
"output_format": "markdown_with_mermaid"
}
Esquema de Base de Datos
El servidor mantiene una base de datos SQLite completa con las siguientes entidades clave:
- Requisitos: Entidad central con estados de ciclo de vida (Borrador → En Revisión → Aprobado → Arquitectura → Listo → Implementado → Validado → Obsoleto)
- Tareas: Elementos de trabajo de implementación con estructura jerárquica (formato TASK-XXXX-YY-ZZ)
- Arquitectura: ADRs y documentos de diseño técnico
- Relaciones: Enlaces de muchos a muchos entre requisitos, tareas y arquitectura
- Eventos: Registro automático de eventos de ciclo de vida y cambios de estado
- Comentarios: Notas sobre requisitos, tareas y decisiones de arquitectura, agregadas con
add_commento elcommentde un cambio de estado
IDs Cortos
En cualquier lugar donde una herramienta acepte un ID de registro, el relleno con ceros y la versión final pueden omitirse:
| Escrito | Resuelve a |
|---|---|
REQ-12-FUNC | REQ-0012-FUNC-00 |
TASK-12 | TASK-0012-00-00 |
TASK-12-1 | TASK-0012-01-00 |
ADR-4 | ADR-0004 |
La forma corta de un requisito conserva su tipo, porque los números de requisito se repiten entre tipos: REQ-12 por sí solo puede significar cuatro registros diferentes. Los IDs completos almacenados siempre funcionan. Un alias que no coincide con nada se rechaza como desconocido, y uno que coincide con varios se rechaza nombrando los candidatos, por lo que una herramienta nunca actúa sobre una suposición. Los IDs almacenados nunca cambian; esto es solo una forma de entrada.
Llamadas Rechazadas
Una llamada cuyos argumentos no coinciden con el esquema de la herramienta se rechaza antes de escribir nada, nombrando el campo en falta. Cuando el parámetro rechazado tiene un vecino cercano en el mismo esquema que habría aceptado el valor, el mensaje lo nombra: pasar una lista a requirement_id responde que requirement_ids toma una matriz y acepta lo que pasaste. La sugerencia se lee del propio esquema de la herramienta, por lo que un nuevo par singular/plural se cubre el día que se declara.
Las llamadas rechazadas llegan al registro de llamadas como cualquier otra cuando LIFECYCLE_CALL_LOG está configurado, por lo que los totales de una sesión cubren las llamadas que un cliente hizo incorrectamente en lugar de solo las que llegaron a un manejador.
Formatos de ID de Entidad
- Requisitos:
REQ-XXXX-TYPE-VV(p. ej., REQ-0001-FUNC-00) - Tareas:
TASK-XXXX-YY-ZZ(p. ej., TASK-0001-00-00) - Arquitectura:
ADR-XXXX(p. ej., ADR-0001)
Variables de Entorno
LIFECYCLE_DB: Ruta al archivo de base de datos SQLite (predeterminado: "./lifecycle.db")LIFECYCLE_GITHUB: Configúralo enonpara crear y sincronizar un issue de GitHub para cada tarea (predeterminado: desactivado). Requiere una CLI deghautenticada y un remotooriginde github.com en el directorio de trabajo del servidor. Cuando está desactivado, el servidor nunca ejecutaghogit, y la herramientasync_github_tasksno se lista.LIFECYCLE_RULES: Qué tan estrictamente se tratan los movimientos de estado riesgosos -off,warnoenforce(predeterminado:warn). Cualquier otra cosa vuelve awarn.LIFECYCLE_STALE_AFTER: Cuántos días puede pasar un requisito sin revisión antes de queget_project_statuslo persiga (predeterminado: 14).0persigue cada requisito tan pronto como se escribe. Cualquier cosa que no sea un número de días vuelve al predeterminado.LIFECYCLE_CALL_LOG: Ruta a un archivo donde el servidor agrega una línea JSON por llamada de herramienta: nombre de la herramienta, nombres de argumentos (no valores), duración, si falló y tamaño de respuesta. Desactivado por predeterminado. Cada llamada que recibe el servidor se registra, incluidas las que su esquema rechazó y las que nombran una herramienta que no existe: esas llevanerror_kind(validation,unknown_tool) y la regla y el parámetro por los que fueron rechazadas, por lo que los totales de una sesión cubren las llamadas que un cliente hizo incorrectamente.scripts/tool_usage_report.pyresume estos registros.
Escritura de Requisitos
El servidor ofrece un prompt MCP, capture_requirement, listado bajo prompts/list. Es una guía para escribir un requisito bien formado que tu propio modelo completa y luego pasa a create_requirement en una sola llamada; toma un argumento opcional about que lleva lo que la persona dijo en sus propias palabras. No se guarda nada en el servidor entre llamadas.
Los nuevos registros también indican cuándo son escasos para su tipo: un requisito sin acceptance_criteria, un requisito NFUNC sin validation_metrics, una tarea P0 o P1 sin test_plan. Estas son reglas de flujo de trabajo, por lo que advierten por predeterminado, rechazan bajo LIFECYCLE_RULES=enforce y son silenciosas bajo off.
Los detalles de un requisito muestran cuándo alguien lo verificó por última vez contra la realidad, y get_project_status lista los que vale la pena releer bajo Necesita Verificación: aquellos cuyo contenido cambió después de la última verificación, y aquellos que nadie ha verificado durante más de LIFECYCLE_STALE_AFTER días. Escribir un requisito cuenta como la primera verificación, y después comentar sobre él o mover su estado también cuenta, por lo que nada se persigue el día en que se escribió. La línea indica los dos momentos que mantiene: cuándo cambió el contenido y cuándo se verificó por última vez, y nunca afirma saber el momento en que el requisito quedó obsoleto.
Cuando cada tarea que implementa un requisito está Completa pero el requisito no ha alcanzado Implementado, el trabajo está hecho y solo falta la decisión. get_project_status nombra esos requisitos bajo Trabajo Completo, Decisión Pendiente, y query_requirements los encuentra con work_complete. Nada se mueve por sí solo: el rastreador solicita y la persona decide.
Reglas de Flujo de Trabajo
Un movimiento de estado puede ser riesgoso sin ser incorrecto. LIFECYCLE_RULES decide qué sucede entonces:
warn(predeterminado): el movimiento ocurre exactamente como hoy, y la respuesta indica por qué era riesgoso, en el texto y enstructuredContentbajowarnings- por registro para una lista de IDs.enforce: el movimiento se rechaza antes de escribir nada, nombrando lo que lo bloquea.off: no se verifica nada.
Las reglas:
- Dependencias incompletas: iniciar o completar una tarea cuyas dependencias no están todas Completas las nombra. Una dependencia abandonada se nombra por separado, con las dos formas de salir: eliminar el enlace con
delete_relationship, o abandonar también la tarea que espera. - Subtareas abiertas: completar una tarea mientras una subtarea no está ni Completa ni Abandonada nombra las subtareas abiertas.
- Saltos y reaperturas: completar una tarea que nunca se inició o que aún está Bloqueada, y reabrir una tarea Completa, cada uno lo indica.
- La puerta de Implementado: un requisito que alcanza Implementado mientras las tareas que lo implementan están abiertas las nombra.
- Movimientos de decisión: una decisión de arquitectura que se mueve fuera de su vocabulario indica dónde suele ir ese estado. Los estados de ADR y la cadena TDD son conjuntos separados.
Tres reglas están siempre activas, sea cual sea el modo, porque protegen lo que el servidor mantiene por sí mismo: un requisito no puede ser Validado mientras una tarea vinculada esté abierta, Superseded necesita un enlace supersedes, y el estado de un requisito aún sigue su mapa de transición.
Solución de Problemas
Problemas de Conexión
"MCP error -32000: Connection closed"
El servidor salió o escribió algo distinto a mensajes de protocolo en stdout. Para verificar una instalación:
python3 scripts/mcp_handshake_smoke.py lifecycle-mcp
Esto inicia el servidor dos veces contra una base de datos temporal e informa si el handshake de MCP tiene éxito con stdout limpio. Si falla:
-
Reinstala para que se use el SDK de MCP fijado (
mcp[cli]>=1.10,<2):uv tool install --force . -
Vuelve a agregar el servidor MCP:
claude mcp add lifecycle lifecycle-mcp -
Verifica que el servidor se inicie sin errores:
lifecycle-mcp
Servidor No Encontrado
Si el comando lifecycle-mcp no se encuentra después de la instalación:
- Verifica que la instalación se completó correctamente
- Verifica que el punto de entrada esté registrado en
pyproject.toml - Intenta reinstalar con
pip install -e .
Problemas de Base de Datos
Errores de Bloqueo de Base de Datos
Si ves errores de bloqueo de base de datos, asegúrate de que solo una instancia del servidor esté ejecutándose y que el archivo de base de datos tenga permisos adecuados.
Inicialización del Esquema
El esquema de la base de datos se crea automáticamente en la primera ejecución. Si necesitas restablecer la base de datos, simplemente elimina el archivo SQLite (predeterminado: lifecycle.db).
Desarrollo
Usando uv (Recomendado)
# Install dependencies
uv sync
# Run the server directly
uv run server.py
# Test with Claude Code
claude mcp add lifecycle $(which uv) -- --directory $(pwd) run server.py
Usando pip (Tradicional)
# Install in development mode
pip install -e .
# Run the server
lifecycle-mcp
# Test with Claude Code
claude mcp add lifecycle lifecycle-mcp
Construcción de la Extensión de Escritorio (.dxt)
Para crear un paquete de Extensión de Escritorio para instalación con un clic:
# Build the .dxt file
make build-dxt
# or
python build_dxt.py
Esto crea lifecycle-mcp-1.0.0.dxt que los usuarios pueden hacer doble clic para instalar en Claude Desktop.