Skip to content

Servidor MCP

Finova expone un servidor Model Context Protocol (MCP) para que clientes de IA — Claude.ai (web, OAuth), Claude Desktop, ChatGPT (custom connector), Cursor, Continue, Cline, y cualquier cliente compatible — se conecten directamente a tu cuenta y le permitan a la IA consultar tus datos y generar reportes.

Estado actual (MVP): sólo lectura. La IA puede listar y consultar datos + generar reportes, pero no puede crear, editar ni borrar. Las mutaciones llegan en una fase posterior.

Endpoint

POST https://developers.fi-nova.com/api/mcp/v1
  • Transporte: Streamable HTTP (spec MCP 2025-03-26). JSON-RPC 2.0 sobre POST.
  • Content-Type: application/json.
  • Auth: dos opciones, ambas soportadas en paralelo:
    • API key estática — header Authorization: Bearer finova_sk_<secret>. La misma key que la API REST. Genera una en app.fi-nova.com → Settings → Developers. Recomendada para scripts y clientes que pegas el token a mano (Claude Desktop, Cursor, Continue, ChatGPT custom connector privado).
    • OAuth 2.1 + PKCE — header Authorization: Bearer finova_oat_<secret>, donde el access token sale del flow OAuth. Recomendada para clientes web que descubren OAuth automáticamente (Claude.ai). El usuario nunca pega una API key — el access token rota solo y se puede revocar.

GET sobre el mismo URL devuelve un handshake público (sin auth) útil para verificar que el servidor está vivo.

Flow OAuth 2.1

Cualquier cliente compatible con la spec MCP 2025-03-26 descubre los endpoints sin configuración manual:

  1. GET https://developers.fi-nova.com/.well-known/oauth-protected-resource — metadata del recurso (RFC 9728).
  2. GET https://developers.fi-nova.com/.well-known/oauth-authorization-server — metadata del authorization server (RFC 8414).
  3. POST https://developers.fi-nova.com/oauth/registerdynamic client registration (RFC 7591). Devuelve un client_id opaco (fcli_*). No emitimos client_secret — el flow es público con PKCE S256 obligatorio.
  4. GET https://developers.fi-nova.com/authorize?response_type=code&client_id=fcli_…&redirect_uri=…&code_challenge=…&code_challenge_method=S256&state=…&scope=read-customers+read-incomes+… — el usuario inicia sesión en developers.fi-nova.com, escoge la empresa que quiere conectar y aprueba los scopes pedidos.
  5. POST https://developers.fi-nova.com/oauth/token con grant_type=authorization_code + code_verifier — devuelve access_token (finova_oat_*, 1h) y refresh_token (finova_ort_*, 30 días, rota en cada uso).
  6. Llamadas a /api/mcp/v1 con Authorization: Bearer finova_oat_*.
  7. Refresh con grant_type=refresh_token cuando el access token expira.

Los scopes disponibles son los mismos slugs que las API keys (<action>-<resource>). El usuario aprueba un subset por sesión y siempre puede revocar el acceso desde Finova.

Scopes y autorización

Cada tool requiere un scope en el formato <action>-<resource>. El servidor MCP:

  1. Filtra tools/list para mostrar sólo las tools cuyo scope coincida con los permisos de tu API key. Esto evita que el LLM intente llamarlas y queme turns con errores 403.
  2. Rechaza tools/call con código -32001 Forbidden si la API key no tiene el scope requerido.

Catálogo de tools

ToolScope requeridoDevuelve
list_customersread-customersClientes con búsqueda por nombre/email/teléfono.
list_productsread-productsCatálogo con búsqueda y filtros.
list_leadsread-leadsPipeline de prospección (CRM).
list_accountsread-accountsCuentas con balance actual + totales por moneda.
list_incomesread-incomesIngresos con filtros por fecha, cuenta, cliente.
list_expensesread-expensesEgresos con filtros por fecha, cuenta, proveedor.
list_calendar_eventsread-calendar_eventsEventos del calendario por rango.
get_companyread-companyInfo básica de la empresa + módulos activados.
get_balance_sheetread-reportsBalance general a una fecha de corte.
get_income_statementread-reportsEstado de resultados (P&L) por rango.
get_cash_flowread-reportsFlujo de efectivo por rango.

Recomendación: para un asistente IA generalista, crea una API key con los scopes read-customers, read-products, read-incomes, read-expenses, read-accounts, read-reports, read-company.

Métodos JSON-RPC soportados

MethodDescripción
initializeHandshake. Devuelve capabilities + serverInfo.
notifications/initializedAck del cliente tras initialize. Sin respuesta.
notifications/cancelledCancelación. Sin respuesta.
pingHealth check. Devuelve {}.
tools/listLista las tools que esta API key puede usar.
tools/callEjecuta una tool.

