Skip to main content
Glama

@neonexai/beebole-mcp

CI npm node License: MIT

MCP server que conecta Claude (Claude Code / Claude Desktop) con Beebole (control de horas) a través de su API GraphQL nueva — la de la app rediseñada app.beebole.com.

  • Endpoint: POST https://app.beebole.com/graphql

  • Auth: cabecera apikey: <API_KEY> (la key se obtiene en app.beebole.com → Settings → API).

  • Verificado e2e (2026-06-25) contra la API real: 18/18 checks de lectura y escritura (crear proyecto/tarea, fichar horas, editar, borrar, limpiar).

Dos transportes:

  • Local (stdio) — recomendado (GDPR): corre en el PC del cliente; su API key vive solo en su máquina y los datos no pasan por ningún servidor intermedio.

  • Remoto (HTTP, VPS) — centralizado; el token viaja por cabecera X-Beebole-Key en cada petición y no se almacena (stateless multi-tenant).


Arquitectura: híbrida (curadas + passthrough)

La API GraphQL nueva es enorme y fine-grained: 87 queries + 745 mutations (cada campo editable tiene su propia mutation). Exponer eso 1:1 saturaría a cualquier agente. Por eso el server combina dos capas:

A) ~24 tools curadas para el flujo real de un estudio:

Área

Tools

Identidad

beebole_whoami

Proyectos

beebole_list_projects, beebole_get_project, beebole_add_project

Tareas

beebole_list_tasks, beebole_get_task, beebole_add_task

Personas

beebole_list_persons, beebole_get_person, beebole_add_person

Fichaje de horas

beebole_list_time_records, beebole_count_time_records, beebole_add_time_record, beebole_edit_time_record, beebole_delete_time_records, beebole_clone_time_records

Timesheets

beebole_submit_timesheet, beebole_approve_timesheet, beebole_reject_timesheet

Catálogos

beebole_list_tags, beebole_list_absence_types

Informes

beebole_list_reports, beebole_run_report, beebole_planned_vs_real

B) 3 tools genéricas para cobertura del 100% de la API (las ~800 operaciones restantes de administración/configuración):

  • beebole_search_schema — descubre cualquier operación por palabra clave.

  • beebole_describe_operation — su firma completa (args + input objects + retorno).

  • beebole_graphql — ejecuta cualquier query/mutation cruda.

Flujo para algo sin tool curada: search → describe → graphql.

Notas de dominio (del propio schema)

  • Timestamps: BeeboleTimestamp = Unix epoch en milisegundos (> 1e10).

  • Duración de un time record: entero en minutos (ej. 90 = 1 h 30 min). Beebole lo interpreta según los time settings de la organización; confírmalo visualmente la primera vez.

  • Estados (status): d=draft, s=submitted, a=approved, r=rejected.

  • Color: índice de paleta 0-71. Ausencias: unidad day o hour.

  • addProject / addTask requieren categoryId o parentId (la API rechaza con NoCategoryOrParentProvided si no se da ninguno).


Related MCP server: timely-mcp-server

Requisitos en el PC

  • Node ≥ 18 instalado (para npx). No hay que instalar nada más: el server se descarga solo al arrancar con npx.

  • Una API key de Beebole (app.beebole.com → Settings → API).

  • Conexión a internet.

  • NO hace falta tener Beebole abierto ni instalado. Este MCP habla directamente con la API web de Beebole (app.beebole.com/graphql) usando la API key; funciona aunque no tengas Beebole abierto en el navegador.

Instalación (local · stdio · recomendado)

Publicado en npm como @neonexai/beebole-mcp. @latest trae siempre la última versión.

Opción 1 — con el comando de Claude Code (si tienes el CLI claude)

claude mcp add beebole -s user --env BEEBOLE_API_KEY=TU_API_KEY -- npx -y @neonexai/beebole-mcp@latest

-s user lo deja disponible en todos los proyectos de ese PC.

Opción 2 — sin CLI, editando la configuración a mano

Útil si usáis Claude Desktop o si el comando claude no existe en el equipo. Añade el bloque "beebole" dentro de mcpServers en el archivo de configuración y reinicia la app:

  • Claude Desktop → C:\Users\<usuario>\AppData\Roaming\Claude\claude_desktop_config.json (en la app: Settings → Developer → Edit Config).

  • Claude Code (config global de usuario) → C:\Users\<usuario>\.claude.json, bajo la clave raíz mcpServers.

{
  "mcpServers": {
    "beebole": {
      "command": "npx",
      "args": ["-y", "@neonexai/beebole-mcp@latest"],
      "env": { "BEEBOLE_API_KEY": "TU_API_KEY" }
    }
  }
}

Reinicia la app del todo (en Claude Desktop, ciérrala también desde el icono de la bandeja del sistema → Quit).

Si la app no encuentra npx (PATH), pon la ruta absoluta como command (en PowerShell: where.exe npx), con barras dobles \\ en el JSON. Alternativa sin npm (no auto-actualiza, npx cachea el clon): npx -y github:NeoNexAI/beebole-mcp.

