A high-performance Model Context Protocol (MCP) server for Trino implemented in Go.
A high-performance Model Context Protocol (MCP) server for Trino implemented in Go. This project enables AI assistants to seamlessly interact with Trino's distributed SQL query engine through standardized MCP tools.
This project implements a Model Context Protocol (MCP) server for Trino in Go. It enables AI assistants to access Trino's distributed SQL query engine through standardized MCP tools.
Trino (formerly PrestoSQL) is a powerful distributed SQL query engine designed for fast analytics on large datasets.
graph TB
subgraph "AI Clients"
CC[Claude Code]
CD[Claude Desktop]
CR[Cursor]
WS[Windsurf]
CW[ChatWise]
end
subgraph "Authentication (Optional)"
OP[OAuth Provider<br/>Okta/Google/Azure AD]
JWT[JWT Tokens]
end
subgraph "MCP Server (mcp-trino)"
HTTP[HTTP Transport<br/>/mcp endpoint]
STDIO[STDIO Transport]
AUTH[OAuth Middleware]
TOOLS[MCP Tools<br/>• execute_query<br/>• list_catalogs<br/>• list_schemas<br/>• list_tables<br/>• get_table_schema]
end
subgraph "Data Layer"
TRINO[Trino Cluster<br/>Distributed SQL Engine]
CATALOGS[Data Sources<br/>• PostgreSQL<br/>• MySQL<br/>• S3/Hive<br/>• BigQuery<br/>• MongoDB]
end
%% Connections
CC -.->|OAuth Flow| OP
OP -.->|JWT Token| JWT
CC -->|HTTP + JWT| HTTP
CD -->|STDIO| STDIO
CR -->|HTTP + JWT| HTTP
WS -->|STDIO| STDIO
CW -->|HTTP + JWT| HTTP
HTTP --> AUTH
AUTH -->|Validated| TOOLS
STDIO --> TOOLS
TOOLS -->|SQL Queries| TRINO
TRINO --> CATALOGS
%% Styling
classDef client fill:#e1f5fe
classDef auth fill:#f3e5f5
classDef server fill:#e8f5e8
classDef data fill:#fff3e0
class CC,CD,CR,WS,CW client
class OP,JWT auth
class HTTP,STDIO,AUTH,TOOLS server
class TRINO,CATALOGS data
Key Components:
For macOS and Linux, install with a single command:
curl -fsSL https://raw.githubusercontent.com/tuannvm/mcp-trino/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh
The easiest way to install mcp-trino is using Homebrew:
# Install mcp-trino
brew install tuannvm/mcp/mcp-trino
To update to the latest version:
brew update && brew upgrade mcp-trino
/usr/local/bin
on Linux/macOS)chmod +x mcp-trino
on Linux/macOS)git clone https://github.com/tuannvm/mcp-trino.git
cd mcp-trino
make build
# Binary will be in ./bin/
You can download pre-built binaries for your platform:
Platform | Architecture | Download Link |
---|---|---|
macOS | x86_64 (Intel) | Download |
macOS | ARM64 (Apple Silicon) | Download |
Linux | x86_64 | Download |
Linux | ARM64 | Download |
Windows | x86_64 | Download |
Or see all available downloads on the GitHub Releases page.
If you encounter issues during installation:
Common Issues:
Binary not found in PATH: The install script installs to ~/.local/bin
by default. Make sure this directory is in your PATH:
export PATH="$HOME/.local/bin:$PATH"
Add this to your shell profile (.bashrc
, .zshrc
, etc.) to make it permanent.
Permission denied: If you get permission errors, ensure the install directory is writable:
mkdir -p ~/.local/bin
chmod 755 ~/.local/bin
Claude configuration not found: If the install script doesn't detect your Claude installation:
claude
command is available in PATHGitHub API rate limiting: If you're hitting GitHub API rate limits:
export GITHUB_TOKEN=your_github_token
curl -fsSL https://raw.githubusercontent.com/tuannvm/mcp-trino/main/install.sh | bash
Getting Help:
--help
for usage informationThis MCP server can be integrated with several AI applications:
To use the Docker image instead of a local binary:
{
"mcpServers": {
"mcp-trino": {
"command": "docker",
"args": ["run", "--rm", "-i",
"-e", "TRINO_HOST=<HOST>",
"-e", "TRINO_PORT=<PORT>",
"-e", "TRINO_USER=<USERNAME>",
"-e", "TRINO_PASSWORD=<PASSWORD>",
"-e", "TRINO_SCHEME=http",
"ghcr.io/tuannvm/mcp-trino:latest"],
"env": {}
}
}
}
Note: The
host.docker.internal
special DNS name allows the container to connect to services running on the host machine. If your Trino server is running elsewhere, replace with the appropriate host.
This Docker configuration can be used in any of the below applications.
To use with Cursor, create or edit ~/.cursor/mcp.json
:
{
"mcpServers": {
"mcp-trino": {
"command": "mcp-trino",
"args": [],
"env": {
"TRINO_HOST": "<HOST>",
"TRINO_PORT": "<PORT>",
"TRINO_USER": "<USERNAME>",
"TRINO_PASSWORD": "<PASSWORD>"
}
}
}
}
Replace the environment variables with your specific Trino configuration.
For HTTP+StreamableHTTP transport mode (recommended for web clients):
{
"mcpServers": {
"mcp-trino-http": {
"url": "http://localhost:8080/mcp"
}
}
}
For remote MCP server with JWT authentication:
{
"mcpServers": {
"mcp-trino-remote": {
"url": "https://your-mcp-server.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_JWT_TOKEN"
}
}
}
}
For backward compatibility with SSE (legacy endpoint):
{
"mcpServers": {
"mcp-trino-sse": {
"url": "http://localhost:8080/sse"
}
}
}
Then start the server in a separate terminal with:
# Basic HTTP transport
MCP_TRANSPORT=http TRINO_HOST=<HOST> TRINO_PORT=<PORT> TRINO_USER=<USERNAME> TRINO_PASSWORD=<PASSWORD> mcp-trino
# With JWT authentication enabled
MCP_TRANSPORT=http TRINO_OAUTH_ENABLED=true TRINO_HOST=<HOST> TRINO_PORT=<PORT> TRINO_USER=<USERNAME> TRINO_PASSWORD=<PASSWORD> mcp-trino
# Production deployment with HTTPS
MCP_TRANSPORT=http TRINO_OAUTH_ENABLED=true HTTPS_CERT_FILE=/path/to/cert.pem HTTPS_KEY_FILE=/path/to/key.pem TRINO_HOST=<HOST> TRINO_PORT=<PORT> TRINO_USER=<USERNAME> TRINO_PASSWORD=<PASSWORD> mcp-trino
To use with Claude Desktop, the easiest way is to use the install script which will automatically configure it for you. Alternatively, you can manually edit your Claude configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json
%APPDATA%\Claude\claude_desktop_config.json
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"mcp-trino": {
"command": "mcp-trino",
"args": [],
"env": {
"TRINO_HOST": "<HOST>",
"TRINO_PORT": "<PORT>",
"TRINO_USER": "<USERNAME>",
"TRINO_PASSWORD": "<PASSWORD>"
}
}
}
}
After updating the configuration, restart Claude Desktop. You should see the MCP tools available in the tools menu.
To use with Claude Code, the install script will automatically configure it for you. Alternatively, you can manually add the MCP server:
claude mcp add mcp-trino mcp-trino
Then set your environment variables:
export TRINO_HOST=<HOST>
export TRINO_PORT=<PORT>
export TRINO_USER=<USERNAME>
export TRINO_PASSWORD=<PASSWORD>
Restart Claude Code to see the MCP tools available.
To use with Windsurf, create or edit your mcp_config.json
:
{
"mcpServers": {
"mcp-trino": {
"command": "mcp-trino",
"args": [],
"env": {
"TRINO_HOST": "<HOST>",
"TRINO_PORT": "<PORT>",
"TRINO_USER": "<USERNAME>",
"TRINO_PASSWORD": "<PASSWORD>"
}
}
}
}
Restart Windsurf to apply the changes. The Trino MCP tools will be available to the Cascade AI.
To use with ChatWise, follow these steps:
Local MCP Server:
mcp-trino
(or any name you prefer)mcp-trino
TRINO_HOST=<HOST>
TRINO_PORT=<PORT>
TRINO_USER=<USERNAME>
TRINO_PASSWORD=<PASSWORD>
Remote MCP Server: For remote MCP servers with JWT authentication:
{
"mcpServers": {
"remote-trino": {
"url": "https://your-mcp-server.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_JWT_TOKEN"
}
}
}
}
Alternatively, you can import the local configuration from JSON:
{
"mcpServers": {
"mcp-trino": {
"command": "mcp-trino",
"args": [],
"env": {
"TRINO_HOST": "<HOST>",
"TRINO_PORT": "<PORT>",
"TRINO_USER": "<USERNAME>",
"TRINO_PASSWORD": "<PASSWORD>"
}
}
}
}
Once enabled, click the hammer icon below the input box in ChatWise to access Trino MCP tools.
The server provides the following MCP tools:
Execute a SQL query against Trino with full SQL support for complex analytical queries.
Sample Prompt:
"How many customers do we have per region? Can you show them in descending order?"
Example:
{
"query": "SELECT region, COUNT(*) as customer_count FROM tpch.tiny.customer GROUP BY region ORDER BY customer_count DESC"
}
Response:
{
"columns": ["region", "customer_count"],
"data": [
["AFRICA", 5],
["AMERICA", 5],
["ASIA", 5],
["EUROPE", 5],
["MIDDLE EAST", 5]
]
}
List all catalogs available in the Trino server, providing a comprehensive view of your data ecosystem.
Sample Prompt:
"What databases do we have access to in our Trino environment?"
Example:
{}
Response:
{
"catalogs": ["tpch", "memory", "system", "jmx"]
}
List all schemas in a catalog, helping you navigate through the data hierarchy efficiently.
Sample Prompt:
"What schemas or datasets are available in the tpch catalog?"
Example:
{
"catalog": "tpch"
}
Response:
{
"schemas": ["information_schema", "sf1", "sf100", "sf1000", "tiny"]
}
List all tables in a schema, giving you visibility into available datasets.
Sample Prompt:
"What tables are available in the tpch tiny schema? I need to know what data we can query."
Example:
{
"catalog": "tpch",
"schema": "tiny"
}
Response:
{
"tables": ["customer", "lineitem", "nation", "orders", "part", "partsupp", "region", "supplier"]
}
Get the schema of a table, understanding the structure of your data for better query planning.
Sample Prompt:
"What columns are in the customer table? I need to know the data types and structure before writing my query."
Example:
{
"catalog": "tpch",
"schema": "tiny",
"table": "customer"
}
Response:
{
"columns": [
{
"name": "custkey",
"type": "bigint",
"nullable": false
},
{
"name": "name",
"type": "varchar",
"nullable": false
},
{
"name": "address",
"type": "varchar",
"nullable": false
},
{
"name": "nationkey",
"type": "bigint",
"nullable": false
},
{
"name": "phone",
"type": "varchar",
"nullable": false
},
{
"name": "acctbal",
"type": "double",
"nullable": false
},
{
"name": "mktsegment",
"type": "varchar",
"nullable": false
},
{
"name": "comment",
"type": "varchar",
"nullable": false
}
]
}
This information is invaluable for understanding the column names, data types, and nullability constraints before writing queries against the table.
Here's a complete interaction example showing how an AI assistant might use these tools to answer a business question:
User Query: "Can you help me analyze our biggest customers? I want to know the top 5 customers with the highest account balances."
AI Assistant's workflow:
First, discover available catalogs
> Using list_catalogs tool
> Discovers tpch catalog
Then, find available schemas
> Using list_schemas tool with catalog "tpch"
> Discovers "tiny" schema
Explore available tables
> Using list_tables tool with catalog "tpch" and schema "tiny"
> Finds "customer" table
Check the customer table schema
> Using get_table_schema tool
> Discovers "custkey", "name", "acctbal" and other columns
Finally, execute the query
> Using execute_query tool with:
> "SELECT custkey, name, acctbal FROM tpch.tiny.customer ORDER BY acctbal DESC LIMIT 5"
Returns the results to the user:
The top 5 customers with highest account balances are:
1. Customer #65 (Customer#000000065): $9,222.78
2. Customer #13 (Customer#000000013): $8,270.47
3. Customer #89 (Customer#000000089): $7,990.56
4. Customer #11 (Customer#000000011): $7,912.91
5. Customer #82 (Customer#000000082): $7,629.41
This seamless workflow demonstrates how the MCP tools enable AI assistants to explore and query data in a conversational manner.
The server supports two transport methods:
/mcp
endpoint with StreamableHTTP protocol/sse
endpoint for backward compatibility with SSE✅ Production-Ready: Complete OAuth 2.0 implementation with OIDC provider support for secure remote deployments.
Supported Authentication Modes:
OIDC Provider Mode (Production - Recommended)
# Configure with OAuth provider (Okta example)
export TRINO_OAUTH_ENABLED=true
export OAUTH_PROVIDER=okta
export OIDC_ISSUER=https://your-domain.okta.com
export OIDC_AUDIENCE=https://your-domain.okta.com
export MCP_TRANSPORT=http
mcp-trino
HMAC Mode (Development/Testing)
# Simple JWT with shared secret
export TRINO_OAUTH_ENABLED=true
export OAUTH_PROVIDER=hmac
export JWT_SECRET=your-secret-key-here
export MCP_TRANSPORT=http
mcp-trino
Key Features:
Client requests must include the JWT token in the Authorization header:
Authorization: Bearer <your-jwt-token>
For detailed OAuth configuration and deployment examples, see docs/oauth.md.
For production deployments with authentication, HTTPS is strongly recommended:
export HTTPS_CERT_FILE=/path/to/certificate.pem
export HTTPS_KEY_FILE=/path/to/private-key.pem
export TRINO_OAUTH_ENABLED=true
export MCP_TRANSPORT=http
mcp-trino
The server will automatically start with HTTPS when certificate files are provided.
Since the server supports JWT authentication and HTTP transport, you can deploy it as a remote MCP server accessible to multiple clients over the network.
# Deploy with HTTPS and JWT authentication
export MCP_TRANSPORT=http
export MCP_PORT=443
export TRINO_OAUTH_ENABLED=true
export HTTPS_CERT_FILE=/etc/ssl/certs/mcp-trino.pem
export HTTPS_KEY_FILE=/etc/ssl/private/mcp-trino.key
export TRINO_HOST=your-trino-cluster.com
export TRINO_PORT=443
export TRINO_USER=service-account
export TRINO_PASSWORD=service-password
# Start the server
mcp-trino
With JWT Authentication:
{
"mcpServers": {
"remote-trino": {
"url": "https://your-mcp-server.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_JWT_TOKEN"
}
}
}
}
Load Balancer/Proxy Configuration:
server {
listen 443 ssl;
server_name your-mcp-server.com;
ssl_certificate /etc/ssl/certs/mcp-trino.pem;
ssl_certificate_key /etc/ssl/private/mcp-trino.key;
location /mcp {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization $http_authorization;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
For containerized deployment:
FROM ghcr.io/tuannvm/mcp-trino:latest
ENV MCP_TRANSPORT=http
ENV MCP_PORT=8080
ENV TRINO_OAUTH_ENABLED=true
ENV TRINO_HOST=your-trino-cluster.com
ENV TRINO_PORT=443
ENV TRINO_USER=service-account
ENV TRINO_PASSWORD=service-password
EXPOSE 8080
CMD ["mcp-trino"]
# Build and run with Docker
docker build -t mcp-trino-server .
docker run -d -p 8080:8080 \
-e HTTPS_CERT_FILE=/certs/cert.pem \
-e HTTPS_KEY_FILE=/certs/key.pem \
-v /path/to/certs:/certs \
mcp-trino-server
iss
) and audience (aud
) validationFor Production (OIDC):
# Configure OAuth provider
export TRINO_OAUTH_ENABLED=true
export OAUTH_PROVIDER=okta
export OIDC_ISSUER=https://your-domain.okta.com
export OIDC_AUDIENCE=https://your-domain.okta.com
export MCP_TRANSPORT=http
# Start server
mcp-trino
For Development (HMAC):
# Simple JWT testing
export TRINO_OAUTH_ENABLED=true
export OAUTH_PROVIDER=hmac
export JWT_SECRET="your-test-secret"
export MCP_TRANSPORT=http
# Start server
mcp-trino
Client Configuration:
{
"mcpServers": {
"trino-oauth": {
"url": "https://your-mcp-server.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_JWT_TOKEN"
}
}
}
}
The server can be configured using the following environment variables:
Variable | Description | Default |
---|---|---|
TRINO_HOST | Trino server hostname | localhost |
TRINO_PORT | Trino server port | 8080 |
TRINO_USER | Trino user | trino |
TRINO_PASSWORD | Trino password | (empty) |
TRINO_CATALOG | Default catalog | memory |
TRINO_SCHEMA | Default schema | default |
TRINO_SCHEME | Connection scheme (http/https) | https |
TRINO_SSL | Enable SSL | true |
TRINO_SSL_INSECURE | Allow insecure SSL | true |
TRINO_ALLOW_WRITE_QUERIES | Allow non-read-only SQL queries | false |
TRINO_QUERY_TIMEOUT | Query timeout in seconds | 30 |
MCP_TRANSPORT | Transport method (stdio/http) | stdio |
MCP_PORT | HTTP port for http transport | 8080 |
MCP_HOST | Host for HTTP callbacks | localhost |
TRINO_OAUTH_ENABLED | Enable OAuth authentication | false |
OAUTH_PROVIDER | OAuth provider (hmac/okta/google/azure) | hmac |
JWT_SECRET | JWT secret for HMAC mode | (empty) |
OIDC_ISSUER | OIDC provider issuer URL | (empty) |
OIDC_AUDIENCE | OIDC audience identifier | (empty) |
OIDC_CLIENT_ID | OIDC client ID | (empty) |
HTTPS_CERT_FILE | Path to HTTPS certificate file | (empty) |
HTTPS_KEY_FILE | Path to HTTPS private key file | (empty) |
Note: When
TRINO_SCHEME
is set to "https",TRINO_SSL
is automatically set to true regardless of the provided value.
Important: The default connection mode is HTTPS. If you're using an HTTP-only Trino server, you must set
TRINO_SCHEME=http
in your environment variables.
Security Note: By default, only read-only queries (SELECT, SHOW, DESCRIBE, EXPLAIN) are allowed to prevent SQL injection. If you need to execute write operations or other non-read queries, set
TRINO_ALLOW_WRITE_QUERIES=true
, but be aware this bypasses this security protection.
For Web Client Integration: When using with web clients, set
MCP_TRANSPORT=http
and connect to the/mcp
endpoint for StreamableHTTP support. The/sse
endpoint is maintained for backward compatibility.
OAuth Authentication: When
TRINO_OAUTH_ENABLED=true
, the server supports multiple OAuth providers including OIDC-compliant providers (Okta, Google, Azure AD) for production use and HMAC mode for development/testing.
HTTPS Support: For production deployments, configure HTTPS by setting
HTTPS_CERT_FILE
andHTTPS_KEY_FILE
environment variables. This is strongly recommended when using JWT authentication.
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
This project uses GitHub Actions for continuous integration and GoReleaser for automated releases.
Our CI pipeline performs the following checks on all PRs and commits to the main branch:
When changes are merged to the main branch: