Conectar un cliente
Conecta Claude Code, Claude Desktop, el MCP Inspector o cualquier cliente MCP al servidor MCP de Factuarea — con OAuth 2.1 o una API key, y en modo de prueba.
El servidor MCP de Factuarea habla Streamable HTTP en
https://mcp.factuarea.com. Cualquier cliente compatible con MCP puede conectarse usando una
de las dos credenciales admitidas:
- OAuth 2.1 — el cliente se registra a sí mismo y el usuario lo autoriza mediante una pantalla de consentimiento. Ideal para herramientas de usuario final.
- API key — pasas un Bearer token
fact_live_/fact_test_directamente. Ideal para tus propias automatizaciones.
El endpoint canónico es la raíz del subdominio, https://mcp.factuarea.com. La
forma anterior con ruta https://mcp.factuarea.com/mcp sigue funcionando como
alias de compatibilidad.
¿Usas Claude Code? La configuración recomendada es el plugin oficial factuarea-mcp
— dos comandos y estás conectado por OAuth, con una skill de orientación
incluida. Consulta la guía dedicada del plugin de Claude Code.
Los pasos manuales de abajo son para otros clientes o configuraciones headless.
Claude Code
El camino más sencillo es el plugin de Claude Code — registra el servidor e incluye una skill de orientación en una sola instalación. Si prefieres conectar el servidor a mano, Claude Code también admite servidores MCP remotos sobre HTTP con OAuth integrado.
Con OAuth
Añade el servidor
claude mcp add --transport http factuarea https://mcp.factuarea.comAutentícate
Dentro de Claude Code, ejecuta el slash command:
/mcpElige factuarea, selecciona Authenticate y tu navegador abre la pantalla de consentimiento. Selecciona la empresa a la que dar acceso, el entorno (live o test) y los scopes que quieras permitir, y luego confirma. Claude Code almacena el token resultante y lo renueva automáticamente.
Úsalo
Pide a Claude que haga algo — "lista mis facturas vencidas en modo de prueba" — y descubre y llama a las tools correspondientes.
Con una API key
Si prefieres usar tu propia clave (sin flujo de consentimiento), pásala como un
header Authorization:
claude mcp add --transport http factuarea https://mcp.factuarea.com \
--header "Authorization: Bearer fact_test_xxxxxxxxxxxxxxxxxxxxxxxx"Los scopes de la clave determinan qué tools aparecen en tools/list. Una clave con *
ve las 232 tools; una clave más restringida solo ve las tools que cubren sus scopes.
Claude Desktop
Claude Desktop se conecta a servidores remotos
mediante su archivo de configuración. Añade una entrada bajo mcpServers:
{
"mcpServers": {
"factuarea": {
"type": "http",
"url": "https://mcp.factuarea.com"
}
}
}En el siguiente arranque, Claude Desktop descubre el servidor y te guía por
el flujo de consentimiento OAuth en tu navegador. Para usar una API key en su lugar, añade un
objeto headers:
{
"mcpServers": {
"factuarea": {
"type": "http",
"url": "https://mcp.factuarea.com",
"headers": {
"Authorization": "Bearer fact_test_xxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}El archivo de configuración está en
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o
%APPDATA%\Claude\claude_desktop_config.json (Windows). Reinicia la app después de
editarlo.
MCP Inspector
El MCP Inspector es la forma más rápida de explorar el catálogo y llamar a tools a mano mientras desarrollas.
Arráncalo
npx @modelcontextprotocol/inspectorConecta
Configura Transport a Streamable HTTP y URL a
https://mcp.factuarea.com. Para OAuth, el Inspector ejecuta el flujo de
autorización por ti. Para una API key, añade un header
Authorization: Bearer fact_test_… bajo Authentication.
Explora
Abre Tools → List Tools para ver todas las tools que tu credencial puede alcanzar, inspecciona su esquema de entrada y ejecútala con argumentos de ejemplo.
Cualquier cliente MCP
El servidor sigue la especificación MCP, así que cualquier cliente conforme funciona. Lo esencial:
- Endpoint —
https://mcp.factuarea.com(la forma con ruta…/mcpes un alias de compatibilidad) - Transport — Streamable HTTP
- Auth —
Authorization: Bearer <token>, donde el token es una API key (fact_live_/fact_test_) o un access token de OAuth 2.1 - Discovery — ante un
401, el servidor devuelve un headerWWW-Authenticateque apunta a sus Protected Resource Metadata (RFC 9728) para que los clientes encuentren el authorization server automáticamente
El descubrimiento de tools está paginado; el servidor devuelve el catálogo completo (hasta 200
tools) en una sola respuesta tools/list por defecto, y respeta nextCursor si
tu cliente pagina.
Autenticación
El servidor MCP acepta dos tipos de credencial en el mismo
endpoint https://mcp.factuarea.com, para dos audiencias distintas. Ambas llegan como
Authorization: Bearer <token>; el servidor las distingue por la
forma del token (fact_* → API key, cualquier otra cosa → access token de OAuth).
Política de canal
Esta es la regla más importante de la superficie MCP:
| Canal | Quién | Cómo se eligen los scopes | Tools accesibles |
|---|---|---|---|
| API key | El propietario de la cuenta automatizando su propia empresa | Eliges los scopes al crear la clave — hasta el super-scope * | 232 (todo) |
| OAuth 2.1 | Una app de terceros actuando en nombre de un usuario | El usuario concede los scopes en la pantalla de consentimiento, desde un catálogo curado | 218 |
El modelo refleja el de GitHub: un personal access token (API key) es la credencial propia del propietario y puede tener cualquier permiso, mientras que una OAuth app es externa y se limita a un conjunto verificado de scopes que el usuario aprueba explícitamente.
Las 14 tools que una OAuth app nunca puede alcanzar (solo una API key puede) son las operaciones fiscales y de privacidad más sensibles:
- Escrituras de VeriFactu (
verifactu:write) — 8 tools: registrar/reintentar/subsanar registros y eventos de VeriFactu, subir/activar/revocar certificados FNMT, actualizar ajustes de VeriFactu. Tocan el cumplimiento de la AEAT y son exclusivas del propietario. - Borrado RGPD (
delivery_notes:gdpr_forget) — 1 tool: borrar la PII de auditoría de firma (Art. 17). Privilegiada, solo para administradores. - FacturaE (FACe) (
facturae:read/facturae:write) — 5 tools: las operaciones B2G de FACe. Sus scopes aún no están en el catálogo de consentimiento OAuth, así que por ahora son solo para API key.
Todo lo demás — las 218 tools de lectura/escritura/transición/envío — está disponible para ambos canales. Consulta Scopes & permisos para ver el catálogo.
API keys
Una API key es un Bearer token opaco vinculado a tu empresa, creado en el dashboard de desarrolladores en Ajustes → Desarrolladores → API Keys. El formato y las reglas son idénticos a los de la API REST:
fact_live_<24 alphanumeric characters> → production company
fact_test_<24 alphanumeric characters> → isolated sandbox companyEl prefijo es la fuente de verdad del entorno — consulta Modo de prueba. El secreto se muestra solo una vez en la creación; el backend solo almacena un hash bcrypt. Pásalo a tu cliente MCP como:
Authorization: Bearer fact_test_xxxxxxxxxxxxxxxxxxxxxxxxPara el ciclo de vida completo de la clave — creación, scopes, rotación con periodo de gracia,
revocación, lista de acceso de IPs, expires_at — consulta la
guía de Autenticación canónica. Las claves se comparten entre las superficies REST
y MCP.
OAuth 2.1
Para apps de terceros, Factuarea es un OAuth 2.1 Authorization Server completo. Es compatible con Dynamic Client Registration, el flujo de authorization-code con PKCE y la rotación de refresh-token. No se requiere pre-registro ni aprobación manual de la app — un cliente se registra a sí mismo y el usuario lo autoriza. (Los clientes interactivos como Claude Code y el MCP Inspector ejecutan todo este flujo por ti; los pasos de abajo son para construir tu propio cliente.)
Descubrimiento
Los clientes descubren las capacidades del servidor a través de endpoints de metadata estándar
(sin prefijo /api):
| Endpoint | RFC | Propósito |
|---|---|---|
/.well-known/oauth-authorization-server | 8414 | Authorization Server Metadata — lista los endpoints authorize/token/register/introspect/revoke, los scopes admitidos, code_challenge_methods_supported: ["S256"]. |
/.well-known/oauth-protected-resource | 9728 | Protected Resource Metadata — declara el recurso MCP y qué authorization server emite tokens válidos. |
Cuando una petición no autenticada alcanza el endpoint, el servidor responde 401
con un header WWW-Authenticate: Bearer ..., resource_metadata="<url>" para que los clientes RFC
9728 encuentren el authorization server sin adivinar.
1. Dynamic Client Registration (RFC 7591)
Un cliente se registra a sí mismo haciendo POST de su metadata; el servidor devuelve un
client_id (y un client_secret para clientes confidenciales):
curl -X POST https://mcp.factuarea.com/api/oauth/register \
-H "Content-Type: application/json" \
-d '{
"client_name": "My Invoicing Assistant",
"redirect_uris": ["https://myapp.example.com/callback"],
"token_endpoint_auth_method": "none"
}'Los clientes públicos (apps de navegador/nativas) se registran con
token_endpoint_auth_method: "none" y dependen de PKCE; los clientes confidenciales usan
client_secret_basic. El registro tiene un rate limit de 60 por minuto por IP.
2. Autorización con PKCE
Envía al usuario al endpoint authorize con un challenge PKCE
(code_challenge_method=S256 es el único método aceptado):
GET https://mcp.factuarea.com/api/oauth/authorize
?response_type=code
&client_id=<client_id>
&redirect_uri=https://myapp.example.com/callback
&scope=factuarea.read invoices.write
&state=<opaque>
&code_challenge=<base64url(sha256(verifier))>
&code_challenge_method=S256Esto renderiza la pantalla de consentimiento, donde el usuario:
- Elige la empresa a la que dar acceso (un usuario puede pertenecer a varias).
- Elige el entorno — live (la empresa real) o test (un sandbox aislado), al estilo Stripe. Test es opt-in; si está ausente ⇒ live.
- Revisa y selecciona los scopes a conceder. Los scopes sensibles se marcan y no vienen pre-seleccionados.
Al aprobar, el servidor redirige de vuelta con un code de un solo uso (y tu
state). Las operaciones sensibles se filtran del catálogo que el usuario puede
aprobar — consulta la política de canal.
3. Intercambio de token
Intercambia el code por un access token, enviando el verificador PKCE:
curl -X POST https://mcp.factuarea.com/api/oauth/token \
-d grant_type=authorization_code \
-d code=<code> \
-d redirect_uri=https://myapp.example.com/callback \
-d client_id=<client_id> \
-d code_verifier=<verifier>{
"access_token": "<opaque>",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "<opaque>",
"scope": "profile.read clients.read invoices.read invoices.write"
}El token persiste los scopes expandidos y de grano fino (las macros como
factuarea.read se expanden en el momento de la emisión). Usa el access token como
credencial Bearer. El endpoint token tiene un rate limit de 60 por minuto por (cliente,
IP) y requiere autenticación de cliente (HTTP Basic para clientes confidenciales,
client_id en el body para los públicos).
4. Rotación de refresh-token
Los refresh tokens rotan por familia: cada refresh emite un nuevo access token y un nuevo refresh token, e invalida el que usaste.
curl -X POST https://mcp.factuarea.com/api/oauth/token \
-d grant_type=refresh_token \
-d refresh_token=<refresh_token> \
-d client_id=<client_id>Si un refresh token se reutiliza (usado tras la rotación — la señal clásica de una fuga), el servidor detecta la reutilización, revoca toda la familia de tokens y lanza una alerta de seguridad. Almacena y usa siempre solo el último refresh token.
Revocación e introspección
| Endpoint | RFC | Propósito |
|---|---|---|
POST /api/oauth/revoke | 7009 | Revoca un access o refresh token. |
POST /api/oauth/introspect | 7662 | Comprueba si un token está activo y lee sus scopes/metadata. |
Ambos requieren autenticación de cliente. Los usuarios también pueden revisar y revocar apps conectadas desde el dashboard de Factuarea, y a un administrador de empresa que pierde el acceso se le revocan sus tokens automáticamente en la siguiente llamada.
Modo de prueba
El servidor MCP funciona contra los mismos dos entornos que la API REST — live (tu empresa real) y test (un sandbox aislado) — para que puedas construir y validar una integración de agente sin tocar datos de producción, la AEAT ni las bandejas de entrada de tus clientes.
Cómo seleccionas el modo de prueba depende del canal:
| Canal | Cómo usar el modo de prueba |
|---|---|
| API key | Autentícate con una clave fact_test_. El prefijo es la fuente de verdad — un token fact_test_ siempre opera sobre el sandbox. |
| OAuth 2.1 | En la pantalla de consentimiento, elige el entorno Test (al estilo Stripe). Si está ausente ⇒ live. El token emitido queda vinculado a ese entorno. |
Una credencial de test opera sobre una empresa sandbox dedicada — un gemelo técnico de tu empresa real, aprovisionado automáticamente y que hereda su plan, para que el gating de módulo/plan se comporte fielmente. El aislamiento es estructural (los datos de test y live viven en empresas separadas), y los efectos externos están desactivados:
| Efecto | En live | En test |
|---|---|---|
| VeriFactu | El registro de Alta se crea y se transmite a la AEAT. | Se crea localmente, pero nunca se transmite a la AEAT. |
| Los emails de documentos llegan a los destinatarios reales. | No se entregan a los destinatarios reales. | |
| Webhooks | Los eventos suscritos se entregan a tus endpoints. | Se registran con livemode: false, pero no se entregan. |
| FACe (FacturaE) | Los envíos se presentan al web service real de FACe. | Simulados — ninguna llamada SOAP sale de Factuarea; el número de registro es sintético (FACE-SANDBOX-*). |
Todo lo demás se comporta exactamente igual que en producción, y el conjunto completo de 232 tools
está disponible en ambos entornos (sujeto a tus scopes y plan). Cuando tu
flujo funcione de extremo a extremo, cambia a live: crea una clave fact_live_, o vuelve a ejecutar el
flujo de consentimiento y selecciona el entorno live.
Este es el mismo mecanismo de sandbox que la API REST. Consulta la guía canónica Modo de prueba & sandbox para saber cómo se aprovisiona y consulta la empresa sandbox.
Plugin de Claude Code
Instala el plugin oficial factuarea-mcp para conectar Claude Code al servidor MCP de Factuarea con un solo comando — la configuración recomendada.
Catálogo de tools
Las 232 tools del MCP de Factuarea agrupadas por dominio, con el scope que requiere cada una y su categoría de límite de peticiones.