Mcp Reportia

io.github.javalenciacai由 GitHub 帳號 javalenciacai 發布v0.3.2更新於 Oct 24, 2026

Reportia HTTP API as 66 curated MCP tools (accounting, mappings, SIIGO).

概覽

AI 產生的概覽

將 Reportia 會計 HTTP API 包裝成 66 個工具,讓助理讀取和修改公司、會計傳票、對應設定、發票及 SIIGO 資料。

可以做什麼
檢查健康狀態、辨識目前登入使用者並登出 Reportia 工作階段;列出公司並讀取或修改其設定,啟用公司需明確確認;列出會計傳票、匯出為 Excel 或 PDF,並在確認後刪除全部傳票;管理科目對應、搜尋科目代碼、列出佣金報表並匯出為 Excel;依清單、搜尋、NIT 或應收餘額查詢第三方;管理業務員與發票對應、發票設定並以電子郵件寄送發票;管理行-組與成本中心對應及成本中心報表的完整生命週期,包括執行、複製和匯出;讀取上傳歷史、佇列與
適用情境
當助理需要操作 Reportia 會計系統時使用:檢視傳票、對應設定、發票、第三方或成本中心報表,或進行受控修改,例如建立對應、寄送發票。適合已在使用 Reportia、希望以對話方式存取其資料的團隊。
執行需求
透過 npx 在本機執行,需要 Node.js 20 或更新版本及 npm 9 或更新版本。必須設定 REPORTIA_BASE_URL。認證需且僅需一種方式:REPORTIA_TOKEN、REPORTIA_EMAIL 加 REPORTIA_PASSWORD,或預先簽發的 REPORTIA_COOKIE。選用設定包括 REPORTIA_COMPANY_ID、REPORTIA_DOWNLOAD_DIR、REPORTIA_TIMEOUT_MS、REPORTIA_MAX_DOWNLOAD_BYTES 和 REPORTIA_USER_AGENT。需要能存取 Reportia API 的網路。
安裝前請注意
需要 Reportia 憑證:REPORTIA_TOKEN、REPORTIA_PASSWORD 或 REPORTIA_COOKIE,應設定在 MCP 用戶端的環境中,切勿提交到程式碼庫。許多工具會寫入或刪除資料,包括刪除全部會計傳票、刪除對應設定和報表、修改公司設定以及啟用公司;破壞性工具需將 confirm 設為 true,助理應先取得使用者同意。寄送發票會透過 Reportia 發出真實郵件。匯出檔案會寫入本機或

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mcp Reportia,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

mcp-reportia

[MCP Registry] [skills.sh] [npm] [License: MIT]

Servidor MCP (Model Context Protocol) independiente que envuelve la API HTTP real de Reportia y la expone a través del transporte stdio con JSON-RPC newline-delimited. Pensado para ser consumido por clientes MCP (Claude Desktop, Cursor, Hermes Agent, otros) con un único npx, sin ejecutar código de servidor propio.

Esta capa no contiene lógica de negocio ni secretos propios: actúa como traductor entre el protocolo MCP y los endpoints REST de Reportia. Las credenciales se inyectan desde variables de entorno.


Índice


Dónde está indexado

Este servidor MCP está publicado y discoverable en:

PlataformaURLFormato
MCP Registry oficial (modelcontextprotocol.io)io.github.javalenciacai/mcp-reportiaserver.json
npm registry@james.valencia/mcp-reportianpm package
skills.sh (Agent Skills Directory)javalenciacai/mcp-reportiaskills/reportia-mcp-usage/SKILL.md

Instalación via skills.sh:

bash
npx skills add javalenciacai/mcp-reportia --skill reportia-mcp-usage

Flujo de release

Este repo publica automáticamente a npm y al MCP Registry oficial cuando se pushea un tag v* a main. La indexación en skills.sh es automática (scrapeo de GitHub).

Configuración inicial (una sola vez)

Opción elegida: npm Trusted Publishing (OIDC)

