Skip to main content
Glama
par4987

@pired/sap-fiori-mcp-server

by par4987

@pired/sap-fiori-mcp-server

CI

Servidor MCP (Model Context Protocol) unificado para desarrollo SAP Fiori — creado desde cero, en TypeScript, sin dependencias de SAP.

Un único binario que combina las capacidades de los tres servidores MCP de referencia del ecosistema SAP, más conectividad a SAP BTP:

Inspiración

Capacidades replicadas

@sap-ux/fiori-mcp-server

Generación y modificación de apps Fiori elements, búsqueda documental, descarga de metadata OData

@ui5/mcp-server

Scaffolding UI5, integration cards, API reference, guidelines, validación de manifest, linter

@cap-js/mcp-server

Búsqueda fuzzy sobre el modelo CDS, detalles de definiciones, queries sobre datos de ejemplo

SAP BTP

Destinations locales y del BTP Destination Service, queries OData V2/V4 remotas (query_odata_data)

📖 English documentation: README.en.md


✨ Características

  • 26 tools MCP listas para usar con Claude Desktop, Claude Code, Cursor, VS Code (Copilot), Cline, Windsurf o cualquier cliente MCP.

  • Soporte SAP BTP: destinations desde variables de entorno, archivos o del Destination Service en la nube (OAuth2 automático, secretos siempre redactados).

  • 5 floorplans Fiori elements: list-report, object-page (form entry), worklist, analytical-list-page (V2) y overview-page (V2).

  • Apps que arrancan, no solo que validan: cada variante (V4, V4 con parámetros, worklist, V2 y CAP) se ha abierto en un navegador contra un servicio real. Ver Qué sale al generar una app.

  • Anotaciones y entidad elegidas del propio servicio: el documento de anotaciones de un servicio V2 se busca en el catálogo y se declara solo; la entidad principal sale de UI.LineItem/HeaderInfo/DraftRoot, no del orden del documento.

  • Doble transporte: stdio (por defecto) y HTTP Streamable (--http --port 3001) con API key opcional.

  • Sin dependencias de SAP: parser CDS, parser EDMX, cliente OData V2/V4 y motor de queries CSV implementados desde cero en TypeScript (~0 dependencias de runtime: solo el SDK oficial de MCP y zod).

  • Documentación integrada: corpus local de Fiori Elements, UI5, CAP, OPA5 y BTP con búsqueda TF-IDF — funciona sin conexión.

  • Salida estructurada: todas las tools declaran outputSchema y devuelven structuredContent, además del JSON en texto, y anotaciones de comportamiento (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).

  • Paginación explícita en las tools de búsqueda y consulta: count, total, hasMore y nextOffset/nextSkip.

  • Seguridad por diseño: credenciales solo por variables de entorno, secretos redactados en las respuestas, API key y validación de Origin (anti DNS-rebinding) en modo HTTP, allowlist opcional de hosts salientes, regla de no-registro en stdout.

Related MCP server: BelugaMCP

📦 Instalación

# Uso directo con npx (una vez publicada la versión en npm):
npx @pired/sap-fiori-mcp-server

# Instalación global:
npm install -g @pired/sap-fiori-mcp-server
sap-fiori-mcp --http --port 3001

# Desde el tarball sin publicar:
npm install -g pired-sap-fiori-mcp-server-1.1.0.tgz

# Desde el código:
npm install && npm run build

Guía de publicación en NPM: docs/NPM-PUBLISH.md.

Probar con el proyecto de ejemplo

# el repo incluye examples/bookshop (CAP) con modelo CDS y datos CSV
# desde otra terminal, con el servidor en modo HTTP:
curl -X POST http://localhost:3001/mcp \
  -H "content-type: application/json" \
  -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_model","arguments":{"projectPath":"./examples/bookshop","query":"Books","kind":"entity"}}}'

⚙️ Configuración por cliente MCP

Claude Code

# Una vez publicado en npm, la forma más simple:
claude mcp add sap-fiori-mcp -- npx -y @pired/sap-fiori-mcp-server

# O apuntando a una copia local del código:
claude mcp add sap-fiori-mcp -- node /ruta/absoluta/sap-fiori-mcp-server/dist/index.js

O crea un .mcp.json en la raíz del proyecto:

{
  "mcpServers": {
    "sap-fiori-mcp": {
      "type": "stdio",
      "timeout": 600,
      "command": "node",
      "args": ["/ruta/absoluta/sap-fiori-mcp-server/dist/index.js"],
      "env": { "LOG_LEVEL": "info" }
    }
  }
}

Claude Desktop

Edita claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):

{
  "mcpServers": {
    "sap-fiori-mcp": {
      "command": "node",
      "args": ["/ruta/absoluta/sap-fiori-mcp-server/dist/index.js"],
      "env": {
        "SAP_BASE_URL": "https://tu-sistema:44300",
        "SAP_CLIENT": "100",
        "SAP_USER": "DEVELOPER",
        "SAP_PASSWORD": "tu-password"
      }
    }
  }
}

Cursor

Edita .cursor/mcp.json (proyecto) o ~/.cursor/mcp.json (global):

{
  "mcpServers": {
    "sap-fiori-mcp": {
      "type": "stdio",
      "command": "node",
      "args": ["/ruta/absoluta/sap-fiori-mcp-server/dist/index.js"]
    }
  }
}

VS Code (Copilot / Cline)

.vscode/mcp.json:

{
  "servers": {
    "sap-fiori-mcp": {
      "type": "stdio",
      "command": "node",
      "args": ["/ruta/absoluta/sap-fiori-mcp-server/dist/index.js"]
    }
  },
  "inputs": []
}

En Windows nativo (no WSL) usa "command": "cmd" y "args": ["/c", "node", "...\\dist\\index.js"].

Modo HTTP (equipo / remoto)

SAP_FIORI_MCP_API_KEY=mi-secreto node dist/index.js --http --port 3001 --host 0.0.0.0

Endpoints: POST /mcp (MCP Streamable HTTP) y GET /health (estado del servidor).

🔒 Protección DNS-rebinding: el servidor valida la cabecera Origin. Las peticiones sin Origin (clientes MCP, curl, extensiones de IDE) y las de localhost/127.0.0.1 se aceptan; cualquier otro origen de navegador se rechaza con 403 salvo que lo declares en SAP_FIORI_MCP_ALLOWED_ORIGINS. Si expones el servidor con --host 0.0.0.0, usa siempre SAP_FIORI_MCP_API_KEY.

{
  "mcpServers": {
    "sap-fiori-mcp": {
      "type": "streamableHttp",
      "url": "http://tu-servidor:3001/mcp",
      "headers": { "x-api-key": "mi-secreto" }
    }
  }
}

Docker

docker build -t sap-fiori-mcp-server .
# HTTP:
docker run -p 3001:3001 -e SAP_FIORI_MCP_API_KEY=secreto sap-fiori-mcp-server --http --port 3001 --host 0.0.0.0
# stdio (cliente dockerizado):
docker run -i --rm sap-fiori-mcp-server

🧰 Tools disponibles (26)

Documentación y guías

Tool

Descripción

search_docs

Búsqueda semántica (TF-IDF) sobre el corpus local de Fiori Elements, anotaciones, UI5, OPA5, cards, TypeScript, CAP y BTP destinations. Parámetros: query, scope (all/fiori/ui5/cap/opa5/cards/typescript/btp), limit.

get_guidelines

Mejores prácticas UI5 por tema: general, views, bindings, routing, i18n, performance, security, testing.

get_integration_cards_guidelines

Guía de desarrollo de UI Integration Cards.

get_typescript_conversion_guidelines

Guía paso a paso para convertir apps UI5 de JavaScript a TypeScript.

Fiori (generación y modificación)

Tool

Descripción

list_fiori_apps

Escanea un workspace y lista las apps Fiori existentes (FE V4/V2, freestyle, cards, adaptación) con su entitySet, versión OData y vistas.

list_sap_systems

Lista los sistemas SAP configurados (env vars o ~/.sap-fiori-mcp/systems.json).

download_odata_service_metadata

Descarga el $metadata EDMX de un servicio OData V2/V4 y lo guarda como metadata.xml; devuelve resumen de entity sets y tipos. Acepta serviceUrl, systemName (+servicePath) o destination (+servicePath) BTP.

get_metadata_summary

Resume un metadata.xml local (entidades, claves, asociaciones, anotaciones).

generate_fiori_app_odata

Genera una app Fiori elements para servicios OData no-CAP (p.ej. RAP). Acepta destination/systemName + servicePath —los mismos argumentos que descargaron la metadata— y escribe la URL real del servicio en el manifest. En V2 busca el documento de anotaciones del servicio en el catálogo y lo declara. Sin entitySet elige la entidad por sus anotaciones, no por el orden del documento. Floorplans: list-report (LR+ObjectPage, V4+V2), object-page (form entry, V4), worklist (V4+V2), analytical-list-page (V2), overview-page (V2). Opcional: FCL, initial load. Los combos no soportados se ajustan con warning, y avisa cuando al servicio le faltan las anotaciones que el floorplan necesita.

generate_fiori_app_cap

Genera una app Fiori elements dentro de un proyecto CAP existente, resolviendo servicio y entidad del modelo CDS automáticamente. La URL del servicio sigue a la versión de @sap/cds del proyecto (cds 10 monta un @path absoluto tal cual; antes llevaba /odata/v4 delante), la app arranca UI5 desde el CDN porque cds sirve la carpeta de la app y nada más, y avisa si la entidad no tiene UI.LineItem —sin ella la tabla sale sin columnas—. Floorplans: list-report, object-page, worklist.

list_functionality

Paso 1/3 — Lista las modificaciones soportadas para una app existente.

get_functionality_details

Paso 2/3 — Parámetros requeridos por una funcionalidad.

execute_functionality

Paso 3/3 — Ejecuta: add_page, delete_page, add_controller_extension, enable_fcl, enable_initial_load, update_manifest.

UI5

Tool

Descripción

create_ui5_app

