Trino MCP サーバー
Trino のモデル コンテキスト プロトコル サーバー。AI モデルに Trino の分散 SQL クエリ エンジンへの構造化されたアクセスを提供します。
⚠️ベータリリース (v0.1.2) ⚠️
このプロジェクトはコア機能が動作しテスト済みで安定しつつあります。ぜひフォークして貢献してください!
特徴
✅ Docker コンテナ API の初期化問題を修正しました。(信頼性の高いサーバーの初期化)
✅ MCPプロトコルを通じてTrinoリソースを公開します
✅ AIツールがTrinoのデータをクエリおよび分析できるようにします
✅ トランスポート オプションを提供します (STDIO トランスポートは確実に動作しますが、SSE トランスポートには問題があります)
✅ Trinoクエリを正しく実行するためのカタログ処理を修正しました
✅ DockerコンテナAPIとスタンドアロンPython APIサーバーオプションの両方
Related MCP server: Trino MCP Server
クイックスタート
# Start the server with docker-compose
docker-compose up -d
# Verify the API is working
curl -X POST "http://localhost:9097/api/query" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT 1 AS test"}'コンテナ化されていないバージョンが必要ですか?スタンドアロン API を実行してください。
# Run the standalone API server on port 8008
python llm_trino_api.pyLLM統合
LLM に Trino インスタンスへのクエリを直接実行するためのアクセス権を与えたいですか? そのためにシンプルなツールを作成しました。
コマンドラインLLMインターフェース
LLM に Trino をクエリさせる最も簡単な方法は、コマンドライン ツールを使用することです。
# Simple direct query (perfect for LLMs)
python llm_query_trino.py "SELECT * FROM memory.bullshit.real_bullshit_data LIMIT 5"
# Specify a different catalog or schema
python llm_query_trino.py "SELECT * FROM information_schema.tables" memory information_schemaLLM 向け REST API
LLM アプリケーションとの統合には、次の 2 つの API オプションがあります。
1. DockerコンテナAPI(ポート9097)
Docker コンテナはポート 9097 で REST API を公開します。
# Execute a query against the Docker container API
curl -X POST "http://localhost:9097/api/query" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT 1 AS test"}'2. スタンドアロン Python API (ポート 8008)
より柔軟なデプロイメントを実現するには、スタンドアロン API サーバーを実行します。
# Start the API server on port 8008
python llm_trino_api.pyこれにより、次の場所にエンドポイントが作成されます。
GET http://localhost:8008/- API 使用情報POST http://localhost:8008/query- SQLクエリを実行する
次に、LLM にこのエンドポイントへの HTTP リクエストを送信させます。
# Example code an LLM might generate
import requests
def query_trino(sql_query):
response = requests.post(
"http://localhost:8008/query",
json={"query": sql_query}
)
return response.json()
# LLM-generated query
results = query_trino("SELECT job_title, AVG(salary) FROM memory.bullshit.real_bullshit_data GROUP BY job_title ORDER BY AVG(salary) DESC LIMIT 5")
print(results["formatted_results"])このアプローチにより、LLM は SQL の生成に集中でき、当社のツールが MCP プロトコルの複雑な部分をすべて処理できるようになります。
デモと検証スクリプト 🚀
AI モデルが MCP プロトコルを使用して Trino に対して複雑なクエリを実行する方法を示す、優れたデモ スクリプトをいくつか作成しました。
1. でたらめなデータ生成と読み込み
tools/create_bullshit_data.pyスクリプトは、ばかげた役職、水増しされた給与、および「bullshit 係数」評価 (1 ~ 10) を持つ 10,000 人の従業員のデータセットを生成します。
# Generate the bullshit data
python tools/create_bullshit_data.py
# Load the bullshit data into Trino's memory catalog
python load_bullshit_data.py2. MCP を介した複雑なクエリの実行
test_bullshit_query.pyスクリプトは、エンドツーエンドの MCP 相互作用を示します。
STDIOトランスポートを使用してMCPサーバーに接続します
MCP仕様に従ってプロトコルを初期化します
WHERE、GROUP BY、HAVING、ORDER BYを使用した複雑なSQLクエリを実行します。
結果を処理しフォーマットする
# Run a complex query against the bullshit data through MCP
python test_bullshit_query.py高給のトップ BS 職種を示す出力例:
🏆 TOP 10 BULLSHIT JOBS (high salary, high BS factor):
----------------------------------------------------------------------------------------------------
JOB_TITLE | COUNT | AVG_SALARY | MAX_SALARY | AVG_BS_FACTOR
----------------------------------------------------------------------------------------------------
Advanced Innovation Jedi | 2 | 241178.50 | 243458.00 | 7.50
VP of Digital Officer | 1 | 235384.00 | 235384.00 | 7.00
Innovation Technical Architect | 1 | 235210.00 | 235210.00 | 9.00
...and more!3. APIテスト
test_llm_api.pyスクリプトは、API 機能を検証します。
# Test the Docker container API
python test_llm_api.pyこれにより、次の包括的なチェックが実行されます。
APIエンドポイントの検出
ドキュメントの入手可能性
有効なクエリ実行
無効なクエリのエラー処理
使用法
# Start the server with docker-compose
docker-compose up -dサーバーは次の場所で利用できます:
MCP サーバー: http://localhost:9096
API サーバー: http://localhost:9097
クライアント接続
✅重要:クライアントスクリプトはローカルマシン(Dockerの外部)で実行され、Dockerコンテナに接続します。スクリプトはdocker execコマンドを使用してこれを自動的に処理します。MCPを使用するためにコンテナ内に入る必要はありません。
ローカルマシンからテストを実行する:
# Generate and load data into Trino
python tools/create_bullshit_data.py # Generates data locally
python load_bullshit_data.py # Loads data to Trino in Docker
# Run MCP query through Docker
python test_bullshit_query.py # Queries using MCP in Docker交通手段
このサーバーは 2 つの転送方法をサポートしていますが、現在信頼できるのは STDIO のみです。
STDIO トランスポート (推奨および動作中)
STDIO トランスポートは確実に動作し、現在テストと開発に推奨される唯一の方法です。
# Run with STDIO transport inside the container
docker exec -i trino_mcp_trino-mcp_1 python -m trino_mcp.server --transport stdio --debug --trino-host trino --trino-port 8080 --trino-user trino --trino-catalog memorySSE トランスポート (非推奨 - 重大な問題あり)
SSEはMCPのデフォルトトランスポートですが、現在のMCPバージョン1.3.0には深刻な問題があり、クライアントの切断時にサーバークラッシュが発生します。これらの問題が解決されるまでは使用を推奨しません。
# NOT RECOMMENDED: Run with SSE transport (crashes on disconnection)
docker exec trino_mcp_trino-mcp_1 python -m trino_mcp.server --transport sse --host 0.0.0.0 --port 8000 --debug既知の問題と修正
修正: DockerコンテナAPIの初期化
✅修正済み: Dockerコンテナ内のAPIが503 Service Unavailableレスポンスを返す問題を修正しました。この問題は、 app_lifespan関数がapp_context_globalとTrinoクライアント接続を適切に初期化していなかったことに起因しています。修正により、以下の問題が解決されます。
Trinoクライアントは起動時に明示的に接続します
AppContextグローバル変数が適切に初期化されている
ヘルスチェックが正しく動作するようになりました
503 エラーが発生した場合は、コンテナが最新のコードで再構築されていることを確認してください。
# Rebuild and restart the container with the fix
docker-compose stop trino-mcp
docker-compose rm -f trino-mcp
docker-compose up -d trino-mcpMCP 1.3.0 SSEトランスポートのクラッシュ
MCP 1.3.0 の SSE トランスポートに重大な問題があり、クライアントの切断時にサーバーがクラッシュします。新しいバージョンの MCP が統合されるまでは、STDIO トランスポートのみを使用してください。エラーは次のように表示されます。
RuntimeError: generator didn't stop after athrow()
anyio.BrokenResourceErrorTrinoカタログの取り扱い
Trinoクライアントのカタログ処理に関する問題を修正しました。元の実装ではUSE catalogステートメントの使用が試みられていましたが、これは信頼性に欠けていました。修正により、接続パラメータにカタログを直接設定するようになりました。
プロジェクト構造
このプロジェクトは次のように構成されています。
src/- Trino MCP サーバーのメインソースコードexamples/- サーバーの使用方法を示す簡単な例scripts/- 便利な診断およびテストスクリプトtools/- データ作成とセットアップのためのユーティリティスクリプトtests/- 自動テスト
主要ファイル:
llm_trino_api.py- LLM 統合用のスタンドアロン API サーバーtest_llm_api.py- APIサーバーのテストスクリプトtest_mcp_stdio.py- STDIO トランスポートを使用したメインテスト スクリプト (推奨)test_bullshit_query.py- でたらめなデータを使った複雑なクエリの例load_bullshit_data.py- 生成されたデータを Trino にロードするスクリプトtools/create_bullshit_data.py- 面白いテストデータを生成するスクリプトrun_tests.sh- 自動テストを実行するスクリプトexamples/simple_mcp_query.py- MCP を使用してデータをクエリする簡単な例
発達
重要: すべてのスクリプトはローカル マシンから実行できます。スクリプトは docker exec コマンドを介して Docker コンテナーと自動的に通信します。
# Install development dependencies
pip install -e ".[dev]"
# Run automated tests
./run_tests.sh
# Test MCP with STDIO transport (recommended)
python test_mcp_stdio.py
# Simple example query
python examples/simple_mcp_query.py "SELECT 'Hello World' AS message"テスト
Trino クエリが正しく動作しているかどうかをテストするには、STDIO トランスポート テスト スクリプトを使用します。
# Recommended test method (STDIO transport)
python test_mcp_stdio.pyでたらめなデータを使ったより複雑なテストの場合:
# Load and query the bullshit data (shows the full power of Trino MCP!)
python load_bullshit_data.py
python test_bullshit_query.pyLLM API エンドポイントをテストするには:
# Test the Docker container API
python test_llm_api.py
# Test the standalone API (make sure it's running first)
python llm_trino_api.py
curl -X POST "http://localhost:8008/query" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT 1 AS test"}'LLMがこれをどのように活用できるか
LLM は Trino MCP サーバーを使用して次のことを行うことができます。
データベーススキーマ情報を取得します:
# Example prompt to LLM: "What schemas are available in the memory catalog?" # LLM can generate code to query: query = "SHOW SCHEMAS FROM memory"複雑な分析クエリを実行する:
# Example prompt: "Find the top 5 job titles with highest average salaries" # LLM can generate complex SQL: query = """ SELECT job_title, AVG(salary) as avg_salary FROM memory.bullshit.real_bullshit_data GROUP BY job_title ORDER BY avg_salary DESC LIMIT 5 """データ分析を実行し、結果を提示する:
# LLM can parse the response, extract insights and present to user: "The highest paying job title is 'Advanced Innovation Jedi' with an average salary of $241,178.50"
実際のLLM分析例:企業によるナンセンスな求人
以下は、LLM が「くだらない仕事に就いている従業員が最も多い企業を特定し、マーメイド チャートを作成してください」と要求された場合に作成できる実際の例です。
ステップ1: LLMがクエリを生成して実行する
SELECT
company,
COUNT(*) as employee_count,
AVG(bullshit_factor) as avg_bs_factor
FROM
memory.bullshit.real_bullshit_data
WHERE
bullshit_factor > 7
GROUP BY
company
ORDER BY
employee_count DESC,
avg_bs_factor DESC
LIMIT 10ステップ2: LLMが結果を取得して分析する
COMPANY | EMPLOYEE_COUNT | AVG_BS_FACTOR
----------------------------------------
Unknown Co | 2 | 9.0
BitEdge | 1 | 10.0
CyberWare | 1 | 10.0
BitLink | 1 | 10.0
AlgoMatrix | 1 | 10.0
CryptoHub | 1 | 10.0
BitGrid | 1 | 10.0
MLStream | 1 | 10.0
CloudCube | 1 | 10.0
UltraEdge | 1 | 10.0ステップ3: LLMがマーメイドチャートの視覚化を生成する
%%{init: {'theme': 'forest'}}%%
graph LR
title[Companies with Most Bullshit Jobs]
style title fill:#333,stroke:#333,stroke-width:1px,color:white,font-weight:bold,font-size:18px
Companies --> UnknownCo[Unknown Co]
Companies --> BitEdge[BitEdge]
Companies --> CyberWare[CyberWare]
Companies --> BitLink[BitLink]
Companies --> AlgoMatrix[AlgoMatrix]
Companies --> CryptoHub[CryptoHub]
Companies --> BitGrid[BitGrid]
Companies --> MLStream[MLStream]
Companies --> CloudCube[CloudCube]
Companies --> UltraEdge[UltraEdge]
UnknownCo --- Count2[2 employees]
BitEdge --- Count1a[1 employee]
CyberWare --- Count1b[1 employee]
BitLink --- Count1c[1 employee]
AlgoMatrix --- Count1d[1 employee]
CryptoHub --- Count1e[1 employee]
BitGrid --- Count1f[1 employee]
MLStream --- Count1g[1 employee]
CloudCube --- Count1h[1 employee]
UltraEdge --- Count1i[1 employee]
classDef company fill:#ff5733,stroke:#333,stroke-width:1px,color:white,font-weight:bold;
classDef count fill:#006100,stroke:#333,stroke-width:1px,color:white,font-weight:bold;
class UnknownCo,BitEdge,CyberWare,BitLink,AlgoMatrix,CryptoHub,BitGrid,MLStream,CloudCube,UltraEdge company;
class Count2,Count1a,Count1b,Count1c,Count1d,Count1e,Count1f,Count1g,Count1h,Count1i count;代替棒グラフ:
%%{init: {'theme': 'default'}}%%
pie showData
title Companies with Bullshit Jobs
"Unknown Co (BS: 9.0)" : 2
"BitEdge (BS: 10.0)" : 1
"CyberWare (BS: 10.0)" : 1
"BitLink (BS: 10.0)" : 1
"AlgoMatrix (BS: 10.0)" : 1
"CryptoHub (BS: 10.0)" : 1
"BitGrid (BS: 10.0)" : 1
"MLStream (BS: 10.0)" : 1
"CloudCube (BS: 10.0)" : 1
"UltraEdge (BS: 10.0)" : 1ステップ4:LLMは重要な洞察を提供する
LLM はデータを分析し、洞察を提供できます。
「不明な会社」は、くだらない役職に就いている従業員が最も多く(2人)、他の会社では1人だけである。
ほとんどの企業は完璧な10.0のデタラメ度スコアを達成している
テクノロジーに特化した企業(BitEdge、CyberWareなど)は、特に意味のない役割を作り出しているようだ。
くだらない役割は経営幹部や専門職レベルに集中しているようだ
この例では、LLM が次の機能を実現する方法を示します。
自然言語の質問に基づいて適切なSQLクエリを生成する
Trinoからの結果の処理と解釈
データの視覚的表現を作成する
有意義な洞察と分析を提供する
APIへのアクセス
Trino MCP サーバーには、データにアクセスするための 2 つの API オプションが含まれるようになりました。
1. DockerコンテナAPI(ポート9097)
import requests
import json
# API endpoint (default port 9097 in Docker setup)
api_url = "http://localhost:9097/api/query"
# Define your SQL query
query_data = {
"query": "SELECT * FROM memory.bullshit.real_bullshit_data LIMIT 5",
"catalog": "memory",
"schema": "bullshit"
}
# Send the request
response = requests.post(api_url, json=query_data)
results = response.json()
# Process the results
if results["success"]:
print(f"Query returned {results['results']['row_count']} rows")
for row in results['results']['rows']:
print(row)
else:
print(f"Query failed: {results['message']}")2. スタンドアロン Python API (ポート 8008)
# Same code as above, but with different port
api_url = "http://localhost:8008/query"両方の API は次のエンドポイントを提供します。
GET /api- APIドキュメントと使用例POST /api/query- Trinoに対してSQLクエリを実行する
これらの API により、ラッパー スクリプトの必要性がなくなり、LLM は REST 呼び出しを使用して Trino を直接クエリできるため、Claude、GPT、その他の AI システムなどのサービスとの統合がはるかに簡単になります。
トラブルシューティング
APIが503サービス利用不可を返す
Docker コンテナ API が 503 エラーを返す場合:
コンテナを最新のコードで再構築したことを確認してください。
docker-compose stop trino-mcp docker-compose rm -f trino-mcp docker-compose up -d trino-mcpコンテナのログでエラーを確認します。
docker logs trino_mcp_trino-mcp_1Trino が正常に実行されていることを確認します。
curl -s http://localhost:9095/v1/info | jq
スタンドアロン API とのポート競合
スタンドアロンAPIは、競合を避けるため、デフォルトでポート8008を使用します。「アドレスが既に使用されています」というエラーが表示された場合は、以下の手順に従ってください。
llm_trino_api.pyを編集し、最後の行のポート番号を変更します。uvicorn.run(app, host="127.0.0.1", port=8008)コマンドラインからカスタムポートで実行します。
python -c "import llm_trino_api; import uvicorn; uvicorn.run(llm_trino_api.app, host='127.0.0.1', port=8009)"
今後の仕事
これは現在ベータ版であり、以下の改善が計画されています:
[ ] SSEトランスポートの問題を修正するために、新しいMCPバージョンが利用可能になったら統合する
[ ] Hive、JDBC、その他のコネクタのサポートを追加/検証
[ ] さまざまなタイプと複雑さにわたる、より包括的なクエリ検証を追加する
[ ] より多くのデータ型と高度なTrino機能のサポートを実装
[ ] エラー処理と回復メカニズムの改善
[ ] ユーザー認証と権限制御を追加する
[ ] より包括的な例とドキュメントを作成する
[ ] 管理者監視および管理インターフェースの開発
[ ] パフォーマンスメトリックとクエリ最適化のヒントを追加する
[ ] 長時間実行クエリと結果ストリーミングのサポートを実装する
Stink Labs開発、2025年
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/stinkgen/trino_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
