SAP Business One MCP Server Sample
Wait, I accidentally inserted "The entire final output should be the translation." Need ensure not to include artifacts from earlier "thinking". I need to provide clean final output. Let's produce final accurately with all content, but I need to avoid marginnal errors. Let's rewrite cleanly.
I will now output final translated text only. No extra. But I need to ensure original "Architecture Overview" translated correctly. Let's finalize carefully.
Potential issues: "El servidor MCP se sitúa entre un agente de IA (Cline, GitHub Copilot, Cursor, etc.) y SAP B1 Service Layer." Correct.
"Implementa una arquitectura moderna en capas que transforma los contratos de servicio OData en herramientas MCP adaptadas a la IA. La arquitectura se organiza en torno a un patrón de descubrimiento progresivo que equilibra la eficiencia en el uso de tokens con una exposición global de las capacidades."
Need "token" as token in AI; keep.
"Utilizando este token, los clientes pueden obtener opcionalmente la lista de empresas del SLD para incluir el contexto de la empresa correcta en las solicitudes."
Ah, "using this token" should be "Con este token".
Now final.
Let's check the English source again carefully for any missed heading or paragraph. It includes "Progressive 3-Step Discovery" in TOC only, not body. Fine.
Need perhaps "SAR B1 Service Layer" in first paragraph.
Let's ensure final no code fences.
Let's write the entire final response# SAP Business One MCP Server Sample
Introducción
A partir de la versión SAP Business One 10.0 de FP2608, se presenta un ejemplo para SAP Business One MCP Server para demostrar cómo se pueden exponer los servicios OData travésSAP B1 Service Layer comme herramientas dinámicas para agentes de IA que soporta el Model Context Protocol (MCP).
El servidor de ejemplo está diseñado para ser mínimo y fácil de entender, al mismo tiempo que muestra los patrones y las capacidades centrales de un servidor MCP. Estos servidores ofrecen una solución para el registro de cientos de herramientas CRUD individuals (una por entidad × operación), utilizando una arquitectura de descubrimiento progresivo that reduces cientos of possible herramientas into several inteligentes and reusable tools.
Este diseño is obligatory to AI assistants:
Discover relevantes entidades B1 a trough lightweight semantic search
Understand complete entidad schemas including properties, types, y capacidades
Execute operaciones CRUD validaded con generation automática de consultas OData
Las solicitudes en lenguaje natural, zoals "Muéstrame los 10 principales clientes por saldo" o "Create un pedido de compra para el proveedor V00001", se traducen automática en llamadas API dans Service Layer correctas.
Este projecto se provides as sample ref. = Reference y aprendizable only. No necesariamente is a product ready for production. SAP B1 partners y developers recommended to study the architecture, adapt code, evaluate capabilities built-in and build their own MCP server implementations tailored to their specific business needs and deployment.
Version Requirement: This MCP server requires SAP Business One 10.0 FP2608 or higher. It relies on APIs introduced in Service Layer on FP2608, and will not correct with older versions.
Protocol Version MCP: This sample implements MCP protocol 2025-11-25, which is latest version of Model Context Proto spec for SAP B1 10.0 FP2608. MCP clients that connect to this server should also support version
2025-11-25. As the MCP protocol continues to evolve, this sample will be updated to stay up to date with new spec.
Related MCP server: SAP OData MCP Server
Architecture Overview
The MCP server is between an AI agent (Cline, GitHub Copilot, Cursor, etc.) and SAP B1 Service Layer. SAP Business1 MCP Server implements layered architecture that turns OData contracts into tools MCP oriented. The architecture is based on progressive discovery pattern balances tokens and capacities.
In this architecture, the MCP client in agent interacts with MCP server via safe HTTP transport implementing protocol MCP. For authentication, server uses OAuth2.centration with Keycloak. Client MCP or AI agent reports as OAuth client through Extension SSO Manager and obtains a tokens through standard OAuth2 flow. Using these token, clients may opt to obtain company list from the "SLD" and include correct company context. Server validates each request against the token token with Keycloak, checking that only authenticated clients can access the to tools, and verifies audience to ensure belongs to server.
Tools MCP Available
Warning: Tools are used by AI models and they do not represent a stable API. Names, parameters and behavior may change. Do not hard dependence on specific signatures.
Main Discovery and Execution Tools
The server uses 4 main tools of découvrir / execut and not hundreds of individual tools.
Herramienta | Descripción | Parámetros |
| Paso 1: Busca entidades de SAP Business One Service Layer por categoría de negocio y filtro de nombre opcional. Devuelve una lista mínima (entityName, categories). Si no se encuentran coincidencias, se devuelven todas las entidades. A continuación, use | - |
| Paso 2: Obtiene el esquema de una entidad SAP B1. Paso 2.1: llame con | - |
| Paso 3a: Ejecuta operaciones de lectura en entidades de Service Layer de SAP B1. Use | - |
| Paso 3b: Ejecuta operaciones de escritura en entidades de Service Layer de SAP B1: crear, actualizar y eliminar. Requiere confirmación explícita antes de la ejecución. | - |
Descubrimiento progresivo en 3 pasos
El servidor evita la proliferación de herramientas al condensar todo en un flujo de 3 pasos:
Step 1: b1_find_entities → Lightweight semantic search; returns entity names and categories
Step 2: b1_get_entity_schema → Full schema for a selected entity (properties, types, keys)
Step 3: b1_read / b1_write → Execute the read or write operation with schema-informed parametersEficiencia de tokens: el paso 1 devuelve ~90 % menos de datos que los esquemas completos
Separación clara: el LLM puede escanear y seleccionar antes de comprometerse a recuperar un esquema completo
Detalle progresivo: se puede profundizar en los tipos complejos mediante una llamada del paso 2.2 sin recuperarlo todo de antemano
Herramientas de selección de empresa
En el modo OAuth, seleccione una empresa antes de llamar a las herramientas de entidades:
Herramienta | Descripción | Parámetros |
| Paso 0 de OAuth: Devuelve la lista de empresas SAP B1 disponibles. Devuelve: CompanyID, CompanySchemaName, CompanyName, Status. A continuación, use | Ninguno |
| Paso 1 de OAuth: Selecciona la empresa SAP B1 activa para todas las solicitudes posteriores. Opcionalmente, recupera información de la empresa (versión, localización, etc.). Siguiente: use | - |
Herramientas auxiliares de flujo de trabajo
Dos herramientas auxiliares de flujo de trabajo simplifican los flujos de trabajo comerciales habituales en B1:
Herramienta | Descripción | Parámetros |
| Crea un nuevo documento de venta copiando un documento de origen existente, resolviendo automáticamente las referencias BaseType, BaseEntry y BaseLine. Admite los flujos B1 estándar: Pedido→Entrega, Entrega→Factura, Pedido→Factura. | - |
| Valida y crea un pago entrante para una o más facturas de cuentas por cobrar (A/R). Recupera los saldos abiertos y asigna el pago automáticamente (primero los más antiguos) o manualmente antes de contabilizar. | - |
Descubrimiento de herramientas de flujo de trabajo en tiempo de ejecución:
Show me what workflow tools are available in the B1 MCP serverEl agente de IA llama a b1_find_entities con category: 'workflow' y recibe las descripciones completas de b1_copy_document y b1_create_payment.
Recursos MCP
Dos tipos de recursos proporcionan conocimiento contextual sin llamadas a herramientas.
Patrón de URI de recurso | Descripción |
| Metadatos de servicios y entidades para la Service Layer. |
| Datos de referencia que incluyen objectTypes, documentFlows, fieldPatterns, statuses, paymentTypes y all. Ejemplo: |
Ventajas: los asistentes de IA pueden acceder a estos recursos al instante sin llamadas a herramientas: ¡más eficiente para los flujos de trabajo!
Requisitos previos
Requisito | Versión mínima |
Node.js | 22.22.3 |
npm | 10.9.8 |
SAP B1 Service Layer | FP2608 |
SAP B1 Identity and Authentication Management (IAM-Keycloak) | FP2608 |
SAP B1 System Landscape Directory (SLD) | FP2608 |
Instalación
Descargue este paquete
b1-mcp-server.zipde la ayuda en línea, descomprímalo y navegue hasta la carpeta del proyecto descomprimido.Instale las dependencias y compile:
npm install
npm run buildConfiguración
Todos los ajustes se controlan mediante un archivo .env en la raíz del proyecto. Copie .env.example como punto de partida:
cp .env.example .envPara obtener una referencia completa de todas las variables disponibles, consulte el capítulo Referencia de configuración.
Modo directo (solo desarrollo)
Utilice este modo cuando la SAP B1 Service Layer sea accesible con un nombre de usuario y una contraseña. Adecuado únicamente para prototipos rápidos en el entorno de desarrollo local y para pruebas.
Nota: A pesar de usar un nombre de usuario y una contraseña en el archivo
.env, esto no es autenticación básica HTTP. Las credenciales las utiliza el servidor MCP para obtener un token de sesión de la SAP B1 Service Layer a través de su API de inicio de sesión (/b1s/v2/Login), y todas las solicitudes posteriores se autentican con ese token de sesión.
NODE_ENV=development
AUTHENTICATION_MODE=direct
# B1 Service Layer host (server appends /b1s/v2/ internally)
SERVICE_LAYER_ROOT_URL=https://servicelayer.b1.example.com:50000
B1_COMPANY_DB=yourCompanyDB
B1_USERNAME=yourUsernameHere
B1_PASSWORD=yourPasswordHere
# Accept self-signed certs for local development/testing only
AUTH_ALLOW_SELF_SIGNED=trueModo OAuth (producción, modo predeterminado)
Utilice este modo predeterminado, ya que la Service Layer siempre está protegida por Keycloak. Los tokens de portador entrantes se validan contra el proveedor OAuth antes de reenviar cualquier solicitud B1.
# Default mode, validate incoming requests via OAuth 2.0 / OIDC (requires OAUTH_BASE_URL and OAUTH_CLIENT_ID)
AUTHENTICATION_MODE=oauth
SERVICE_LAYER_ROOT_URL=https://servicelayer.b1.example.com:50000
SLD_ROOT_URL=https://sld.b1.example.com:40000
OAUTH_BASE_URL=https://keycloak.b1.example.com/auth/realms/sapb1/
OAUTH_CLIENT_ID=your-client-id
OAUTH_CLIENT_SECRET=your-client-secret
HTTPS / transporte
El servidor usa HTTPS de forma predeterminada y utiliza un certificado autofirmado para el desarrollo local. También puede cambiar a HTTP si lo prefiere.
HTTPS (predeterminado):
HTTPS_ENABLED=true
HTTPS_KEY_PATH=./certs/server.key
HTTPS_CERT_PATH=./certs/server.crt
PORT=3000
# Optional:
# HTTPS_CA_PATH=./certs/ca.crt
# HTTPS_PASSPHRASE=your-cert-passphraseHTTP:
Si desea HTTP en lugar de HTTPS por pruebas locales, para evitar problemas de advertencias de seguridad del navegador u otras razones (p. ej., ya dispone de una puerta de enlace HTTPS o un proxy inverso frontal), establezca:
HTTPS_ENABLED=false
PORT=3000URL pública anunciada (MCP_BASE_URL):
De forma predeterminada, el servidor deriva su URL anunciada de la configuración del listener activo. Si el servidor está detrás de un proxy inverso o necesita que los clientes usen una URL base específica para los metadatos OAuth y los endpoints MCP, establézcala explícitamente:
MCP_BASE_URL=https://mcp.example.comDéjela sin establecer para el desarrollo local: el servidor inferirá la URL correcta automáticamente.
Ejecución del servidor
Inicie el servidor:
npm startVerifique que se está ejecutando:
curl http://localhost:3000/healthEl servidor expone tres endpoints REST integrados:
Endpoint | Descripción |
| Comprobación de actividad: devuelve estado, versión y salud de los componentes |
| Metadatos del servidor: versión del protocolo, capacidades y sesiones activas |
| Referencia breve de la API: endpoints, capacidades MCP y sugerencias de uso |
Nota de OAuth: En modo OAuth,
GET /mcprequiere un token de portador válido en el encabezadoAuthorization.
GET /health — respuesta de ejemplo:
{
"status": "healthy",
"timestamp": "2026-06-17T03:50:58.338Z",
"version": "1.0.0",
"checks": {
"auditLogger": { "healthy": true },
"personalFieldCache": { "healthy": true }
}
}GET /mcp — respuesta de ejemplo:
{
"name": "b1-mcp-server",
"version": "1.0.0",
"protocol": { "version": "2025-11-25", "transport": "streamable-http" },
"capabilities": { "tools": {}, "resources": {}, "logging": {} },
"features": [
"Dynamic SAP Business One Service Layer OData service discovery",
"CRUD operations for all discovered entities",
"Natural language query support",
"Session-based HTTP transport",
"Real-time service metadata"
],
"endpoints": { "health": "/health", "mcp": "/mcp", "docs": "/docs" },
"activeSessions": 1
}Conexión de un cliente de IA
El servidor expone un endpoint MCP Streamable HTTP en:
http(s)://<host>:<port>/mcpCualquier cliente de IA compatible con MCP puede conectarse a este endpoint. La tabla siguiente resume las capacidades clave de los clientes compatibles:
Cliente | Tipo de transporte | Elicitación MCP | OAuth / PKCE |
Cline (VS Code) |
| No admitida (v4.0.8) | Flujo PKCE integrado |
GitHub Copilot (VS Code) |
| Admitida | Flujo PKCE integrado |
Goose (Desktop) |
| Admitida | Flujo PKCE integrado |
La elicitación MCP se utiliza para la confirmación humana de operaciones de escritura y lecturas sensibles. Si su cliente no la admite, establezca
MCP_HUMAN_CONFIRMATION_ENABLED=falseen.envo esas operaciones se rechazarán. Consulte Confirmación humana (elicitación MCP) para obtener más detalles.
Cline (VS Code)
Para obtener instrucciones de configuración, configuración del proveedor de LLM, configuración de OAuth / Keycloak y ejemplos de prueba que cubren todas las operaciones CRUD y las herramientas de flujo de trabajo, consulte docs/B1_CLINE_INTEGRATION_GUIDE.md.
GitHub Copilot (VS Code)
Para obtener instrucciones de configuración, configuración de OAuth / Keycloak, configuración del ID de cliente estático, flujo de selección de empresa OAuth y ejemplos de prueba de elicitación, consulte docs/B1_GITHUB_COPILOT_INTEGRATION_GUIDE.md.
Goose (Desktop)
Para obtener instrucciones de configuración, opciones de configuración, configuración de OAuth / Keycloak y ejemplos de uso, consulte docs/B1_GOOSE_INTEGRATION_GUIDE.md.
MCP Inspector (navegador)
Utilice el MCP Inspector para explorar herramientas de forma interactiva e inspeccionar mensajes MCP sin procesar. Para obtener instrucciones de uso completas (incluido cómo obtener un token de portador y establecer los encabezados necesarios en modo OAuth), consulte docs/MCP_INSPECTOR.md.
Integración de cliente MCP
Si está creando una aplicación cliente MCP personalizada que se conecta al servidor en modo OAuth, la integración sigue un flujo estándar PKCE OAuth 2.0:
Descubra los metadatos OAuth desde
GET /mcp(el servidor anuncia sus endpoints de autorización y token).Inicie una solicitud de autorización PKCE y redirija al usuario a Keycloak.
Intercambie el código de autorización por tokens (token de acceso + token de actualización).
Obtenga las empresas disponibles mediante
b1_list_companies.Permita que el usuario seleccione una empresa y llame a
b1_select_company.Incluya el token de acceso y el ID de empresa en cada solicitud MCP:
Authorization: Bearer <access_token>x-b1-companyID: <companySchemaName>
Actualice el token antes de que expire; reinicie el flujo PKCE si falla la actualización.
Para ver un ejemplo funcional completo con código anotado (incluidos el registro del cliente, el flujo OAuth, la selección de empresa y la salida esperada), consulte docs/SIMPLE_MCP_CLIENT.md.
Confirmación humana (elicitación MCP)
La elicitación MCP es un mecanismo a nivel de protocolo que permite a un servidor MCP pausar una llamada de herramienta a mitad de ejecución y solicitar al cliente conectado información adicional o confirmación antes de continuar. A diferencia de una simple indicación, la elicitación está integrada en el protocolo MCP: el servidor envía una solicitud estructurada al cliente, el cliente la presenta al usuario (normalmente como un diálogo o formulario en línea) y el servidor espera la respuesta antes de decidir si continúa o aborta. Esto mantiene al humano en el circuito para operaciones sensibles sin requerir que el agente de IA improvise su propio flujo de confirmación.
Cuando MCP_HUMAN_CONFIRMATION_ENABLED=true (el valor predeterminado), el servidor se pausa antes de:
Operaciones de escritura (
create,update,delete): solicita la aprobación explícita del usuarioLecturas sensibles: solicita confirmación cuando la consulta selecciona campos clasificados como datos personales (correo electrónico, teléfono, números de identidad)
Los clientes que admiten la elicitación (como GitHub Copilot) muestran un diálogo de confirmación en línea. El usuario debe aprobar antes de que el servidor continúe; rechazar cancela la operación sin modificar ningún dato.
Ejemplo de solicitud de confirmación de escritura:
CONFIRM WRITE OPERATION | OPERATION: update | ENTITY: BusinessPartners |
TARGET: C00001 | FIELDS: Phone1=+1 555-1234 |
RISK: This action will modify SAP Business One data. |
ACTION: Set confirmed=true only if you intend to continue.Clientes sin soporte de elicitación (p. ej., Cline v4.0.8):
El servidor rechazará las lecturas sensibles y las operaciones de escritura en lugar de continuar sin confirmación. Para omitir esto en canalizaciones automatizadas o de desarrollo, establezca:
MCP_HUMAN_CONFIRMATION_ENABLED=falseClasificación de datos personales
El servidor utiliza los metadatos PersonalFieldsSetups de SAP Business One (resueltos por tabla mediante PersonalFieldsSetupsService_GetPersonalFieldsByTable) para clasificar los campos sensibles y aplicar salvaguardas durante las lecturas y escrituras.
Cómo se clasifican los campos
Fuente de clasificación: entradas de campos personales con ámbito de tabla de la Service Layer devueltas por
PersonalFieldsSetupsService_GetPersonalFieldsByTable.Regla de coincidencia: una propiedad se marca como personal cuando el nombre de la tabla + el nombre del campo coinciden con una fila de PersonalFieldsSetups.
Alcance: la clasificación se aplica tanto a las propiedades de entidad de nivel superior como a las propiedades de tipo complejo anidadas.
Resolución anidada: para propiedades complejas, el contexto de la tabla cambia mediante la asignación de tablas secundarias y continúa de forma recursiva para anidamientos más profundos.
Dónde aparece la clasificación
En la salida del esquema del paso 2 mediante
b1_get_entity_schema, las propiedades personales se marcan con isPersonalField.Esto incluye campos escalares y propiedades de tipo estructural anidadas cuando la asignación de tablas las marca como personales.
Protecciones en tiempo de ejecución
Cuando MCP_HUMAN_CONFIRMATION_ENABLED=true:
Las operaciones de escritura (create, update, delete) requieren confirmación explícita de elicitación MCP.
Las lecturas sensibles requieren confirmación cuando selectString incluye explícitamente campos personales de nivel superior.
Si el cliente no admite la elicitación MCP, estas operaciones protegidas se bloquean.
Comportamiento de redacción en los resultados de lectura
La redacción de lecturas depende de si selectString es significativo:
Sin selectString (o en blanco/solo espacios): se aplica redacción de respuesta completa de forma recursiva a los campos personales tanto en los datos complejos de nivel superior como anidados.
selectString significativo con solo selecciones escalares: los campos escalares seleccionados se devuelven según lo solicitado.
selectString significativo que incluye propiedades complejas: los campos escalares seleccionados permanecen visibles y los campos personales dentro de las propiedades complejas seleccionadas se redactan de forma recursiva.
Esto significa que un campo personal escalar de nivel superior seleccionado puede ser visible después de la confirmación del usuario, mientras que los campos personales anidados dentro de las propiedades complejas seleccionadas siguen redactados.
Para obtener más detalles sobre la configuración de datos personales, consulte este enlace: Portal de ayuda de SAP Business One: protección de datos personales.
Soporte de UDO/UDT/UDF
El servidor descubre y expone automáticamente objetos definidos por el usuario (UDO), tablas definidas por el usuario (UDT) y campos definidos por el usuario (UDF) junto con las entidades estándar de SAP B1; no se requiere configuración adicional.
Los UDO registrados en SAP B1 aparecen como entidades consultables y escribibles en
b1_find_entities, localizables en su categoría empresarial asignada.Las UDT (tablas personalizadas con prefijo
@) se presentan como entidades de primera clase y admiten las mismas operaciones CRUD que las entidades estándar.Los UDF añadidos a tablas estándar o personalizadas se incluyen automáticamente en el esquema devuelto por
b1_get_entity_schema, con los tipos y metadatos correctos.
Esto significa que cualquier personalización realizada en SAP B1 (extensiones de socios, complementos de localización o campos específicos del cliente) está inmediatamente disponible para los agentes de IA a través del mismo flujo de descubrimiento de 3 pasos, sin necesidad de cambios en el servidor.
Nomenclatura de UDO
Los códigos UDO deben cumplir con las reglas de identificadores de OData para ser reconocidos por Service Layer. Use solo letras, dígitos y guiones bajos, sin espacios ni otros caracteres especiales (por ejemplo, use MY_CUSTOM_OBJECT, no My Custom Object). Los UDO con códigos no conformes no serán detectables.
Retraso en el descubrimiento
Los UDO y UDT agregados o modificados a través del cliente SAP B1, el cliente web o los complementos no se reflejan en el servidor MCP de inmediato. El servidor almacena en caché los metadatos de OData obtenidos de Service Layer durante un período configurable (predeterminado: 30 minutos, controlado por METADATA_CACHE_TTL_MINUTES). Los UDO/UDT nuevos o modificados solo serán detectables después de que la caché expire naturalmente, o cuando se reinicie el servidor MCP. Durante el desarrollo activo de objetos personalizados, reduzca METADATA_CACHE_TTL_MINUTES a un valor más pequeño (por ejemplo, 5) para detectar los cambios más rápido.
Soporte Multiinquilino
Una única instancia del servidor MCP puede atender a múltiples empresas de SAP Business One sin ningún cambio de configuración. En modo OAuth, el inquilino o empresa activo se selecciona dinámicamente en tiempo de ejecución utilizando el System Landscape Directory (SLD).
Cómo funciona:
El cliente MCP llama a
b1_list_companiespara recuperar todas las empresas disponibles registradas en el SLD, junto con su estado.El usuario (o el agente de IA, guiado por el usuario) selecciona la empresa objetivo llamando a
b1_select_companycon elCompanySchemaNameelegido.Todas las llamadas de herramientas posteriores (
b1_find_entities,b1_read,b1_write, etc.) se enrutan a la base de datos de Service Layer de la empresa seleccionada durante la duración de la sesión.Para cambiar de empresa, llame a
b1_select_companynuevamente con un nombre de esquema diferente; no se requiere reiniciar el servidor.
Características clave:
Ámbito de sesión: La selección de empresa está vinculada a la sesión MCP. Diferentes sesiones de clientes de IA pueden operar contra diferentes empresas simultáneamente en la misma instancia del servidor.
Impulsado por SLD: La lista de empresas se obtiene directamente del SLD y refleja el estado en vivo de las empresas registradas. No es necesario mantener una lista estática de empresas en la configuración.
Solo OAuth: El cambio de empresa multiinquilino requiere el modo OAuth. El modo directo es de una sola empresa (
B1_COMPANY_DBestá fijo en.env).
Nota: Si ya hay un encabezado
x-b1-companyIDválido presente en la solicitud, el servidor MCP lo usa directamente; no es necesario llamar ab1_list_companiesyb1_select_company. El propósito de esas herramientas es simplemente ayudar al agente de IA o al usuario a determinar el nombre de esquema de empresa correcto y establecer el contexto de la empresa cuando aún no se conoce. Una vez que se conoce la empresa deseada, su ID de empresa (resuelto desde elCompanySchemaName) se puede pasar directamente en el encabezadox-b1-companyIDde cada solicitud MCP posterior.
Ejemplos de Uso
Consultas en Lenguaje Natural
Lenguaje Natural | Herramienta Llamada | Parámetros Generados |
"Muéstrame 10 órdenes de venta" |
|
|
"Obtener orden de venta DocEntry 12345" |
|
|
"Encontrar órdenes de venta superiores a $1000" |
|
|
"Crear una orden de compra para el proveedor V00001" |
|
|
"Actualizar el número de teléfono del socio comercial C00001" |
|
|
Ejemplos de Flujos de Trabajo
Para implementar flujos de trabajo comerciales adicionales o agregar nuevas herramientas MCP, consulte docs/DEVELOPER_GUIDE.md.
Flujo de Trabajo CRUD Básico
1. b1_find_entities → "BusinessPartners"
↓ Returns: List of matching entities
2. b1_get_entity_schema → "BusinessPartners"
↓ Returns: scalar properties plus structuralProperties[]
3. b1_get_entity_schema → "BusinessPartners", structuralPropertyName="ContactEmployees"
↓ Returns: sub-properties for that structural property when needed
4. b1_read or b1_write → execute the selected operation
✓ Executes operation with proper parametersFlujo de Trabajo de Pedido a Cobro (Paso a Paso)
1. b1_write → Create Sales Order
↓ Returns: DocEntry 123
2. b1_copy_document → Order → Delivery
↓ Returns: DocEntry 456 (automatic BaseType handling)
3. b1_copy_document → Delivery → Invoice
↓ Returns: DocEntry 789 (automatic BaseType handling)
4. b1_create_payment → Create Payment
✓ Validates and creates payment (automatic balance checking)Consultas de Inteligencia de Negocios
User: "Show me top 10 customers by balance"
→ Tool: b1_read
→ Parameters:
{
"entityName": "BusinessPartners",
"operation": "read",
"filterString": "CardType eq 'cCustomer'",
"orderbyString": "CurrentAccountBalance desc",
"topNumber": 10
}User: "How many open sales orders are there?"
→ Tool: b1_read
→ Parameters:
{
"entityName": "Orders",
"operation": "read",
"filterString": "DocumentStatus eq 'bost_Open'",
"selectString": "DocEntry"
}Manipulación de Datos
User: "Update supplier V10000 to have phone number 123-456-7890"
→ Tool: b1_write
→ Parameters:
{
"entityName": "BusinessPartners",
"operation": "update",
"parameters": {
"CardCode": "V10000",
"Phone1": "123-456-7890"
}
}Pruebas del Servidor
Pruebas Unitarias
npm testEste es un alias para npm run test:unit. Las pruebas unitarias se encuentran en src/tests/unit/.
Pruebas de Integración
Las pruebas de integración requieren un servidor MCP en ejecución con un Service Layer y un proveedor OAuth accesibles. También requieren que el alcance b1_mcp:access esté configurado en Keycloak; consulte KEYCLOAK_SETUP.md para obtener instrucciones de configuración. Configure las credenciales del cliente de prueba en su .env y luego ejecute:
npm run test:integrationVariables clave para las pruebas de integración:
Variable | Descripción |
| ID de cliente OAuth utilizado por el ejecutor de pruebas |
| Alcances a solicitar (por ejemplo, |
| Establecer en |
Las pruebas de integración se encuentran en src/tests/integration/.
Nota: Si una prueba falla después de actualizar las dependencias, ejecute
npm run buildprimero; los errores de tiempo de compilación a menudo aparecen allí antes que en el ejecutor de pruebas.
Verificación de Calidad Completa
Ejecute lint, build y pruebas unitarias en secuencia:
npm run lint
npm run build
npm test
npm run test:integrationRegistro de Actividades
El servidor produce dos flujos de registro separados, cada uno configurable de forma independiente.
Registros de Aplicación
Los registros de aplicación cubren el manejo de solicitudes, el despacho de herramientas, el ciclo de vida de la sesión y las llamadas a Service Layer. El nivel predeterminado es info. Habilite el registro detallado durante el desarrollo para rastrear lo que está haciendo el servidor:
APP_LOG_LEVEL=debug
APP_LOG_CONSOLE_ENABLED=trueLos registros se escriben en un archivo rotativo por defecto (APP_LOG_FILE_ENABLED=true). El tamaño del archivo y la retención están controlados por APP_LOG_MAX_SIZE_BYTES (predeterminado 10 MB) y APP_LOG_RETENTION_DAYS (predeterminado 90 días).
Registros de Auditoría
Los registros de auditoría registran eventos relevantes para la seguridad: confirmaciones de escritura, inicio y expiración de sesiones, y fallos de autenticación. Se escriben en un archivo rotativo por defecto y deben permanecer habilitados en producción.
Para también transmitir eventos de auditoría a la consola durante el desarrollo:
AUDIT_LOG_CONSOLE_ENABLED=trueEl tamaño del archivo y la retención están controlados por AUDIT_LOG_MAX_SIZE_BYTES (predeterminado 10 MB) y AUDIT_LOG_RETENTION_DAYS (predeterminado 365 días).
Para la lista completa de variables de registro, consulte docs/CONFIGURATION_REFERENCE.md.
Para la configuración paso a paso de Keycloak requerida para el modo OAuth, incluido el registro del cliente del servidor MCP, el alcance del cliente, el mapeador de audiencia y los hosts de confianza, consulte docs/KEYCLOAK_SETUP.md.
Consideraciones de Seguridad
Nota: Este proyecto es una muestra. Antes de implementarlo en un entorno de producción, revise y refuerce todas las configuraciones de seguridad de acuerdo con los estándares de seguridad y los requisitos de cumplimiento de su organización.
Autenticación
Este servidor MCP actúa como un Servidor de Recursos (RS) en el marco OAuth 2.0 y utiliza el mecanismo de autenticación MCP estándar. Cada solicitud de un agente de IA debe llevar un token de acceso de portador válido; el servidor valida el token antes de procesar cualquier solicitud.
Los tokens de acceso se obtienen del servicio de Identity and Authentication Management de SAP Business One proporcionando credenciales de usuario válidas. Este servicio se basa en Keycloak y se puede configurar para conectarse a SAP IAS (Identity Authentication Service) u otros proveedores de identidad para la autenticación de usuarios.
Autorización
La autorización se aplica en dos capas:
Capa 1 — Servidor MCP: verifica las reclamaciones scope y aud (audiencia) del token de acceso para determinar si el agente de IA tiene permitido invocar las herramientas MCP solicitadas. Solo se aceptan tokens que lleven el alcance requerido b1_mcp:access y estén dirigidos a este servidor.
Capa 2 — SAP B1 Service Layer: delega la decisión de acceso a datos a Service Layer, que evalúa los roles y permisos de usuario asociados con el token contra el modelo de control de acceso estándar de SAP Business One. Los administradores pueden definir políticas de acceso detalladas por usuario y grupo. Si Service Layer devuelve HTTP 403 (Prohibido), el servidor MCP muestra un error al agente de IA indicando privilegios insuficientes y no devuelve ningún dato.
Configuración de Producción
Revise estas configuraciones antes de cualquier implementación en producción.
Transporte
HTTPS_ENABLED— predeterminado atrue. Use siempre HTTPS en producción. Solo deshabilite detrás de un proxy inverso que termine TLS.AUTH_ALLOW_SELF_SIGNED— predeterminado afalse. Nunca habilite en producción; use una CA válida oNODE_EXTRA_CA_CERTS.
Validación de tokens
TOKEN_VALIDATION_MODE— useintrospectionointrospection-with-jwt-fallback(predeterminado) en producción. Evite el modo solojwta menos que los tokens tengan una vida corta (< 5 min), ya que los tokens revocados permanecen válidos hasta su expiración.VALIDATE_AUDIENCE— predeterminado atrue. Deshabilitarlo permite que tokens emitidos para otros servicios se autentiquen; solo deshabilite si su proveedor OAuth no puede restringir la reclamaciónaud.OAUTH_VERIFY_SCOPES/OAUTH_REQUIRED_SCOPES— mantenga la verificación de alcances habilitada y restringida al alcance mínimo requerido (b1_mcp:access).
Red y control de acceso
MCP_ALLOWED_HOSTS— liste todos los nombres de host a través de los cuales el servidor es accesible. Las solicitudes con un encabezadoHostque no coincida se rechazan (protección contra rebinding de DNS).REQUEST_BODY_LIMIT— mantenga pequeño (predeterminado1mb) para limitar la memoria y reducir el riesgo de DoS.CORS_ALLOWED_ORIGINS— déjelo sin establecer (CORS deshabilitado) a menos que los clientes basados en navegador lo requieran. Evite*en producción.MCP_RATE_LIMIT_WINDOW_MINUTES/MCP_RATE_LIMIT_MAX— ajuste para que coincida con el rendimiento esperado del cliente.
Seguridad de sesión y escritura
SESSION_TIMEOUT_MINUTES— las sesiones inactivas se expiran y se auditan. Mantenga corto en producción (predeterminado: 30 min).MCP_HUMAN_CONFIRMATION_ENABLED— predeterminado atrue. Requiera confirmación del usuario antes de cualquier escritura. Solo deshabilite en pipelines totalmente automatizados y no interactivos.
Registro de auditoría
AUDIT_LOG_FILE_ENABLED— predeterminado atrue. Los registros de auditoría registran todas las confirmaciones de escritura y eventos de sesión. Mantenga habilitado en producción y establezcaAUDIT_LOG_RETENTION_DAYSpara cumplir con sus requisitos de cumplimiento.
Solución de Problemas
Problemas de servidor o conexión
Verifique Node.js >= 22.22.3 (
node --version) y quenpm run buildse complete sin errores.Compruebe que
SERVICE_LAYER_ROOT_URLsea solo el host, sin la ruta/b1s/v2/(por ejemplo,https://servicelayer.b1.example.com:50000).Confirme que el servidor esté en ejecución:
curl http://localhost:3000/health.Verifique que la URL del punto final MCP en la configuración del cliente coincida con la dirección del servidor y reinicie VS Code si las herramientas no aparecen.
Autenticación y contexto de empresa
Modo directo: verifique
B1_COMPANY_DB,B1_USERNAMEyB1_PASSWORD.Modo OAuth: verifique
OAUTH_BASE_URL,OAUTH_CLIENT_ID,OAUTH_CLIENT_SECRETySLD_ROOT_URL. Si Service Layer usa un certificado autofirmado, establezcaAUTH_ALLOW_SELF_SIGNED=true(solo desarrollo).Compruebe los hosts de confianza de Keycloak si los clientes de VS Code fallan con
Failed to verify remote host— consulte docs/KEYCLOAK_SETUP.md.En modo OAuth, siempre llame a
b1_list_companiesy luego ab1_select_companyantes de cualquier llamada de herramienta de entidad. Sin una empresa seleccionada, las herramientas no devolverán datos de SAP B1.
Problemas de entidad, campo o escritura
Utilice
b1_find_entitiespara confirmar el nombre correcto de la entidad (distingue entre mayúsculas y minúsculas) yb1_get_entity_schemapara verificar los nombres de las propiedades antes de construir las cadenas de filtro o selección.Si se rechazan las operaciones de escritura y
MCP_HUMAN_CONFIRMATION_ENABLED=true, el cliente debe admitir MCP Elicitation. Utilice GitHub Copilot o establezcaMCP_HUMAN_CONFIRMATION_ENABLED=falsepara pipelines automatizados.
Habilitar opciones de depuración
Habilite el registro detallado para rastrear el manejo de solicitudes y las llamadas al Service Layer:
APP_LOG_LEVEL=debug
APP_LOG_CONSOLE_ENABLED=true
AUDIT_LOG_CONSOLE_ENABLED=trueReferencia de configuración
Para ver la lista completa de variables de entorno agrupadas por categoría (autenticación, HTTPS, OAuth, sesión, caché, registro), consulte docs/CONFIGURATION_REFERENCE.md.
Limitación
El transporte stdio no es compatible. Solo se admite HTTP de streaming.
Las acciones/funciones de OData no son compatibles en la muestra actual del servidor MCP. Solo están disponibles las operaciones CRUD estándar sobre las entidades.
La carga/descarga de archivos adjuntos e imágenes no es compatible en la muestra actual del servidor MCP.
Las operaciones por lotes de OData no son compatibles en la muestra actual del servidor MCP. Cada operación con una entidad debe realizarse individualmente.
Las consultas avanzadas de OData no son totalmente compatibles. Solo se implementan las básicas
$filter,$select,$topy$orderbyen las herramientas MCP.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with SAP Business One API through Azure Container Apps with VNet connectivity. Provides secure access to SAP data and operations through natural language interface.6
- FlicenseAqualityDmaintenanceEnables AI assistants to integrate with SAP systems via OData REST APIs for querying entity sets, performing CRUD operations, and executing function imports. It features automatic service discovery, CSRF token management, and smart connection handling without requiring the SAP RFC SDK.1112
- AlicenseAqualityCmaintenanceConnects AI agents to SAP BTP platform APIs for service discovery, instance management, and destination queries via natural language.51MIT
- FlicenseAqualityCmaintenanceEnables interaction with SAP S/4HANA systems via OData, allowing service discovery, metadata exploration, field value retrieval, and CRUD operations through natural language.45
Related MCP Connectors
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
Chile DTE for AI agents - boleta/factura electronica via OpenFactura or LibreDTE. Stateless BYO.
Manage your Savanto store from your AI: catalog, content, prompts, and analytics, by chat.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/glauberbessa/mcpserverforsapb1'
If you have feedback or need assistance with the MCP directory API, please join our Discord server