Scaffolding freestyle: basic, worklist (tabla + object page), master-detail (FCL), fcl (Flexible Column Layout con routing por columnas) o tabs (IconTabBar).

create_integration_card

Crea una UI Integration Card (List, Object, Table, Timeline, Analytical, Adaptive, Component, Calendar) con preview.

get_api_reference

API reference de un control (p.ej. sap.m.Table) con JSDoc, desde los type definitions oficiales (@openui5/ts-types-esm vía CDN, con caché local).

get_project_info

Extrae metadata y configuración de un proyecto UI5/CAP (framework, libs, vistas, modelos, routing).

get_version_info

Versiones del framework UI5 (CDN sap-ui-version.json + versión local del proyecto).

run_manifest_validation

Valida manifest.json: patrón del id, dataSources, modelos, routing/targets, existencia de vistas e i18n, estructura de cards.

run_ui5_linter

Linter UI5: APIs deprecadas (jQuery.sap.*, sap.ui.getCore().byId), librerías eliminadas, controles deprecados, controladores e i18n faltantes.

CAP / CDS

Tool

Descripción

search_model

Búsqueda fuzzy sobre las definiciones del modelo CDS compilado (entidades, vistas, servicios, types, aspects, events, actions).

get_cap_details

Detalles completos de una definición: elementos, claves, asociaciones (target, cardinalidad, on-condition), actions y functions con sus parámetros (nombre, tipo, default, colecciones), anotaciones y exposición por servicio.

query_cap_data

Ejecuta queries tipo CQN sobre los datos de ejemplo CSV de CAP (db/data/<namespace>-<Entity>.csv): columnas, filtro WHERE-like (and/or, eq/ne/gt/ge/lt/le, contains), orden, skip/limit.

SAP BTP (destinations y OData remoto)

Tool

Descripción

list_btp_destinations

Lista los destinations disponibles: locales (env/JSON/archivo/carpeta) y del BTP Destination Service en la nube. Secretos redactados.

get_btp_destination

Detalles de un destination (URL, auth, sap-client, headers) con secretos redactados y preview de la autenticación resuelta.

btp_login

Abre el navegador para el login único de BTP de un destination y guarda el refresh token, de modo que las llamadas posteriores se renuevan solas. Es el único paso que no puede resolverse desde un resultado de tool: BTP delega en un proveedor de identidad con SSO y segundo factor, así que hace falta un navegador de verdad. Antes solo existía en el panel y en --btp-login, y una tool que fallaba por token caducado solo sabía mandarte a un terminal. Un cliente MCP abandona una tool call a los 60 s y un login con SSO y segundo factor no cabe ahí, así que la llamada devuelve pending: true con la URL en cuanto el navegador está abierto: terminás el login y volvés a llamarla para recoger el resultado. noBrowser devuelve la URL en vez de abrirla.

query_odata_data

Ejecuta una query OData V2/V4 contra un entity set vía destination BTP, systemName de list_sap_systems o serviceUrl directa. Soporta $filter, $top, $skip, $select, $orderby, $expand y el total de filas ($count en V4, $inlinecount en V2). La versión se detecta sola: un servicio V2 rechaza $count sin nombrarlo —Gateway responde «Invalid system query option specified»— así que el reintento se decide por el código de estado, no por el texto. Es la contraparte remota de query_cap_data.

🧭 Qué sale al generar una app (y qué se ha comprobado)

Las apps generadas se han ejecutado en un navegador contra servicios reales, no solo validado. Cada variante de esta tabla se abrió, cargó datos y se navegó:

Variante

Servicio de prueba

Resultado

OData V4, list report + object page

/DMO/UI_TRAVEL_D_D (BTP)

4.136 viajes; detalle con su faceta de reservas

OData V4, worklist

/DMO/UI_TRAVEL_D_D

carga sola, sin pulsar Ir

OData V4, CDS con parámetros

binding propio sobre /DMO/I_Travel_U

sap.fe pide los parámetros y lista 2.017 filas

OData V2, list report + object page

ZUI_TRAVEL_APP

40 viajes con columnas, filtros y acciones; detalle con 4 reservas

CAP (cds 10)

examples/bookshop

6 libros con las columnas que describen las anotaciones

Cómo se elige la entidad cuando no se pasa entitySet: se toman los entity sets con UI.LineItem; de esos, los que además tienen UI.HeaderInfo o UI.Facets —un value help lleva LineItem para su popup, pero nadie le escribe un object page—; y entre los que quedan manda el Common.DraftRoot que declare el servicio, luego la raíz de la composición y luego UI.SelectionFields, que es la barra de filtros de la página sobre la que abre la app. Sin anotaciones se usa el primer entity set, como antes.

Anotaciones de un servicio V2: un servicio Gateway guarda las anotaciones UI fuera de su $metadata. El generador pregunta al catálogo por el documento del servicio, lo declara como ODataAnnotation, guarda una copia en localService/ y lo usa también para elegir la entidad. Sin catálogo, sin autorización o con el modelo vacío, la generación sigue igual que antes.

CDS con parámetros: las páginas se direccionan por contextPath (/Entidad/Set), que es lo que hace que sap.fe pida los parámetros antes de cargar nada.

Limitaciones conocidas

  • Sin object page para una entidad paramétrica. sap.fe no lo contempla: resuelve la página contra la entidad de parámetros y pide rutas que no existen (…/Set('1')/p_from), así que el detalle solo podría abrir vacío. Se genera el list report y se avisa; expón la entidad resultado sin parámetros si necesitas detalle.

  • analytical-list-page necesita anotaciones analíticas (UI.Chart, UI.PresentationVariant). Si el servicio no las trae, se genera igual pero se avisa: la página abriría con un error.

  • overview-page es un andamio: arranca y pinta los marcos de las tarjetas, pero las tarjetas no enlazan a datos. Descríbelas en sap.ovp/cards con su annotationPath antes de usarla. El aviso lo dice al generar.

🖥️ Panel de conexiones

npx @pired/sap-fiori-mcp-server --admin

Abre un panel local para dar de alta, editar, renombrar y borrar sistemas SAP y destinations BTP, y probar cada conexión —sistema o destination— antes de usarla: alcance del host, aceptación de credenciales y lectura de $metadata, mostrando el código HTTP, el sistema que responde (sap-system), el realm y el mensaje real de SAP. También informa de si el certificado TLS es de confianza y de qué variables ${env:...} no están definidas.

Los destinations con service key traen además un botón Token BTP: dice si hay token guardado y cómo está sellado, lo valida contra el tenant (gastándolo en un access token, que es la única autoridad sobre si sigue vivo), permite iniciar sesión desde ahí mismo y olvidarlo. Un token guardado es invisible hasta que falla: se ve igual funcionando que caducado.

Cuatro cosas lo mantienen a raya:

  • Escucha solo en 127.0.0.1; no existe opción para cambiarlo.

  • Exige un token generado en cada arranque, impreso una vez en consola y enviado en cabecera.

  • No usa cookies, así que otra pestaña no puede lograr que el navegador se autentique sola.

  • Rechaza cualquier petición cuyo Host no nombre al loopback, que es lo que cierra el DNS-rebinding desde el propio navegador del operador.

Y la regla que lo sostiene: ningún secreto entra ni sale. La contraseña solo se acepta como ${env:NOMBRE}; los secretos que ya estuvieran literales en un fichero de destination se conservan intactos al editar, pero nunca se devuelven.

Variable

Por defecto

Descripción

SAP_FIORI_MCP_ADMIN_PORT

7392

Puerto del panel (también con --port).

🔧 Variables de entorno

Variable

Default

Descripción

LOG_LEVEL

error

off, error, warn, info, debug (log a archivo, nunca a stdout).

SAP_FIORI_MCP_LOG_FILE

~/.sap-fiori-mcp/server.log

Ruta del log.

SAP_FIORI_MCP_WORKSPACE_ROOT

cwd

Raíz por defecto para rutas relativas.

SAP_BASE_URL / SAP_USER / SAP_PASSWORD / SAP_CLIENT / SAP_SYSTEM_NAME

Sistema SAP "default" con Basic Auth.

SAP_SYSTEMS_JSON o SAP_SYSTEMS_FILE

~/.sap-fiori-mcp/systems.json

Varios sistemas: [{ "name", "url", "client", "user", "password" }]. UTF-8, con o sin BOM. Admite ${env:NOMBRE} en cualquier campo para no guardar contraseñas en el fichero. Si algo no se puede leer o falta una variable, list_sap_systems lo dice en warnings en vez de reportar cero sistemas.

SAP_DESTINATIONS_JSON

Destinations BTP inline: [{ "Name", "URL", "Authentication", ... }] (también acepta el env destinations del Cloud SDK).

SAP_DESTINATIONS_FILE / SAP_DESTINATIONS_DIR

dir: ~/.sap-fiori-mcp/destinations

Un JSON por destination (<nombre>.json, formato cockpit export o camelCase).

BTP_CLIENT_ID / BTP_CLIENT_SECRET / BTP_TOKEN_URL / BTP_DESTINATION_API_URL

Conexión al BTP Destination Service (o detección automática vía VCAP_SERVICES).

BTP_USER_TOKEN

Token de usuario para destinations OAuth2UserTokenExchange / OAuth2JWTBearer.

UI5_DISTRIBUTION

openui5

openui5 (sdk.openui5.org) o sapui5 (ui5.sap.com).

UI5_CDN_URL

según distribución

CDN alternativo para versiones de UI5.

UI5_TYPES_CDN_URL

jsDelivr @openui5/ts-types-esm

Fuente de los type definitions para get_api_reference.

SAP_FIORI_MCP_API_KEY

API key requerida en modo HTTP (x-api-key o Authorization: Bearer).

SAP_FIORI_MCP_ALLOWED_DOMAINS

(vacío = sin restricción)

Allowlist de hosts salientes. Limita las URLs pasadas como argumento (serviceUrl); los hosts de tus sistemas, destinations y CDNs configurados siempre se permiten. Admite *.dominio.com.

SAP_FIORI_MCP_ALLOWED_ORIGINS