La configuración vive en la página del paquete (no en /settings/james.valencia/security — esa URL es para tokens tradicionales).

  1. Abre https://www.npmjs.com/package/@james.valencia/mcp-reportia/settings (logueado como james.valencia en el navegador).

  2. En la sección "Trusted Publisher", click en "Add a trusted publisher" (o "GitHub Actions" según el wording de tu versión de npmjs.com).

  3. Completa el formulario con estos valores exactos (la doc oficial los lista así):

    CampoValor
    ProviderGitHub Actions
    Organization or userjavalenciacai
    Repositorymcp-reportia
    Workflow filenamepublish.yml (solo el nombre, sin la ruta .github/workflows/)
    Environment name(vacío) — el workflow no usa GitHub Environments
    Allowed actionsnpm publish (al menos uno)
  4. Click "Add" o "Save". npm NO valida la configuración al guardar, pero el workflow fallará en runtime si los datos no coinciden exactamente.

Subir el workflow a Node 24 (necesario para Trusted Publishing)

Trusted Publishing requiere npm >= 11.5.1, que viene incluido en Node.js 24. El workflow actual usa Node 22 (npm 10.9) — fallará con ENEEDAUTH aunque el publisher esté bien configurado.

Lo que voy a hacer yo cuando confirmes el paso 1: actualizar el workflow a Node 24, hacer commit, re-crear el tag v0.1.2 apuntando al nuevo commit, re-disparar el publish.

Verificación rápida de que está bien

Re-dispara manualmente el workflow y mira el log del job publish-npm:

bash
gh workflow run Publish --ref v0.1.2gh run watch --exit-status

Si dice OK: @james.valencia/[email protected] publicado en el último step, está funcionando. Si vuelve a fallar, mandame el output del step "Publish" (sin el token).

Estado actual de los requisitos
PlataformaRequisitoEstado
npm Trusted PublishingConfigurar publisher en /package/@james.valencia/mcp-reportia/settings con javalenciacai/mcp-reportia + publish.ymlTu turno
Workflow Node 24Subir a Node 24 (lo hago yo tras tu confirmación)Pendiente
MCP RegistryNinguno — usa github-oidc que firma el workflow automáticamenteListo
skills.shNinguno — scraping automáticoListo
GitHub ReleasePermiso contents: write ya configurado en el workflowListo

Plan al terminar tu paso 1

Voy a ejecutar en este orden (no requiere tu input):

  1. Cambiar node-version: '22' → '24' en ambos jobs del workflow publish
  2. Verificar con npm test && npm run build local
  3. Commit + push
  4. Re-crear el tag v0.1.2 apuntando al nuevo commit
  5. Observar el workflow Publish hasta publish-npm exitoso
  6. Reportarte el resultado final (versión en npm + GitHub Release creado)

Hacer un release

bash
# 1. Bump de version (esto actualiza package.json y server.json automaticamente)cd /c/james/mcp-reportianpm version patch    # 0.1.1 -> 0.1.2 (o minor/major)
# 2. Push del commit + tag a GitHubgit push origin main --follow-tags# (npm version ya crea el tag v0.1.2 y lo pushea junto con el commit)

GitHub Actions se dispara automáticamente:

  1. Job validate — typecheck + test + build + smoke. Verifica que package.json.version y server.json.version coincidan con el tag.
  2. Job publish-npm — publica a npm via OIDC (sin tokens de larga duración).
  3. Job publish-mcp-registry — publica server.json al MCP Registry oficial.
  4. Job release — crea un GitHub Release con notas auto-generadas.

Publicar manualmente (sin tag)

Si necesitas un release fuera del flujo normal, ve a GitHub → Actions → "Publish" → "Run workflow" y opcionalmente pasa un version override.

Rollback

Si necesitas revertir una versión publicada a npm (dentro de 72h):

bash
npm unpublish @james.valencia/[email protected]

Después de 72h no es posible; debes publicar un patch. El MCP Registry no soporta rollback; hay que publicar una versión superior con la corrección.


Instalación y uso rápido

Una vez publicado, el consumo típico es vía npx:

bash
# 1) Construir dist/ localmente (la primera vez, o al actualizar):npm run build
# 2) Ejecutar el binario MCP directamente:npx mcp-reportia

Los clientes MCP (Claude Desktop, Cursor, Hermes, etc.) lo invocan por ti como subproceso. No necesitas ejecutarlo a mano salvo para depurar.


Variables de entorno

VariableObligatoriaDescripción
REPORTIA_BASE_URLSíURL raíz de la API de Reportia, sin barra final (p.ej. https://reportia.example.com).
REPORTIA_TOKENCondicional*Token Bearer. Alternativa al login por sesión.
REPORTIA_COOKIECondicional*Cookie de sesión Reportia pre-emitida (p.ej. connect.sid=s%3A...). Para callers que ya tienen la sesión del usuario resuelta y quieren que el child autentique como ese usuario sin re-login.
REPORTIA_EMAILCondicional*Email para login por sesión (cookie).
REPORTIA_PASSWORDCondicional*Contraseña para login por sesión (cookie).
REPORTIA_COMPANY_IDNocompanyId por defecto cuando la tool lo admita. Acepta entero positivo.
REPORTIA_TIMEOUT_MSNo (def. 30000)Timeout por petición HTTP en ms.
REPORTIA_DOWNLOAD_DIRNo (def. ./downloads)Carpeta donde se guardan los binarios descargados (Excel/PDF exportados).
REPORTIA_USER_AGENTNo (def. mcp-reportia/0.1.0)Cabecera User-Agent en cada request.

* Exactamente una de las tres alternativas de auth debe estar presente:

  • REPORTIA_TOKEN Bearer, o
  • REPORTIA_EMAIL + REPORTIA_PASSWORD sesión cookie (el package hace POST /api/auth/login y captura la cookie), o
  • REPORTIA_COOKIE sesión cookie pre-emitida (el package la usa directo, sin re-login).

Si pasás REPORTIA_TOKEN y REPORTIA_COOKIE a la vez, loadConfig lanza ConfigError con el mensaje REPORTIA_TOKEN y REPORTIA_COOKIE son mutuamente excluyentes — usa solo uno. para evitar que un token accidental sobreescriba una sesión per-user.

Precedencia cuando se establece una sola: cookie > bearer > session. cookie gana porque es la que matchea la identidad resuelta upstream; bearer es service-account; session es email+password login (el child se loguea a sí mismo).

Si no se establece ninguna, loadConfig lanza ConfigError al arrancar el servidor.

⚠️ No copies credenciales de C:\james\Reportia\.env a este repositorio. Este proyecto no debe contener secretos. Configúralas en el entorno del cliente MCP que lo invoque.

Revisa .env.example para ver todas las variables.


Configuración en clientes MCP

Claude Desktop (%APPDATA%\Claude\claude_desktop_config.json)

Añade una entrada dentro de mcpServers:

jsonc
{  "mcpServers": {    "reportia": {      "command": "npx",      "args": ["-y", "mcp-reportia"],      "env": {        "REPORTIA_BASE_URL": "https://reportia.example.com",        "REPORTIA_TOKEN": "<tu-token>",        "REPORTIA_COMPANY_ID": "123"      }    }  }}

Sustituye mcp-reportia por la ruta local C:\\james\\mcp-reportia durante desarrollo, con args: ["-y", "--prefix", "C:\\james\\mcp-reportia", "mcp-reportia"] o ejecutando npm run start como comando directo.

Cursor (%USERPROFILE%\.cursor\mcp.json)

jsonc
{  "mcpServers": {    "reportia": {      "command": "npx",      "args": ["-y", "mcp-reportia"],      "env": {        "REPORTIA_BASE_URL": "https://reportia.example.com",        "REPORTIA_TOKEN": "<tu-token>"      }    }  }}

Hermes Agent (plugin MCP vía ~/.hermes/config.toml o UI)

Añade un servidor MCP stdio de nombre reportia apuntando a npx mcp-reportia y exporta las variables en env.

Formato típico:

toml
[[mcp_servers]]name = "reportia"command = "npx"args = ["-y", "mcp-reportia"][mcp_servers.env]REPORTIA_BASE_URL = "https://reportia.example.com"REPORTIA_TOKEN    = "<tu-token>"REPORTIA_COMPANY_ID = "123"

El nombre exacto del campo varía según la versión de Hermes. Consulta hermes mcp --help.

Caller que ya tiene la sesión del usuario (per-user, recomendado para servidores AI)

Cuando el caller (p.ej. un servidor AI multi-tenant) ya resolvió la sesión de Reportia del usuario activo y quiere que el child autentique como ese mismo usuario — sin re-login y sin service-account — pasale la cookie pre-emitida:

jsonc
{  "mcpServers": {    "reportia": {      "command": "npx",      "args": ["-y", "mcp-reportia"],      "env": {        "REPORTIA_BASE_URL": "https://reportia.example.com",        "REPORTIA_COOKIE": "connect.sid=s%3A<session-id-from-resolved-user>",        "REPORTIA_COMPANY_ID": "123"      }    }  }}

El child NO va a llamar a /api/auth/login (se salta ese paso), NO va a llamar a /api/auth/logout al cerrar (la sesión es del caller, no del child), y va a hacer todas las requests Reportia con la identidad del usuario resuelto. Si el caller está corriendo detrás de un relay que captura la cookie del usuario en runtime (p.ej. la session-derived path del Cowork server), este es el modo de auth que se alinea con ese flujo.


Herramientas disponibles

El servidor expone 66 herramientas con el prefijo reportia_. Todas devuelven JSON (string con JSON.stringify pretty-print) y validan su input con Zod. Se agrupan por dominio funcional:

DominioMóduloCantidad
Salud y autenticaciónsrc/tools/auth-health.ts3
Empresassrc/tools/companies.ts5
Movimientos contablessrc/tools/accounting-movements.ts4
Mapeo de cuentassrc/tools/account-mappings.ts5
Reportes de comisionessrc/tools/commission-reports.ts2
Tercerossrc/tools/third-parties.ts4
Vendedor × facturasrc/tools/salesperson-invoice.ts11
Línea × centro de costosrc/tools/line-cost-center.ts22
Operaciones (uploads, colas, SIIGO)src/tools/operations.ts10
Total66

Salud y autenticación (src/tools/auth-health.ts)

ToolDescripción
reportia_healthDiagnóstico del cliente MCP + ping a GET /api/health.
reportia_whoamiPerfil del usuario autenticado (GET /api/auth/me).
reportia_logoutCierra la sesión contra Reportia (POST /api/auth/logout).

Empresas (src/tools/companies.ts)

ToolTipoDescripción
reportia_companies_listListadoLista empresas accesibles (GET /api/companies).
reportia_company_getDetalleDetalle de una empresa (GET /api/companies/:id).
reportia_company_settings_getConfiguraciónSettings de empresa (GET /api/companies/:id/settings).
reportia_company_settings_updateMutaciónPatch de settings (PATCH /api/companies/:id/settings).
reportia_company_activate ⚠️DestructivaActiva empresa (POST /api/companies/:id/activate). Requiere confirm:true.

Movimientos contables (src/tools/accounting-movements.ts)

ToolTipoDescripción
reportia_movements_listListadoLista movimientos con filtros y paginación.
reportia_movements_export_excelDescarga binariaExporta movimientos a Excel y devuelve ruta local.
reportia_movements_export_pdfDescarga binariaExporta movimientos a PDF y devuelve ruta local.
reportia_movements_delete_all ⚠️DestructivaElimina todos los movimientos de la empresa. Requiere confirm:true.

Mapeo de cuentas (src/tools/account-mappings.ts)

ToolTipoDescripción
reportia_account_mappings_listListadoLista mapeos contables (GET /api/companies/:companyId/account-mappings).
reportia_account_mapping_createMutaciónCrea un mapeo (POST /api/account-mappings).
reportia_account_mapping_updateMutaciónActualiza un mapeo (PATCH /api/account-mappings/:mappingId).
reportia_account_mapping_delete ⚠️DestructivaElimina un mapeo (DELETE /api/account-mappings/:mappingId). Requiere confirm:true.
reportia_account_codes_searchBúsquedaBusca códigos contables para autocompletar (GET /api/companies/:companyId/account-codes/search).

Reportes de comisiones (src/tools/commission-reports.ts)

ToolTipoDescripción
reportia_commission_listListadoLista cálculos de comisión (GET /api/commission-reports).
reportia_commission_export_excelDescarga binariaExporta reporte de comisiones a Excel.

Terceros (src/tools/third-parties.ts)

ToolTipoDescripción
reportia_third_parties_listListadoLista terceros (clientes/proveedores).
reportia_third_parties_searchBúsquedaBúsqueda avanzada de terceros.
reportia_third_parties_get_by_nitDetalleObtiene un tercero por NIT.
reportia_third_parties_portfolio_balanceResumenBalance de cartera por tercero.

Vendedor × factura (src/tools/salesperson-invoice.ts)

Mapeos vendedor → factura, opciones de vendedor, listados de facturas, settings de factura y envío de facturas (email individual y masivo).

ToolTipoDescripción
reportia_salesperson_mappings_listListadoLista mapeos vendedor × factura de una empresa.
reportia_salesperson_mapping_createMutaciónCrea un mapeo vendedor × factura.
reportia_salesperson_mapping_updateMutaciónActualiza un mapeo vendedor × factura.
reportia_salesperson_mapping_delete ⚠️DestructivaElimina un mapeo vendedor × factura. Requiere confirm:true.
reportia_salesperson_options_listListadoLista opciones de vendedor para selección / autocompletar.
reportia_invoices_listListadoLista facturas con filtros.
reportia_invoice_settings_getConfiguraciónLee la configuración de factura de una empresa.
reportia_invoice_settings_createMutaciónCrea la configuración de factura.
reportia_invoice_settings_updateMutaciónActualiza la configuración de factura.
reportia_invoice_email_sendNotificaciónEnvía una factura por email (servidor Reportia dispara el envío).
reportia_invoices_send_multipleNotificaciónEnvía varias facturas por email en una sola llamada.

Línea × centro de costo (src/tools/line-cost-center.ts)

Dominio más extenso: gestiona mapeos línea-grupo, mapeos centro de costo, centros de costo disponibles, y todo el ciclo de vida de los reportes de centro de costo (CRUD + ejecutar + duplicar + exportes).

ToolTipoDescripción
reportia_line_group_mappings_listListadoLista mapeos línea-grupo.
reportia_line_group_mapping_createMutaciónCrea un mapeo línea-grupo.
reportia_line_group_mapping_updateMutaciónActualiza un mapeo línea-grupo.
reportia_line_group_mapping_delete ⚠️DestructivaElimina un mapeo línea-grupo. Requiere confirm:true.
reportia_line_group_suggestions_lines_groupsSugerenciasSugerencias de líneas-grupo para autocompletar.
reportia_line_group_suggestions_by_typeSugerenciasSugerencias de líneas-grupo filtradas por tipo.
reportia_line_group_descriptionDetalleDescripción legible de un mapeo línea-grupo.
reportia_cost_center_mappings_listListadoLista mapeos centro de costo.
reportia_cost_center_mapping_createMutaciónCrea un mapeo centro de costo.
reportia_cost_center_mapping_updateMutaciónActualiza un mapeo centro de costo.
reportia_cost_center_mapping_delete ⚠️DestructivaElimina un mapeo centro de costo. Requiere confirm:true.
reportia_cost_center_mappings_suggestionsSugerenciasSugerencias de mapeos centro de costo.
reportia_cost_centers_availableListadoCentros de costo disponibles para una empresa.
reportia_cost_center_reports_listListadoLista reportes de centro de costo.
reportia_cost_center_report_getDetalleDetalle de un reporte de centro de costo.
reportia_cost_center_report_createMutaciónCrea un reporte de centro de costo.
reportia_cost_center_report_updateMutaciónActualiza un reporte de centro de costo.
reportia_cost_center_report_delete ⚠️DestructivaElimina un reporte de centro de costo. Requiere confirm:true.
reportia_cost_center_report_executeEjecuciónEjecuta un reporte de centro de costo.
reportia_cost_center_report_duplicateMutaciónDuplica un reporte de centro de costo (alias: copia).
reportia_cost_center_report_export_excelDescarga binariaExporta el resultado del reporte a Excel.
reportia_cost_center_report_export_pdfDescarga binariaExporta el resultado del reporte a PDF.

Operaciones (src/tools/operations.ts) — uploads, colas y SIIGO

Todas las tools de este módulo son read-only: historial/estado de uploads, salud del sistema de colas y de los workers, y herramientas de consulta sobre SIIGO (settings, clientes, corridas, trazas, schedules, historial). No hay tools de mutación, de subida multipart/form-data, ni de control de colas en esta versión.

ToolTipoDescripción
reportia_uploads_history_listListadoHistorial de uploads de una empresa (GET /api/companies/:companyId/upload-history).
reportia_upload_status_getDetalleEstado de un upload específico (GET /api/upload/:uploadId/status).
reportia_health_queue_systemDiagnósticoSalud del sistema de colas (GET /api/health/queue-system).
reportia_health_workersDiagnósticoSalud de los workers y lag de la cola (GET /api/queue/workers/health).
reportia_siigo_settings_getConfiguraciónSettings SIIGO Pyme de una empresa (GET /api/companies/:companyId/siigo-settings).
reportia_siigo_clients_listListadoClientes remotos SIIGO disponibles para una empresa (GET /api/companies/:companyId/siigo/clients).
reportia_siigo_sync_runs_listListadoCorridas de sincronización SIIGO (GET /api/companies/:companyId/siigo/sync/runs).
reportia_siigo_run_trace_getDetalleTrazabilidad de una corrida SIIGO (GET /api/companies/:companyId/siigo/sync/runs/:runId/trace).
reportia_siigo_schedules_listListadoSchedules de sincronización SIIGO (GET /api/companies/:companyId/siigo/schedules).
reportia_siigo_history_getHistorialHistorial de comandos SIIGO (GET /api/companies/:companyId/siigo/history).

⚠️ Las tools marcadas como Destructiva requieren el parámetro { "confirm": true } en su input. Si no se envía, el handler valida con assertConfirmed(input, '<tool-name>') (definido en src/tool-base.ts) y devuelve un error con code: "GUARD_REJECTED" antes de cualquier llamada HTTP. El LLM debe pedir confirmación explícita al usuario antes de invocarlas.

companyId puede omitirse si configuraste REPORTIA_COMPANY_ID; en caso contrario, es obligatorio en todas las tools que tocan datos por empresa.


Limitaciones conocidas

  • Sin HTTP streaming / SSE: este servidor solo habla stdio. Clientes que solo soporten HTTP no pueden consumirlo directamente.
  • Una sola ReportiaClient por proceso: el login es lazy y global; no se admite multi-cuenta simultánea.
  • Subida de archivos (multipart/form-data): el cliente HTTP está preparado (FormData desde undici) pero las tools actuales no exponen endpoints de upload (no hay POST/PUT con multipart/form-data). Sí se exponen dos tools read-only sobre el histórico y estado de uploads existentes: reportia_uploads_history_list (GET /api/companies/:companyId/upload-history) y reportia_upload_status_get (GET /api/upload/:uploadId/status). Si Reportia añade en el futuro endpoints de carga, basta con añadir un ToolDefinition que use ctx.client.call(..., { formData }).
  • Sin caché persistente: cada invocación vuelve a llamar a la API. El LLM debe sentirse libre de hacer tools/list cuando lo necesite.
  • Errores HTTP: se traducen a tipos estructurados (AUTH_ERROR, NOT_FOUND, VALIDATION_ERROR, ROW_LIMIT_EXCEEDED, NETWORK_ERROR, TIMEOUT). El cliente nunca expone secretos en el mensaje.
  • Smoke test offline: npm run test:smoke arranca el servidor con REPORTIA_BASE_URL=http://127.0.0.1:9 (puerto cerrado). No hace llamadas reales; solo valida el handshake MCP. Para pruebas integradas reales, usa npm run test:integration apuntando a un servidor Reportia accesible.
  • Sin reintentos automáticos: ante 5xx el servidor reporta error; el LLM puede reintentar manualmente.

Seguridad

El servidor está diseñado para minimizar superficie de ataque cuando es invocado por un LLM:

  • No hay herramienta HTTP genérica: las tools son curadas por dominio (66 endpoints específicos). El LLM no puede apuntar el cliente a una URL arbitraria ni a una IP interna.
  • Validación Zod en cada input: ningún handler llega a la red sin antes pasar por un esquema que rechaza tipos, rangos y formatos inválidos.
  • Tools destructivas requieren confirm: true literal: se declaran con destructive: true y verifican con assertConfirmed(...) antes de cualquier llamada HTTP. Si falta confirm, devuelven GUARD_REJECTED sin tocar la API. El LLM debe pedirle al usuario confirmación explícita antes de invocarlas.
  • Interpolación segura en URLs: los IDs numéricos (companyId, mappingId, reportId, runId, uploadId) son validados como z.number().int().positive() antes de la interpolación. Los strings de path (NIT, invoiceId, mappingId de líneas/centros) usan encodeURIComponent y/o se restringen a un alfabeto seguro ([A-Za-z0-9-]+ para NITs).
  • Cabeceras HTTP saneadas: el User-Agent configurable vía REPORTIA_USER_AGENT se sanitiza contra CRLF (header injection) en src/client.ts:sanitizeUserAgent.
  • Sin secretos en logs: los mensajes de error exponen el endpoint y el código HTTP, pero nunca el token, la cookie, la contraseña ni el cuerpo completo del body. La cookie connect.sid se mantiene en memoria del cliente y nunca aparece en respuestas JSON.
  • Login con cookie persistente: el modo sesión reutiliza la cookie connect.sid recibida de /api/auth/login y la rota solo si Reportia la renueva; nunca se escribe a disco.
  • Tests de regresión de seguridad (tests/security.test.ts): 16 tests que verifican que ninguna tool destructiva omite confirm, que ningún esquema acepta inputs peligrosos, y que el orden de guards (resolveCompanyId → assertConfirmed) prefiere errores informativos sobre GUARD_REJECTED cuando el problema es de configuración.

Rutas cubiertas y omitidas

Cubiertas (tools/)

EndpointTool
GET /api/healthreportia_health
GET /api/auth/mereportia_whoami
POST /api/auth/logoutreportia_logout
GET /api/companiesreportia_companies_list
GET /api/companies/:idreportia_company_get
GET /api/companies/:id/settingsreportia_company_settings_get
PATCH /api/companies/:id/settingsreportia_company_settings_update
POST /api/companies/:id/activatereportia_company_activate
GET /api/accounting-movements (con filtros)reportia_movements_list
GET /api/accounting-movements/export/excelreportia_movements_export_excel
GET /api/accounting-movements/export/pdfreportia_movements_export_pdf
DELETE /api/accounting-movementsreportia_movements_delete_all
GET/POST/PATCH/DELETE /api/account-mappings/...reportia_account_mapping_*
GET /api/account-codes/searchreportia_account_codes_search
GET /api/commission-reportsreportia_commission_list
GET /api/commission-reports/export/excelreportia_commission_export_excel
GET /api/third-partiesreportia_third_parties_list
GET /api/third-parties/searchreportia_third_parties_search
GET /api/third-parties/by-nit/:nitreportia_third_parties_get_by_nit
GET /api/third-parties/portfolio-balancereportia_third_parties_portfolio_balance

Omitidas (fuera de alcance de esta versión)

  • Login por sesión desde una tool (no se necesita: ya se hace lazy desde ReportiaClient).
  • Cualquier endpoint de subida (multipart/form-data) — la superficie se limita a GET /api/companies/:companyId/upload-history y GET /api/upload/:uploadId/status (read-only).
  • Endpoints administrativos internos que requieren scopes no documentados públicamente.
  • Versionado antiguo (/api/v0/*).

⚠️ Esta tabla refleja la superficie actual de src/tools/*.ts. Antes de añadir rutas nuevas, edita src/tools/<modulo>.ts, re-exporta en src/tools/index.ts y corre npm run typecheck && npm test.


Desarrollo local

Requisitos:

  • Node.js ≥ 20
  • npm ≥ 9
bash
# 1) Instalar dependenciasnpm install
# 2) Compilar TypeScript a dist/npm run build
# 3) Verificar tipos sin emitirnpm run typecheck
# 4) Ejecutar el servidor (lee dist/server.js, stdio)npm run start

Los tests no requieren Reportia levantada ni credenciales; usan entorno sintético.


Pruebas

bash
# Suite unitaria (Vitest) — sin red, sin credencialesnpm test
# Smoke de protocolo MCP sobre stdio (sin credenciales reales)npm run test:smoke
# Smoke de integracion contra un servidor Reportia REAL# (configura REPORTIA_BASE_URL y REPORTIA_TOKEN en tu entorno antes).npm run buildREPORTIA_BASE_URL=https://reportia.example.com \REPORTIA_TOKEN=<tu-token> \  npm run test:integration

El smoke test (scripts/jsonrpc-smoke.mjs) lanza dist/server.js como subproceso, le envía initialize + tools/list por JSON-RPC newline-delimited y verifica que la respuesta contenga al menos una herramienta. No realiza llamadas HTTP contra Reportia (apunta a 127.0.0.1:9).

El test de integración (scripts/integration-smoke.mjs) sí habla con un servidor Reportia real: hace initialize, tools/list, llama a reportia_health (que hace ping a /api/health) y a reportia_whoami (que debe devolver AUTH_ERROR con un token inválido para validar el manejo de errores). Útil para verificar que la versión desplegada sigue siendo compatible con el backend real.

Si solo quieres validar que la build no está rota:

bash
npm test -- --passWithNoTests

Inspección con MCP Inspector

bash
npm run inspect

Esto ejecuta npx @modelcontextprotocol/inspector node dist/server.js, que abre una UI web para enviar manualmente los métodos del protocolo (initialize, tools/list, tools/call, etc.).


Arquitectura interna

src/├── server.ts               # Arranca McpServer + StdioServerTransport y registra tools.├── config.ts               # Carga y valida env vars (Zod). Tres auth modes: bearer / session / cookie.├── client.ts               # Cliente HTTP sobre undici. Bearer, sesión cookie propia, o cookie pre-emitida.├── errors.ts               # Jerarquía ReportiaError.├── tool-base.ts            # Helpers: ToolDefinition, ok/fail, resolveCompanyId, assertConfirmed.└── tools/    ├── index.ts            # allTools = union de los modulos.    ├── auth-health.ts      # reportia_health / whoami / logout.    ├── companies.ts        # reportia_companies_*.    ├── accounting-movements.ts  # reportia_movements_*.    ├── account-mappings.ts # reportia_account_mapping_* y account_codes_search.    ├── commission-reports.ts # reportia_commission_*.    └── third-parties.ts    # reportia_third_parties_*.
scripts/└── jsonrpc-smoke.mjs       # Smoke de protocolo (sin red contra Reportia).
tests/├── config.test.ts          # loadConfig.├── resolve-company-id.test.ts # helpers de tool-base.└── schema-validation.test.ts  # invariantes de allTools y Zod.

Convenciones:

  • Cada tool debe usar un esquema Zod (z.object({...})) para validar su input.
  • Los handlers deben envolver ctx.client.call(...) en try/catch y usar ok(...)/fail(...) de tool-base.ts.
  • Tools mutaciones destructivas deben declarar destructive: true y verificar confirm: true con assertConfirmed(...) o equivalente en su handler.

Licencia

MIT

來源:README.md,提交 78eda26

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.3.2最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分