Skip to main content
Glama
javiarmesto

Business Central MCP Server

by javiarmesto
README.md

# MCP_BusinessCentral - Servidor Model Context Protocol 🚀

Este proyecto implementa un **servidor MCP** para Microsoft Business Central, usando FastMCP y FastAPI, integrable con Claude Desktop y otros clientes AI.

## 🌐 Servidor Online Disponible

**🎉 El servidor está desplegado y operativo en Azure App Service:**
- **URL**: https://mcp-bc-javi-chb7bue4evbkeyb0.westeurope-01.azurewebsites.net
- **Documentación API**: https://mcp-bc-javi-chb7bue4evbkeyb0.westeurope-01.azurewebsites.net/docs
- **Estado**: ✅ 100% funcional con datos reales de Business Central
- **Endpoints disponibles**: GET /customers, /items, /orders, POST /customers

📋 **Para usar el servidor desplegado**: Consulta el archivo `test-mcp-api.http` con ejemplos de todas las operaciones.

## 📋 ¿Qué es MCP?

El **Model Context Protocol** (MCP) es un estándar abierto que permite a clientes AI acceder a herramientas, datos y servicios externos de forma segura y estructurada. MCP define una arquitectura cliente-servidor donde:
- **MCP Host:** Cliente AI (Claude, Copilot, etc.)
- **MCP Client:** Conector MCP en el host
- **MCP Server:** Este proyecto (Python) expone herramientas y lógica de negocio
- **Transporte:** JSON-RPC sobre stdin/stdout (local) o HTTP/SSE (remoto)

