Skip to main content
Glama
fcdmoraes

Teradata MCP Server

by fcdmoraes
README.md
# Teradata MCP Server

An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server for Teradata. Enables Claude (via Cowork or Claude Desktop) to run SQL queries, explore metadata, and interact directly with Teradata databases.

---

## Features

- Execute arbitrary SQL queries with configurable row limits
- List tables and views within a database
- Preview sample rows from any table
- Test connectivity and retrieve the database version
- Environment-based configuration via `.env`
- Supports `stdio` transport (Claude Desktop / Cowork) and `streamable-http`

---

## Tools

| Tool | Description |
|---|---|
| `ping` | Tests the connection and returns the Teradata version |
| `read_query` | Executes a SQL statement and returns results as JSON |
| `list_tables` | Lists tables and views in a given database |
| `table_preview` | Returns a sample of the first rows from a table |

### Details

**`ping()`**
Confirms the connection is active. Useful for validating configuration before running queries.

**`read_query(sql, row_limit?)`**
Executes any SQL statement. `row_limit` is optional — defaults to `DEFAULT_ROW_LIMIT` (1000). Never exceeds `MAX_ROW_LIMIT` (50000). Returns `truncated: true` when results were cut off.

**`list_tables(database)`**
Queries `DBC.TablesV` and returns the name, type (Table / View), and creation date of each object in the given database.

**`table_preview(database, table, row_limit?)`**
Executes `SELECT TOP N * FROM database.table`. Default `row_limit` is 10.

---

## Installation

### Prerequisites

- Python 3.11+
- [uv](https://docs.astral.sh/uv/) (package manager)
- Access to a Teradata server

### Steps

```bash
# 1. Clone the repository
git clone <repository-url>
cd teradata-mcp-server

# 2. Install dependencies
uv sync

# 3. Set up environment variables
cp .env.example .env
# Edit .env with your Teradata credentials

# 4. Test the connection
uv run teradata-mcp-server
```

---

## Configuration

### Environment variables (`.env`)

| Variable | Required | Default | Description |
|---|---|---|---|
| `DATABASE_URI` | ✅ | — | Connection URI: `teradata://user:password@host:1025/database` |
| `LOGMECH` | — | `TD2` | Authentication mechanism (`TD2` or `LDAP`) |
| `MCP_TRANSPORT` | — | `stdio` | MCP transport (`stdio` or `streamable-http`) |
| `MCP_HOST` | — | `localhost` | Host for HTTP transport |
| `MCP_PORT` | — | `8001` | Port for HTTP transport |
| `TD_POOL_SIZE` | — | `5` | Connection pool size |
| `TD_MAX_OVERFLOW` | — | `10` | Extra connections allowed above pool size |
| `TD_POOL_TIMEOUT` | — | `30` | Timeout to acquire a connection (seconds) |
| `DEFAULT_ROW_LIMIT` | — | `1000` | Default row limit for `read_query` |
| `MAX_ROW_LIMIT` | — | `50000` | Hard ceiling — callers cannot exceed this |
| `LOGGING_LEVEL` | — | `WARNING` | Log level (`DEBUG`, `INFO`, `WARNING`, `ERROR`) |

---

## Cowork Configuration

In Claude Cowork (or Claude Desktop), go to **Settings → Claude Cowork → Edit Config** and add the block below inside `mcpServers`:

```json
{
  "mcpServers": {
    "teradata": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/teradata-mcp-server",
        "run",
        "teradata-mcp-server"
      ],
      "env": {
        "DATABASE_URI": "teradata://user:password@host:1025/database"
      }
    }
  }
}
```

> Replace `/path/to/teradata-mcp-server` with the absolute path to the project on your machine and fill in your credentials in `DATABASE_URI`.

If you prefer to keep credentials in `.env` rather than exposing them in the config JSON, omit the `"env"` field — the server reads `.env` automatically on startup.

---

## Project Structure

```
teradata-mcp-server/
├── .env.example                  # Environment variables template
├── pyproject.toml                # Dependencies and entry point (uv/hatchling)
├── README.md
└── src/
    ├── core/
    │   ├── __init__.py
    │   ├── config.py             # Settings (pydantic-settings, reads .env)
    │   └── connection.py         # SQLAlchemy singleton engine (get_engine)
    ├── tools/
    │   ├── __init__.py
    │   └── base.py               # Tools: ping, read_query, list_tables, table_preview
    └── server/
        ├── __init__.py
        └── teradata_mcp_server.py  # Entry point: FastMCP instance + mcp.run()
```

TDQS

A3.5/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a distinct purpose: listing tables, testing connectivity, executing arbitrary queries, and previewing table data. No overlap or ambiguity.

Naming Consistency4/5

All names use snake_case, but patterns vary: 'ping' is a bare verb, while others combine verb_noun (list_tables, read_query) or noun_verb (table_preview). Minor inconsistency, but still clear.

Tool Count2/5

Only 4 tools for a database server is too few. Essential operations like write, DDL, and transaction control are missing, making the set feel incomplete for the domain.

Completeness3/5

Covers read-only operations (list, query, preview, test), but lacks write operations, schema manipulation, and more advanced query support. Notable gaps for a full database server.

Maintenance

ActivityStale
ResponsivenessNo issues