MLflow MCP Server
# MLflow MCP Server
A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that exposes MLflow experiment tracking and model registry operations as tools for AI assistants.
## Table of Contents
- [Quickstart](#quickstart)
- [Tools](#tools)
- [Example Prompts](#example-prompts)
- [Configuration](#configuration)
- [Installation (Development)](#installation-development)
- [Project Structure](#project-structure)
- [License](#license)
## Quickstart
The fastest way to get started is to add the server to your MCP client config. No local clone required.
### Claude Desktop
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
```json
{
"mcpServers": {
"mlflow": {
"command": "uvx",
"args": ["mlflow-mcp-server"],
"env": {
"MLFLOW_TRACKING_URI": "http://localhost:5000"
}
}
}
}
```
### Cursor
Add to `~/.cursor/mcp.json`:
```json
{
"mcpServers": {
"mlflow": {
"command": "uvx",
"args": ["mlflow-mcp-server"],
"env": {
"MLFLOW_TRACKING_URI": "http://localhost:5000"
}
}
}
}
```
### OpenCode
Add to your `opencode.json`:
```json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mlflow": {
"type": "local",
"command": ["uvx", "mlflow-mcp-server"],
"environment": {
"MLFLOW_TRACKING_URI": "http://localhost:5000"
}
}
}
}
```
Replace `http://localhost:5000` with the URL of your MLflow tracking server.
## Tools
### Experiment Management
| Tool | Description |
|------|-------------|
| `get_experiment` | Get experiment details by ID |
| `get_experiment_by_name` | Get experiment details by name |
| `search_experiments` | List and filter experiments with optional name matching and pagination |
### Run Management
| Tool | Description |
|------|-------------|
| `get_run` | Get full run details including metrics, parameters, tags, and run type (parent/child/standalone) |
| `get_experiment_runs` | List runs for an experiment with pagination |
### Model Registry
| Tool | Description |
|------|-------------|
| `get_registered_models` | Search and list registered models |
| `get_model_versions` | Browse model versions with filtering |
| `create_registered_model` | Create a new registered model with optional description and tags |
| `create_model_version` | Create a new model version from a run's artifacts |
| `rename_registered_model` | Rename an existing registered model |
| `set_registered_model_alias` | Assign an alias (e.g. `champion`, `challenger`) to a model version |
| `delete_registered_model` | Delete a registered model and all its versions |
| `delete_model_version` | Delete a specific model version |
## Example Prompts
Once configured, you can ask your AI assistant things like:
**Exploring experiments and runs:**
- "List all experiments related to recommendation models"
- "Show me the runs for experiment 12 and compare their metrics"
- "Get the parameters and metrics for run abc123"
- "Which runs in the fraud-detection experiment have the highest accuracy?"
**Managing the model registry:**
- "Show me all registered models"
- "Register a new model called churn-classifier with description 'Binary classifier for customer churn'"
- "Create a new version of churn-classifier from run abc123"
- "Set the champion alias on version 3 of churn-classifier"
- "Rename the model old-name to new-name"
- "Delete version 1 of churn-classifier"
**Analysis and comparison:**
- "Compare the last 5 runs of the search-ranking experiment by NDCG and latency"
- "What hyperparameters were used in the best-performing run of experiment 7?"
- "List all model versions for recommendation-model and their aliases"
## Configuration
| Environment Variable | Default | Description |
|---------------------|---------|-------------|
| `MLFLOW_TRACKING_URI` | `http://localhost:5000` | URL of the MLflow tracking server |
## Installation (Development)
### Prerequisites
- Python 3.11+
- [uv](https://docs.astral.sh/uv/)
- An MLflow tracking server
### Setup
```bash
git clone https://github.com/yesid-lopez/mlflow-mcp-server.git
cd mlflow-mcp-server
uv sync
```
### Running Locally
```bash
export MLFLOW_TRACKING_URI="http://localhost:5000"
uv run -m mlflow_mcp_server
```
The server communicates over **stdio**, which is the standard MCP transport for local tool servers.
## Project Structure
```
mlflow_mcp_server/
├── __main__.py # Entry point
├── server.py # MCP server setup and tool registration
├── tools/
│ ├── experiment_tools.py # Experiment search and retrieval
│ ├── run_tools.py # Run details and listing
│ └── registered_models.py # Model registry CRUD operations
└── utils/
└── mlflow_client.py # MLflow client singleton
```
### Adding New Tools
1. Create a function in the appropriate file under `tools/`.
2. Register it in `server.py`:
```python
from mlflow_mcp_server.tools.your_module import your_function
mcp.add_tool(your_function)
```
### Linting
```bash
uv run ruff check .
uv run ruff format --check .
```
## License
MIT
TDQS
Scored across 7 tools
Most tools have distinct purposes targeting different MLflow entities (experiments, runs, models), but 'get_experiment' and 'get_experiment_by_name' could cause confusion as they serve the same ultimate purpose through different lookup methods. The other tools clearly target different resources.
All tools follow a consistent verb_noun pattern with 'get_' or 'search_' prefixes, using snake_case throughout. The naming is predictable and follows a clear convention across all seven tools.
Seven tools is well-scoped for an MLflow server, covering key entities like experiments, runs, and models. The count feels appropriate—neither too sparse nor bloated—for the apparent domain scope.
The toolset provides good read/search coverage for experiments, runs, and models, but lacks any write operations (create, update, delete) or lifecycle management tools. This is a notable gap that will limit agent workflows to read-only scenarios.