Spark History Server MCP
Spark History Server MCP (TypeScript)
LLM に Spark History Server への読み取りアクセスを提供し、Spark 作業の退屈な部分(ジョブが失敗した理由の特定、遅いジョブが時間を費やしている場所の特定)を任せられるようにします。
これは kubeflow/mcp-apache-spark-history-server の TypeScript 移植版であり、Python オリジナルとレスポンス単位で検証されています(PARITY.md を参照)。移植に加えて、根本原因分析とパフォーマンスチューニングのためのエキスパートワークフローに生のツールを変える エージェントスキル を2つ同梱しています。
┌──────────────────┐
data engineer ──▶ │ LLM client │ Claude Code / Claude Desktop / any MCP client
│ + skills │ ← skills/ supply the method
└────────┬─────────┘
│ MCP (stdio or streamable-http)
┌────────▼─────────┐
│ this server │ 17 tools, 2 prompts
└────────┬─────────┘
│ HTTP GET /api/v1/...
┌────────▼─────────┐
│ Spark History │ your existing one, or the bundled demo
│ Server │
└────────┬─────────┘
│ reads
┌────────▼─────────┐
│ event logs │ s3://…, hdfs://…, file://…
└──────────────────┘このサーバーは History Server の REST API に対して GET リクエストのみを発行します。何も変更することはできません。
目次
Related MCP server: Spark History MCP Server
1. クイックスタート
オプション A — Docker(Docker 以外のインストールは不要)
サンプルのイベントログとこの MCP を読み込んだ Spark History Server を起動します:
git clone https://github.com/ukonduru91/spark-history-mcp.git
cd spark-history-mcp
docker compose up --buildSpark History Server UI | |
Spark History REST API | |
MCP エンドポイント |
同梱のログには、正常なパイプラインと意図的に失敗させたジョブが含まれているため、独自のクラスターを指定する前に、ツールが実際に何かを表示できます。
History Server のみを実行する場合:
./start_local_spark_history.sh # macOS / Linux / Git Bash
.\start_local_spark_history.ps1 # Windows PowerShellオプション B — ソースから
Node.js 20+ が必要です(22 推奨)。
git clone https://github.com/ukonduru91/spark-history-mcp.git
cd spark-history-mcp
npm install
npm run build
npm start動作確認
node scripts/mcp-cli.mjs list-tools
node scripts/mcp-cli.mjs call list_applications '{"limit": 5}'アプリケーションが返ってくれば、接続されています。
2. Spark History Server を指定する
これが唯一設定が必要な項目です。 優先度の高い順に3つの方法があります。環境変数は .env ファイルより優先され、.env ファイルは YAML より優先されます。
a. 環境変数(コンテナと CI に最適)
ネストには 二重 アンダースコアを使用します。以下の LOCAL はサーバーに付ける任意の名前です:
export SHS_SERVERS__LOCAL__URL=http://spark-history.internal:18080
export SHS_SERVERS__LOCAL__DEFAULT=trueb. YAML 設定ファイル
サーバーは次の順序でファイルを探します:
--configまたは$SHS_MCP_CONFIGで指定されたパス作業ディレクトリの
./config.yaml~/.config/spark-mcp/config.yaml
servers:
prod:
url: "https://spark-history.company.com:18080"
default: true # used when a tool call omits `server`
verify_ssl: true
ssl_ca_cert: "/etc/ssl/custom-ca/ca-bundle.pem" # private CA
timeout: 30 # seconds
auth:
username: admin
password: ${SPARK_PASSWORD} # see the note below
# token: <bearer token> # or a bearer token instead
staging:
url: "https://spark-history-staging.company.com:18080"シークレットについて: YAML の値はリテラルです —
${SPARK_PASSWORD}は 展開されません。認証情報は環境変数(SHS_SERVERS__PROD__AUTH__PASSWORD)に保持してください。これらはファイルより優先されます。これはアップストリームプロジェクトの動作と一致します。
c. .env ファイル
(a) と同じ変数名で、作業ディレクトリの .env から読み取ります。
複数サーバー
必要な数だけ設定できます。ツールはオプションの server 引数を受け取ります。省略された場合、サーバーはそのアプリケーションを持つ設定済み History Server を 自動検出 し、それを使用します(5分間キャッシュされます)。したがって、エンジニアはどのクラスターで実行されたかを知らなくても、アプリケーション ID について質問できます。
すべての設定
設定 | 環境変数 | デフォルト | 意味 |
|
|
| History Server のベース URL |
|
|
|
|
|
| — | 基本認証 |
|
| — | 基本認証 |
|
| — | ベアラートークン |
|
|
| TLS 検証 |
|
| — | プライベート CA 用の PEM バンドル |
|
|
| リクエストタイムアウト(秒) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| HTTP のバインドアドレス |
|
|
| HTTP のバインドポート |
|
|
| 詳細ログ |
単一アンダースコアの変数(SHS_MCP_PORT)も引き続き機能しますが、アップストリームと同様に非推奨の警告がログに記録されます。
ルーティングできない History Server に到達する
SSH トンネルと use_proxy: true を組み合わせることで、一般的なロックダウンされたクラスターのケースをカバーできます:
ssh -D 8157 -N user@bastion # SOCKS5 proxy on :81573. LLM クライアントを接続する
stdio(Claude Code、Claude Desktop、ほとんどのクライアント)
{
"mcpServers": {
"spark-history": {
"command": "node",
"args": ["/absolute/path/to/spark-history-mcp/dist/index.js"],
"env": {
"SHS_MCP__TRANSPORT": "stdio",
"SHS_SERVERS__PROD__URL": "https://spark-history.company.com:18080",
"SHS_SERVERS__PROD__DEFAULT": "true"
}
}
}
}Claude Code ユーザーは同じことを1行で行えます:
claude mcp add spark-history \
--env SHS_MCP__TRANSPORT=stdio \
--env SHS_SERVERS__PROD__URL=https://spark-history.company.com:18080 \
--env SHS_SERVERS__PROD__DEFAULT=true \
-- node /absolute/path/to/spark-history-mcp/dist/index.jsstreamable-http(チームで共有する1つのサーバー)
一度実行して、全員をそこに向けます:
SHS_MCP__TRANSPORT=streamable-http SHS_MCP__ADDRESS=0.0.0.0 npm startクライアントは http://<host>:18888/mcp に接続します。サーバーは読み取り専用ですが、認証もありません。通常の内部イングレスの背後に配置し、ブラウザから到達可能な場合は DNS リバインディング保護を有効にしてください:
mcp:
transport_security:
enable_dns_rebinding_protection: true
allowed_hosts: ["spark-mcp.internal:*"]
allowed_origins: ["https://spark-mcp.internal"]4. スキルのインストール
ツールはモデルにデータへのアクセスを提供します。スキルは方法論を提供します — 証拠を収集する順序、ノイズから発見を分離するしきい値、そしてデータで確認していない原因を挙げてはならないというルールです。
# per project
mkdir -p .claude/skills
cp -r skills/spark-rca skills/spark-optimization .claude/skills/
# or for every project
mkdir -p ~/.claude/skills
cp -r skills/spark-rca skills/spark-optimization ~/.claude/skills/スキル | 対象 | トリガー |
| 失敗、強制終了、またはハングしたジョブ | 「なぜ失敗したのか」、スタックトレース、アプリ ID、「OOM」、「スタック」 |
| 遅い、高コスト、または劣化したジョブ | 「なぜ遅いのか」、「チューニング」、「以前は20分かかった」、「コスト削減」 |
通常の質問から自動的にトリガーされるため、コマンドを覚える必要はありません:
「午前2時のロードがまた失敗しました、app_1724… — 見てもらえますか?」
各スキルの内容と、チーム独自の知識で拡張する方法については、skills/README.md を参照してください。
5. ツール
17個すべてが src/tools/tools.ts にあります。JSON スキーマは src/schemas/generated.ts にあります。node scripts/mcp-cli.mjs list-tools を実行すると、引数とともに確認できます。
検索
ツール | 戻り値 |
| アプリケーション。ステータスと日付でフィルタリング可能、または |
| アプリケーションのジョブ。デフォルトでは失敗が先頭。 |
| ステージ。同じ並べ替えオプション、オプションのサマリーメトリクス |
| エグゼキューター。デフォルトはアクティブ、 |
| 厳選された SQL 実行サマリー。説明でフィルタリング可能 |
詳細調査
ツール | 戻り値 |
| 1つのステージ。指定した分位数でのタスクごとのメトリクス分布 |
| タスクごとの例外とスタックトレース — 根本原因が存在する場所 |
| 1つのクエリ: ヘッダー、物理プラン、ノードごとのメトリクス、ジョブ、ステージ |
| ランタイムバージョン、Spark/システム/Hadoop プロパティ、クラスパス — |
| アプリケーションの集計エグゼキューター メトリクス |
| JVM スレッドダンプ — 実行中アプリケーションのみ |
診断
ツール | 戻り値 |
| 最も遅いステージとジョブ、スピル、GC プレッシャー、利用率、推奨事項 |
| エグゼキューターの追加/削除とステージのタイムラインサマリー |
2つの実行の比較
ツール | 戻り値 |
| 設定の差分 — 2つの実行間で何が変わったか |
| リソースと期間の差分 |
| 2つのクエリのメトリクス差分、オプションのプラン構造差分 |
| ステージのメトリクスとタスク分位数を並べて表示 |
プロンプト
investigate_failure(app_id, server?) と compare_applications(app_a, app_b, server?, context?) — アップストリームプロジェクトからの対話型ウォークスルー。エンジニアが分析を任せる代わりに自分で操作したい場合に使用します。
6. 仕組み
ツール呼び出しは /api/v1/... に対する1つ以上の GET になり、JSON は Python オリジナルが整形したのとまったく同じ形で返されます。
src/
index.ts CLI entry, transport selection (stdio | streamable-http)
config/config.ts YAML + .env + SHS_* resolution and precedence
core/
app.ts MCP request handlers; maps results to content blocks
validation.ts pydantic-compatible argument validation and messages
json.ts Python-compatible JSON rendering
pyfloat.ts int/float fidelity across the JSON round-trip
pyrepr.ts Python repr() for validation messages
errors.ts error text shaping
api/
httpClient.ts HTTP transport, ApiException taxonomy, auth, TLS, SOCKS
sparkClient.ts Spark REST facade: pagination, attempts, status filters
models/
generated.ts model shapes, generated from the upstream OpenAPI models
deserialize.ts from_dict / model_dump equivalents
mcpTypes.ts curated LLM-facing output models
tools/tools.ts the 17 tools
prompts/prompts.ts the 2 prompts
schemas/generated.ts tool + prompt catalogue (names, descriptions, schemas)変更を計画している場合に知っておく価値のある3つの詳細:
models/generated.tsとschemas/generated.tsは生成されます。tools/gen_models.pyとtools/gen_schemas.pyによって、アップストリームの Python プロジェクトから生成されます。手動編集ではなく再生成してください — これにより、カタログとレスポンスの形状がオリジナルと同一に保たれます。低レベルの
ServerAPI が使用され、McpServerは使用されません。結果の形状が FastMCP のものと一致する必要があるためです: リスト要素ごとに1つのテキストブロック、structuredContentは Python シグネチャが具体的な戻り値の型を宣言したツールのみ。アプリケーションの自動検出により、ツールは
serverを省略できます。ApplicationDiscoveryは各設定済みサーバーをプローブしてアプリケーション ID を探し、回答を5分間キャッシュします。
7. デプロイ
Docker
docker build -t spark-history-mcp .
docker run -p 18888:18888 \
-e SHS_SERVERS__PROD__URL=https://spark-history.company.com:18080 \
-e SHS_SERVERS__PROD__DEFAULT=true \
-e SHS_MCP__ADDRESS=0.0.0.0 \
spark-history-mcpKubernetes
通常のDeploymentとして、URLをenvに、認証情報をSecretから指定して実行します:
env:
- name: SHS_MCP__TRANSPORT
value: streamable-http
- name: SHS_MCP__ADDRESS
value: "0.0.0.0"
- name: SHS_SERVERS__PROD__URL
value: http://spark-history-server.spark.svc.cluster.local:18080
- name: SHS_SERVERS__PROD__DEFAULT
value: "true"
- name: SHS_SERVERS__PROD__AUTH__TOKEN
valueFrom:
secretKeyRef: { name: spark-history-auth, key: token }このプロセスは5分間のディスカバリーキャッシュ以外はステートレスなので、調整なしで水平スケールできます。
8. トラブルシューティング
症状 | 原因と対処 |
| URLまたはポートが間違っているか、History Serverが停止しています。同じホストから |
| そのIDが設定済みのサーバーにないか、イベントログがまだ取得されていません — |
|
|
| タスクが完了する前に失敗したステージに対するSpark自身の応答です。ツールの問題ではありません — 代わりにタスクの例外を確認してください |
| 想定どおりです:History Serverはスレッドダンプを保持しません。アプリの実行中のみ機能します |
Empty |
|
Very large responses |
|
| EMR persistent-UI認証は移植されていません。代わりに直接到達可能なURLを指定してください |
詳細ログには SHS_MCP__DEBUG=true を設定してください。
9. 開発
npm install
npm run build # compile to dist/
npm run dev # run from source, no build step
npm test # unit tests
npm run typecheck # tsc --noEmit実装間のパリティテストは parity/ にあります — このサーバーとPython版オリジナルに対して同じMCP呼び出しを実行し、すべてのレスポンスを差分比較します。PARITY.md に結果と残っている正確な差分が記録されています。
アップストリームから移植されていないもの
アップストリームモジュール | ステータス |
| 移植されていません — |
| 移植されていません — AWSホストのMCPエンドポイントへのプロキシで、AWS認証情報がある場合のみ登録されます |
| 移植されていません — ツール呼び出しのないPlaywrightスクリーンショットヘルパー |
ライセンス
アップストリームプロジェクトと同様にApache-2.0です。
This server cannot be deployed
Maintenance
Related MCP Connectors
Your Databricks Lakehouse in natural language: run SQL on your SQL warehouses, track long-running qu
LLM Observability & Orchestration Agent
Code intelligence for LLMs. Analyze, search, and retrieve code from any public git repository.
LLM Observability & Orchestration Agent (Langchain)
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive analysis of Apache Spark event logs from S3, HTTP, or local sources, providing performance metrics, resource monitoring, shuffle analysis, and automated optimization recommendations with interactive HTML reports.MIT
- FlicenseNot gradedqualityNot gradedmaintenanceExposes Spark History Server metrics and metadata as tools for LLM-based analysis of Spark applications. It enables deep optimization of Spark jobs by providing access to job summaries, stage details, SQL execution plans, and executor performance.-
- AlicenseNot gradedqualityAmaintenanceExposes Spark History Server data as tools for AI agents, enabling natural language querying of Spark applications, jobs, stages, and performance metrics.142 PyPI203Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to query Hadoop MapReduce job history, including job listing, details, counters, configuration, and logs via the JobHistory REST API.1-