(solo loopback)

Modo HTTP: orígenes de navegador aceptados. * desactiva la comprobación.

SAP_FIORI_MCP_TOOL_PREFIX

Prefija todos los nombres de tools (p. ej. sapfiori_search_docs) para evitar colisiones con otros servidores MCP.

SAP_FIORI_MCP_TIMEOUT_MS

30000

Timeout de requests OData/CDN.

SAP_FIORI_MCP_RESPONSE_NO_RESOURCES

Desactiva los recursos MCP (clientes sin soporte).

Ejemplo de archivo de sistemas (~/.sap-fiori-mcp/systems.json):

[
  { "name": "S4H-DEV", "url": "https://s4dev:44300", "client": "100", "user": "DEV", "password": "secret" },
  { "name": "BTP-ABAP", "url": "https://xxx.abap-web.eu10.hana.ondemand.com", "user": "mail@corp.com", "password": "secret" }
]

☁️ Conectividad SAP BTP

1. Destinations locales (sin nube)

Un JSON por destination en ~/.sap-fiori-mcp/destinations/ (o SAP_DESTINATIONS_JSON inline). Formato cockpit export o camelCase:

{
  "Name": "S4H",
  "URL": "https://s4.example.com:44300",
  "Authentication": "BasicAuthentication",
  "User": "dev",
  "Password": "secret",
  "sap-client": "100"
}

Para OAuth2: { "name": "SFSF", "authType": "OAuth2ClientCredentials", "clientId": "...", "clientSecret": "...", "tokenServiceUrl": "https://...authentication.eu10.hana.ondemand.com" } — el token se intercambia automáticamente en cada request.

2. BTP Destination Service (nube)

Lo más simple es apuntar al fichero de service key tal como se descarga del cockpit, sin repartir sus campos:

export BTP_SERVICE_KEY_FILE=/ruta/a/destination-key.json

Se leen de él clientid, clientsecret, la URL de UAA (url) y la API de destinations (uri). El fichero se queda donde está: el secreto no se copia a ninguna otra parte. Si prefieres las variables sueltas, siguen funcionando:

export BTP_CLIENT_ID="sb-..."
export BTP_CLIENT_SECRET="..."
export BTP_TOKEN_URL="https://subaccount.authentication.eu10.hana.ondemand.com"
export BTP_DESTINATION_API_URL="https://destination-configuration.cfapps.eu10.hana.ondemand.com"
# Alternativa: detección automática desde VCAP_SERVICES (deploy en CF/Kyma)

Un destination OAuth también puede apuntar a su service key en lugar de deletrear las credenciales:

{ "Name": "TRL", "Authentication": "OAuth2ClientCredentials",
  "serviceKeyPath": "/ruta/a/abap-key.json" }

Cuidado con el host -web. Un ABAP Environment tiene dos: el que nombra la service key sirve las APIs (ADT y OData), y su gemelo -web sirve el launchpad. Llamar al -web desde código devuelve 200 con una página de login, que despista más que un error. Los servicios se consumen en el host de la key, y exigen token de usuario nombrado también para OData.

Por qué OAuth2ClientCredentials falla contra un ABAP Environment. El token se emite sin problema, pero llega con un único scope, uaa.resource, que no autoriza nada en el ABAP: el sistema responde 401 con sap-authenticated: false, idéntico a unas credenciales incorrectas. El panel muestra ahora los scopes del token junto al paso de autenticación, que es lo que distingue "credencial mala" de "este cliente no tiene permiso aquí".

Para un ABAP Environment (Steampunk) no sirve OAuth2ClientCredentials: ese token pertenece al cliente OAuth y a ninguna persona, y el ABAP responde 401 porque no tiene usuario con el que ejecutar. Hace falta un usuario nombrado, y en un subaccount con proveedor de identidad (trial, o corporativo con SSO) eso no es una contraseña sino un refresh token de un login por navegador hecho una vez:

npx @pired/sap-fiori-mcp-server --btp-login --destination BTP

Abre el navegador, haces login como siempre (SSO y segundo factor incluidos) y guarda el refresh token él mismo, en ~/.sap-fiori-mcp/tokens/<destination>.json. En Windows va sellado con DPAPI: solo ese usuario de Windows y en esa máquina puede abrirlo. Después basta con poner el destination en OAuth2RefreshToken; no hay que copiar nada:

{ "Name": "BTP", "Authentication": "OAuth2RefreshToken",
  "serviceKeyPath": "/ruta/a/btp-key.json" }

Si prefieres gestionarlo tú, un refreshToken explícito como ${env:NOMBRE} tiene prioridad sobre el almacén. Es el único secreto que este servidor guarda en un fichero propio, y lo hace porque lo genera él: pedirte que lo copies a mano sería un paso manual para un valor que nadie eligió.

El flujo es authorization code con PKCE y redirect a loopback, el mismo que usa Eclipse ADT. OAuth2Password sigue disponible para subaccounts cuyos usuarios viven en la propia UAA.

Se entienden las tres formas que emite BTP: la del Destination service (uri + url), la de ABAP Environment (credenciales bajo uaa, y de la que se toma también la URL del sistema) y la de XSUAA.

Si el Destination Service devuelve tokens pre-intercambiados (authTokens), se usan tal cual — así destinations OAuth2 o On-Premise funcionan sin exponer secretos.

3. Flujo típico con el modelo de IA

list_btp_destinations → get_btp_destination (verificar auth) → query_odata_data (validar datos)
→ download_odata_service_metadata (destination + servicePath) → generate_fiori_app_odata

Los secretos (password, clientSecret, tokens) nunca aparecen en las respuestas de las tools.

🔒 Certificados SSL autofirmados

Si tu sistema SAP usa un certificado autofirmado (unable to get local issuer certificate):

Opción recomendada — CA personalizada:

"env": { "NODE_EXTRA_CA_CERTS": "/ruta/a/ca.crt" }

Opción no recomendada (solo dev) — desactivar validación TLS:

"env": { "NODE_TLS_REJECT_UNAUTHORIZED": "0" }

🤖 Reglas para el modelo de IA

Copia las reglas de docs/AGENTS-rules.md en tu AGENTS.md/CLAUDE.md/.cursorrules para que el asistente use el servidor correctamente (igual que hacen los servidores de SAP).

📁 Estructura del proyecto

sap-fiori-mcp-server/
├── src/
│   ├── index.ts          # CLI: stdio / HTTP / --help
│   ├── server.ts         # Factoría McpServer + registro de tools + recursos
│   ├── http.ts           # Transporte HTTP Streamable (stateless, API key, CORS)
│   ├── config.ts         # Variables de entorno y sistemas SAP
│   ├── logger.ts         # Log a archivo (nunca stdout)
│   ├── tools/            # Registro de las 26 tools (doc/fiori/ui5/cap/btp)
│   ├── fiori/            # apps, generación (5 floorplans FE), funcionalidades
│   ├── ui5/              # scaffold (5 plantillas), cards, api, versions, project, validate, linter
│   ├── cap/              # parser CDS, modelo, motor de queries CSV
│   ├── btp/              # destinations: env/archivos/Destination Service, auth OAuth2/Basic
│   ├── odata/            # cliente OData V2/V4 + parser EDMX
│   ├── util/             # fs seguro, búsqueda TF-IDF, helpers XML
│   └── docs/             # corpus documental integrado
├── examples/bookshop/    # Proyecto CAP demo (db + srv + datos CSV)
├── test/                 # 243 tests (Vitest) con transport in-memory
├── docs/AGENTS-rules.md  # Reglas para el modelo de IA
├── docs/NPM-PUBLISH.md   # Guía de publicación en npm
├── Dockerfile            # Multi-stage, node:22-alpine
└── .vscode/launch.json   # Debug con breakpoints (stdio y HTTP)

🧪 Desarrollo

npm run build       # tsc → dist/
npm run typecheck   # tsc --noEmit
npm test            # vitest run (243 tests)
npm run test:watch  # vitest watch

Evaluación del servidor: eval/evaluation.xml contiene 10 preguntas de solo lectura que miden si un modelo puede resolver tareas reales con estas tools y nada más (instrucciones en eval/README.md). npm test -- evaluation-answers recalcula cada respuesta llamando a las tools, para que la evaluación no se quede obsoleta si cambia el proyecto de ejemplo.

Debug: abre la carpeta en VS Code y usa las configuraciones de .vscode/launch.json («MCP server (stdio)» y «MCP server (HTTP :3001)»).

🆚 Diferencias con los servidores oficiales

Aspecto

Servidores oficiales

Este servidor

Búsqueda documental

Embeddings locales (modelo ~86 MB en fiori-mcp-server)

TF-IDF sobre corpus integrado, sin descargas

Modelo CDS

@cap-js/cds compilado

Parser CDS propio (entidades, servicios, aspectos, anotaciones)

API reference UI5

@ui5/dts-tooling + CDN

Type definitions oficiales por CDN con caché

Transporte

stdio

stdio + HTTP Streamable con API key

BTP

Destinations locales + Destination Service + query_odata_data

Instalación

npx (descarga paquete npm)

npx @pired/sap-fiori-mcp-server, build local o Docker

Extras

get_metadata_summary, get_cap_details, query_cap_data, proyectos demo

📄 Licencia

MIT — ver LICENSE.

Available Tools

27 tools
btp_loginSign in to SAP BTP in a browserA

Opens a browser for the one-time SAP BTP login of a destination and stores the refresh token it returns, so later calls renew themselves. Use it when a destination fails with an expired or missing refresh token. The destination must carry a serviceKeyPath. Signing in takes longer than an MCP client waits for a tool call, so this returns 'pending' with the URL once the browser is open: finish the login there and call it again for the same destination to collect the outcome. Set noBrowser to get the URL back instead, for a machine with no browser of its own.

