Servidor MCP de DeveuWeb
Conecta Claude, Cursor o cualquier cliente compatible con MCP a tu organización y opera tu facturación con lenguaje natural: consulta clientes, crea facturas, registra gastos con su recibo y mucho más.
Endpoint
https://app.deveuweb.com/mcp
Introducción
El servidor MCP (Model Context Protocol) de DeveuWeb expone los datos de tu organización a asistentes de IA de forma segura y controlada. Cada token actúa en nombre de su creador, con sus permisos reales y limitado a los recursos y scopes que tú elijas.
El transporte es Streamable HTTP (JSON-RPC 2.0 sobre POST). No hay estado de sesión: cada petición se autentica de forma independiente.
Requisitos
- Un plan con el servidor MCP incluido.
- Autenticación en dos pasos (2FA) activada en tu cuenta — se verifica en cada petición.
- Rol de administrador o propietario en la organización para generar tokens.
Cómo conectar
Hay tres formas de conectar un cliente MCP. La recomendada es el conector OAuth: no copias ningún token y el acceso se renueva solo.
Conector OAuth (recomendado)
La forma más sencilla y segura: añade deveuweb como conector en Claude (Desktop o web) o cualquier cliente MCP compatible con OAuth. No necesitas copiar ningún token.
- Añade un conector / servidor MCP personalizado usando la URL de arriba.
- Se abrirá el navegador: inicia sesión, elige la organización, revisa los permisos y confirma con tu código 2FA.
- Listo: el cliente queda conectado y renueva el acceso automáticamente.
Cursor / clientes con HTTP directo
Pega esto en el mcp.json de tu cliente.
{
"mcpServers": {
"deveuweb": {
"url": "https://app.deveuweb.com/mcp",
"headers": {
"Authorization": "Bearer dvw_mcp_..."
}
}
}
}
Claude Desktop (con token)
Alternativa con token: Claude Desktop usa un puente (mcp-remote). Pega esto en claude_desktop_config.json y reinicia la app.
{
"mcpServers": {
"deveuweb": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://app.deveuweb.com/mcp",
"--header", "Authorization: Bearer dvw_mcp_..."
]
}
}
}
Gestiona tus tokens y conexiones desde el panel de tu organización.
Autenticación y scopes
Tokens
Los tokens tienen el formato dvw_mcp_… y se muestran una sola vez al crearlos — en la base de datos solo se guarda su hash SHA-256, así que no se pueden recuperar después. Se revocan al instante desde el panel y caducan según tu plan.
Cada token actúa como su creador con su rol vigente: si pierde el rol de administrador o desactiva el 2FA, todos sus tokens dejan de funcionar inmediatamente.
Scopes
Cada token lleva una lista de scopes con el formato read:invoices · write:expenses. La lectura desbloquea las tools .list y .get; la escritura, .create y .update. Una llamada a una tool fuera de los scopes del token devuelve el error -32003.
OAuth 2.1
Para el conector OAuth, el servidor publica su metadata en /.well-known/oauth-authorization-server y soporta registro dinámico de clientes (DCR). Los access tokens duran 60 minutos y se renuevan automáticamente con el refresh token.
Límites
- Rate limit: 60 peticiones por minuto por token (configurable por plan o token). Por encima, HTTP 429.
- Llamadas al mes: según tu plan; el contador se muestra en el panel MCP de tu organización.
- Las tools .list devuelven 25 resultados por defecto y 100 como máximo (parámetro limit).
- Adjuntos (p. ej. recibos de gastos): PDF, JPG o PNG en base64, máximo 5 MB.
Recursos y tools
Esta referencia se genera automáticamente del registro del servidor: siempre refleja exactamente lo que el MCP expone. Los nombres y descripciones técnicas se muestran en inglés.
Clientes
clients.list
List clients for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
clients.get
Retrieve a single clients record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
clients.create
Create a clients record in the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| name | string | Sí | — |
| cif | string | No | — |
| billing_company_name | string | No | — |
| string | No | — | |
| phone | string | No | — |
| address | string | No | — |
| city | string | No | — |
| postal_code | string | No | — |
| country | string | Sí | — |
| notes | string | No | — |
clients.update
Partially update a clients record. Only the fields provided are modified.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | Id of the record to update. |
| name | string | No | — |
| cif | string | No | — |
| billing_company_name | string | No | — |
| string | No | — | |
| phone | string | No | — |
| address | string | No | — |
| city | string | No | — |
| postal_code | string | No | — |
| country | string | No | — |
| notes | string | No | — |
Empresas
companies.list
List companies for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
companies.get
Retrieve a single companies record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
companies.create
Create a companies record in the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| name | string | Sí | — |
| cif | string | Sí | — |
| address | string | Sí | — |
| city | string | Sí | — |
| postal_code | string | Sí | — |
| country | string | Sí | — |
| string | No | — | |
| phone | string | No | — |
| iva_percentage | number | No | — |
| irpf_percentage | number | No | — |
companies.update
Partially update a companies record. Only the fields provided are modified.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | Id of the record to update. |
| name | string | No | — |
| cif | string | No | — |
| address | string | No | — |
| city | string | No | — |
| postal_code | string | No | — |
| country | string | No | — |
| string | No | — | |
| phone | string | No | — |
| iva_percentage | number | No | — |
| irpf_percentage | number | No | — |
Proveedores
suppliers.list
List suppliers for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
suppliers.get
Retrieve a single suppliers record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
suppliers.create
Create a suppliers record in the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| name | string | Sí | — |
| cif | string | No | — |
| string | No | — | |
| phone | string | No | — |
| address | string | No | — |
| web | string | No | — |
| notes | string | No | — |
suppliers.update
Partially update a suppliers record. Only the fields provided are modified.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | Id of the record to update. |
| name | string | No | — |
| cif | string | No | — |
| string | No | — | |
| phone | string | No | — |
| address | string | No | — |
| web | string | No | — |
| notes | string | No | — |
Productos
products.list
List products for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
products.get
Retrieve a single products record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
products.create
Create a products record in the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| name | string | Sí | — |
| sku | string | No | Optional; autogenerated if omitted. |
| description | string | No | — |
| base_price | number | Sí | — |
| default_iva_percentage | number | No | — |
| default_irpf_percentage | number | No | — |
products.update
Partially update a products record. Only the fields provided are modified.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | Id of the record to update. |
| name | string | No | — |
| sku | string | No | Optional; autogenerated if omitted. |
| description | string | No | — |
| base_price | number | No | — |
| default_iva_percentage | number | No | — |
| default_irpf_percentage | number | No | — |
Planes
plans.list
List plans for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
plans.get
Retrieve a single plans record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
Presupuestos
budgets.list
List budgets for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
budgets.get
Retrieve a single budgets record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
budgets.create
Create a budgets (header + line items) in the authenticated organization. Totals and code are computed server-side.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| client_id | integer | Sí | — |
| company_id | integer | Sí | — |
| title | string | Sí | — |
| description | string | No | — |
| notes | string | No | — |
| discount_type | string (enum) | No | — |
| discount_value | number | No | — |
| lines | array | Sí | — |
Facturas
invoices.list
List invoices for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
invoices.get
Retrieve a single invoices record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
invoices.create
Create a invoices (header + line items) in the authenticated organization. Totals and code are computed server-side.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| client_id | integer | Sí | — |
| company_id | integer | No | — |
| title | string | No | — |
| description | string | No | — |
| notes | string | No | — |
| discount_type | string (enum) | No | — |
| discount_value | number | No | — |
| lines | array | Sí | — |
Facturas recurrentes
recurring_invoices.list
List recurring_invoices for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
recurring_invoices.get
Retrieve a single recurring_invoices record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
Gastos
expenses.list
List expenses for the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | integer | No | — |
| search | string | No | Optional free-text filter. |
expenses.get
Retrieve a single expenses record by id.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | The record's numeric id. |
expenses.create
Create a expenses record in the authenticated organization.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| date | string | Sí | YYYY-MM-DD |
| concept | string | Sí | — |
| category | string | Sí | supplies|office|software|formation|insurance|transport|meals|professional_services|advertising|autonomo_quota|other |
| subtotal | number | Sí | — |
| iva_percentage | number | Sí | — |
| irpf_percentage | number | Sí | — |
| provider | string | No | — |
| provider_cif | string | No | — |
| invoice_number | string | No | — |
| supplier_id | integer | No | — |
| notes | string | No | — |
| attachment_base64 | string | No | Base64-encoded file content (PDF, JPG or PNG, max 5 MB). |
| attachment_filename | string | No | Original filename including extension. |
expenses.update
Partially update a expenses record. Only the fields provided are modified.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | integer | Sí | Id of the record to update. |
| date | string | No | YYYY-MM-DD |
| concept | string | No | — |
| category | string | No | supplies|office|software|formation|insurance|transport|meals|professional_services|advertising|autonomo_quota|other |
| subtotal | number | No | — |
| iva_percentage | number | No | — |
| irpf_percentage | number | No | — |
| provider | string | No | — |
| provider_cif | string | No | — |
| invoice_number | string | No | — |
| supplier_id | integer | No | — |
| notes | string | No | — |
| attachment_base64 | string | No | Base64-encoded file content (PDF, JPG or PNG, max 5 MB). |
| attachment_filename | string | No | Original filename including extension. |
Ejemplos
Peticiones reales con curl. Sustituye $TOKEN por tu token.
Listar las tools disponibles para tu token
curl -X POST https://app.deveuweb.com/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Buscar facturas
curl -X POST https://app.deveuweb.com/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "invoices.list",
"arguments": { "search": "202606", "limit": 10 }
}
}'
Respuesta
{
"jsonrpc": "2.0",
"result": {
"content": [
{ "type": "text", "text": "[ { \"id\": 12, \"code\": \"2026060001\", \"status\": \"paid\", \"total\": \"1590.31\", ... } ]" }
]
},
"id": 1
}
Crear un gasto con recibo adjunto
curl -X POST https://app.deveuweb.com/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "expenses.create",
"arguments": {
"date": "2026-06-08",
"concept": "Spotify Premium",
"category": "software",
"subtotal": 4.96,
"iva_percentage": 21,
"irpf_percentage": 0,
"provider": "Spotify AB",
"attachment_base64": "JVBERi0xLjcK...",
"attachment_filename": "receipt.pdf"
}
}
}'
Errores
| Código | Significado | Qué hacer |
|---|---|---|
| HTTP 401 · -32001 | Token ausente, inválido, caducado o revocado. | Genera un token nuevo en el panel MCP y revisa el header Authorization. |
| HTTP 403 · -32003 | El token no tiene el scope necesario, el creador perdió permisos o el 2FA está desactivado. | Regenera el token con los scopes necesarios y verifica rol y 2FA del creador. |
| HTTP 405 · -32000 | El endpoint solo acepta POST. | Envía las peticiones JSON-RPC por POST. |
| HTTP 429 | Superaste el rate limit por minuto. | Espera y reintenta; considera un plan con límites mayores. |
| -32602 | Los argumentos de la tool no pasan la validación. | Revisa la tabla de campos del recurso: tipos, requeridos y formatos. |