@cencosud-mdh-ar/sap-mcp
v1.1.0
Published
Servidor MCP profesional para desarrollo SAP ABAP vía ADT REST (sin SAP GUI Scripting, sin Eclipse, sin RFC en el núcleo).
Maintainers
Readme
@cencosud-mdh-ar/sap-mcp — SAP ABAP Development MCP Server
Servidor MCP (Model Context Protocol) profesional para desarrollo ABAP sobre SAP ADT (ABAP Development Tools) REST, sin SAP GUI Scripting, sin Eclipse, sin RFC en el núcleo. Permite que clientes MCP (Claude Desktop, Claude Code, Cursor, VSCode, entre otros) exploren, lean, modifiquen y administren objetos ABAP usando las credenciales SAP propias de cada desarrollador.
Estado: v1.0.0 — roadmap completo (Etapas 0–12). 52 herramientas MCP operativas: exploración, lectura, escritura transaccional, creación de objetos, dependencias, Diccionario profundo, calidad (ABAP Unit, ATC, pretty printer), versiones y transportes. 220 tests verdes,
npm auditsin vulnerabilidades.delete_*queda explícitamente fuera de v1.
Herramientas MCP disponibles
| Herramienta | Descripción |
|-------------|-------------|
| search_object | Búsqueda de objetos por patrón (quickSearch), filtro opcional por tipo |
| list_packages | Paquetes que coinciden con un patrón |
| list_package_contents | Todos los objetos de un paquete |
| list_programs / list_classes / list_interfaces | Contenido del paquete filtrado por tipo |
| read_program / read_include | Fuente + metadatos de programas e includes |
| read_class / read_interface / read_method | Fuente de clases, interfaces y métodos individuales |
| read_function_module / read_function_group | Módulos de función y grupos |
| read_table / read_structure | Metadatos DDIC + fuente DDL si el release la soporta |
| read_domain / read_data_element | Metadatos DDIC (edición no soportada por ADT) |
| read_cds | Fuente DDL de vistas CDS |
| get_object_metadata | Metadatos adtcore de cualquier URI ADT |
| update_program / update_include / update_class / update_interface / update_cds | Reemplazo del fuente completo (lock→PUT→unlock, rollback local, transporte) |
| update_method | Reemplazo de un método individual de una clase |
| activate_object / activate_multiple | Activación de objetos (compila la versión inactiva) |
| check_syntax | Chequeo de sintaxis sobre fuente en memoria, sin persistir |
| get_where_used | Usos de un objeto ABAP (where-used real de ADT) |
| get_references | Referencias del símbolo en una posición del fuente (línea/columna) |
| get_callers | Quiénes llaman a un método concreto de una clase |
| get_called_methods | Llamadas salientes (métodos/FM/forms/submits) por análisis estático local |
| get_dependency_graph | Grafo de dependencias inversas por BFS acotado (maxDepth ≤ 3, límite de nodos) |
| read_table_contents | Datos de una tabla/vista vía datapreview (solo SELECT, nunca cacheado) |
| get_table_keys | Campos clave y foreign keys (DDL o fallback datapreview) |
| get_table_indexes | Índices secundarios si el release los expone por ADT |
| read_search_help / read_lock_object | Metadatos de ayudas de búsqueda y objetos de bloqueo (según discovery) |
| run_unit_tests | Ejecuta ABAP Unit y detalla las aserciones fallidas por clase/método |
| run_atc | Corrida ATC completa con hallazgos priorizados (variante del sistema o explícita) |
| format_source | Pretty printer del sistema sobre fuente en memoria |
| analyze_source | Análisis estático local con reglas Clean ABAP básicas (sin conexión) |
| list_versions | Historial de versiones ADT del objeto (según release) |
| compare_versions | Diff de líneas cliente-side entre dos versiones ("active" = actual) |
| list_transports | Órdenes de transporte del usuario con estado y tareas |
| create_transport | Crea una orden workbench (bloqueada en conexiones readOnly) |
| get_transport_info | Si el objeto exige orden, su paquete y qué órdenes sirven |
| create_program / create_include | Crea programas e includes nuevos (transporte obligatorio fuera de $TMP) |
| create_class / create_interface | Crea clases (con include de test classes) e interfaces globales nuevas |
| create_cds | Crea vistas CDS (DDL sources) nuevas, con definición DDL inicial opcional |
Instalación y puesta en marcha
npm install -g @cencosud-mdh-ar/sap-mcp
sap-mcp init # crea la conexión (URL, mandante, usuario); --allow-insecure para http://
sap-mcp login # guarda tu password en el llavero del SO y lo verifica
sap-mcp doctor # diagnostica entorno + conectividad ADT + capacidades del sistema
sap-mcp config list # muestra la configuración efectivaCon la conexión verificada por doctor, configurá el servidor en tu cliente MCP (sección siguiente). El proceso servidor es sap-mcp-server; acepta --connection <nombre> para elegir una conexión distinta de la default.
Configuración por cliente MCP
Claude Code
claude mcp add sap-abap --scope user -- sap-mcp-server --connection devo directamente en ~/.claude.json:
{
"mcpServers": {
"sap-abap": {
"type": "stdio",
"command": "sap-mcp-server",
"args": ["--connection", "dev"],
"env": {}
}
}
}Claude Desktop
Archivo claude_desktop_config.json (Windows: %APPDATA%\Claude\; macOS: ~/Library/Application Support/Claude/; Linux: ~/.config/Claude/):
{
"mcpServers": {
"sap-abap": {
"command": "sap-mcp-server",
"args": ["--connection", "dev"]
}
}
}Cursor
~/.cursor/mcp.json (global) o .cursor/mcp.json en el proyecto:
{
"mcpServers": {
"sap-abap": {
"command": "sap-mcp-server",
"args": ["--connection", "dev"]
}
}
}VSCode (GitHub Copilot / MCP)
.vscode/mcp.json en el workspace:
{
"servers": {
"sap-abap": {
"type": "stdio",
"command": "sap-mcp-server",
"args": ["--connection", "dev"]
}
}
}En todos los casos la credencial NO va en la configuración del cliente: vive en el llavero del sistema operativo (la guardó sap-mcp login). Si el binario global no está en el PATH del cliente, usá la ruta absoluta a sap-mcp-server como command.
Prueba E2E contra un sistema SAP real
La suite tests/e2e/ ejecuta solo lecturas (discovery + capacidades, search_object, read_program) contra un sistema real. Está desactivada por defecto y nunca corre en CI: se habilita con variables de entorno y las credenciales viven solo en la memoria del proceso.
PowerShell (Windows):
$env:SAP_MCP_E2E = "1"
$env:SAP_MCP_E2E_URL = "https://sapdev.empresa.com:44300"
$env:SAP_MCP_E2E_CLIENT = "100"
$env:SAP_MCP_E2E_USER = "TUUSUARIO"
$env:SAP_MCP_E2E_PASSWORD = "********"
# opcionales:
# $env:SAP_MCP_E2E_INSECURE = "1" # certificado self-signed
# $env:SAP_MCP_E2E_CAPATH = "C:\ca\corp.pem" # CA corporativa
# $env:SAP_MCP_E2E_PROGRAM = "ZMIPROGRAMA" # default: SAPMSSY0 (estándar)
# $env:SAP_MCP_E2E_QUERY = "ZVENT*" # default: Z*
npm run test:e2ebash (Linux/macOS):
SAP_MCP_E2E=1 SAP_MCP_E2E_URL=https://sapdev:44300 SAP_MCP_E2E_CLIENT=100 \
SAP_MCP_E2E_USER=TUUSUARIO SAP_MCP_E2E_PASSWORD='********' npm run test:e2eLa salida [E2E] en stderr muestra las capacidades detectadas, los resultados de búsqueda y el tamaño/paquete del programa leído. Alternativa sin código: sap-mcp init → sap-mcp login → sap-mcp doctor valida lo mismo desde la CLI.
Desarrollo
npm install
npm run verify # build + typecheck + lint + tests con cobertura
npm run build # compila a dist/
npm test # tests unitarios (vitest)Binarios generados: sap-mcp (CLI de administración) y sap-mcp-server (proceso MCP por stdio). Para desarrollo local, npm run build && npm link deja ambos disponibles globalmente apuntando a dist/. Reglas de contribución y checklist de release en CONTRIBUTING.md.
Estructura del código según docs/ARCHITECTURE.md: src/domain (errores, puertos), src/application (servicios, desde la Etapa 3), src/infrastructure (config, logging, y el cliente ADT en la Etapa 3), src/presentation (MCP + CLI), src/composition (composition root).
Documentación de arquitectura
| Documento | Contenido |
|-----------|-----------|
| docs/ADT_CAPABILITIES.md | Catálogo de endpoints ADT con evidencia + matriz de capacidades por objeto/operación (base normativa: nada se implementa fuera de esta matriz) |
| docs/ARCHITECTURE.md | Clean Architecture: capas, servicios, repositorios, cliente ADT, sesiones, multi-conexión, extensibilidad |
| docs/MCP_CONTRACT.md | Contrato de herramientas MCP: naming, zod, envelope uniforme, códigos de error, convenciones |
| docs/SECURITY.md | Modelo de amenazas, keychain del SO, redacción de secretos, auditoría |
| docs/CLI_SPEC.md | Especificación de sap-mcp init/login/logout/doctor/config/logs/version/cache/update |
| docs/CONFIGURATION.md | config.json, variables de entorno, precedencia, multi-conexión, ubicaciones por plataforma |
| docs/LOGGING.md | pino, niveles, rotación, correlación, redacción obligatoria |
| docs/CACHE.md | Cache L1/L2 por usuario y sistema, TTL por categoría, invalidación |
| docs/TESTING.md | vitest, mock ADT server, fixtures XML, cobertura mínima, E2E opt-in |
| docs/ADR.md | 12 decisiones de arquitectura con alternativas evaluadas |
| docs/ROADMAP.md | Etapas 1–12 validadas técnicamente + Definition of Done por etapa |
Principios no negociables
- Comunicación exclusiva por HTTP(S) contra
/sap/bc/adt/*; las capacidades reales se detectan por el discovery del sistema conectado — jamás se inventan endpoints. - Credenciales por desarrollador, guardadas en el llavero del sistema operativo (fallback cifrado AES-256-GCM); nunca en código, config ni logs.
- TypeScript estricto, sin
any, sin TODOs, sin funciones vacías; cada etapa cierra compilando con lint y tests verdes. - Compatibilidad: SAP ECC (NW ≥ 7.31 SP04 con ADT activo) y S/4HANA · Windows, Linux y macOS.
Licencia
Propietaria — Cencosud S.A. Ver LICENSE. La publicación en npmjs.com es solo un canal de distribución interna: el paquete no es open source y su uso está restringido a personal autorizado de Cencosud.