ParametersJSON Schema
NameRequiredDescriptionDefault
noBrowserNoDo not open a browser; return the URL to open by hand (over SSH, or in a container)
destinationYesName of the destination to sign in for, as list_btp_destinations reports it
waitSecondsNoSeconds to hold this call waiting for a fast login before answering 'pending'. An MCP client abandons a tool call after 60 s, so this never goes near that.
timeoutSecondsNoHow long the login itself stays open in the background, waiting for the browser callback

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesAuthorize URL that was opened, or the one to open by hand when noBrowser was set
detailYes
sealedYesHow the refresh token was stored: 'dpapi' on Windows, 'plain' elsewhere
pendingYesTrue when the browser is open and the login has not come back yet; call the tool again to collect the outcome
signedInYes
sealErrorNoSet when sealing failed and the token was stored in the clear
destinationYes
identityProviderNoHost that actually asked for the credentials, when it could be resolved

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the two-phase async behavior (returns 'pending' with the URL, requires a second call to collect the outcome), explains why it outlasts MCP client timeouts, and notes the side effect of storing a refresh token. This goes well beyond the annotations' bare mutation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A dense four-sentence description with no filler. Purpose, trigger condition, async timeout behavior, and the noBrowser fallback each earn their place without excessive length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with asynchronous side effects and a two-call workflow, the description covers the full invocation contract: when to use, precondition, pending response, repeat-call semantics, and headless fallback. The output schema handles return-value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already documents all 4 parameters (100% coverage), but the description adds genuine context: ties waitSeconds to the MCP 60s call limit, explains noBrowser for headless machines, and links destination to the serviceKeyPath requirement. This is additive, not redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: opens a browser for the one-time SAP BTP login of a destination and stores the refresh token it returns. It clearly distinguishes itself from sibling list/get/execute tools by focus on authentication and token renewal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use it when a destination fails with an expired or missing refresh token' and adds a precondition (the destination must carry a serviceKeyPath). It stops short of naming when-not-to-use or alternative sibling tools, so it loses a point for not having explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_integration_cardScaffold a UI Integration CardA

Creates a manifest-based UI Integration Card (List, Object, Table, Timeline, Analytical, Adaptive, Component, Calendar) with preview index.html. Fails if the target folder already exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCard name / folder name
titleNoCard title
dataUrlNoData request URL for the card
cardTypeNoCard typeList
namespaceNoCard id namespace
targetPathNoFolder where the card folder is created

Output Schema

ParametersJSON Schema
NameRequiredDescription
appPathYes
nextStepsNo
createdFilesYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, covering basic safety traits. The description adds useful specifics: it creates a manifest-based card with a preview index.html, and fails if the target folder exists, which clarifies the non-overwriting behavior. This goes beyond the annotations and gives the agent clear expectations about side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, information-dense sentence. It front-loads the primary action and resource, lists all valid card types in a compact enumeration, and includes the critical failure condition. Every element earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core creation behavior, the supported types, the preview file, and the failure condition. With an output schema present and full parameter coverage in the schema, the description is sufficient for an agent to understand what the tool does and what to expect. It might benefit from mentioning any environment prerequisites (e.g., having a valid session), but given the available structured data, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are documented in the schema. The description does not add any parameter-specific details beyond what the schema provides; it merely lists card types that are already an enum. With full schema coverage, the baseline of 3 is appropriate, as the description does not need to compensate for missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a manifest-based UI Integration Card, enumerates the supported card types, and notes the preview index.html and failure condition. This differentiates it from sibling tools like create_ui5_app or generate_fiori_app_odata, which target different artifacts. The verb 'creates' with a specific resource and explicit scoping makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. It implies usage for creating Integration Cards, but there is no guidance on when choose this over other generation tools. The failure condition 'Fails if the target folder already exists' provides a practical constraint but does not clarify the appropriate context relative to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_ui5_appScaffold a new UI5 freestyle applicationA

Creates a new UI5 freestyle app from templates: 'basic' (single page), 'worklist' (searchable table + object page, OData V2), 'master-detail' (FCL, 2 columns), 'fcl' (Flexible Column Layout with column routing) or 'tabs' (IconTabBar page). Generates manifest.json, Component.js, views, controllers, i18n, index.html, ui5.yaml and package.json. Fails if the target folder already exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesApp name / folder name, e.g. 'shop'
titleYesApp title
templateNoTemplatebasic
namespaceNoApp id namespace, e.g. 'my.company'ns
serviceUriNoOData service URL for worklist/master-detail/fcl templates
targetPathNoFolder where the app folder is created (default workspace root)
ui5VersionNoUI5 version for bootstrap and minUI5Version (default 1.120.0)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appPathYes
nextStepsNo
createdFilesYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no hints (all false), so the description carries the burden. It discloses a key behavioral trait: 'Fails if the target folder already exists.' It also details the generated files, giving a clear picture of side effects. However, it does not mention that certain templates require serviceUri or any network/permission dependencies, which is a minor gap but not critical given no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences: first states purpose and templates with inline explanations, second lists generated files, third states the failure condition. It is front-loaded with the core purpose and template options, and every sentence adds distinct information without redundancy. No filler or unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete enough for an agent to decide whether to invoke it: it covers the tool's scope (freestyle apps), lists templates, generated files, and failure behavior. An output schema exists (per signal) for return values. While it does not detail when to choose each template, the schema and inline notes cover parameter needs (e.g., serviceUri's purpose is in schema). Minor gaps remain about prerequisites or environment, but these are not essential for successful invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are documented. The description adds value by explaining template meanings (e.g., 'master-detail' as 'FCL, 2 columns') and noting the failure condition related to targetPath. This enriches the schema's dry descriptions, e.g., clarifying that worklist is OData V2. It does not repeat parameter details but adds contextual semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Creates a new UI5 freestyle app' and lists specific template types with brief explanations (e.g., 'worklist' as 'searchable table + object page, OData V2'). It also enumerates the generated artifacts (manifest.json, Component.js, etc.), making the scope unambiguous. It distinguishes from sibling generation tools by focusing on freestyle apps, though it does not name alternatives directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (for creating freestyle UI5 apps) but does not explicitly state when to use this tool versus siblings like generate_fiori_app_odata or generate_fiori_app_cap. It provides no exclusions or guidance on selecting between templates beyond naming them. The context suggests it is for freestyle apps, but explicit comparisons with alternatives are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_odata_service_metadataDownload OData service metadata (EDMX)A
DestructiveIdempotent

Downloads the $metadata EDMX document of an OData service (V2 or V4) and saves it as localService/metadata.xml (or a custom path). Provide serviceUrl directly, or a systemName from list_sap_systems plus servicePath, or a BTP destination (destination + optional servicePath). Returns a summary of entity sets and types.

ParametersJSON Schema
NameRequiredDescriptionDefault
savePathNoWhere to save metadata.xml (default: <workspace>/metadata.xml)
serviceUrlNoFull OData service URL, e.g. https://host:port/sap/opu/odata4/sap/my_v4_service?sap-client=000
systemNameNoName of a configured SAP system (see list_sap_systems)
destinationNoBTP destination name (see list_btp_destinations) — auth headers are applied automatically
servicePathNoService path relative to the system/destination URL, e.g. /sap/opu/odata/sap/SEPMRA_PROD_MAN

Output Schema

ParametersJSON Schema
NameRequiredDescription
savedToNo
sourceUrlNo
entitySetsYes
namespacesYes
annotationsNo
entityTypesYes
odataVersionYes
annotationTargetsNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose the broad safety profile (not read-only, destructive, idempotent). The description adds specific behavioral context: the side effect of writing to localService/metadata.xml or a custom path, automatic auth header handling for BTP destinations, and support for both V2 and V4 services. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: the first states the core action and output, the second specifies the input modes, and the third describes the return value. It is front-loaded and contains zero filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 optional parameters and no required ones, the description fully explains the three valid invocation patterns, the default and custom output path, and the summary return. An output schema exists, so return details are covered externally. The only minor inconsistency is 'localService/metadata.xml' vs the schema's '<workspace>/metadata.xml', but this does not compromise completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaningful semantics beyond the schema by clarifying that serviceUrl, systemName, and destination are alternative input modes, with servicePath relative to the chosen source. This combination guidance is not evident from the individual parameter descriptions and materially helps an agent construct a valid call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a highly specific verb and resource: 'Downloads the $metadata EDMX document of an OData service (V2 or V4) and saves it as localService/metadata.xml'. This clearly distinguishes it from sibling tools like get_metadata_summary or query_odata_data, which have different outputs and purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence explicitly enumerates the three supported invocation modes: direct serviceUrl, systemName plus servicePath, or BTP destination with optional servicePath. It also references sibling tools list_sap_systems and list_btp_destinations as sources for valid values, giving concrete usage guidance. It does not explicitly compare against alternatives like get_metadata_summary, but the in-tool usage context is very clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_functionalityExecute a modification functionality (step 3/3)A
Destructive

Executes a modification on an existing SAP Fiori application: adds/deletes pages, adds controller extensions, enables FCL or initial load, or updates manifest.json properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNoParameters required by the functionality (see get_functionality_details)
appPathYesAbsolute path to the app folder
functionalityIdYesFunctionality id

Output Schema

ParametersJSON Schema
NameRequiredDescription
changedYes
createdYes
messageYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the mutation profile is established. The description adds some operation-level context, such as deleting pages and updating manifest.json, which is consistent with the annotations. However, it does not disclose additional behavioral details like filesystem effects, reversibility, or required permissions; with the annotation coverage present, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence begins with the action and target, then uses a colon-separated list of supported operations. There is no filler or redundant restatement of the tool name. The length is proportionate to the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, strong annotations, and full schema parameter coverage, the description covers the core operation scope. However, it omits workflow guidance: it never explicitly tells the agent to call get_functionality_details first to resolve params, despite that being a clear dependency for correct invocation. The safety profile is covered by annotations, but the execution workflow is under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3: appPath and functionalityId are documented and the enum values are explicit. The description paraphrases the functionalityId enum values at a high level, adding slight clarification but no major semantic information beyond the schema. The nested params object is intentionally left to get_functionality_details, which the schema references.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Executes a modification on an existing SAP Fiori application' and enumerates the exact supported operations. This clearly differentiates it from read-only siblings like get_functionality_details and list_functionality, as well as creation tools like create_ui5_app. The title's 'step 3/3' adds workflow context, but the description is independently clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context by limiting the tool to existing applications and listing the mutation operations it performs, which routes an agent toward this tool for modification tasks. It does not explicitly name alternatives or state when not to use it, but the 'existing app' qualifier and operation list provide enough placement guidance. The prerequisite of fetching parameters via get_functionality_details is only implied by the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_fiori_app_capGenerate a Fiori elements app inside a CAP projectA

