Skip to main content
Glama
ukonduru91

Spark History Server MCP

by ukonduru91

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

  1. Schnellstart

  2. Anbindung Ihres Spark History Servers

  3. Verbinden Ihres LLM-Clients

  4. Installieren der Skills

  5. Die Tools

  6. So funktioniert es

  7. Bereitstellung

  8. Fehlerbehebung

  9. Entwicklung


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 --build

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 PowerShell

Option 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 start

Prü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=true

b. Eine YAML-Konfigurationsdatei

Der Server sucht in dieser Reihenfolge danach:

  1. den Pfad, der mit --config angegeben wurde, oder $SHS_MCP_CONFIG

  2. ./config.yaml im Arbeitsverzeichnis

  3. ~/.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

servers.<n>.url

SHS_SERVERS__<N>__URL

http://localhost:18080

Basis-URL des History Servers

servers.<n>.default

SHS_SERVERS__<N>__DEFAULT

false

verwenden, wenn kein server angegeben ist

servers.<n>.auth.username

SHS_SERVERS__<N>__AUTH__USERNAME

Basisauthentifizierung

servers.<n>.auth.password

SHS_SERVERS__<N>__AUTH__PASSWORD

Basisauthentifizierung

servers.<n>.auth.token

SHS_SERVERS__<N>__AUTH__TOKEN

Bearer-Token

servers.<n>.verify_ssl

SHS_SERVERS__<N>__VERIFY_SSL

true

TLS-Verifizierung

servers.<n>.ssl_ca_cert

SHS_SERVERS__<N>__SSL_CA_CERT

PEM-Bündel für eine private Zertifizierungsstelle

servers.<n>.timeout

SHS_SERVERS__<N>__TIMEOUT

30

Anfrage-Timeout in Sekunden

servers.<n>.use_proxy

SHS_SERVERS__<N>__USE_PROXY

false

über socks5h://localhost:8157 leiten

servers.<n>.include_plan_description

SHS_SERVERS__<N>__INCLUDE_PLAN_DESCRIPTION

false

Standard für den Plantext von get_sql_execution

mcp.transport

SHS_MCP__TRANSPORT

streamable-http

stdio oder streamable-http

mcp.address

SHS_MCP__ADDRESS

localhost

Bind-Adresse für HTTP

mcp.port

SHS_MCP__PORT

18888

Bind-Port für HTTP

mcp.debug

SHS_MCP__DEBUG

false

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 :8157

3. 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.js

streamable-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 start

Clients 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

spark-rca

fehlgeschlagene, abgebrochene oder hängende Jobs

"warum ist es fehlgeschlagen", ein Stack-Trace, eine Anwendungs-ID, "OOM", "hängt"

spark-optimization

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

list_applications

Anwendungen, filterbar nach Status und Datum, oder eine einzelne anhand der app_id

list_jobs

Jobs für eine Anwendung – standardmäßig zuerst fehlgeschlagene; sort_by duration / failed-tasks / id

list_stages

Stages, gleiche Sortieroptionen, optionale Zusammenfassungsmetriken

list_executors

Executors, standardmäßig aktive, include_inactive für die vollständige Historie

list_sql_executions

kuratierte SQL-Ausführungszusammenfassungen, filterbar nach Beschreibung

Ins Detail gehen

Tool

Liefert

get_stage

eine einzelne Stage mit Metrikverteilungen pro Task auf Ihren Quantilen

list_stage_task_failures

die Ausnahmen und Stack-Traces pro Task – dort, wo die Ursachen liegen

get_sql_execution

eine Abfrage: Header, physischer Plan, Metriken pro Knoten, Jobs, Stages

get_environment

Laufzeitversionen, Spark-/System-/Hadoop-Eigenschaften, Classpath – filterbar nach section

get_executor_summary

aggregierte Executor-Metriken für die Anwendung

get_executor_thread_dump

JVM-Thread-Dump – nur für laufende Anwendungen

Diagnose

Tool

Liefert

get_job_bottlenecks

langsamste Stages und Jobs, Spill, GC-Druck, Auslastung, Empfehlungen

get_resource_usage_timeline

Zusammenfassung der Zeitachse von Executor-Hinzufügen/-Entfernen und Stages

Zwei Läufe vergleichen

Tool

Liefert

compare_job_environments

Konfigurationsunterschied – was sich zwischen zwei Läufen geändert hat

compare_job_performance

Unterschied bei Ressourcen und Dauer

compare_sql_executions

Metrikunterschied für zwei Abfragen, plus optional ein Unterschied der Planstruktur

compare_stages

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.ts und schemas/generated.ts werden generiert – von tools/gen_models.py und tools/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, nicht McpServer, weil die Ergebnisstruktur der von FastMCP entsprechen muss: ein Textblock pro Listenelement und structuredContent nur für die Tools, deren Python-Signatur einen konkreten Rückgabetyp deklariert hat.

  • Anwendungsermittlung (Application Discovery) ermöglicht es den Tools, server wegzulassen. ApplicationDiscovery prü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-mcp

Kubernetes

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

connect ECONNREFUSED

falsche URL oder falscher Port, oder der History Server ist nicht erreichbar. Überprüfen Sie curl $URL/api/v1/applications vom selben Host

Application '<id>' not found on any server

die ID ist auf keinem konfigurierten Server vorhanden, oder das Ereignisprotokoll wurde noch nicht eingelesen — spark.history.fs.update.interval steuert den Scan

No Spark server named 'x' is configured

das Argument server stimmt mit keinem Schlüssel unter servers: überein

404 … No tasks reported metrics for N / 0 yet

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

get_executor_thread_dump-Fehler bei einer beendeten App

Erwartetes Verhalten: Der History Server persistiert keine Thread-Dumps. Sie funktionieren nur, solange die App läuft

Leeres list_applications

prüfen Sie, dass spark.history.fs.logDirectory dorthin zeigt, wo Ihre Jobs tatsächlich Ereignisprotokolle schreiben, und dass spark.eventLog.enabled=true bei den Jobs gesetzt ist

Sehr große Antworten

grenzen Sie sie mit length, limit und section ein. get_stage(with_summaries=false) ist deutlich kleiner

emr_cluster_arn … not included in this TypeScript port

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 --noEmit

Die 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

api/emr_persistent_ui_client.py

nicht portiert — ein Server, der mit emr_cluster_arn konfiguriert ist, schlägt sofort mit einer erklärenden Fehlermeldung fehl

tools/aws_troubleshooting.py

nicht portiert — fungiert als Proxy zu einem AWS-gehosteten MCP-Endpunkt und wird nur registriert, wenn AWS-Anmeldedaten vorhanden sind

api/spark_html_client.py

nicht portiert — ein Playwright-Screenshot-Helfer ohne Tool-Aufrufe


Lizenz

Apache-2.0, wie auch beim Upstream-Projekt.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Exposes 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.
  • A
    license
    Not graded
    quality
    A
    maintenance
    Exposes Spark History Server data as tools for AI agents, enabling natural language querying of Spark applications, jobs, stages, and performance metrics.
    189
    Apache 2.0

View all related MCP servers

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

View all MCP Connectors

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/ukonduru91/spark-history-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server