# mcp-zenml

An MCP server that lets your agent read and change ZenML resources: pipelines, runs, stacks, models. Handy when you want live ML platform data inside the editor.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 49
- Author: zenml-io
- License: MIT · policy=link-only · description only; the file stays with the author
- Source: https://github.com/zenml-io/mcp-zenml
- Updated: 2026-10-22
- HTML: https://affpapa.org/en/nevibecode/mcp/mcp-zenml

## What it does

The server talks to the ZenML API and exposes a set of tools to the agent. The compact profile ships 16 of them: seven generic ones (`zenml_describe_resources`, `zenml_list_resources`, `zenml_get_resource`, `zenml_create_resource`, `zenml_update_resource`, `zenml_delete_resource`, `zenml_action_resource`) plus focused tools for setup diagnostics, the active user and project, pipeline triggering, step logs and code, deployment logs, and opening a run dashboard or activity chart.

Registration and write access are separate switches. `ZENML_MCP_WRITE_POLICY=read_only` drops the four mutation tools and `trigger_pipeline` from discovery, along with the create, update, delete and action schemas. The older `ZENML_MCP_READ_ONLY=true` is still accepted, and a bad policy value falls back to read-only. A bad `ZENML_MCP_PROFILE` halts startup with a config error.

Version 2.0.0 needs MCP Python SDK 2.2.0 and ZenML 0.96.4. Compact is now the default, which breaks discovery for clients calling entity-specific names such as `list_pipeline_runs` — set `ZENML_MCP_PROFILE=legacy` while you migrate. The legacy profile does not extend coverage to earlier ZenML server releases. Mutations report `completed`, `accepted` or `unknown`, and the server never retries after a call may have reached ZenML: reconcile from the response first.

## Requirements
- Needs: Docker
- Environment variables: `ZENML_STORE_URL`, `ZENML_STORE_API_KEY`, `ZENML_MCP_PROFILE`, `ZENML_MCP_WRITE_POLICY` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env ZENML_STORE_URL=<ZENML_STORE_URL> --env ZENML_STORE_API_KEY=<ZENML_STORE_API_KEY> --env ZENML_MCP_PROFILE=<ZENML_MCP_PROFILE> --env ZENML_MCP_WRITE_POLICY=<ZENML_MCP_WRITE_POLICY> --transport stdio mcp-zenml -- docker run -i --rm -e ZENML_STORE_URL -e ZENML_STORE_API_KEY -e ZENML_MCP_PROFILE -e ZENML_MCP_WRITE_POLICY docker.io/zenmldocker/mcp-zenml:2.0.0
```
Replace <…> with your own values

### Codex

**Platform CLI**
```bash
codex mcp add mcp-zenml --env ZENML_STORE_URL=<ZENML_STORE_URL> --env ZENML_STORE_API_KEY=<ZENML_STORE_API_KEY> --env ZENML_MCP_PROFILE=<ZENML_MCP_PROFILE> --env ZENML_MCP_WRITE_POLICY=<ZENML_MCP_WRITE_POLICY> -- docker run -i --rm -e ZENML_STORE_URL -e ZENML_STORE_API_KEY -e ZENML_MCP_PROFILE -e ZENML_MCP_WRITE_POLICY docker.io/zenmldocker/mcp-zenml:2.0.0
```
Replace <…> with your own values

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "mcp-zenml": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "-e",
                "ZENML_STORE_URL",
                "-e",
                "ZENML_STORE_API_KEY",
                "-e",
                "ZENML_MCP_PROFILE",
                "-e",
                "ZENML_MCP_WRITE_POLICY",
                "docker.io/zenmldocker/mcp-zenml:2.0.0"
            ],
            "env": {
                "ZENML_STORE_URL": "<ZENML_STORE_URL>",
                "ZENML_STORE_API_KEY": "<ZENML_STORE_API_KEY>",
                "ZENML_MCP_PROFILE": "<ZENML_MCP_PROFILE>",
                "ZENML_MCP_WRITE_POLICY": "<ZENML_MCP_WRITE_POLICY>"
            }
        }
    }
}
```
Replace <…> with your own values

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "mcp-zenml": {
            "type": "stdio",
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "-e",
                "ZENML_STORE_URL",
                "-e",
                "ZENML_STORE_API_KEY",
                "-e",
                "ZENML_MCP_PROFILE",
                "-e",
                "ZENML_MCP_WRITE_POLICY",
                "docker.io/zenmldocker/mcp-zenml:2.0.0"
            ],
            "env": {
                "ZENML_STORE_URL": "<ZENML_STORE_URL>",
                "ZENML_STORE_API_KEY": "<ZENML_STORE_API_KEY>",
                "ZENML_MCP_PROFILE": "<ZENML_MCP_PROFILE>",
                "ZENML_MCP_WRITE_POLICY": "<ZENML_MCP_WRITE_POLICY>"
            }
        }
    }
}
```
Replace <…> with your own values

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e ZENML_STORE_URL=<ZENML_STORE_URL> -e ZENML_STORE_API_KEY=<ZENML_STORE_API_KEY> -e ZENML_MCP_PROFILE=<ZENML_MCP_PROFILE> -e ZENML_MCP_WRITE_POLICY=<ZENML_MCP_WRITE_POLICY> mcp-zenml docker run -i --rm -e ZENML_STORE_URL -e ZENML_STORE_API_KEY -e ZENML_MCP_PROFILE -e ZENML_MCP_WRITE_POLICY docker.io/zenmldocker/mcp-zenml:2.0.0
```
Replace <…> with your own values

## When to use it
- check run status and history from the editor
- pull logs and code for one pipeline step
- create or update a ZenML resource by UUID
- trigger a pipeline from a snapshot
- open a run dashboard and activity chart

## Example prompts
- Show the latest runs of this pipeline and their status
- Fetch the logs for the step that failed
- Trigger the pipeline from the newest snapshot

## Similar
- [MCP Toolbox for Databases](https://affpapa.org/en/nevibecode/mcp/googleapis-mcp-toolbox-for-databases.md) — MCP server · ★ 16717
- [labelhead-artist-momentum](https://affpapa.org/en/nevibecode/mcp/labelhead-artist-momentum.md) — MCP server · ★ 107423
- [Agent Skills Search Server](https://affpapa.org/en/nevibecode/mcp/agent-skills-search-server.md) — MCP server · ★ 26559
- [Skyvern](https://affpapa.org/en/nevibecode/mcp/skyvern.md) — MCP server · ★ 23263
- [Nhost](https://affpapa.org/en/nevibecode/mcp/nhost.md) — MCP server · ★ 9366
- [PraisonAI](https://affpapa.org/en/nevibecode/mcp/praisonai.md) — MCP server · ★ 9289

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