Generates a new SAP Fiori elements application inside an existing SAP CAP project (app/ folder), based on an entity of the project's CDS model. Reads the CDS model to resolve the main entity and its to-many associations, and wires the app to the CAP service.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesApplication title shown in the shell
addFclNoEnable Flexible Column Layout (default true for V4)
appNameYesApp name, used as folder name (e.g. 'travels')
entitySetNoMain entity set (optional if metadata is provided)
floorplanNoFloorplan: 'list-report' (LR+ObjectPage), 'object-page' (form entry) or 'worklist'. CAP apps are OData V4.list-report
namespaceNoApp id namespace (default 'ns' for OData / 'cap.app' for CAP)
descriptionNoApplication description
initialLoadNoSet initialLoad:true so the List Report table loads without pressing Go (default true for 'worklist')
serviceNameNoCDS service whose entity is exposed (e.g. CatalogService). Auto-detected when omitted.
capProjectPathYesRoot of the CAP project (contains package.json with @sap/cds and db/srv folders)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appPathYes
warningsYes
nextStepsYes
serviceUriNo
createdFilesYes
resolvedServiceNo
resolvedEntitySetNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no safety hints, so the description carries the burden; it discloses that the tool reads the CDS model, resolves to-many associations, and wires the app to the CAP service. This goes beyond a generic 'generate' statement, though it could still be more explicit about overwrite behavior or exactly which files are modified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, with the purpose front-loaded and the behavioral detail in the second sentence. There is no filler or repeated information from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter code-generation tool, the description provides enough context to invoke it correctly: existing CAP project, app/ folder, CDS entity resolution, and service wiring. The presence of an output schema covers return-value details, and the parameter schema covers individual options; a small gap is the lack of explicit idempotency or overwrite behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter already has a clear description. The tool description adds contextual information about CDS-model resolution and service wiring, but no parameter-specific meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('generates'), names the target resource (a SAP Fiori elements app inside an existing CAP project's app/ folder), and specifies the source input (an entity of the project's CDS model). The CAP/CDS focus clearly differentiates it from siblings like generate_fiori_app_odata and create_ui5_app.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the tool is for an existing SAP CAP project and that it uses a CDS entity, which gives an agent enough context to know when this tool applies. It does not explicitly name alternatives or state when not to use it, but the provided context is more than merely implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_fiori_app_odataGenerate a Fiori elements app for an OData service (non-CAP)A

Generates a new SAP Fiori elements application for an OData V2/V4 service, e.g. from RAP. Floorplans: 'list-report' (LR+ObjectPage, V4+V2), 'object-page' (form entry, V4), 'worklist' (V4+V2), 'analytical-list-page' (V2), 'overview-page' (V2). Provide metadataXmlPath (from download_odata_service_metadata) or metadataXml content, or just entitySet. Creates manifest.json, Component.js, index.html, i18n, ui5.yaml and package.json.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesApplication title shown in the shell
addFclNoEnable Flexible Column Layout (default true for V4)
appNameYesApp name, used as folder name (e.g. 'travels')
entitySetNoMain entity set (optional if metadata is provided)
floorplanNoFloorplan: 'list-report' (LR+ObjectPage, V4+V2), 'object-page' (form entry, V4), 'worklist' (task list, V4+V2), 'analytical-list-page' (V2) or 'overview-page' (V2). Unsupported combos are auto-adjusted with a warning.list-report
namespaceNoApp id namespace (default 'ns' for OData / 'cap.app' for CAP)
serviceUrlNoOData service URL to store in the manifest dataSources
systemNameNoConfigured SAP system name; with servicePath it supplies serviceUrl
descriptionNoApplication description
destinationNoBTP destination the service belongs to; with servicePath it supplies serviceUrl, so the same arguments that downloaded the metadata also generate the app
initialLoadNoSet initialLoad:true so the List Report table loads without pressing Go (default true for 'worklist')
servicePathNoService path relative to the destination/system URL, e.g. /sap/opu/odata4/sap/zsb_x/srvd/sap/zsd_x/0001
odataVersionNoForce OData version (auto-detected from metadata)
workspacePathNoTarget workspace root; app is created as <workspace>/<appName>/
metadataXmlPathNoPath to a local metadata.xml

Output Schema

ParametersJSON Schema
NameRequiredDescription
appPathYes
warningsYes
nextStepsYes
serviceUriNo
createdFilesYes
resolvedServiceNo
resolvedEntitySetNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only state non-read-only, non-idempotent, non-destructive. The description adds concrete behavioral detail by listing the files it generates (manifest.json, Component.js, etc.), which tells the agent what side effects to expect. It does not mention overwrite behavior or permissions, but the annotations already cover the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with the main purpose front-loaded, followed by input guidance and output artifacts. The floorplan enumeration partly duplicates schema enum descriptions, but the summary is compact and each sentence carries meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return details need not be explained. The description covers the high-level workflow and references a sibling tool, but it does not clarify parameter groups (e.g., serviceUrl vs systemName vs destination/servicePath) and contains the misleading 'metadataXml content' reference. Given 15 parameters, the description is adequate but leaves some gaps filled only by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds a useful rule about alternative metadata inputs, but it references 'metadataXml content' which is not a parameter in the schema, misleading the agent. The 'or just entitySet' hint is helpful, but the inaccurate reference outweighs that benefit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Generates') and resource ('SAP Fiori elements application') with an explicit scope ('OData V2/V4 service... non-CAP'). It distinguishes from the obvious sibling generate_fiori_app_cap via the parenthetical and clearly enumerates the output artifacts, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description signals when to use this tool by the 'non-CAP' qualifier, implying CAP projects belong to generate_fiori_app_cap. It also gives workflow guidance by referencing download_odata_service_metadata as the source for metadataXmlPath and hints at fallback input modes ('or just entitySet'). However, it does not explicitly name alternatives like create_ui5_app or state when to avoid this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_api_referenceGet UI5 API reference for a controlA
Read-onlyIdempotent

Fetches and formats the UI5 API reference (properties, aggregations, events, methods with JSDoc) for a control such as 'sap.m.Table'. Source: official UI5 TypeScript type definitions (@openui5/ts-types-esm), cached locally after first use.

ParametersJSON Schema
NameRequiredDescriptionDefault
ui5VersionNoUI5 version (default 1.120.0 LTS)
controlNameYesFull control name, e.g. 'sap.m.Table' or 'sap.ui.layout.form.SimpleForm'

Output Schema

ParametersJSON Schema
NameRequiredDescription
controlYes
versionYes
referenceYes
truncatedYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations by revealing the source is official TypeScript type definitions and that results are cached locally after first use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first states the function and scope, the second adds source and caching behavior. Every sentence carries useful information with no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only, idempotent tool with two well-documented parameters and an output schema, the description is complete. It covers what is fetched, for which kind of input, from where, and the caching behavior, leaving no critical operational gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both controlName and ui5Version are already documented in the schema. The description adds a concrete controlName example, but does not provide new semantics beyond what the schema already states, matching the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetches and formats') and names the exact resource ('UI5 API reference' with properties, aggregations, events, methods). It also gives a concrete example control ('sap.m.Table'), which clearly distinguishes this from sibling tools like search_docs or get_cap_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: when an agent needs the full API reference for a specific UI5 control. It does not explicitly name alternatives or provide exclusion guidance, but the context 'for a control such as' establishes the selection criterion clearly enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_btp_destinationGet a SAP BTP destination (secrets redacted)A
Read-onlyIdempotent

Returns the details of one SAP BTP destination (local or from the BTP Destination Service): URL, authentication type, sap-client, custom headers and proxy type. Secrets are redacted. Useful to verify a destination before querying it with query_odata_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDestination name (see list_btp_destinations)

Output Schema

ParametersJSON Schema
NameRequiredDescription
authYes
usageYes
destinationYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the key behavioral fact that secrets are redacted, which is critical for an agent. It also clarifies that it returns local or BTP Destination Service sources. There is no contradiction with annotations, and the added context goes beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences, front-loaded with the primary purpose and returning fields, followed by the redaction note and a usage hint. Every sentence earns its place with no filler, making it efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema is present (as indicated), the return values are defined. The description enumerates the key fields and the redaction behavior, and provides a usage context. For a single-parameter read-only tool, this is complete; nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the 'name' parameter with 'Destination name (see list_btp_destinations)'. The description adds no additional semantic detail about the parameter beyond that. Per the baseline, when schema coverage is high, a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Returns' and the resource 'details of one SAP BTP destination', enumerating specific fields (URL, authentication type, sap-client, custom headers, proxy type). It also distinguishes from the sibling list_btp_destinations by specifying 'one' and mentions query_odata_data, so an agent can differentiate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly provides a use case: 'Useful to verify a destination before querying it with query_odata_data.' This implies when to use it. It does not explicitly state when not to use it or name alternatives, but the sibling list_btp_destinations is clearly for listing, and the description's mention of 'one' implies selection. The context is clear enough, though not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cap_detailsGet details of a CDS definition (CAP)A
Read-onlyIdempotent

