Skip to main content
Glama
facusada

sap-btp-destination-mcp

by facusada
README.md
# SAP BTP Destination MCP

App en Python para consumir un destination SAP BTP con `OAuth2ClientCredentials`, exponer un endpoint HTTP y publicar tools MCP sobre FastMCP.

## Que hace

- Pide un access token al `Token Service URL`.
- Lee un destination usando `GET /destination-configuration/v1/destinations/<name>`.
- Expone endpoints REST para healthcheck y prueba del destination.
- Expone las mismas operaciones como tools MCP en `/mcp`.

## Variables de entorno

Modo manual, tomando los datos del destination que pasaste:

```env
SAP_DESTINATION_NAME=mcp-destination
SAP_DESTINATION_SERVICE_URL=https://destination-configuration.cfapps.us10.hana.ondemand.com
SAP_TOKEN_URL=https://mcp-test.authentication.us10.hana.ondemand.com/oauth/token
SAP_CLIENT_ID=sb-clone6ab3984cf18e4ae991b5b02eab972d9b!b646663|destination-xsappname!b62
SAP_CLIENT_SECRET=<tu-secret>
```

Podés copiarlas a un `.env`.

## Credenciales correctas para Destination Service

Para consumir el Destination Service de forma estándar en SAP BTP:

- `clientid`, `clientsecret` y `uri` salen del service key del Destination Service.
- `url` sale del service key del XSUAA.

Las credenciales de XSUAA por sí solas pueden emitir token, pero no necesariamente tienen autorización para llamar al Destination Service. Si pasa eso, SAP responde `403 Forbidden`.

La app ahora soporta estos formatos además del `.env` manual:

- `VCAP_SERVICES`
- `SAP_DESTINATION_SERVICE_KEY` con el JSON del service key del Destination Service
- `SAP_XSUAA_CREDENTIALS` con el JSON del service key del XSUAA

Ejemplo:

```bash
export SAP_DESTINATION_SERVICE_KEY='{"clientid":"...","clientsecret":"...","uri":"https://destination-configuration.cfapps.us10.hana.ondemand.com"}'
export SAP_XSUAA_CREDENTIALS='{"url":"https://mcp-test.authentication.us10.hana.ondemand.com"}'
```

## Ejecutar local

```bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reload
```

## Endpoints

- `GET /health`
- `GET /destination/{destination_name}`
- `GET /destination/{destination_name}/call?path=destination-configuration/v1/subaccountDestinations`
- MCP endpoint: `GET/POST /mcp`

## Deploy a Cloud Foundry

```bash
cf push
cf set-env sap-btp-mcp-python SAP_DESTINATION_SERVICE_URL https://destination-configuration.cfapps.us10.hana.ondemand.com
cf set-env sap-btp-mcp-python SAP_TOKEN_URL https://mcp-test.authentication.us10.hana.ondemand.com/oauth/token
cf set-env sap-btp-mcp-python SAP_CLIENT_ID 'sb-clone6ab3984cf18e4ae991b5b02eab972d9b!b646663|destination-xsappname!b62'
cf set-env sap-btp-mcp-python SAP_CLIENT_SECRET '<tu-secret>'
cf restart sap-btp-mcp-python
```

Si la app está bindeada a `destination` y `xsuaa`, también puede resolver credenciales automáticamente desde `VCAP_SERVICES`.

## Deploy estilo tutorial (recomendado)

Este flujo replica la idea del video de deploy en BTP pero usando tu app actual en Python.

1. Logueate y selecciona org/space:

```bash
cf login
cf target -o "<tu-org>" -s "<tu-space>"
```

2. Crea servicios (si no existen):

```bash
cf create-service destination lite mcp-destination
cf create-service xsuaa application mcp-xsuaa -c xs-security.json
```

3. Prepara variables de despliegue:

```bash
cp vars.btp.example.yml vars.btp.yml
```

4. Deploy con binding automatico a servicios:

```bash
./scripts/deploy_btp.sh
```

5. Verifica que la app quedo arriba:

```bash
cf app sap-btp-mcp-python
```

Notas:

- `manifest.btp.yml` define bindings a `destination` y `xsuaa`.
- La app toma credenciales desde `VCAP_SERVICES`, asi que no necesitas setear `SAP_CLIENT_SECRET` manualmente en CF.

## Referencias

- [SAP Help: Consuming the Destination Service](https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/consuming-destination-service)
- [FastMCP: FastAPI integration](https://gofastmcp.com/integrations/fastapi)