adf-mcp-server
adf-mcp-server
Servidor MCP (Model Context Protocol) de solo lectura para la monitorización y el análisis de causa raíz de Azure Data Factory, diseñado para usarse desde VS Code / Claude Code.
Estado: Paso 1 (esqueleto + comprobación de salud). Aún no hay conectividad con Azure; eso se añade en el Paso 2 (autenticación) y el Paso 3 (herramientas de ADF).
Requisitos
Python 3.11+
Un registro de aplicación de Azure AD (Service Principal) con el rol Lector en el/los recurso(s) de Data Factory que quieras inspeccionar (Lector es suficiente; este servidor es de solo lectura de principio a fin, por lo que nunca necesita Colaborador).
Related MCP server: mcp-azure-landing-zone
Configuración local
cd adf-mcp-server
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
cp .env.example .envCreación del Service Principal (una sola vez, mediante az-cli)
az ad sp create-for-rbac \
--name "adf-mcp-server-reader" \
--role "Reader" \
--scopes "/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RG_NAME>/providers/Microsoft.DataFactory/factories/<FACTORY_NAME>"Esto imprime appId, password y tenant; asígnalos en .env como
AZURE_CLIENT_ID, AZURE_CLIENT_SECRET y AZURE_TENANT_ID
respectivamente. Limita la asignación de roles a la fábrica específica (o,
como máximo, al grupo de recursos) en lugar de a toda la suscripción:
privilegio mínimo, y este SPN nunca necesita tocar nada fuera de ADF.
Ejecución del servidor
python -m adf_mcp.server
# or, after `pip install -e .`:
adf-mcp-serverEl servidor se comunica a través de stdio; ejecutarlo directamente en una
terminal parecerá que se cuelga; eso es lo esperado, está esperando que un
cliente MCP (extensión de VS Code, Claude Code, mcp dev, etc.) se conecte
mediante stdin/stdout.
Configuración en VS Code
Apunta la configuración del servidor de tu extensión compatible con MCP a:
{
"command": "python",
"args": ["-m", "adf_mcp.server"],
"cwd": "/absolute/path/to/adf-mcp-server"
}Una vez conectado:
Llama a
health_check; debería devolver{"status": "ok", ...}sin tocar Azure en absoluto.Llama a
check_auth; esto hace una llamada real a Azure AD para adquirir un token de ARM. El éxito se ve así:{"authenticated": true, "auth_mode": "service_principal", "token_expires_on": 1735000000}El fallo devuelve una explicación estructurada (no un stack trace), por ejemplo, variables de entorno faltantes o un secreto no válido; consulta Solución de problemas más abajo.
Llama a
list_factories; esto hace una llamada real a Azure Data Factory. Devuelve elresource_groupde cada fábrica, que todas las demás herramientas siguientes necesitan como entrada:{"factories": [{"name": "shell-prod-adf", "resource_group": "rg-shell-prod", "location": "eastus"}]}
Herramientas disponibles (Paso 3)
Todas las herramientas son de solo lectura; ninguna puede crear, modificar, activar o eliminar nada en Azure Data Factory.
Herramienta | Argumentos requeridos | Notas |
| — | Sin llamadas a Azure |
| — | Verifica solo el Service Principal |
| — | Empieza aquí; devuelve |
|
| |
|
| Ligero: nombre + recuento/nombres de actividades |
|
| Lista completa de actividades para una canalización |
|
|
|
|
| Detalle completo de la ejecución, sin truncar; obtén |
Ejemplo de flujo de RCA para un agente: list_factories →
list_pipeline_runs(status="Failed") → get_failed_activity_details(run_id=...)
para el desglose de errores directamente.
Herramientas disponibles (adiciones del Paso 4)
Herramienta | Argumentos requeridos | Notas |
|
| Lista completa de actividades para una ejecución; |
|
| La herramienta de RCA; solo actividades fallidas, con |
|
| Todos los desencadenadores + estado de ejecución actual (Iniciado/Detenido) |
|
| Estado de ejecución de un desencadenador; detecta "la canalización nunca se ejecutó porque su desencadenador estaba detenido" |
|
|
|
Flujo completo de RCA para una canalización fallida: list_pipeline_runs(status="Failed") →
get_failed_activity_details(run_id=...) para el error, y por separado
get_trigger_status(trigger_name=...) para descartar "ni siquiera se disparó".
Ejecución de pruebas
pip install -e ".[dev]" pytest-asyncio
pytest -vEstructura del proyecto
Consulta src/adf_mcp/; server.py (transporte MCP), config.py
(ajustes), logging_config.py (registro estructurado). La lógica de dominio
y la conectividad con Azure se añaden en src/adf_mcp/domain/ a partir del
Paso 3.
Solución de problemas
El cliente muestra "servidor desconectado" inmediatamente: comprueba que
python -m adf_mcp.serverse ejecuta correctamente por sí solo primero; una excepción de inicio matará el proceso antes de que el cliente se conecte.El cliente no puede analizar las respuestas / salida distorsionada: algo escribió en stdout además del propio protocolo MCP (por ejemplo, un
print()suelto). Todo el registro de este proyecto va a stderr precisamente por esta razón.check_authdevuelve "Faltan ajustes requeridos del Service Principal": una deAZURE_TENANT_ID/AZURE_CLIENT_ID/AZURE_CLIENT_SECRETestá vacía en.env. Ten en cuenta que estos tres NO usan el prefijoADF_MCP_.check_authdevuelve "Error de autenticación de Azure": normalmente un secreto de cliente caducado/rotado, un registro de aplicación deshabilitado o un error tipográfico en el ID de inquilino. Vuelve a verificarlo conaz ad sp show --id <AZURE_CLIENT_ID>.ClientAuthenticationError: AADSTS7000215: secreto de cliente no válido; regenéralo en el registro de aplicación y actualiza.env.Una herramienta devuelve
{"error": "AZURE_SUBSCRIPTION_ID no está configurado..."}: añadeAZURE_SUBSCRIPTION_IDa.env; es necesario para todas las herramientas de ADF (no paracheck_auth, que solo necesita tenant/client/secret).Una herramienta devuelve
{"error": "Error de API de Azure (403): ..."}: el Service Principal carece de acceso de Lector a esa fábrica/grupo de recursos; revisa la asignaciónaz ad sp create-for-rbac --role Reader --scopes ...de la configuración.Una herramienta devuelve
{"error": "Error de API de Azure (404): ..."}: comprueba la ortografía deresource_group/factory_name/pipeline_name; distinguen entre mayúsculas y minúsculas y deben coincidir exactamente con lo que devolvieronlist_factories/list_pipelines.get_failed_activity_detailsdevuelve una lista vacía pero sabes que la canalización falló: el fallo puede estar a nivel de canalización (por ejemplo, un parámetro no válido) en lugar de en una sola actividad; comprueba elmessagede la ejecución principal medianteget_pipeline_run.Una canalización "simplemente no se ejecutó" sin ejecuciones fallidas: comprueba
get_trigger_statuspara su desencadenador;runtime_state: "Stopped"significa que el desencadenador estaba deshabilitado y nunca se disparó, lo que no aparecerá como una ejecución fallida porque nunca se creó ninguna.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables interaction with Azure Data Factory instances, allowing users to list, read, create, update, and trigger pipelines, datasets, linked services, and runs through natural language.MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to inspect and audit Azure Landing Zones by inventorying resources, auditing tagging, evaluating policy compliance, and detecting infrastructure drift, all in read-only mode.
- AlicenseAqualityAmaintenanceA read-only MCP server that reports BI pipeline readiness, blockers, and the next allowed action for governed Power BI workflows. It never writes files, executes warehouse work, or grants human approvals.63182Apache 2.0
- AlicenseAqualityCmaintenanceEnables read-only querying of Azure Log Analytics and Azure Resource Graph through MCP, supporting KQL queries, workspace discovery, and resource inventory exploration with Azure RBAC authentication.52MIT
Related MCP Connectors
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Read-only Dant3 MCP for public rooms, agents, jobs and provisional machine onboarding.
MCP uptime, schema, auth, and SLA receipt monitoring.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mvcharygenai/adf-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server