Returns full details of one CDS definition: elements with types and annotations, associations (target, cardinality, on-condition), actions/functions, projections and includes.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectPathNoCAP project root
definitionNameYesDefinition name (short or fully qualified), e.g. 'Books' or 'my.bookshop.Books'

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYes
lineNo
nameYes
sourceNo
actionsNo
elementsNo
includesNo
namespaceNo
shortNameYes
annotationsNo
projectionOnNo
exposedByServicesYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds the scope of returned details but doesn't disclose additional behaviors like error handling, permissions, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that is front-loaded with the main purpose and then lists the specific content areas. Every word earns its place; no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the read-only nature, the description is largely sufficient. It could mention behavior when a definition is not found, but that is minor given the other structured signals.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents the two parameters. The description adds no additional parameter semantics, keeping it at the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and resource ('full details of one CDS definition') and enumerates the exact contents (elements, associations, actions/functions, projections, includes). This clearly distinguishes it from sibling tools like get_functionality_details or search_model.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., search_model, get_api_reference). The description only states what it does, not the conditions under which an agent should choose it, nor any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_functionality_detailsGet functionality details (step 2/3)A
Read-onlyIdempotent

Gets the required parameters and detailed information for a specific functionality before executing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
appPathYesAbsolute path to the app folder
functionalityIdYesFunctionality id from list_functionality

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleYes
parametersYes
descriptionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds workflow-relevant behavioral context by disclosing that the tool returns the 'required parameters' needed for a subsequent execution step. This adds value beyond the annotations and does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single ~14-word sentence that front-loads the verb and resource and carries no filler, redundancy, or repetition of annotation content. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only lookup with two fully documented parameters, an enum, a comprehensive output schema, and a complete annotation set, nothing an agent needs to invoke it correctly is missing. Workflow context is carried by the title ('step 2/3') and schema hint (functionalityId 'from list_functionality').

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters carry meaningful descriptions; functionalityId even documents that its values come from list_functionality. The tool description itself adds no parameter-level detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Gets' with a concrete resource ('required parameters and detailed information for a specific functionality'), and the phrase 'before executing it' distinguishes it from the sibling execute_functionality. The title's 'step 2/3' further reinforces its distinct role in a prepare-then-execute workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description frames usage contextually — 'before executing it' tells the agent this is a prerequisite step to execution, and the title marks it as step 2/3 in a sequence. It doesn't explicitly name alternatives or exclusions, but the workflow position is clear enough that an agent will know to call it between list_functionality and execute_functionality.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_guidelinesGet UI5 development guidelinesA
Read-onlyIdempotent

Returns curated UI5 development best practices for a topic: general, views, bindings, routing, i18n, performance, security, testing.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoGuideline topicgeneral

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleYes
topicNo
contentYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, covering the safety profile. The description adds the useful signal that the content is 'curated' best practices rather than raw search results or exhaustive documentation, but it does not disclose other behavioral traits such as return shape or fallback behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that front-loads the action and resource, then immediately lists all supported topics. Every word earns its place, and there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple tool with one optional parameter, a full enum in the schema, and an output schema available. The description plus schema fully cover what the agent needs to select and invoke the tool correctly; no critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers the single parameter fully (topic with enum, default, and description), so the baseline is 3. The description repeats the enum values from the schema without adding additional meaning such as expected formatting, typical use cases, or interaction between topics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), a clear resource (curated UI5 development best practices), and enumerates the exact topics covered (general, views, bindings, routing, i18n, performance, security, testing). This clearly distinguishes it from specialized siblings like get_typescript_conversion_guidelines and get_integration_cards_guidelines, which are narrower in scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by listing the topics covered, and the sibling names suggest it for general UI5 guidance rather than specialized conversion or integration-card guidance. However, there is no explicit when-to-use statement, no mention of alternatives, and no exclusions, so the agent must infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_integration_cards_guidelinesGet UI Integration Cards guidelinesA
Read-onlyIdempotent

Returns best practices for developing SAP UI Integration Cards (manifest-driven cards for SAP Build Work Zone).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleYes
topicNo
contentYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to repeat those. The description adds useful context about what the returned content is (best practices for a specific card type), but does not disclose any additional behavioral traits beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word adds meaning, specifying both the general purpose and the specific technology context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool with an output schema present, the description is fully sufficient. It tells the agent exactly what the tool returns and in what domain, leaving no necessary information missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema already fully covers this dimension. A baseline score of 4 is appropriate; there is no parameter semantic gap for the description to fill.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and names an exact resource ('best practices for developing SAP UI Integration Cards'), explicitly tying it to manifest-driven cards for SAP Build Work Zone. This clearly differentiates it from the generic sibling get_guidelines and from create_integration_card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: this tool is for obtaining best practices when developing SAP UI Integration Cards. It does not explicitly name alternatives or list exclusions, but the domain is specific enough that an agent can infer when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_metadata_summarySummarize a metadata.xmlA
Read-onlyIdempotent

Parses a local EDMX metadata.xml and returns entity sets, entity types, keys, associations and annotation targets.

ParametersJSON Schema
NameRequiredDescriptionDefault
metadataXmlPathYesPath to the metadata.xml file

Output Schema

ParametersJSON Schema
NameRequiredDescription
savedToNo
sourceUrlNo
entitySetsYes
namespacesYes
annotationsNo
entityTypesYes
odataVersionYes
annotationTargetsNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the local-file input context and the summary output items, but it does not discuss failure behavior for invalid XML or missing files. This is adequate but not strongly additive beyond the annotations and output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence with no filler. It front-loads the key scoping term 'local' and the result list, and every word contributes to understanding what the tool does.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with a rich output schema and safety annotations, the description is complete enough for correct invocation. It specifies the local file input and summarizes what will be returned; no additional context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the single parameter metadataXmlPath is already documented as 'Path to the metadata.xml file'. The tool description adds no additional parameter semantics such as absolute/relative path requirements or file format constraints, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('parses'), a specific resource ('local EDMX metadata.xml'), and enumerates the returned artifact types (entity sets, entity types, keys, associations, annotation targets). This clearly distinguishes it from sibling tools such as download_odata_service_metadata or query_odata_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word 'local' establishes the main intended scenario: analyzing a metadata.xml file that already exists locally, which implicitly excludes remote OData service discovery. However, it does not explicitly name alternative tools or state when not to use this tool, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_infoGet UI5 project infoA
Read-onlyIdempotent

Extracts metadata and configuration from a UI5 or CAP project: app ids, framework version, libraries, views, controllers, models, routing, data sources and package scripts.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectPathNoProject folder (default workspace root)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appsNo
kindYes
nameYes
pathYes
appIdNo
viewsNo
modelsNo
appTypeNo
routingNo
ui5YamlNo
appTitleNo
frameworkNo
cdsServicesNo
controllersNo
dataSourcesNo
manifestPathNo
packageScriptsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces this by framing the operation as extraction of metadata and configuration, and it adds useful scope details (UI5/CAP project, listed artifact types). No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that leads with the core action and resource, then packs a precise enumeration of extracted items. Every part earns its place and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, a fully documented optional parameter, and strong annotations covering safety, the description plus schema is sufficient for an agent to invoke the tool correctly. No critical usage or behavior information is missing for this read-only info-retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the only parameter, projectPath, which already documents the default workspace root. The description adds no independent parameter-level detail, but the schema fully carries that burden, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Extracts') and a specific resource ('UI5 or CAP project'), then enumerates the concrete metadata categories returned (app ids, framework version, libraries, views, controllers, models, routing, data sources, package scripts). This is sufficiently precise to distinguish it from most sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by limiting the tool to UI5/CAP projects, but it gives no explicit guidance about when to choose this over alternatives such as get_cap_details, get_metadata_summary, or get_version_info. No exclusions or alternative routing are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_typescript_conversion_guidelinesGet UI5 JS→TS conversion guidelinesA
Read-onlyIdempotent

Returns the step-by-step guideline for converting UI5 applications and controllers from JavaScript to TypeScript.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleYes
topicNo
contentYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the output content type (step-by-step guideline) but does not disclose any additional behavioral traits such as output format, caching, or rate limits. With annotations carrying the safety burden, this is adequate but not enriching.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler or redundant words. Every phrase ('step-by-step', 'UI5 applications and controllers', 'JavaScript to TypeScript') contributes meaning. It is front-loaded with the action verb and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema and comprehensive annotations, the description is complete. An agent can safely invoke it with no further clarification about inputs, side effects, or return handling, since the output schema covers the return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so the schema fully documents that no input is required. The description's mention of conversion scope is informational rather than parameter-related, and with no params the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns'), a concrete resource ('step-by-step guideline'), and an explicit scope ('converting UI5 applications and controllers from JavaScript to TypeScript'), which clearly distinguishes it from siblings like get_guidelines or get_integration_cards_guidelines. An agent can tell exactly what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the usage context (when a UI5 JS→TS conversion guideline is needed) through its explicit scope and title. However, it does not explicitly name alternative tools or provide when-not guidance, such as pointing to generic get_guidelines for other guideline needs. This is a small gap, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_version_infoGet UI5 framework version infoA
Read-onlyIdempotent

Retrieves UI5 framework version information: latest version from the CDN (sap-ui-version.json) plus the local project's configured version.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectPathNoOptional local project to read its minUI5Version/ui5.yaml version

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
latestYes
sourceYes
librariesNo
distributionYes
localProjectVersionNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the specific data sources (CDN sap-ui-version.json and local project configuration), which is useful beyond the annotations. No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the main purpose and includes the two key sources. There is no extraneous information; every word contributes to understanding the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter, read-only, output schema present), the description provides sufficient context about what the tool retrieves. The output schema covers return value structure, and the description clarifies the data sources. The only gap is usage guidance, which is not critical for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter projectPath is fully documented in the schema. The description reiterates the local project aspect but does not add significant new meaning beyond the schema's description. The baseline of 3 applies since the schema carries the semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Retrieves' and the resource 'UI5 framework version information', specifying the two sources (CDN and local project). This distinguishes it from siblings like get_project_info or get_guidelines, which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives such as get_project_info or get_guidelines. There is no mention of exclusions, prerequisites, or conditions that would lead an agent to choose this tool over others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_btp_destinationsList SAP BTP destinationsA
Read-onlyIdempotent