Verifica la key antes (debe responder con tu nombre)

curl -s -H "apikey: TU_API_KEY" -H "Content-Type: application/json" \
  -X POST https://app.beebole.com/graphql \
  -d '{"query":"{ currentPerson{ id name email } }"}'

B) Despliegue para un equipo (plan Team)

No hay un “instalar para toda la organización” de un click para un MCP propio: cada equipo lo corre en local (stdio) con la API key correspondiente. Para estandarizarlo en varios PCs:

  • Misma cuenta Beebole de empresa → repartid la misma API key (cada PC la pone en su BEEBOLE_API_KEY; nunca en el repo).

  • Cada persona con su propio usuario Beebole → cada PC usa su API key (el server actúa siempre como esa persona).

  • Para fijar la config en un repo compartido, commitea un .mcp.json (scope project) sin la key y que cada entorno aporte BEEBOLE_API_KEY por variable de entorno. La key es un secreto: nunca se commitea.

Alternativa centralizada: desplegar el modo HTTP en el VPS (un solo sitio) y que cada cliente Claude apunte ahí enviando su token por X-Beebole-Key. Útil si no quieres instalar Node en cada PC; menos recomendable para datos GDPR sensibles.


Desarrollo

npm install
npm run build          # tsc → dist/  (incluye schema.json para selección/búsqueda)
npm run typecheck
BEEBOLE_API_KEY=... npm run smoke           # 9 checks de lectura e2e
BEEBOLE_API_KEY=... SMOKE_WRITE=1 npm run smoke   # + ciclo de escritura (SOLO cuenta de pruebas)

El smoke con SMOKE_WRITE=1 crea entidades ZZ_SMOKE_TEST_*, ficha, edita y borra todo al terminar; úsalo solo en una cuenta de pruebas.

Modo HTTP (VPS)

MCP_TRANSPORT=http PORT=8087 node dist/index.js
# POST /mcp con cabecera X-Beebole-Key: <token>   ·   GET /health

Estructura

src/
  index.ts    — entry point (stdio | HTTP)
  client.ts   — cliente GraphQL (auth apikey) + helpers de schema (selección/búsqueda/describe)
  tools.ts    — registro de las 27 tools (factoría buildServer(apiKey))
  smoke.ts    — test e2e contra la API real
schema.json   — introspección de la API (bundleada; potencia selección + search/describe)

Beebole API GraphQL — auth y endpoint verificados empíricamente 2026-06-25. Las funciones de Beebole evolucionan; reverificar en app.beebole.com ante cambios.


Licencia

MIT · NeoNexAI Agency — ver LICENSE. Reporte de seguridad: SECURITY.md.

Available Tools

27 tools
beebole_add_personCrear personaB

Da de alta una persona (usuario). roleId es obligatorio (ver roles de la organización).

Inputs: name (required), email (required), roleId (required), color.

beebole_add_projectCrear proyectoB

Crea un proyecto. color = índice de paleta 0-71.

Inputs: name (required), color, parentId, categoryId.

beebole_add_taskCrear tareaB

Crea una tarea (opcionalmente bajo un proyecto/padre y con estado/categoría).

Inputs: name (required), color, parentId, statusId, +1 more.

beebole_add_time_recordFichar horas (crear imputación)A

Crea una imputación de horas para una persona. duration en MINUTOS. startTime en epoch ms. Indica taskId (y opcionalmente projectIds) para tiempo, o absenceId para una ausencia. comment/nonBillable/wfh se aplican tras crear.

Inputs: personId (required), startTime (required), durationMinutes (required), wfh, +6 more.

beebole_approve_timesheetAprobar timesheetA

Aprueba un evento de aprobación de timesheet por su id (lo da getPendingApprovals / submit).

Inputs: id (required).

beebole_clone_time_recordsClonar imputaciones a otro periodoC

Copia los time records de una persona de un periodo origen a uno destino (epoch ms).

Inputs: personId (required), sourceEndTime (required), targetEndTime (required), sourceStartTime (required), +2 more.

beebole_count_time_recordsContar imputacionesA
Read-only

Cuenta los time records que casan el filtro (útil antes de listar rangos grandes).

Inputs: wfh, status, endTime, taskIds, +6 more.

beebole_delete_time_recordsBorrar imputacionesB
Destructive

Elimina uno o varios time records por id. Acción destructiva e irreversible.

Inputs: ids (required).

beebole_describe_operationDescribir una operaciónA
Read-only

Devuelve la firma completa de una query/mutation: argumentos, expansión de los input objects, scalars con sus valores permitidos y forma del tipo de retorno. Úsalo antes de llamar a beebole_graphql.

Inputs: name (required).

beebole_edit_time_recordEditar una imputaciónA

Modifica campos de un time record existente. Pasa solo los que quieras cambiar: comment, durationMinutes, startTime, endTime, taskId, projectIds, nonBillable, wfh.

