PySpark MCP

io.github.AnnasMazhar由 GitHub 帳號 AnnasMazhar 發布v0.1.0更新於 Oct 24, 2026

SQL migration, AWS Glue job generation, and PySpark optimization as an MCP server.

概覽

AI 產生的概覽

本機 MCP 伺服器,把 SQL 轉成 PySpark 與 AWS Glue 原始碼文字,並審查既有 PySpark 程式碼,不執行 Spark。

可以做什麼
  • 在 PostgreSQL、Oracle、Redshift、MySQL、Snowflake 與 Spark SQL 之間轉換 SQL,並產生 PySpark DataFrame API 原始碼文字
  • 產生 AWS Glue 作業範本字串、DynamicFrame 轉換與 Data Catalog 定義
  • 批次走訪 SQL 檔案或目錄並輸出轉換後的模組
  • 審查 PySpark 原始碼中的反模式、重複片段並提供最佳化建議
  • 注意:它不會啟動 SparkSession、提交 Glue 作業或執行 SQL,最佳化僅回傳建議
適用情境
適合在把 SQL 工作負載遷移到 Spark 或 Glue 時,讓助理草擬轉換程式碼、Glue 樣板程式碼與審查意見。若需要即時 Spark 工作階段內省、查詢執行或直接用 sqlglot 轉譯,則不必安裝。
執行需求
以 PyPI 套件 pyspark-tools 透過 stdio 在本機執行(uvx pyspark-tools 或 pip install pyspark-tools),需要 Python 3.11+。未宣告驗證、環境變數或標頭。選用附加套件提供 boto3 的 S3/Glue 輔助與 pyspark(僅用於產生程式碼)。
安裝前請注意
它能讀取本機檔案(SQL、TXT、PDF),安裝 aws 附加套件後還會用主機預設 AWS 憑證列出並讀取 S3;路徑限制並非沙箱。請在受限帳號下執行,避開機密目錄,除非確實需要 S3 讀取,否則不要掛載具寫入權限的 AWS 憑證。批次模式會寫出檔案。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 PySpark MCP,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

PySpark MCP Server

SQL migration assistance, AWS Glue job template generation, and Spark code optimization — as an MCP server.

Not the live-Spark pyspark-mcp package. This project is SQL → PySpark / Glue source generation, published as pyspark-tools. SemyonSinchenko/pyspark-mcp introspects a running SparkSession. A deprecated pyspark-mcp console script remains here so old configs keep working; it prints a warning, then starts this server.

[CI Pipeline] [Python 3.11+] [License: MIT]

What It Does

  • SQL Dialect Transpilation — Convert between PostgreSQL, Oracle, Redshift, MySQL, Snowflake, and Spark SQL using SQLGlot
  • PySpark DataFrame API Generation — Generate DataFrame API source text from SQL, with optimization hints
  • AWS Glue templates — Job script strings, DynamicFrame conversions, Data Catalog definitions, S3 layout advice
  • Batch Processing — Walk SQL files/directories and emit converted modules
  • Code Review & Optimization — Pattern-based review of existing PySpark source
  • Pattern Detection — Find duplicated snippets and suggest utilities

What It Doesn't Do

  • Recursive CTEs → provides Spark SQL equivalent + guidance (PySpark has no native recursive CTE support)
  • MERGE/PIVOT/CONNECT BY → transpiles to Spark SQL, provides DataFrame API guidance
  • Perfect 1:1 DataFrame API transpilation for all SQL — complex queries get Spark SQL + recommendations
  • It does not start a SparkSession, submit Glue jobs, or execute SQL
  • optimize(mode="code") returns suggestions; it does not rewrite your code
  • glue_s3 is a path heuristic (no AWS call, no measured speedups)
  • It does not replace SemyonSinchenko/pyspark-mcp for live catalog/plans

Why this vs calling sqlglot yourself

SQLGlot already transpiles dialects. This MCP adds three things around that kernel: DataFrame-API pretty-printing with join/window/cast mappings that the conversion tests lock, Glue job boilerplate strings (bookmarks, DynamicFrames, catalog tables) so an agent can emit a file instead of assembling one, and a 14-tool FastMCP surface so an LLM picks convert / mode=sql instead of wiring sqlglot itself. If you only need sqlglot.transpile(...), use sqlglot.

Quick Start

bash
pip install pyspark-toolspyspark-tools

Zero-clone alternative: uvx pyspark-tools. run_server.py is a development convenience that inserts sys.path and prints startup banners. Prefer pyspark-tools in configs and production.

Try it

bash
pip install pyspark-toolspython -c "from pathlib import Path; from pyspark_tools.sql_converter import SQLToPySparkConverter as C; from pyspark_tools.consolidated_tools import glue_job; c,s,o=C(),Path('examples'),Path('examples/out'); [(o/f'{n}.py').write_text(c.convert_sql_to_pyspark((s/f'{n}.sql').read_text(), dialect=d).pyspark_code) for n,d in [('postgres_orders','postgres'),('oracle_decode','oracle')]]; (o/'orders_etl_glue.py').write_text(glue_job(mode='template', job_name='orders_etl', sql_query=(s/'postgres_orders.sql').read_text())['template'])"