Aún no soportado: resources/*, prompts/*, logging/*, roots/*, sampling/*.

Cliente: Claude Desktop

Edita ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o el equivalente en tu sistema:

json
{
  "mcpServers": {
    "finova": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://developers.fi-nova.com/api/mcp/v1",
        "--transport",
        "http-only",
        "--header",
        "Authorization: Bearer finova_sk_TU_SECRETO"
      ]
    }
  }
}

Claude Desktop sólo soporta servidores MCP por stdio, por eso usamos mcp-remote como proxy hacia el endpoint HTTP. Requiere tener Node.js / npx instalado. Reinicia Claude Desktop después de guardar; las tools de Finova aparecen en el selector de servidores.

Cliente: Claude.ai (OAuth)

En claude.ai (web, planes Pro / Team / Enterprise): Settings → Conectores → Agregar conector personalizado.

  • Nombre: Finova
  • URL del servidor MCP remoto: https://developers.fi-nova.com/api/mcp/v1
  • Configuración avanzada: déjalo cerrado. No pegues token.

Al darle Agregar, Claude.ai descubre los metadata OAuth, hace dynamic client registration y te redirige a developers.fi-nova.com/authorize. Inicia sesión con tu cuenta de Finova, escoge la empresa que quieres conectar y aprueba los scopes. De regreso en Claude.ai verás "Finova" en tus conectores con las tools disponibles.

A diferencia del flow Bearer, no compartes ninguna API key con Claude.ai. El access token (finova_oat_*) rota automáticamente y puedes revocar el acceso en cualquier momento desde app.fi-nova.com → Settings → Developers → MCP Server.

Cliente: ChatGPT (custom connector)

Settings → Connectors → Add custom connector:

  • URL: https://developers.fi-nova.com/api/mcp/v1
  • Auth type: Bearer token
  • Token: finova_sk_TU_SECRETO

ChatGPT requiere OAuth para conectores publicados en el marketplace — como conector privado para tu propio uso, el Bearer con API key basta. Finova ya soporta OAuth 2.1 + PKCE (ver el flow descrito arriba); cuando publiquemos un conector oficial de ChatGPT en el marketplace usará ese flow.

Cliente: Cursor / Continue / Cline

Cualquier cliente compatible con MCP remoto vía HTTP funciona. Configuración típica:

json
{
  "name": "finova",
  "transport": {
    "type": "http",
    "url": "https://developers.fi-nova.com/api/mcp/v1",
    "headers": { "Authorization": "Bearer finova_sk_TU_SECRETO" }
  }
}

Prueba rápida desde la terminal

Handshake

bash
curl -sX POST https://developers.fi-nova.com/api/mcp/v1 \
  -H "Authorization: Bearer finova_sk_TU_SECRETO" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": { "name": "curl-test", "version": "0.1" }
    }
  }'

Listar tools disponibles

bash
curl -sX POST https://developers.fi-nova.com/api/mcp/v1 \
  -H "Authorization: Bearer finova_sk_TU_SECRETO" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

Generar estado de resultados

bash
curl -sX POST https://developers.fi-nova.com/api/mcp/v1 \
  -H "Authorization: Bearer finova_sk_TU_SECRETO" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "get_income_statement",
      "arguments": {
        "start_on": "2026-01-01",
        "end_on":   "2026-03-31"
      }
    }
  }'

Formato de respuesta

Las tools devuelven contenido envuelto en content (texto JSON serializado, para clientes legacy) y en structuredContent (objeto parseado, spec 2025-03-26) — así los clientes modernos no tienen que parsear strings dos veces.

json
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [
      { "type": "text", "text": "{\"customers\":[...],\"meta\":{...}}" }
    ],
    "structuredContent": {
      "customers": [...],
      "meta": { "page": 1, "per_page": 25, "total": 137 }
    },
    "isError": false
  }
}

Cuota por plan

MCP es una feature de los planes pagados de Finova. La cuota está incluida en tu plan y se mide por ciclo de facturación (mensual o anual, según el plan).

PlanTool calls por ciclo
Free / sin suscripción0 (feature no disponible)
Plan Starter500
Planes empresarialesConfigurable — contáctanos
  • Cada tools/call cuenta como 1 llamada, exitosa o no — las que rebotan por scope insuficiente o args inválidos también consumen cuota para evitar probing barato.
  • El contador se resetea automáticamente al renovar la suscripción.
  • Si tu plan no incluye MCP, el servidor responde inmediatamente con -32004 QuotaExceeded y data.available = false — eso es señal para que tu cliente IA notifique al usuario que necesita actualizar el plan.
  • La pestaña Settings → Developers → MCP Server en app.fi-nova.com muestra el contador en vivo, paywall si no aplica, y un preview del catálogo de tools.

Códigos de error

Estándar JSON-RPC + algunos específicos:

CódigoSignificado
-32700Parse error — el JSON no parsea.
-32600Invalid request — falta jsonrpc: "2.0" o estructura inválida.
-32601Method not found.
-32602Invalid params — argumentos no pasaron validación.
-32603Internal error.
-32001Forbidden — la API key no tiene el scope que la tool requiere.
-32002Tool no encontrada.
-32003Execution failed — la tool corrió pero terminó con error (ej. rango inválido).
-32004Quota exceeded — se agotó la cuota del ciclo o el plan no incluye MCP. El data incluye limit, used, available (false ⇒ falta plan) y resets_at.

Auth falla a nivel HTTP (401 invalid_key) — el JSON-RPC nunca arranca cuando la key es inválida.

Observabilidad

Desde la UI en app.fi-nova.com → Settings → Developers → MCP Server puedes ver:

  • URL del endpoint (con botón copiar).
  • Catálogo de tools con sus scopes.
  • Snippets de conexión para cada cliente.
  • Logs de las últimas 25 invocaciones (tool, status, duración, args).
  • Tasa de éxito de las últimas 24 horas.

Roadmap

FaseScopeDisponible
1 (MVP)Read-only: list_* + get_* (reportes)✅ Ahora
2OAuth 2.1 + dynamic client registration (Claude.ai, conectores web)✅ Ahora
3Search tools (full-text para clientes/productos/leads)Próximo
4Mutaciones limitadas: create_customer, create_lead, create_income, create_expenseDespués
5resources/* (acceso documental: facturas, contratos, archivos)Más adelante

Limitaciones del MVP

  • Read-only — ninguna tool muta datos.
  • Sin SSE / streaming — cada llamada devuelve respuesta completa.
  • Sin resources/* ni prompts/*.
  • Stateless — no usamos Mcp-Session-Id headers. Si el cliente lo envía, se ignora.

Hecho con cuidado por Finova.