Inputs: id (required), wfh, taskId, comment, +5 more.

beebole_get_personDetalle de una personaA
Read-only

Devuelve una persona por id con detalle (rol, organización, ajustes).

Inputs: id (required).

beebole_get_projectDetalle de un proyectoA
Read-only

Devuelve un proyecto por id con detalle (categoría, padre, managers, budgets).

Inputs: id (required).

beebole_get_taskDetalle de una tareaA
Read-only

Devuelve una tarea por id con detalle.

Inputs: id (required).

beebole_graphqlEjecutar GraphQL crudoA
Destructive

Ejecuta una query o mutation GraphQL arbitraria contra Beebole (cobertura total de la API). Pasa el documento en query y opcionalmente variables. Para operaciones sin tool curada, descúbrelas con beebole_search_schema + beebole_describe_operation. Puede modificar datos: úsalo con cuidado.

Inputs: query (required), variables.

beebole_list_absence_typesListar tipos de ausenciaB
Read-only

Lista los tipos de ausencia (vacaciones, baja, etc.) con su unidad (día/hora).

Inputs: archived.

beebole_list_personsListar personasB
Read-only

Lista las personas (usuarios) de la organización, con filtros opcionales.

Inputs: name, roleId, tagIds, archived.

beebole_list_projectsListar proyectosA
Read-only

Lista proyectos con filtros opcionales. Sin filtros devuelve los proyectos de nivel raíz activos.

Inputs: name, tagIds, archived, categoryId, +2 more.

beebole_list_reportsListar informes guardadosA
Read-only

Lista los informes definidos en la cuenta (para ejecutarlos con beebole_run_report).

Inputs: no named parameters.

beebole_list_tagsListar tags/gruposB
Read-only

Lista los tags (grupos jerárquicos) usados para clasificar personas/proyectos/tareas.

Inputs: name, archived, categoryId.

beebole_list_tasksListar tareasA
Read-only

Lista tareas con filtros (proyecto, estado, responsable, persona asignada, categoría, rango).

Inputs: name, endTime, ownerId, archived, +5 more.

beebole_list_time_recordsListar imputaciones de horasA
Read-only

Lista los time records (horas/ausencias fichadas) en un rango con filtros por persona, proyecto, tarea o estado. Pasa startTime/endTime (epoch ms) para acotar.

Inputs: wfh, status, endTime, taskIds, +6 more.

beebole_planned_vs_realInforme planificado vs realA
Read-only

Compara horas planificadas vs reales en un rango (epoch ms). Útil para seguimiento de presupuesto de proyecto. Filtra por proyecto/persona vía filters.

Inputs: endTime (required), startTime (required), filters, periodSplit, +1 more.

beebole_reject_timesheetRechazar timesheetB
Destructive

Rechaza un timesheet en una etapa concreta con un comentario obligatorio.

Inputs: id (required), stage (required), comment (required).

beebole_run_reportEjecutar un informe guardadoA
Read-only

Ejecuta un informe guardado por id y devuelve sus filas. Hace polling si el informe es asíncrono (campo pending). period/filters son opcionales para sobrescribir el rango.

Inputs: id (required), period, filters.

beebole_search_schemaBuscar operaciones en la APIA
Read-only

Descubre cualquiera de las 87 queries + 745 mutations de Beebole por palabra clave (nombre o descripción). Úsalo cuando no haya una tool curada para lo que necesitas; luego beebole_describe_operation y beebole_graphql.

Inputs: keyword (required), limit.

beebole_submit_timesheetEnviar timesheet a aprobaciónB

Envía el timesheet de una persona para un periodo (epoch ms) al flujo de aprobación.

Inputs: endTime (required), personId (required), startTime (required).

beebole_whoamiQuién soy + organizaciónA
Read-only

Devuelve la persona autenticada por la API key (id, nombre, email, rol) y su organización. Empieza por aquí para conocer tu propio personId y el contexto de la cuenta.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 27 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action (e.g., adding, listing, getting, editing, deleting). Even close pairs like add_time_record and edit_time_record are clearly separated by operation. The generic tools (graphql, describe_operation, search_schema) serve a unique meta-purpose.

    Naming Consistency5/5

    All tool names follow a consistent 'beebole_verb_noun' pattern (beebole_add_person, beebole_list_projects, etc.). Verbs are standard (add, list, get, edit, delete, approve, etc.) and nouns are singular/plural as appropriate. No mixing of conventions.

    Tool Count5/5

    27 tools is appropriate for a comprehensive API covering persons, projects, tasks, time records, absences, reports, and approvals, plus schema discovery and GraphQL access. The count is not excessive given the domain's breadth.

    Completeness5/5

    The curated tools cover core CRUD for time records and listing for other entities. While some operations (update/delete for persons, projects, tasks) are missing from curated tools, the inclusion of beebole_graphql and schema discovery tools (search_schema, describe_operation) provides complete coverage of the entire Beebole API.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers