OpenProject MCP Server
Enables Claude to connect to an OpenProject instance and query, search, and manage projects, work packages, users, and time entries through natural language. Supports advanced filtering, pagination, and creation of work packages like epics and user stories.
README
OpenProject MCP Server
Un servidor Model Context Protocol (MCP) de alta calidad para conectar Claude con tu instancia de OpenProject. Permite a Claude consultar, buscar y gestionar proyectos, paquetes de trabajo (work packages), usuarios y entradas de tiempo directamente desde conversaciones.
🚀 Características
✅ Acceso a Proyectos - Listar, filtrar y obtener detalles de proyectos
✅ Gestión de Work Packages - Ver tareas, bugs, features con filtrado avanzado
✅ Búsqueda de Texto Completo - Buscar paquetes de trabajo por contenido
✅ Historial de Actividades - Ver cambios y comentarios en trabajo packages
✅ Gestión de Usuarios - Listar y obtener información de usuarios
✅ Entradas de Tiempo - Consultar tiempo registrado por proyecto, usuario, período
✅ Paginación Inteligente - Soporte para grandes conjuntos de datos
✅ Manejo de Errores Robusto - Mensajes claros y ActionAbles
✅ Tipado Completo - TypeScript para máxima seguridad de tipos
📋 Requisitos Previos
- Node.js 18+ o Bun 1.0+
- Una instancia de OpenProject 13+ con acceso a API
- Un API Token de OpenProject (generable en Settings)
🔧 Instalación
1. Clonar o descargar el servidor
cd openproject-mcp-server
2. Instalar dependencias
npm install
# o con bun
bun install
3. Configurar variables de entorno
Copia .env.example a .env y completa los valores:
cp .env.example .env
Edita .env:
OPENPROJECT_URL=https://openproject.empresa.com
OPENPROJECT_API_TOKEN=tu-token-api-aqui
OPENPROJECT_PAGE_SIZE=50
Cómo generar un API Token en OpenProject:
- En OpenProject, ve a Administration → API & Webhooks → Personal Access Tokens
- Haz clic en "+ New Personal Access Token"
- Asigna un nombre descriptivo (ej. "Claude MCP")
- Marca los permisos requeridos:
- ✅
view_work_packages - ✅
view_projects - ✅
view_users - ✅
view_time_entries - ✅
edit_work_packages(si deseas crear/editar)
- ✅
- Copia el token generado a
.env
4. Compilar el servidor
npm run build
🎯 Uso
Opción A: En Claude Code
-
Abre Claude Code
-
Ve a Settings → MCP Servers
-
Haz clic en + Add Local Server
-
Configura:
- Name:
openproject - Command:
node - Arguments:
["path/to/openproject-mcp-server/dist/index.js"] - Environment Variables: Los valores de
.env
- Name:
-
Guarda y reconecta a Claude
Opción B: Ejecutar localmente para testing
npm run dev
Luego en otra terminal, usa el MCP Inspector:
npm run inspect
Esto abre una interfaz web donde puedes probar cada herramienta.
Opción C: En Claude.ai
- Abre claude.ai/code
- Ve a Settings → MCP Servers
- Agrega un servidor remoto si desplegaste este servidor en un host accesible
- Configura credenciales de acceso
🛠️ Herramientas Disponibles
📦 Proyectos
list_projects
Lista todos los proyectos con filtrado opcional.
Parámetros:
offset(number, optional): Para paginaciónname_filter(string, optional): Filtrar por nombrestatus(enum: "active" | "archived", optional): Filtrar por estado
Ejemplo:
Claude: List all active projects
→ OpenProject: Muestra proyectos activos
get_project
Obtiene detalles completos de un proyecto.
Parámetros:
project_id(string | number): ID o identificador del proyecto
📋 Work Packages (Tareas)
list_work_packages
Lista paquetes de trabajo con filtrado avanzado.
Parámetros:
project_id(string | number, optional): Filtrar por proyectostatus(string, optional): Estado (ej. "Open", "In Progress")priority(string, optional): Prioridadassignee_id(number, optional): Asignado a usuariosearch(string, optional): Búsqueda de textooffset(number, optional): Paginación
get_work_package
Obtiene detalles completos de un work package.
Parámetros:
work_package_id(number): ID del paquete de trabajo
get_work_package_activities
Obtiene el historial de cambios y comentarios.
Parámetros:
work_package_id(number): ID del paquete de trabajo
search_work_packages
Búsqueda de texto completo en paquetes de trabajo.
Parámetros:
query(string, required): Término de búsquedaproject_id(string | number, optional): Limitar a proyectostatus(string, optional): Filtrar por estadopriority(string, optional): Filtrar por prioridad
👤 Usuarios
list_users
Lista todos los usuarios en OpenProject.
Parámetros:
offset(number, optional): Paginación
get_user
Obtiene detalles de un usuario específico.
Parámetros:
user_id(number): ID del usuario
⏱️ Entradas de Tiempo
list_time_entries
Lista entradas de tiempo con filtrado por período, usuario, proyecto.
Parámetros:
work_package_id(number, optional): Filtrar por paquete de trabajouser_id(number, optional): Filtrar por usuarioproject_id(string | number, optional): Filtrar por proyectofrom_date(string, optional): Fecha inicial (YYYY-MM-DD)to_date(string, optional): Fecha final (YYYY-MM-DD)offset(number, optional): Paginación
get_time_entry
Obtiene detalles de una entrada de tiempo.
Parámetros:
time_entry_id(number): ID de la entrada de tiempo
✍️ Escritura (Crear Épicas e Historias de Usuario)
list_project_types
Lista los tipos de work package disponibles en un proyecto (Epic, User Story, Task, Bug...) con su ID. Úsala primero — los IDs de tipo varían entre instancias de OpenProject.
Parámetros:
project_id(string | number): ID o identificador del proyecto
create_work_package
Crea un work package (Épica, Historia de Usuario, Tarea, etc.). Usa parent_id para colgar una Historia de Usuario bajo su Épica.
Parámetros:
project_id(string | number)subject(string)description(string, optional, Markdown)type_id(number, optional): ID del tipo, obtenido conlist_project_typesparent_id(number, optional): ID de la Épica padrepriority_id,assignee_id,start_date,due_date(optional)
create_work_packages_bulk
Crea varios work packages en una sola llamada (ideal para subir todas las Historias de Usuario extraídas de un Word). Cada item puede tener su propio parent_id, así que historias de distintas épicas pueden crearse en la misma llamada. Devuelve un reporte por item (éxito/error), no aborta el lote completo si una falla.
Parámetros:
project_id(string | number)items(array, máx 100): cada uno con los mismos campos quecreate_work_package(menosproject_id)
📋 Flujo: Subir Épicas e Historias de Usuario desde Word
Caso de uso típico del equipo: tienen historias de usuario redactadas en .docx y necesitan cargarlas a OpenProject respetando la relación Épica → Historia.
- Genera tu API Token personal (cada developer usa el suyo, ver arriba) y configura tu
.envlocal. - Abre la conversación con Claude y adjunta o referencia el archivo
.docxcon las épicas/historias (Claude puede leerlo directamente). - Pide a Claude: "Lee este Word, identifica las épicas y sus historias de usuario, y súbelas al proyecto X de OpenProject".
- Claude normalmente hará, sin que tengas que orquestarlo manualmente:
list_project_typessobre el proyecto para saber eltype_idde Epic y de User Story.create_work_packagepara cada Épica (pocas, se hace una por una para tener sus IDs).create_work_packages_bulkpara las Historias de Usuario, usando elparent_idde la Épica correspondiente a cada una.
- Revisa el reporte final (qué se creó, qué falló) y corrige en OpenProject si hace falta.
Nota: el token necesita el permiso
edit_work_packages(ver sección de generación de token) para poder crear, no solo leer.
📊 Casos de Uso
1. Análisis de Proyectos
Claude: "Análiza todos los proyectos activos y resume cuáles tienen más work packages abiertos"
→ El servidor lista proyectos, luego itera para contar paquetes abiertos
2. Búsqueda de Tareas
Claude: "Busca todas las tareas sobre 'API' en estado 'In Progress' del proyecto BACKEND"
→ search_work_packages con query="API", status="In Progress", project_id="BACKEND"
3. Reporte de Tiempo
Claude: "¿Cuántas horas registró Juan en la última semana?"
→ list_time_entries con user_id=juan, from_date=última_semana
4. Estado del Proyecto
Claude: "Dame un resumen del proyecto FRONTEND: qué se completó, qué está en progreso y qué sigue"
→ get_project + list_work_packages con diferentes status
5. Auditoría de Cambios
Claude: "¿Quién cambió el estado del work package #123 y cuándo?"
→ get_work_package_activities para ver el historial
🏗️ Arquitectura
src/
├── index.ts # Entry point del servidor MCP
├── client/
│ └── openproject.ts # Cliente HTTP para OpenProject API
├── tools.ts # Registro e implementación de herramientas
├── schemas/
│ └── index.ts # Validación Zod de inputs
└── utils/
└── formatters.ts # Formatos de salida Markdown
🔐 Seguridad
- ✅ Autenticación Bearer Token (segura, no requiere credenciales en texto plano)
- ✅ Validación de inputs con Zod (previene inyecciones)
- ✅ Manejo de errores granular (no expone datos sensibles)
- ✅ TypeScript strict mode (previene errores de tipo)
- ⚠️ El token se almacena en
.env- NO comitas este archivo a git
🚨 Troubleshooting
"Authentication failed"
- Verifica que el token en
.enves válido - Regenera un token nuevo en OpenProject
"Connection error"
- Verifica que
OPENPROJECT_URLes accesible desde tu máquina - Si usas proxy/VPN, configura variables de entorno de proxy
"No projects found"
- Verifica que tu usuario tiene permisos para ver proyectos
- Verifica que existen proyectos en tu instancia
Server no inicia
npm run build
npm run dev
Revisa la salida de errores en la terminal.
📈 Próximas Mejoras
- [ ] Soporte para crear/editar work packages desde Claude
- [ ] Soporte para comentarios en work packages
- [ ] Integración con Gantt charts
- [ ] Webhooks para notificaciones en tiempo real
- [ ] Caché de datos para mejor performance
- [ ] Evaluaciones comprehensivas (SEP)
📦 Distribuir a tu equipo de desarrollo
Cada developer necesita su propia copia + su propio API Token (nunca compartir un token entre varias personas — las acciones quedan auditadas por usuario en OpenProject).
Opción recomendada: repo Git compartido
- Sube esta carpeta a un repositorio privado (GitHub org o el Gitea/GitLab de
linux.ie). No olvides que.envya está en.gitignore— nunca se sube. - Cada developer:
git clone <url-del-repo> cd openproject-mcp-server npm install npm run build cp .env.example .env - Cada uno genera su propio token (Administration → API & Webhooks → Personal Access Tokens, con permiso
edit_work_packagessi van a crear historias) y lo pega en su.env. - Cada uno lo agrega en Claude Code (Settings → MCP Servers → Add Local Server) apuntando a su
dist/index.jslocal.
Alternativa sin Git: carpeta comprimida
Si aún no quieres montar el repo, puedes compartir un .zip de la carpeta (excluyendo node_modules, dist y .env) y que cada dev haga npm install && npm run build localmente. Es la misma mecánica, solo cambia el medio de distribución — no requiere CI/CD porque no hay un servidor central que desplegar: el MCP corre en stdio en la máquina de cada developer.
Si más adelante lo corres como servidor remoto compartido
Si en vez de que cada dev lo corra localmente prefieres un único servidor (en linux.ie, por ejemplo) que todos consuman, ahí sí aplica CI/CD (build + deploy en cada push) y habría que migrar el transporte de stdio a HTTP. Es un salto de arquitectura mayor — dímelo si es el camino que quieres y lo planeamos aparte.
🤝 Contribuir
Este es un servidor MCP de código abierto. Para mejorar:
- Haz fork del repositorio
- Crea una rama para tu feature (
git checkout -b feature/mi-feature) - Commitea cambios (
git commit -am 'Agrego mi-feature') - Push a la rama (
git push origin feature/mi-feature) - Abre un Pull Request
📄 Licencia
MIT - Siéntete libre de usar, modificar y distribuir
💬 Soporte
Para reportar bugs, hacer preguntas o sugerencias:
- Abre un issue en el repositorio
- Consulta la documentación de MCP
- Revisa la documentación de OpenProject API
Creado con ❤️ para Integral de Empaques S.A.S.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。