
Mcp Reportia
io.github.javalenciacai由 GitHub 账号 javalenciacai 发布v0.3.2更新于 Oct 24, 2026
Reportia HTTP API as 66 curated MCP tools (accounting, mappings, SIIGO).
概览
将 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 的网络。
安装
在 SourceWeft 中
- 打开 控制台中的 Mcp Reportia,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
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
- Instalación y uso rápido
- Variables de entorno
- Configuración en clientes MCP
- Flujo de release
- Herramientas disponibles
- Limitaciones conocidas
- Seguridad
- Rutas cubiertas y omitidas
- Desarrollo local
- Pruebas
- Inspección con MCP Inspector
- Arquitectura interna
- Licencia
Dónde está indexado
Este servidor MCP está publicado y discoverable en:
Instalación via skills.sh:
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).
-
Abre https://www.npmjs.com/package/@james.valencia/mcp-reportia/settings (logueado como
james.valenciaen el navegador). -
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).
-
Completa el formulario con estos valores exactos (la doc oficial los lista así):
-
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:
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
Plan al terminar tu paso 1
Voy a ejecutar en este orden (no requiere tu input):
- Cambiar
node-version: '22'→'24'en ambos jobs del workflow publish - Verificar con
npm test && npm run buildlocal - Commit + push
- Re-crear el tag v0.1.2 apuntando al nuevo commit
- Observar el workflow
Publishhastapublish-npmexitoso - Reportarte el resultado final (versión en npm + GitHub Release creado)
Hacer un release
GitHub Actions se dispara automáticamente:
- Job
validate— typecheck + test + build + smoke. Verifica quepackage.json.versionyserver.json.versioncoincidan con el tag. - Job
publish-npm— publica a npm via OIDC (sin tokens de larga duración). - Job
publish-mcp-registry— publicaserver.jsonal MCP Registry oficial. - 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):
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:
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
* Exactamente una de las tres alternativas de auth debe estar presente:
REPORTIA_TOKENBearer, oREPORTIA_EMAIL+REPORTIA_PASSWORDsesión cookie (el package hacePOST /api/auth/loginy captura la cookie), oREPORTIA_COOKIEsesió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\.enva 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:
Sustituye
mcp-reportiapor la ruta localC:\\james\\mcp-reportiadurante desarrollo, conargs: ["-y", "--prefix", "C:\\james\\mcp-reportia", "mcp-reportia"]o ejecutandonpm run startcomo comando directo.
Cursor (%USERPROFILE%\.cursor\mcp.json)
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:
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:
El child NO va a llamar a
/api/auth/login(se salta ese paso), NO va a llamar a/api/auth/logoutal 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:
Salud y autenticación (src/tools/auth-health.ts)
Empresas (src/tools/companies.ts)
Movimientos contables (src/tools/accounting-movements.ts)
Mapeo de cuentas (src/tools/account-mappings.ts)
Reportes de comisiones (src/tools/commission-reports.ts)
Terceros (src/tools/third-parties.ts)
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).
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).
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.
⚠️ Las tools marcadas como Destructiva requieren el parámetro
{ "confirm": true }en su input. Si no se envía, el handler valida conassertConfirmed(input, '<tool-name>')(definido ensrc/tool-base.ts) y devuelve un error concode: "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
ReportiaClientpor 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 (FormDatadesdeundici) pero las tools actuales no exponen endpoints de upload (no hay POST/PUT conmultipart/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) yreportia_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 usectx.client.call(..., { formData }). - Sin caché persistente: cada invocación vuelve a llamar a la API. El LLM debe sentirse libre de hacer
tools/listcuando 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:smokearranca el servidor conREPORTIA_BASE_URL=http://127.0.0.1:9(puerto cerrado). No hace llamadas reales; solo valida el handshake MCP. Para pruebas integradas reales, usanpm run test:integrationapuntando 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: trueliteral: se declaran condestructive: truey verifican conassertConfirmed(...)antes de cualquier llamada HTTP. Si faltaconfirm, devuelvenGUARD_REJECTEDsin 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) usanencodeURIComponenty/o se restringen a un alfabeto seguro ([A-Za-z0-9-]+para NITs). - Cabeceras HTTP saneadas: el
User-Agentconfigurable víaREPORTIA_USER_AGENTse sanitiza contra CRLF (header injection) ensrc/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.sidse mantiene en memoria del cliente y nunca aparece en respuestas JSON. - Login con cookie persistente: el modo sesión reutiliza la cookie
connect.sidrecibida de/api/auth/loginy 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 omiteconfirm, 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/)
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 aGET /api/companies/:companyId/upload-historyyGET /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, editasrc/tools/<modulo>.ts, re-exporta ensrc/tools/index.tsy correnpm run typecheck && npm test.
Desarrollo local
Requisitos:
- Node.js ≥ 20
- npm ≥ 9
Los tests no requieren Reportia levantada ni credenciales; usan entorno sintético.
Pruebas
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:
Inspección con MCP Inspector
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
Convenciones:
- Cada tool debe usar un esquema Zod (
z.object({...})) para validar su input. - Los handlers deben envolver
ctx.client.call(...)entry/catchy usarok(...)/fail(...)detool-base.ts. - Tools mutaciones destructivas deben declarar
destructive: truey verificarconfirm: trueconassertConfirmed(...)o equivalente en su handler.
Licencia
来源:README.md,提交 78eda26
工具
0版本历史
1- v0.3.2最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分