Spark History Server MCP
Spark History Server MCP (TypeScript)
Gewähren Sie einem LLM Lesezugriff auf Ihren Spark History Server, damit es den mühsamen Teil der Spark-Arbeit übernehmen kann: herauszufinden, warum ein Job fehlgeschlagen ist, und herauszufinden, wo ein langsamer Job seine Zeit verbringt.
Es ist ein TypeScript-Port von kubeflow/mcp-apache-spark-history-server, Antwort für Antwort gegen das Python-Original verifiziert – siehe PARITY.md. Zusätzlich zum Port enthält es zwei Agent-Skills, die die rohen Tools in einen Experten-Workflow für Ursachenanalyse und Leistungsoptimierung verwandeln.
┌──────────────────┐
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://…
└──────────────────┘Der Server sendet ausschließlich GET-Anfragen an die REST-API des History Servers. Er kann nichts verändern.
Inhalt
Related MCP server: Spark EventLog MCP Server
1. Schnellstart
Option A — Docker (nichts zu installieren außer Docker)
Startet einen Spark History Server, der mit Beispiel-Event-Logs und diesem MCP geladen ist:
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-Endpunkt |
Die enthaltenen Logs umfassen eine fehlerfrei laufende Pipeline und einen absichtlich fehlgeschlagenen Job, sodass die Tools etwas Reales zu zeigen haben, bevor Sie sie auf Ihren eigenen Cluster ausrichten.
Um nur den History Server auszuführen:
./start_local_spark_history.sh # macOS / Linux / Git Bash
.\start_local_spark_history.ps1 # Windows PowerShellOption B — aus dem Quellcode
Erfordert Node.js 20+ (22 empfohlen).
git clone https://github.com/ukonduru91/spark-history-mcp.git
cd spark-history-mcp
npm install
npm run build
npm startPrüfen, ob es funktioniert
node scripts/mcp-cli.mjs list-tools
node scripts/mcp-cli.mjs call list_applications '{"limit": 5}'Wenn Anwendungen zurückkommen, sind Sie verbunden.
2. Anbindung Ihres Spark History Servers
Das ist die eine Sache, die Sie konfigurieren müssen. Drei Möglichkeiten, zuerst die mit höchster Priorität – Umgebungsvariablen haben Vorrang vor der .env-Datei, die wiederum Vorrang vor YAML hat.
a. Umgebungsvariablen (am besten für Container und CI)
Verschachtelung verwendet einen doppelten Unterstrich. LOCAL unten ist nur ein Name, den Sie für den Server wählen:
export SHS_SERVERS__LOCAL__URL=http://spark-history.internal:18080
export SHS_SERVERS__LOCAL__DEFAULT=trueb. Eine YAML-Konfigurationsdatei
Der Server sucht in dieser Reihenfolge danach:
den Pfad, der mit
--configangegeben wurde, oder$SHS_MCP_CONFIG./config.yamlim Arbeitsverzeichnis~/.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"Hinweis zu Geheimnissen: Werte in YAML sind wörtlich zu verstehen –
${SPARK_PASSWORD}wird nicht expandiert. Bewahren Sie Anmeldedaten in Umgebungsvariablen auf (SHS_SERVERS__PROD__AUTH__PASSWORD), die die Datei überschreiben. Dies entspricht dem Verhalten des Upstream-Projekts.
c. Eine .env-Datei
Dieselben Variablennamen wie unter (a), gelesen aus .env im Arbeitsverzeichnis.
Mehrere Server
Konfigurieren Sie so viele, wie Sie möchten. Die Tools akzeptieren ein optionales server-Argument; wenn es weggelassen wird, ermittelt der Server, welcher konfigurierte History Server diese Anwendung besitzt, und verwendet ihn (5 Minuten lang zwischengespeichert). Man kann daher nach einer Anwendungs-ID fragen, ohne zu wissen, welcher Cluster sie ausgeführt hat.
Alle Einstellungen
Einstellung | Umgebungsvariable | Standard | Bedeutung |
|
|
| Basis-URL des History Servers |
|
|
| verwenden, wenn kein |
|
| — | Basisauthentifizierung |
|
| — | Basisauthentifizierung |
|
| — | Bearer-Token |
|
|
| TLS-Verifizierung |
|
| — | PEM-Bündel für eine private Zertifizierungsstelle |
|
|
| Anfrage-Timeout in Sekunden |
|
|
| über |
|
|
| Standard für den Plantext von |
|
|
|
|
|
|
| Bind-Adresse für HTTP |
|
|
| Bind-Port für HTTP |
|
|
| ausführliche Protokollierung |
Variablen mit einfachem Unterstrich (SHS_MCP_PORT) funktionieren weiterhin, erzeugen aber eine Deprecation-Warnung, genau wie upstream.
Erreichen eines History Servers ohne direkte Netzwerkroute
Ein SSH-Tunnel zusammen mit use_proxy: true deckt den häufigen Fall eines abgeschotteten Clusters ab:
ssh -D 8157 -N user@bastion # SOCKS5 proxy on :81573. Verbinden Ihres LLM-Clients
stdio (Claude Code, Claude Desktop, die meisten Clients)
{
"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"
}
}
}
}Nutzer von Claude Code können dasselbe in einer Zeile tun:
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 (ein gemeinsamer Server für ein Team)
Führen Sie ihn einmal aus und verweisen Sie alle darauf:
SHS_MCP__TRANSPORT=streamable-http SHS_MCP__ADDRESS=0.0.0.0 npm startClients verbinden sich mit http://<host>:18888/mcp. Der Server ist schreibgeschützt, aber auch unauthentifiziert – setzen Sie ihn hinter Ihren üblichen internen Ingress und aktivieren Sie den DNS-Rebinding-Schutz, wenn er aus einem Browser erreichbar ist:
mcp:
transport_security:
enable_dns_rebinding_protection: true
allowed_hosts: ["spark-mcp.internal:*"]
allowed_origins: ["https://spark-mcp.internal"]4. Installieren der Skills
Die Tools geben dem Modell Zugriff auf die Daten. Die Skills geben ihm die Methode – die Reihenfolge, in der es Beweise sammelt, die Schwellenwerte, die einen Befund von Rauschen trennen, und die Regel, dass es keine Ursache nennen darf, die es nicht in den Daten gesehen hat.
# 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/Skill | Zuständig für | Auslöser |
| fehlgeschlagene, abgebrochene oder hängende Jobs | "warum ist es fehlgeschlagen", ein Stack-Trace, eine Anwendungs-ID, "OOM", "hängt" |
| langsame, teure oder in der Leistung abfallende Jobs | "warum ist das langsam", "optimieren", "es dauerte früher 20 Minuten", "Kosten senken" |
Sie werden von selbst durch eine normale Frage ausgelöst – niemand muss sich einen Befehl merken:
"die 2-Uhr-Ladung ist schon wieder fehlgeschlagen, app_1724… – kannst du mal schauen?"
In skills/README.md erfahren Sie, was in jedem Skill steckt und wie Sie sie mit dem Wissen Ihres Teams erweitern können.
5. Die Tools
Alle 17 Tools befinden sich in src/tools/tools.ts; ihre JSON-Schemas liegen in src/schemas/generated.ts. Führen Sie node scripts/mcp-cli.mjs list-tools aus, um sie mit ihren Argumenten zu sehen.
Dinge finden
Tool | Liefert |
| Anwendungen, filterbar nach Status und Datum, oder eine einzelne anhand der |
| Jobs für eine Anwendung – standardmäßig zuerst fehlgeschlagene; |
| Stages, gleiche Sortieroptionen, optionale Zusammenfassungsmetriken |
| Executors, standardmäßig aktive, |
| kuratierte SQL-Ausführungszusammenfassungen, filterbar nach Beschreibung |
Ins Detail gehen
Tool | Liefert |
| eine einzelne Stage mit Metrikverteilungen pro Task auf Ihren Quantilen |
| die Ausnahmen und Stack-Traces pro Task – dort, wo die Ursachen liegen |
| eine Abfrage: Header, physischer Plan, Metriken pro Knoten, Jobs, Stages |
| Laufzeitversionen, Spark-/System-/Hadoop-Eigenschaften, Classpath – filterbar nach |
| aggregierte Executor-Metriken für die Anwendung |
| JVM-Thread-Dump – nur für laufende Anwendungen |
Diagnose
Tool | Liefert |
| langsamste Stages und Jobs, Spill, GC-Druck, Auslastung, Empfehlungen |
| Zusammenfassung der Zeitachse von Executor-Hinzufügen/-Entfernen und Stages |
Zwei Läufe vergleichen
Tool | Liefert |
| Konfigurationsunterschied – was sich zwischen zwei Läufen geändert hat |
| Unterschied bei Ressourcen und Dauer |
| Metrikunterschied für zwei Abfragen, plus optional ein Unterschied der Planstruktur |
| Stage-Metriken und Task-Quantile nebeneinander |
Prompts
investigate_failure(app_id, server?) und compare_applications(app_a, app_b, server?, context?) – interaktive Schritt-für-Schritt-Anleitungen aus dem Upstream-Projekt, für den Fall, dass der Entwickler die Steuerung übernehmen möchte, statt die Analyse abzugeben.
6. So funktioniert es
Ein Tool-Aufruf wird zu einer oder mehreren GET-Anfragen an /api/v1/..., und das JSON kommt exakt in der Form zurück, in der es das Python-Original erzeugt hat.
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)Drei Details, die Sie kennen sollten, wenn Sie es ändern möchten:
models/generated.tsundschemas/generated.tswerden generiert – vontools/gen_models.pyundtools/gen_schemas.py– aus dem Upstream-Python-Projekt. Generieren Sie neu, statt von Hand zu editieren – genau das hält den Katalog und die Antwortstrukturen identisch zum Original.Es wird die Low-Level-
Server-API verwendet, nichtMcpServer, weil die Ergebnisstruktur der von FastMCP entsprechen muss: ein Textblock pro Listenelement undstructuredContentnur für die Tools, deren Python-Signatur einen konkreten Rückgabetyp deklariert hat.Anwendungsermittlung (Application Discovery) ermöglicht es den Tools,
serverwegzulassen.ApplicationDiscoveryprüft jeden konfigurierten Server auf die Anwendungs-ID und speichert die Antwort 5 Minuten lang zwischen.
7. Bereitstellung
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
Betreiben Sie es als normales Deployment mit der URL als Umgebungsvariable und Anmeldedaten aus einem 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 }Bis auf den 5-minütigen Discovery-Cache ist der Prozess zustandslos, sodass er ohne Koordination horizontal skaliert.
8. Fehlerbehebung
Symptom | Ursache und Behebung |
| falsche URL oder falscher Port, oder der History Server ist nicht erreichbar. Überprüfen Sie |
| die ID ist auf keinem konfigurierten Server vorhanden, oder das Ereignisprotokoll wurde noch nicht eingelesen — |
| das Argument |
| Sparks eigene Antwort für eine Stage, die fehlgeschlagen ist, bevor irgendein Task beendet wurde. Kein Problem des Tools — lesen Sie stattdessen die Task-Ausnahmen |
| Erwartetes Verhalten: Der History Server persistiert keine Thread-Dumps. Sie funktionieren nur, solange die App läuft |
Leeres | prüfen Sie, dass |
Sehr große Antworten | grenzen Sie sie mit |
| die EMR-Persistent-UI-Authentifizierung ist nicht portiert; verweisen Sie stattdessen auf eine direkt erreichbare URL |
Für ausführliche Logs setzen Sie SHS_MCP__DEBUG=true.
9. Entwicklung
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 --noEmitDie Paritätstests über Implementierungen hinweg befinden sich in
parity/ — sie führen dieselben MCP-Aufrufe gegen diesen Server und
das Python-Original aus und erstellen für jede Antwort einen Diff.
PARITY.md dokumentiert die Ergebnisse und die genauen
verbleibenden Unterschiede.
Nicht aus dem Upstream portiert
Upstream-Modul | Status |
| nicht portiert — ein Server, der mit |
| nicht portiert — fungiert als Proxy zu einem AWS-gehosteten MCP-Endpunkt und wird nur registriert, wenn AWS-Anmeldedaten vorhanden sind |
| nicht portiert — ein Playwright-Screenshot-Helfer ohne Tool-Aufrufe |
Lizenz
Apache-2.0, wie auch beim Upstream-Projekt.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Delta Lake tables stored in MinIO through Spark using natural language queries. Provides read-oriented data operations on Delta Lake tables through the Model Context Protocol.
- 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.189Apache 2.0
Related MCP Connectors
The grounded data layer for any LLM: governed SQL, metrics, lineage and catalog over your data.
Enable language models to perform advanced AI-powered web scraping with enterprise-grade reliabili…
LLM chat, text summarization and AI image generation
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/ukonduru91/spark-history-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server