Más información: [MCP servers en Microsoft Learn](https://learn.microsoft.com/en-us/azure/api-management/export-rest-mcp-server#about-mcp-servers)
## 🔒 Autenticación y Seguridad

- Se recomienda usar Microsoft Entra ID (Azure AD) y OAuth2 para entornos de producción.
- Consulta la [guía de autenticación para Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-develop-connect-apps).

### Ejemplo: Autenticación OAuth2 con Entra ID

```python
import httpx

def get_bc_token(tenant_id, client_id, client_secret, scope):
    url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
    data = {
        "grant_type": "client_credentials",
        "client_id": client_id,
        "client_secret": client_secret,
        "scope": scope
    }
    response = httpx.post(url, data=data)
    response.raise_for_status()
    return response.json()["access_token"]
```
Más información: [Guía de autenticación](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-develop-connect-apps)
## ⚠️ Manejo de límites y errores

- Business Central impone límites de uso (rate limits) en sus APIs. Si recibes errores 429 (Too Many Requests) o 504 (Gateway Timeout), implementa lógica de reintentos y backoff.
- Más información: [Límites de API en Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/dynamics-rate-limits).

### Ejemplo: Manejo de errores 429 y 504 en llamadas a la API

```python
import httpx
import time

def call_bc_api_with_retry(url, headers, max_retries=5):
    retries = 0
    backoff = 2
    while retries < max_retries:
        response = httpx.get(url, headers=headers)
        if response.status_code == 429:
            wait = backoff ** retries
            print(f"Rate limit alcanzado. Reintentando en {wait}s...")
            time.sleep(wait)
            retries += 1
        elif response.status_code == 504:
            print("Timeout de la API. Reintentando...")
            time.sleep(backoff)
            retries += 1
        else:
            return response
    raise Exception("No se pudo completar la petición tras varios intentos")
```
Más información: [Límites de API en Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/dynamics-rate-limits)
## 🏅 Buenas prácticas de integración

- Usa siempre los endpoints REST oficiales de Business Central para la integración.
- Desacopla la lógica de negocio del transporte MCP.
- Documenta claramente las herramientas expuestas y sus parámetros siguiendo el estándar MCP.
- Consulta la [documentación de APIs REST de Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/api-overview).

## 🏗️ Estructura del Proyecto

```
📁 MCP_BusinessCentral/
├── requirements.txt            # Dependencias Python
├── README.md                   # Documentación principal
├── .env                        # Variables de entorno (no se incluye en repo)
├── .venv/                      # Entorno virtual Python
├── .github/copilot-instructions.md
├── .vscode/tasks.json          # Tareas de VS Code
├── task1.txt                   # (Ejemplo o pruebas)
└── 📁 bc_server/                # Paquete principal
    ├── BusinessCentralMCP.py   # Servidor MCP (JSON-RPC) para BC
    ├── http_server.py          # API REST (FastAPI) con OpenAPI/Swagger
    ├── setup_guide.py          # Script de validación de entorno y credenciales
    ├── client.py               # Cliente HTTP para la API de BC
    ├── config.py               # Carga y validación de configuración
    └── __init__.py
```


## 🎯 Servidores y APIs Implementados

### **1. BusinessCentralMCP.py - Servidor MCP (JSON-RPC)**
Expone herramientas para interactuar con Business Central vía JSON-RPC:
- **get_customers(limit)**: Lista clientes
- **get_customer_details(customer_id)**: Detalle de un cliente
- **get_items(limit)**: Lista artículos
- **get_sales_orders(limit)**: Lista órdenes de venta
- **create_customer(...)**: Crea un nuevo cliente

### **2. http_server.py - API REST (FastAPI)**
Expone los mismos métodos anteriores vía HTTP REST, con documentación Swagger/OpenAPI.

### **3. setup_guide.py - Validación de entorno**
Script para comprobar variables de entorno y conectividad con Azure AD y Business Central.


## 🛠️ Tecnologías Utilizadas

- **FastMCP**: Framework para servidores MCP (JSON-RPC)
- **FastAPI**: API REST moderna con documentación automática
- **httpx**: Cliente HTTP asíncrono
- **Pydantic**: Validación y serialización de datos
- **python-dotenv**: Gestión de variables de entorno


## 🚀 Instalación y Puesta en Marcha

### 💻 Entorno Local

### 1. Crear entorno virtual
```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
```

### 2. Instalar dependencias
```powershell
pip install -r requirements.txt
```

### 3. Validar entorno y credenciales
```powershell
python bc_server/setup_guide.py
```

### 4. Lanzar el servidor MCP (JSON-RPC)
```powershell
python -m bc_server.BusinessCentralMCP
```

### 5. Lanzar la API REST (FastAPI)
```powershell
uvicorn bc_server.http_server:app --reload --host 0.0.0.0 --port 8000
```
Accede a la documentación interactiva en: http://localhost:8000/docs

### ☁️ Despliegue en Azure App Service

**¿Quieres el servidor disponible online?** Consulta la **[Guía Completa de Despliegue](./DEPLOYMENT_GUIDE.md)** que incluye:
- Proceso paso a paso para Azure App Service
- Solución a todos los problemas encontrados
- Configuración de variables de entorno
- Scripts de automatización
- Suite de testing completa

**Resultado**: Servidor 100% operativo en Azure con integración real a Business Central.

## 🧪 Testing del Servidor Desplegado

El archivo `test-mcp-api.http` contiene una suite completa de tests para validar todas las funcionalidades:

```http
### Health Check
GET https://mcp-bc-javi-chb7bue4evbkeyb0.westeurope-01.azurewebsites.net/health

### Listar Clientes
GET https://mcp-bc-javi-chb7bue4evbkeyb0.westeurope-01.azurewebsites.net/customers?limit=5

### Crear Cliente
POST https://mcp-bc-javi-chb7bue4evbkeyb0.westeurope-01.azurewebsites.net/customers
Content-Type: application/json

{
  "displayName": "Cliente Test",
  "email": "test@example.com"
}
```

**Usar REST Client extension** de VS Code para ejecutar los tests directamente desde el editor.


## 🔧 Integración con Claude Desktop

1. Localiza el archivo de configuración de Claude Desktop:
   - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
   - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
2. Añade una entrada para el servidor MCP de Business Central, por ejemplo:
   ```json
   {
     "mcpServers": {
       "businesscentral-mcp": {
         "command": "C:/ruta/completa/.venv/Scripts/python.exe",
         "args": ["-m", "bc_server.BusinessCentralMCP"]
       }
     }
   }
   ```
3. Reinicia Claude Desktop para que detecte el nuevo servidor MCP.


## 🛠️ Herramientas Disponibles (BusinessCentralMCP)

| Herramienta              | Descripción                                 | Parámetros principales                |
|--------------------------|---------------------------------------------|---------------------------------------|
| get_customers            | Lista clientes de Business Central          | limit (int)                           |
| get_customer_details     | Detalle de un cliente por ID                | customer_id (str)                     |
| get_items                | Lista artículos                             | limit (int)                           |
| get_sales_orders         | Lista órdenes de venta                      | limit (int)                           |
| create_customer          | Crea un nuevo cliente                       | displayName, email, ... (ver código)  |

Consulta la documentación Swagger en `/docs` si usas la API REST.


## 🧪 Testing y Desarrollo

- **Claude Desktop:** Configura el archivo de Claude Desktop y reinicia para probar las herramientas MCP.
- **Modo desarrollo:** Usa los scripts de la carpeta `bc_server` para pruebas y debugging.
- **API REST:** Ejecuta `uvicorn bc_server.http_server:app --reload` y prueba los endpoints en `http://localhost:8000/docs`.
- **VS Code Task:** Usa la tarea "Run Python Script" para lanzar scripts rápidamente.


## 🎯 Casos de Uso Demostrados

- Integración MCP con Business Central
- Exposición de datos de clientes, artículos y órdenes
- Creación de clientes desde herramientas AI
- API REST y JSON-RPC para integración flexible




## 📚 Referencias oficiales y recursos útiles

### 📖 Documentación del Proyecto

| Recurso | Descripción |
|---------|-------------|
| [Guía de Despliegue Azure](./DEPLOYMENT_GUIDE.md) | Proceso completo para llevar el servidor a producción |
| [Suite de Tests](./test-mcp-api.http) | Validación completa de endpoints con REST Client |
| [Configuración MCP](./bc_server/BusinessCentralMCP.py) | Servidor JSON-RPC para integración con AI clients |
| [API REST](./bc_server/http_server.py) | Endpoints HTTP con documentación OpenAPI |

### 🌐 Enlaces Oficiales de Microsoft

- [MCP servers en Microsoft Learn](https://learn.microsoft.com/en-us/azure/api-management/export-rest-mcp-server#about-mcp-servers)
- [APIs REST de Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/api-overview)
- [Desarrollar apps conectadas a Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-develop-connect-apps)
- [Límites de API en Business Central](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/dynamics-rate-limits)
- [Documentación MCP Oficial](https://modelcontextprotocol.io/llms-full.txt)
- [FastMCP GitHub](https://github.com/jlowin/fastmcp)
- [Claude Desktop](https://claude.ai/desktop)
- [Pydantic Docs](https://docs.pydantic.dev/)
- [Blog TechSphereDynamics](https://techspheredynamics.com)

| Recurso                                    | Enlace                                                                 |
|--------------------------------------------|------------------------------------------------------------------------|
| MCP servers en Microsoft Learn             | https://learn.microsoft.com/en-us/azure/api-management/export-rest-mcp-server#about-mcp-servers |
| APIs REST de Business Central              | https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/api-overview |
| Autenticación y apps conectadas            | https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-develop-connect-apps |
| Límites de API                             | https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/dynamics-rate-limits |
| Documentación MCP Oficial                  | https://modelcontextprotocol.io/llms-full.txt |
| FastMCP GitHub                             | https://github.com/jlowin/fastmcp |
| Claude Desktop                             | https://claude.ai/desktop |
| Pydantic Docs                              | https://docs.pydantic.dev/ |
| Blog TechSphereDynamics                    | https://techspheredynamics.com |



---

**¡Desarrollado con visión y buen rollo!** 😉

Para cualquier duda, revisa los comentarios en el código o consulta la documentación oficial de MCP.