Writes the same files as examples/out/. MCP stdio CLI: pyspark-tools.

Example: SQL → PySpark

sql
SELECT o.customer_id, c.name, SUM(o.amount) AS totalFROM orders oJOIN customers c ON o.customer_id = c.idWHERE o.status = 'paid'GROUP BY o.customer_id, c.name

Call convert with mode=sql. Captured converter output (dialect=spark):

python
from pyspark.sql import SparkSessionfrom pyspark.sql.functions import (    col, lit, when, count, sum as spark_sum, avg, min, max, countDistinct,    coalesce, concat, datediff, date_add, to_date,    row_number, rank, lag, lead,)from pyspark.sql.window import Window
# Generated from SPARK SQLspark = SparkSession.builder.appName('SQLToPySpark').getOrCreate()
# Load table: customerscustomers_df = spark.table('customers')# Load table: ordersorders_df = spark.table('orders')
# Main queryresult_df = (orders_df.alias('o')    .join(customers_df.alias('c'), (col('o.customer_id') == col('c.id')), 'inner')    .filter((col('o.status') == lit('paid')))    .groupBy(col('o.customer_id'), col('c.name'))    .select(col('o.customer_id'), col('c.name'), (spark_sum(col('o.amount'))).alias('total')))

Exact output depends on dialect detection and fallbacks; conversion tests in tests/test_sql_conversion_fixes.py pin the important constructs. Notebook-style import * / show() is opt-in via style="notebook" on the converter.

MCP Configuration

Claude Desktop

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Linux: ~/.config/Claude/claude_desktop_config.json

json
{  "mcpServers": {    "pyspark": {      "command": "pyspark-tools",      "args": []    }  }}

Hermes Agent

Add to ~/.hermes/config.yaml:

yaml
mcp:  servers:    pyspark:      command: pyspark-tools      enabled_tools: all

Docker

The image is stdio only (FastMCP over stdin/stdout). There is no HTTP server on port 8000. docker compose up is for local tests, not a health-checkable web service.

bash
docker compose --profile test run --rm pyspark-tools-test

Tools

Three primary tools. The other eleven routers stay registered this minor version but are deprecated — prefer convert, glue_job, and review.

convert — SQL → PySpark (including mode=batch_dir)

python
convert(mode="sql", sql_query="SELECT id FROM users", dialect="postgres")convert(mode="batch_dir", directory_path="etl/", output_dir="out")

glue_job — Glue 5.0 job template strings

python
glue_job(mode="template", job_name="orders_etl", sql_query="SELECT * FROM orders")

review — code review, patterns, duplicates

python
review(mode="code", code="df = spark.table('t')\ndf.collect()")

Legacy / deprecated: analyze, optimize, glue_schema, glue_s3, glue_data, refactor, search, context, batch_status, s3_source, analytics. Still callable; do not advertise to new agents.

Security

This MCP can read local files (SQL, TXT, PDF) and, if the [aws] extra is installed, list/read S3 with the host's default AWS credentials. File tools only allow paths under the process working directory (or an explicit base_path / FileHandler(base_directory=...)). That is not a sandbox.

Run the server under a restricted OS account. Do not point it at secrets directories. Do not attach AWS credentials with write access unless you intend S3 reads via s3_source / glue_s3. Optional extras:

bash
pip install "pyspark-tools[aws]"    # boto3 for S3/Glue catalog helperspip install "pyspark-tools[spark]"  # pyspark — not required at runtime; generated code only

Development

bash
python -m venv .venvsource .venv/bin/activatepip install -e ".[dev]"
# Testpytest tests/ -v --cov=pyspark_tools
# Formatblack pyspark_tools testsisort pyspark_tools tests
# Lintflake8 pyspark_tools tests

Requires Python 3.11+ (matches the CI matrix).

Architecture

pyspark_tools/├── server.py              # FastMCP server + helper implementations├── consolidated_tools.py  # 14 @app.tool() routers├── sql_converter.py       # SQLGlot-based transpilation + DataFrame API generation├── aws_glue_integration.py # Glue job templates, DynamicFrame, Data Catalog├── advanced_optimizer.py  # Performance analysis + optimization suggestions├── batch_processor.py     # Concurrent file processing├── code_reviewer.py       # PySpark code review patterns├── duplicate_detector.py  # Code deduplication├── data_source_analyzer.py # Data source analysis (optional boto3)└── file_utils.py          # File I/O with allow-root checks

License

MIT — see LICENSE.


mcp-name: io.github.AnnasMazhar/pyspark-mcp

來源:README.md,提交 a5694cd

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v0.1.0最新Oct 18, 2026
  2. v0.0.4Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分