Skip to main content
Glama
dipankarmazumdar

iceberg-mcp-server-trino

README.md
# Iceberg MCP Server (via Trino)

This is an Iceberg MCP Server using Trino as the compute engine, adapted from the [Impala fork](https://github.com/dipankarmazumdar/iceberg-mcp-server) with Iceberg **table health** tooling and Trino SQL dialect support.

Model Context Protocol server for read-only access to Iceberg tables through **Cloudera Trino** (CDW Trino Virtual Warehouse): schema discovery, SQL queries, metadata-based health checks, time travel, and performance analysis.

**Repository:** `https://github.com/dipankarmazumdar/iceberg-mcp-server-trino`

## Requirements

- Python 3.13+
- A Trino endpoint with Iceberg tables (tested with Cloudera Data Warehouse Trino Virtual Warehouse)
- LDAP or basic auth credentials for Trino

## Quick start

```bash
git clone https://github.com/dipankarmazumdar/iceberg-mcp-server-trino.git
cd iceberg-mcp-server-trino
python3.13 -m venv .venv
source .venv/bin/activate
pip install -e .
cp .env.example .env   # edit with your Trino coordinator + credentials
```

Connectivity test:

```bash
python -c "from iceberg_mcp_server_trino.tools import trino_tools; print(trino_tools.get_schema())"
```

Table health check:

```bash
python -c "from iceberg_mcp_server_trino.tools import trino_tools; print(trino_tools.get_table_health('your_iceberg_table'))"
```

## Tools

- `execute_query(query: str)`: Run a read-only SQL query on Trino and return results as JSON.
- `get_schema()`: List tables in the configured catalog and schema.
- `get_table_health(table: str)`: Summarize Iceberg table health from metadata tables (`snapshots`, `history`, `files`, `partitions`, `manifests`, `metadata_log_entries`). Pass `table` or `catalog.schema.table`.

### Iceberg semantics

- `list_metadata_tables(table)`: List available Iceberg metadata tables.
- `describe_metadata_table(table, metadata_name)`: Schema of a metadata table.
- `query_metadata_table(table, metadata_name, limit?, columns?)`: Bounded metadata query.
- `list_snapshots(table, limit?)`: Snapshot timeline from metadata.
- `describe_table_history(table)`: Snapshot history via `$history` metadata table.
- `get_snapshot_summary(table, snapshot_id)`: Detail for one snapshot.
- `list_refs(table)`: Branches and tags.
- `query_at_snapshot(table, snapshot_id, limit?, columns?)`: Time travel by snapshot ID (`FOR VERSION AS OF`).
- `query_at_timestamp(table, timestamp, limit?, columns?)`: Time travel by timestamp (`FOR TIMESTAMP AS OF`).
- `diff_snapshots(table, snapshot_id_a, snapshot_id_b)`: Compare two snapshots.

### Performance & cost awareness

- `explain_query(query)`: Trino EXPLAIN plan for a read-only query.
- `partition_pruning_check(query)`: Heuristic partition pruning assessment from EXPLAIN.
- `table_scan_cost_hints(table)`: Scan cost signals from files/partitions metadata.
- `hot_partitions(table, limit?)`: Top partitions by file/record count (skew detection).

## Local development

```bash
python3.13 -m venv .venv
source .venv/bin/activate
pip install -e .
cp .env.example .env   # then edit with your Trino settings
```

### Cloudera CDW example `.env`

```bash
TRINO_HOST=coordinator-default-trino.example.cloudera.site
TRINO_PORT=443
TRINO_USER=your-username
TRINO_PASSWORD=your-password
TRINO_CATALOG=iceberg
TRINO_SCHEMA=airlines
TRINO_USE_SSL=true
TRINO_SSL_VERIFY=true
MCP_TRANSPORT=stdio
```

Quick connectivity test:

```bash
python -c "from iceberg_mcp_server_trino.tools import trino_tools; print(trino_tools.get_schema())"
```

Run with the MCP Inspector:

```bash
fastmcp dev inspector src/iceberg_mcp_server_trino/server.py:mcp --with-editable .
```

## Configuration

Set these environment variables (via `.env` or MCP config `env` block):

| Variable | Description | Default |
|---|---|---|
| `TRINO_HOST` | Trino coordinator hostname | required |
| `TRINO_PORT` | Trino port | `443` |
| `TRINO_USER` | Username | required |
| `TRINO_PASSWORD` | Password (LDAP/basic auth) | required |
| `TRINO_CATALOG` | Iceberg catalog name | `iceberg` |
| `TRINO_SCHEMA` | Default schema | `default` |
| `TRINO_USE_SSL` | Use HTTPS | `true` |
| `TRINO_SSL_VERIFY` | SSL verification (`true`, `false`, or path to CA cert) | `true` |
| `MCP_TRANSPORT` | `stdio` (default), `http`, or `sse` | `stdio` |

### Trino vs Impala SQL differences (handled internally)

| Feature | Impala | Trino (this server) |
|---|---|---|
| Metadata tables | `db.table.snapshots` | `"catalog"."schema"."table$snapshots"` |
| Time travel (version) | `FOR SYSTEM_VERSION AS OF` | `FOR VERSION AS OF` |
| Time travel (time) | `FOR SYSTEM_TIME AS OF '...'` | `FOR TIMESTAMP AS OF TIMESTAMP '...'` |
| History | `DESCRIBE HISTORY` | `$history` metadata table |

## Usage with Cursor

Copy `mcp.json.example` to `.cursor/mcp.json` and update paths and credentials.

```json
{
  "mcpServers": {
    "iceberg-mcp-server-trino": {
      "command": "/path/to/iceberg-mcp-server-trino/.venv/bin/python",
      "args": [
        "/path/to/iceberg-mcp-server-trino/src/iceberg_mcp_server_trino/server.py"
      ]
    }
  }
}
```

Credentials can live in `.env` (loaded by the server) or in the `env` block. Enable the server under **Cursor Settings → MCP**, then restart the server after code changes.

## Usage with Claude Desktop

### Option 1: Install from GitHub (recommended)

```json
{
  "mcpServers": {
    "iceberg-mcp-server-trino": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/dipankarmazumdar/iceberg-mcp-server-trino@main",
        "run-server"
      ],
      "env": {
        "TRINO_HOST": "coordinator-default-trino.example.com",
        "TRINO_PORT": "443",
        "TRINO_USER": "username",
        "TRINO_PASSWORD": "password",
        "TRINO_CATALOG": "iceberg",
        "TRINO_SCHEMA": "default"
      }
    }
  }
}
```

### Option 2: Local installation

```json
{
  "mcpServers": {
    "iceberg-mcp-server-trino": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/iceberg-mcp-server-trino",
        "run",
        "src/iceberg_mcp_server_trino/server.py"
      ],
      "env": {
        "TRINO_HOST": "coordinator-default-trino.example.com",
        "TRINO_PORT": "443",
        "TRINO_USER": "username",
        "TRINO_PASSWORD": "password",
        "TRINO_CATALOG": "iceberg",
        "TRINO_SCHEMA": "default"
      }
    }
  }
}
```

## Security

All MCP tools are **read-only**. `execute_query` rejects non-read-only SQL prefixes. Use a Trino user with least-privilege access in production.

---

Based on [cloudera/iceberg-mcp-server](https://github.com/cloudera/iceberg-mcp-server). See `LICENSE` and `NOTICE.txt` for attribution.

*Copyright (c) 2025 Cloudera, Inc. All rights reserved.*

TDQS

B3.4/5.0

Scored across 17 tools

Disambiguation5/5

Each tool has a clear, distinct purpose covering metadata tables, snapshots, time travel, queries, health, and partitions. No two tools appear to do the same thing.

Naming Consistency4/5

Most tools follow a verb_noun pattern in snake_case, such as list_snapshots and get_table_health. Exceptions like hot_partitions and partition_pruning_check are minor deviations but still clear.

Tool Count5/5

17 tools is well-scoped for a read-only Iceberg metadata server via Trino, covering exploration, analysis, and querying without being overwhelming.

Completeness3/5

The set covers most read-only operations (snapshots, metadata tables, health, time travel) but lacks a tool to retrieve the current table schema (columns and types), which is a notable gap.

Maintenance

ActivityStale
ResponsivenessNo issues