Lists the SAP BTP destinations available for OData calls: local destinations (env var SAP_DESTINATIONS_JSON / SAP_DESTINATIONS_FILE / SAP_DESTINATIONS_DIR) and, when configured, destinations of the BTP Destination Service (cloud). Secrets are redacted. Use the returned destination names with query_odata_data and download_odata_service_metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeDestinationServiceNoAlso fetch destinations from the BTP Destination Service when it is configured (requires network)

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintYes
countYes
destinationsYes
destinationServiceNo
destinationServiceErrorNo
destinationServiceConfiguredYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds valuable behavioral detail beyond the annotations: secrets are redacted, destinations can come from local environment variables or the cloud Destination Service, and cloud fetching is conditional on configuration.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two dense but purposeful sentences. The first sentence states the core behavior and scope, and the second gives actionable follow-up guidance. No filler or redundant restatement of the tool name or schema properties.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety and side-effect hints, the description supplies the remaining essential context: the sources of destinations, redaction of secrets, and how the returned names should be used. An agent has enough information to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the includeDestinationService parameter is already documented in the schema, including its default and network implication. The description does not repeat or add meaningful parameter semantics beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Lists') with a clear resource ('SAP BTP destinations') and immediately distinguishes the tool from related OData tools by framing destinations as inputs to query_odata_data and download_odata_service_metadata. It also clarifies the scope: local destinations and optionally cloud destinations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit downstream usage: 'Use the returned destination names with query_odata_data and download_odata_service_metadata.' This tells an agent what to do with the results, though it does not explicitly state when not to use this tool versus the sibling get_btp_destination.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_fiori_appsList Fiori apps in a workspaceA
Read-onlyIdempotent

Scans a directory for existing SAP Fiori applications (Fiori elements V2/V4, freestyle, cards, adaptation projects) that can be modified. Returns app id, type, entity set, OData version and view files. Call this before modifying an app.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxDepthNoFolder recursion depth
workspacePathNoRoot folder to scan (default: workspace root / cwd)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appsYes
nameYes
pathYes
isCapYes
cdsFoldersYes
hasPackageJsonYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with the readOnlyHint, idempotentHint, and destructiveHint annotations and adds useful context: it scans a directory, identifies modifiable apps, and returns specific metadata fields. It does not discuss failure or permission behavior, but annotations already carry the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the action is front-loaded, the return content is summarized, and the usage instruction is placed at the end. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With two fully documented optional parameters, a rich output schema, and safety annotations already present, the description covers what the tool does, what it returns, and when to call it. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters fully, including defaults and bounds, so the description adds no parameter-level value. Baseline 3 is appropriate when schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Scans a directory for existing SAP Fiori applications'), enumerates the app types covered, and lists the exact return fields. This clearly differentiates it from the many create/generate siblings in the tool list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing guidance ('Call this before modifying an app') and scopes the tool to existing modifiable apps. It does not name sibling alternatives or state when not to use it, but the usage context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_functionalityList modification functionalities for a Fiori app (step 1/3)A
Read-onlyIdempotent

Gets the list of supported modification functionalities for an existing SAP Fiori application: add_page, delete_page, add_controller_extension, enable_fcl, enable_initial_load, update_manifest. Workflow: list_functionality → get_functionality_details → execute_functionality.

ParametersJSON Schema
NameRequiredDescriptionDefault
appPathYesAbsolute path to the app folder (containing webapp/manifest.json)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appYes
functionalitiesYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value beyond annotations by naming the concrete set of modification functionalities and by framing this as the entry point of a three-step workflow, which helps the agent understand the tool's role and output domain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler. The first sentence front-loads the action, target, and result set; the second gives the workflow context in one compact line. Every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity, read-only list operation with one documented parameter, a rich set of annotations, and an output schema. The description provides the purpose, the exact list domain, and the follow-up workflow, leaving no crucial gap for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single appPath parameter is already fully documented as 'Absolute path to the app folder'. The description adds no parameter-specific meaning, but it reinforces that the tool operates on an existing Fiori app. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb and resource: 'Gets the list of supported modification functionalities for an existing SAP Fiori application' and enumerates the exact functionality names returned. The title's 'step 1/3' and the workflow line clearly distinguish it from get_functionality_details and execute_functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The explicit workflow 'list_functionality → get_functionality_details → execute_functionality' tells the agent this is the first step and names the relevant sibling tools. It does not explicitly state when not to use it versus list_fiori_apps or other listing tools, but the sequencing guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sap_systemsList configured SAP systemsA
Read-onlyIdempotent

Lists SAP system connections available for OData calls (from env vars SAP_BASE_URL/SAP_USER/SAP_PASSWORD, SAP_SYSTEMS_JSON or the systems.json file). Use the returned system name with download_odata_service_metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintYes
countYes
systemsYes
warningsNoConfiguration problems, e.g. a systems.json that could not be parsed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds useful context by naming the configuration sources (env vars and a JSON file), which goes beyond the structured annotations and helps the agent understand the data origin without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, with the core purpose front-loaded and the usage tip immediately after. Every word earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no parameters and an existing output schema (which presumably describes the returned system names), the description covers purpose, sources, and how to use the result. There is no missing information an agent needs to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4 per the rubric. The description does not need to explain parameters, and it doesn't. It correctly focuses on the tool's purpose and output usage, making the parameter semantics effectively handled by the absence of parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists SAP system connections for OData calls, specifying the exact resource and its purpose. It also names a consuming tool (download_odata_service_metadata), making the tool's role unambiguous and distinguishing it from sibling listing tools like list_btp_destinations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it tells the agent to use the returned system name with download_odata_service_metadata, implying this is a prerequisite step. It does not explicitly state when NOT to use it or list alternatives, so it falls short of a full 5, but the guidance is specific and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_cap_dataQuery CAP sample data (CSV mock)A
Read-onlyIdempotent

Executes a CQN-like query against the CAP sample data (CSV files in db/data following CAP conventions). Supports column projection, a WHERE-like filter (and/or, eq/ne/gt/ge/lt/le, contains), order by, skip/limit. Example filter: 'stock gt 10 and price le 50'.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoRows to skip
limitNoMax rows
filterNoWHERE-like filter, e.g. "stock > 0 and contains(title, 'Cat')"
columnsNoColumns to project (default all)
orderByNoSort spec
entityNameYesEntity name, e.g. 'Books' or 'my.bookshop.Books'
projectPathNoCAP project root

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYes
rowsYes
skipYes
countYesRows in this response
limitYes
totalYesRows matching the filter, before skip/limit
columnsYes
hasMoreYes
nextSkipYesValue to pass as skip on the next call, or null

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds operational context (CSV files, CAP conventions, filter syntax) but does not disclose error behavior, pagination details beyond limits, or what happens if the entity is not found. Given the annotation coverage, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus a concise example, with the core purpose front-loaded and no redundant filler. Every sentence earns its place—first establishes the resource, then enumerates capabilities, and finally gives a concrete filter example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with an output schema, the description covers the essential query capabilities and the filter syntax. It does not explain the output shape, but the output schema handles that. Missing details like default behavior when projectPath is omitted are present in the schema. Overall, it's complete enough for successful invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema documents all parameters. The description adds valuable syntax guidance for the filter parameter ('and/or, eq/ne/gt/ge/lt/le, contains' and an example), which is essential for constructing valid queries. It also clarifies that the data follows CAP conventions, which helps set expectations for projectPath and entityName.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Executes a CQN-like query') and a specific resource ('CAP sample data (CSV files in db/data following CAP conventions)'). It lists the supported operations (projection, filter, order, skip/limit) and distinguishes this tool from siblings like query_odata_data by explicitly targeting local CSV mock data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context that this tool is for querying CAP sample CSV data, which implies usage for local/testing scenarios. It does not explicitly mention when not to use it (e.g., against OData services) or name alternatives, but the context is strong enough for an agent to infer the primary use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_odata_dataQuery OData data via destination, system or URLA
Read-onlyIdempotent

Executes an OData query (V2 or V4) against an entity set and returns the rows as JSON. Target: a BTP destination (destination + optional servicePath), a configured SAP system (systemName + servicePath from list_sap_systems), or a full serviceUrl. Supports $filter, $top, $skip, $select, $orderby, $expand and $count. This is the remote counterpart of query_cap_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo$top (max rows returned by the service, default 50)
skipNo$skip
countNoAsk the service for the total number of rows
expandNo$expand navigation properties, e.g. '_Travel,_Agency'
filterNoOData $filter, e.g. "Status eq 'A' and Price gt 100"
selectNo$select comma-separated fields
maxRowsNoMax rows included in the tool output (safety limit)
orderByNo$orderby, e.g. 'CreatedAt desc'
entitySetYesEntity set name, e.g. 'Travel' or 'Products'
serviceUrlNoFull service URL (used when no destination/system is given)
systemNameNoConfigured SAP system name (see list_sap_systems)
destinationNoBTP destination name (see list_btp_destinations)
servicePathNoService path relative to the destination/system URL, e.g. /sap/opu/odata4/sap/zui_travel_ov4/srv
odataVersionNoService OData version. Only affects how the total is requested: $count=true in V4, $inlinecount=allpages in V2. When omitted, V4 is tried first and V2 is retried automatically if the service rejects it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYesRows in this response
totalNoTotal rows reported by the service (only when count:true was requested)
sourceYes
hasMoreYes
nextSkipYesValue to pass as skip on the next call, or null
rowCountYesDeprecated alias of count; use count
appliedUrlYes
destinationNo
inlineCountNoRaw $count value reported by the service
truncatedToNoSet when the service returned more rows than maxRows
odataVersionYesConvention used to request the total: '4.0' ($count) or '2.0' ($inlinecount)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral details beyond annotations: supported OData query options ($filter, $top, $skip, etc.), the maxRows safety limit, and the odataVersion fallback (V4 tried first, V2 retried automatically if rejected). These disclose runtime behaviors not captured in annotations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero waste. The first sentence states the primary action and output. The second sentence efficiently covers three meaningful pieces of information: targeting modes, supported OData clauses, and the relationship to a sibling tool. All content earns its place; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's complexity (14 parameters, multiple targeting modes, OData version handling), the description covers the essential decision points: how to choose among destination/system/URL, which query options are supported, the count behavior across versions, and the safety limit. The presence of an output schema covers return format details, so no additional information on that front is needed. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% – every parameter includes a description in the schema. The tool description does add context about how the three targeting parameters (destination, systemName, serviceUrl) relate and that servicePath is optional for destination/system, but these are minor enhancements over the schema descriptions. Since the schema already documents each parameter thoroughly, the baseline of 3 applies; the description does not add significant semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb+resource: 'Executes an OData query (V2 or V4) against an entity set and returns the rows as JSON.' It also specifies three targeting modes (destination, system, URL) and explicitly distinguishes itself from the sibling 'query_cap_data' as its remote counterpart, making the purpose unambiguous and well-differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete guidance on when to use each targeting mode (BTP destination, configured SAP system, or full serviceUrl) and references sibling tools like list_sap_systems and list_btp_destinations. It also explains the odataVersion fallback behavior. It does not explicitly list when not to use this tool versus query_cap_data, but the 'remote counterpart' phrasing implies a clear context. Minor gap: no explicit exclusions or alternatives besides this reference, so not a perfect 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_manifest_validationValidate a UI5 manifest.jsonA
Read-onlyIdempotent

Validates the manifest against UI5 rules: sap.app id pattern, dataSources, model references, routing targets, view/i18n files on disk, card structure.

ParametersJSON Schema
NameRequiredDescriptionDefault
appPathYesApp folder (or direct path to manifest.json)

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
errorsYes
issuesYes
warningsYes
manifestPathYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the operation as read-only and idempotent. The description adds meaningful behavioral context by listing exactly what gets checked, including files-on-disk validation for views and i18n resources. This goes beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that front-loads the core purpose ('Validates the manifest against UI5 rules') and then efficiently lists the validation categories. Every part adds useful information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter, full schema coverage, rich annotations, and presence of an output schema, the description is sufficiently complete. An agent can correctly infer what the tool checks and how to invoke it without missing critical information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the only parameter, appPath, has a clear schema description. The tool description does not add parameter-level detail beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool validates a UI5 manifest.json and enumerates specific rule categories (sap.app id pattern, dataSources, model references, routing targets, view/i18n files, card structure). This is a specific verb+resource and helps differentiate from generic siblings, though it does not explicitly contrast with run_ui5_linter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for manifest validation but provides no explicit guidance on when to use it versus alternatives like run_ui5_linter or when not to use it. There are no stated prerequisites, exclusions, or sibling comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_ui5_linterLint UI5 codeA
Read-onlyIdempotent

Analyzes JS/XML code of a UI5 app for common issues: deprecated APIs (jQuery.sap.*, sap.ui.getCore().byId), removed libraries, deprecated controls, missing controllers and missing i18n keys.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesNoRestrict to specific files
projectPathYesApp or project folder to lint (scans webapp/)

Output Schema

ParametersJSON Schema
NameRequiredDescription
issuesYes
filesScannedYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which establishes the safety profile. The description adds useful detail about the analysis scope, such as deprecated APIs and missing controllers, but does not disclose additional behavioral traits like output format or runtime side effects. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the main action ('Analyzes JS/XML code') and then provides a concrete list of issue categories that justify the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, read-only linter with an output schema and full parameter documentation, the description provides enough context for invocation. It clearly states what the tool checks, and the schema covers path and file details. It does not offer guidance on choosing this over run_manifest_validation, but that gap is accounted for under usage guidelines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both projectPath and files fully documented in the input schema. The description adds no parameter-specific meaning, such as path conventions or how file filtering behaves, so the schema carries the full burden. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Analyzes JS/XML code of a UI5 app for common issues.' It enumerates concrete categories like deprecated APIs, removed libraries, missing controllers, and missing i18n keys, which makes it clearly distinguishable from sibling run_manifest_validation and other app-generation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by the name and the phrase 'Analyzes JS/XML code of a UI5 app,' but the description never explicitly states when to use this tool versus alternatives such as run_manifest_validation. There is no when-not-to-use guidance or exclusions, so an agent must infer the selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_docsSearch SAP documentationA
Read-onlyIdempotent

Searches the bundled documentation corpora for SAP Fiori elements, UI annotations, UI5 development, OPA5 testing, UI Integration Cards, TypeScript conversion, CAP (CDS) development and SAP BTP destinations. Use this before generating or modifying apps to ground answers in current best practices. Local, no network required.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results per page
queryYesSearch query, e.g. 'flexible column layout' or 'value help annotation'
scopeNoRestrict to one documentation corpusall
offsetNoNumber of results to skip (use nextOffset from a previous call)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesItems returned in this response
queryYes
scopeYes
totalYesTotal items matching the request
offsetYesOffset of the first returned item
hasMoreYesTrue when more items are available
resultsYes
nextOffsetYesOffset to request next, or null on the last page

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behaviorikuha. The description adds useful context beyond annotations: the docs are bundled/local and require no network, and searches are meant to ground answers in current best practices. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant words. The front-loaded list of topics gives immediate clarity, followed by a usage directive and a key behavioral constraint. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with full parameter descriptions, an output schema, and safety annotations, the description covers what the tool searches, when to use it, and important constraints. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add parameter-specific semantics beyond the schema's own descriptions, though the enumerated corpus topics roughly map to possible scope values. It provides no extra meaning for query, limit, offset, or scope.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Searches') and resource ('bundled documentation corpora'), and enumerates the exact documentation topics covered. This distinguishes it from sibling guideline-getters and code-generation tools without needing to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use the tool: 'before generating or modifying apps' to ground answers in current best practices. It does not explicitly mention when not to use it or name alternative tools, but the use case is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_modelSearch the CDS model (CAP)A
Read-onlyIdempotent

Performs fuzzy searches against names of definitions from the compiled CDS model of a CAP project: entities, views (projections), services, types, aspects, events, actions. CDS parses all .cds files into a unified model including relationships and annotations. Example: searchModel(projectPath, 'Books', 'entity').

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter by definition kindall
limitNoMax results per page
queryYesFuzzy query, e.g. 'book', 'Orders', 'my.bookshop'
offsetNoResults to skip (use nextOffset from a previous call)
projectPathNoCAP project root (default workspace root)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesItems returned in this response
totalYesTotal items matching the request
offsetYesOffset of the first returned item
hasMoreYesTrue when more items are available
resultsYes
namespacesYes
nextOffsetYesOffset to request next, or null on the last page
sourcesParsedYes
totalDefinitionsYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description adds context that the search is fuzzy and operates on a compiled unified model including relationships and annotations. This adds value without contradicting annotations, though no further behavioral details like pagination or auth are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loads the core action and scope, includes a helpful example, and contains no filler or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 100% schema coverage, an output schema, and annotations covering read-only/idempotent behavior, the description is complete for a search tool. It explains what is searched, enumerates kinds, and gives an example, so an agent has what it needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds a concrete example (searchModel(projectPath, 'Books', 'entity')) and enumerates the kind values, giving extra meaning beyond the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Performs fuzzy searches') and a specific resource ('names of definitions from the compiled CDS model'), and it enumerates the definition kinds covered. This clearly distinguishes it from sibling tools like search_docs and query_cap_data by scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching CDS model definitions and provides an example, but it does not explicitly mention when to use this tool versus alternatives such as search_docs or query_cap_data. No exclusions or when-not-to-use guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 27 tool updatesv1.26.1
    • First observedbtp_login
    • First observedcreate_integration_card
    • First observedcreate_ui5_app
    • First observeddownload_odata_service_metadata
    • First observedexecute_functionality
    • First observedgenerate_fiori_app_cap
    • First observedgenerate_fiori_app_odata
    • First observedget_api_reference
    • First observedget_btp_destination
    • First observedget_cap_details
    • First observedget_functionality_details
    • First observedget_guidelines
    • First observedget_integration_cards_guidelines
    • First observedget_metadata_summary
    • First observedget_project_info
    • First observedget_typescript_conversion_guidelines
    • First observedget_version_info
    • First observedlist_btp_destinations
    • First observedlist_fiori_apps
    • First observedlist_functionality
    • First observedlist_sap_systems
    • First observedquery_cap_data
    • First observedquery_odata_data
    • First observedrun_manifest_validation
    • First observedrun_ui5_linter
    • First observedsearch_docs
    • First observedsearch_model

TDQS

A3.9/5.0

Scored across 27 tools

Disambiguation4/5

Each tool maps to a distinct resource/action (apps, systems, destinations, CAP models, OData services), and the descriptions clarify boundaries. A few pairs like get_guidelines/search_docs or generate_fiori_app_odata/create_ui5_app could be momentarily confused, but the descriptions disambiguate them well.

Naming Consistency4/5

Almost all tools follow snake_case verb_noun naming (list_*, get_*, run_*, query_*). Minor deviations: create_ui5_app vs generate_fiori_app_*, btp_login is noun_verb, and list_functionality is singular while other list_* tools are plural.

Tool Count2/5

27 tools exceeds the 25+ threshold and feels heavy for an MCP surface, even for a broad SAP Fiori domain. Several guideline, validation, and connection tools could be consolidated into parameterized tools, so the count is more likely to overwhelm agents than help them.

Completeness4/5

The tool surface covers the main lifecycle: discover/create/modify Fiori apps, query OData/CAP data, fetch metadata, validate/lint, and access documentation. Missing build/deploy/test operations and full CRUD for CAP entities or destinations are minor gaps given the server's stated scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    A specialized MCP server for SAPUI5 and Fiori development that enables code generation, project analysis, and refactoring for JavaScript-based applications. It provides comprehensive tools for managing OData features, validating code compatibility, and searching official SAPUI5 SDK and MDN documentation.
    51
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for SAP UI5/OpenUI5 development, enabling creation of UI5 apps, API reference, guidelines, manifest validation, and code linting.
    63,675 npm
    Apache 2.0