ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที รีวิวและบัญชีผู้ใช้จะมาในขั้นถัดไป
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · อธิบายเป็นภาษาคน

PostgreSQL Performance (read-only)

โดย gouranshulรุ่น 0.1.0i★ –iรันบนเครื่อง
ชื่อใน registryio.github.gouranshul/pg-perf-mcp

ติดตั้ง

ภาพรวม

คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)

Read-only PostgreSQL performance diagnostics: slow queries, EXPLAIN, index advice, locks, functions

สามเสาของ PopNx MCP

สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน

ใช้ทำอะไรได้

ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry

  • การเชื่อมต่อ: รันบนเครื่อง
  • ช่องทาง (transport): Streamable HTTP
  • หมวด: ฐานข้อมูลและชุดข้อมูล
  • ต้องใส่ค่าเหล่านี้: PGPERF_DB_URL, PGPERF_DB_USER, PGPERF_DB_PASSWORD, MCP_API_KEY

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ก่อนติดตั้ง

ค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต

ต้องเตรียมก่อน

  • Dockerติดตั้ง Docker ในเครื่อง

คุณใช้แอปไหน

เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”

เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json

{
  "mcpServers": {
    "pg-perf": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "PGPERF_DB_URL",
        "-e",
        "PGPERF_DB_USER",
        "-e",
        "PGPERF_DB_PASSWORD",
        "-e",
        "MCP_API_KEY",
        "ghcr.io/gouranshul/pg-perf-mcp:0.1.0"
      ],
      "env": {
        "PGPERF_DB_URL": "ใส่ค่าของคุณ",
        "PGPERF_DB_USER": "ใส่ค่าของคุณ",
        "PGPERF_DB_PASSWORD": "ใส่ค่าของคุณ",
        "MCP_API_KEY": "ใส่ค่าของคุณ"
      }
    }
  }
}

พิมพ์คำสั่งนี้ใน Terminal

claude mcp add pg-perf --env PGPERF_DB_URL='ใส่ค่าของคุณ' --env PGPERF_DB_USER='ใส่ค่าของคุณ' --env PGPERF_DB_PASSWORD='ใส่ค่าของคุณ' --env MCP_API_KEY='ใส่ค่าของคุณ' -- docker run -i --rm -e PGPERF_DB_URL -e PGPERF_DB_USER -e PGPERF_DB_PASSWORD -e MCP_API_KEY ghcr.io/gouranshul/pg-perf-mcp:0.1.0

เติมค่าที่เว้นว่างไว้ก่อนรัน

เปิดใน Cursor

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json

{
  "mcpServers": {
    "pg-perf": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "PGPERF_DB_URL",
        "-e",
        "PGPERF_DB_USER",
        "-e",
        "PGPERF_DB_PASSWORD",
        "-e",
        "MCP_API_KEY",
        "ghcr.io/gouranshul/pg-perf-mcp:0.1.0"
      ],
      "env": {
        "PGPERF_DB_URL": "ใส่ค่าของคุณ",
        "PGPERF_DB_USER": "ใส่ค่าของคุณ",
        "PGPERF_DB_PASSWORD": "ใส่ค่าของคุณ",
        "MCP_API_KEY": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

เปิดใน VS Code

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .vscode/mcp.json ของโปรเจกต์

{
  "servers": {
    "pg-perf": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "PGPERF_DB_URL",
        "-e",
        "PGPERF_DB_USER",
        "-e",
        "PGPERF_DB_PASSWORD",
        "-e",
        "MCP_API_KEY",
        "ghcr.io/gouranshul/pg-perf-mcp:0.1.0"
      ],
      "env": {
        "PGPERF_DB_URL": "ใส่ค่าของคุณ",
        "PGPERF_DB_USER": "ใส่ค่าของคุณ",
        "PGPERF_DB_PASSWORD": "ใส่ค่าของคุณ",
        "MCP_API_KEY": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น

ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี

ค่าที่ต้องใส่เอง

  • PGPERF_DB_URL จำเป็น env
    JDBC URL of the database to diagnose. From inside the container, use host.docker.internal for a database on your machine, e.g. jdbc:postgresql://host.docker.internal:5432/mydb
  • PGPERF_DB_USER จำเป็น env
    A read-only role with pg_read_all_stats and pg_monitor (see docker/init.sql)
  • PGPERF_DB_PASSWORD ความลับ จำเป็น env
    Password of that role
  • MCP_API_KEY ความลับ จำเป็น env
    Bearer token clients must send, at least 16 characters (32+ random recommended)

ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README

ทำอะไรได้บ้าง

รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub gouranshul ซึ่งเป็นเจ้าของ repo

  • … ยังไม่ตรวจ

    ยังมีคนดูแล

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • … ยังไม่ตรวจ

    มีสัญญาอนุญาต (license)

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • – ไม่เกี่ยว

    endpoint ตอบ

    ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน

  • … ยังไม่ตรวจ

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต

เทียบกับตัวอื่นในหมวด ฐานข้อมูลและชุดข้อมูลi

  • ดาวมากกว่า 0% ของอีก 1141 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 63% ของอีก 1141 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 1141 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

PostgreSQL Performance (read-only) ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

ต้องใส่ค่าเหล่านี้: PGPERF_DB_URL, PGPERF_DB_USER, PGPERF_DB_PASSWORD, MCP_API_KEY

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.0) เข้า registry 28 วันที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Docker ในเครื่องด้วย

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี Supabase, MongoDB MCP Server, Elasticsearch MCP Server

ตัวที่ใช้แทนได้

server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว

อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

Supabase

โดย supabase

server ทางการของ Supabase ให้ AI สร้างตาราง ถามข้อมูล และดูการตั้งค่าโปรเจกต์ในฐานข้อมูล Supabase ของคุณ

บนเครื่องหรือคลาวด์★ 2,993Apache-2.0อัปเดต เมื่อวาน
ติดตั้ง

MongoDB MCP Server

โดย mongodb-js

MongoDB Model Context Protocol Server

รันบนเครื่อง★ 1,157Apache-2.0อัปเดต 3 วันที่ผ่านมา
ติดตั้ง

Elasticsearch MCP Server

โดย cr7258

MCP server for interacting with Elasticsearch

รันบนเครื่อง★ 315Apache-2.0อัปเดต 14 เดือนที่ผ่านมา
ติดตั้ง

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

pg-perf-mcp

An MCP server that lets AI assistants diagnose PostgreSQL performance problems safely: slow queries, EXPLAIN plans, index suggestions, table health and lock contention. It is read-only by design.

*A real Claude Code session against the demo shop, sped up. First it finds which database functions are slow and why. Then it explains a slow catalog query and estimates the fix with a hypothetical index. Asked to create the index, it says it can't: every tool is read-only.*

Why

When a page is slow, developers paste a query into a chat and ask "why is this slow?". The assistant then guesses, because it cannot see the plan, the table sizes, the existing indexes or which queries actually dominate the load.

pg-perf-mcp gives the assistant real numbers from `pg_stat_statements`, `EXPLAIN` and the catalogs, through a narrow, audited, read-only interface. It cannot change data, cannot run DDL, and never creates the indexes it recommends.

Demo

A condensed, illustrative session against the demo shop (docker compose up, then ./demo/workload.sh). Exact numbers vary from run to run:

You:    The shop database feels slow. What's going on?

Claude: [top_slow_queries orderBy=total_time] The top statement by total time is SELECT id, status, total, created_at FROM shop.orders WHERE customer_id = $1 ORDER BY created_at DESC (thousands of calls, the largest share of total execution time).

[explain_query sql="... WHERE customer_id = 42 ORDER BY created_at DESC"] HIGH SEQ_SCAN_ON_LARGE_TABLE Seq Scan on shop.orders reads all ~1.0M rows of shop.orders to apply filter (customer_id = 42); only a handful match.

[suggest_indexes] CREATE INDEX CONCURRENTLY idx_orders_customer_id ON shop.orders (customer_id); hypopg: the planner would use it; estimated cost drops by well over 90%. Not executed. Review it and run it yourself, ideally off-peak.

[table_health table=shop.orders] Autovacuum is disabled on shop.orders and ~20% of rows are dead. Re-enable autovacuum and VACUUM.

Prioritized actions: 1) add the index above (orders.customer_id is a foreign key with no index),

  1. re-enable autovacuum on shop.orders, 3) ...

Architecture

flowchart LR

A["AI assistant (Claude Code, Claude Desktop, ...)"] -- "MCP over streamable HTTP Authorization: Bearer key" --> F["API key filter (constant-time)"] F --> M["MCP tools / resources / prompt Spring AI 2.0 annotations"] M --> R["ToolRunner audit log · metrics · safe errors"] R --> G["SqlGuard PG lexer + JSqlParser"] G --> E["ReadOnlyExecutor READ ONLY tx · always rollback statement/lock timeout · row cap"] R --> AN["analysis PlanAnalyzer · IndexAdvisor (pure functions)"] E --> P[("PostgreSQL 18 role mcp_readonly pg_stat_statements · hypopg")]

Tools

ToolWhat it doesSafety notes
top_slow_queriesMost expensive statements from pg_stat_statements: normalized text, calls, total/mean/max ms, rows, cache hit ratio, share of total time. Order by total_time, mean_time, calls or rows.Fixed SQL; sort column chosen from an enum. Excludes the server's own statements.
explain_querySummarized plan: 5 costliest nodes, seq scans on large tables, 10x row misestimates, disk sorts/hash spills, nested loops with many iterations. analyze=true adds real timings. $1 placeholders get a generic plan.SQL guard first. ANALYZE runs in a read-only transaction that is rolled back and cancelled after the timeout.
suggest_indexesCREATE INDEX CONCURRENTLY candidates from filtered seq scans, join keys and ORDER BY ... LIMIT, each with a reason; validated with hypothetical indexes when hypopg is installed.Never executed. Hypothetical indexes are reset in a savepoint so they cannot leak to other calls.
unused_indexesIndexes with idx_scan = 0, largest first, excluding primary key, unique and constraint indexes; includes size, definition and a DROP INDEX CONCURRENTLY to review.Nothing is dropped. Reports when stats were last reset.
table_healthLive/dead tuples, dead ratio, last (auto)vacuum/analyze, rows changed since analyze, seq vs index scans, sizes, with plain-language warnings.Catalog reads only.
blocking_sessionsBlocked/blocking pairs via pg_blocking_pids, truncated query texts, wait time, lock type/mode/table, blocker state, root blockers.Never cancels or terminates anything.
slow_functionsUser-defined functions (PL/pgSQL, SQL, ...) ranked by total, self or mean time or calls, from pg_stat_user_functions, with language and volatility.Catalog reads only. Needs track_functions.
explain_functionLooks inside the functions a query calls: time per function, every statement executed inside them with calls, time and its own analyzed plan, and findings such as a seq scan inside a function, a function called once per row, or a read-only function left VOLATILE. Includes the function source.SQL guard first; runs in the same rolled-back read-only transaction as explain_query, so functions that write fail. auto_explain is switched on for that transaction only, with generic plans so no data values appear.

Resources: pg://schema/overview (tables, row estimates, sizes, indexes) and pg://schema/{table} (columns, indexes with scan counts, foreign keys flagged when unindexed). Prompt: diagnose_slow_database, a guided workflow: slow queries, then explain, suggest indexes, table health, functions, then a prioritized summary.

Why a separate tool for database functions

EXPLAIN shows a function call as one opaque expression, and charges its time to whichever plan node evaluates it. On the demo catalog page (20 products, each calling shop.product_rating), explain_query blames the index scan on products (184 ms self time) and finds nothing else serious. explain_function on the same query, against the full demo data:

shop.product_rating          plpgsql  20 calls  99% of execution time

SELECT avg(rating) FROM shop.reviews WHERE product_id = p_product_id 20 calls 175 ms 96% of execution time HIGH FUNCTION_DOMINATES_QUERY shop.product_rating takes 99% of the query's execution time HIGH FUNCTION_CALLED_PER_ROW ran 20 times for one query (9.0 ms per call) HIGH SEQ_SCAN_ON_LARGE_TABLE inside shop.product_rating: Seq Scan on shop.reviews reads all ~250k rows to apply filter (reviews.product_id = $1)

How it works (ADR 0006): the query runs once with auto_explain enabled for that transaction only, so the plan of each nested statement comes back as a notice; per-function time comes from pg_stat_xact_user_functions and per-statement calls from pg_stat_statements, both as before/after differences.

Security model

Five independent layers stand between the assistant and a write (details in ADR 0001):

  1. SQL guard: exactly one plain SELECT. It is checked by a PostgreSQL-faithful lexer *and* JSqlParser, and both must agree. Blocks DML/DDL, multiple statements, data-modifying CTEs, SELECT INTO, FOR UPDATE/SHARE, COPY, DO, and dangerous functions (pg_sleep*, *_file, lo_*, dblink*, set_config, pg_terminate_backend, query_to_xml, ...). It fails closed.
  2. Read-only role: mcp_readonly has SELECT plus pg_read_all_stats/pg_monitor, with default_transaction_read_only = on and statement_timeout = 5s set on the role.
  3. Read-only connections: Hikari readOnly=true and a read-only session default.
  4. One rolled-back read-only transaction per call: statement_timeout/lock_timeout set locally, standard_conforming_strings forced on, always rolled back.
  5. Row cap: every result is capped (default 200 rows).

Around those layers: a bearer API key (constant-time comparison; only /actuator/health is open), a JSON audit line per call (SQL stored as a SHA-256 hash plus an 80-character preview), error messages with no stack traces or connection details, and metrics mcp.tool.duration and mcp.guard.rejections.

Quickstart

Requirements: Docker. There are two ways to start:

  • [Use it on your database](#use-it-on-your-database): pull the published image. No clone or build.
  • [Try the demo shop](#try-the-demo-shop): clone the repo and get a seeded database with realistic problems to diagnose.

Either way, finish with connecting your AI client.

Use it on your database

1. Pull the image (public on GHCR, built for amd64 and arm64):

docker pull ghcr.io/gouranshul/pg-perf-mcp:0.1.0

2. Prepare the database (once). Create a read-only role like mcp_readonly (see docker/init.sql) and make sure pg_stat_statements is in shared_preload_libraries. Prefer a replica or staging database: analyze=true and explain_function execute the query. For the function tools, also enable function tracking.

3. Run it. Put the settings in a file so secrets stay out of your shell history:

cat > pg-perf.env <<'EOF'

PGPERF_DB_URL=jdbc:postgresql://host.docker.internal:5432/mydb PGPERF_DB_USER=mcp_readonly PGPERF_DB_PASSWORD= MCP_API_KEY=<32+ random characters> EOF

docker run --rm --env-file pg-perf.env -p 127.0.0.1:8080:8080 ghcr.io/gouranshul/pg-perf-mcp:0.1.0

host.docker.internal reaches a database on your machine (Docker Desktop; on Linux add --add-host=host.docker.internal:host-gateway). The MCP endpoint is now http://localhost:8080/mcp.

4. Connect your AI client: see below.

Try the demo shop

To build and test from source you also need Java 25.

git clone https://github.com/gouranshul/pg-perf-mcp && cd pg-perf-mcp

cp .env.example .env # then replace the placeholder secrets docker compose up --build # Postgres 18 + seeded demo shop (~4.5M rows) + the MCP server on :8080

Generate some slow-query statistics (optional, but makes top_slow_queries interesting):

./demo/workload.sh          # 60s of deliberately bad queries via pgbench

./demo/lock-scenario.sh # holds a row lock for 2 minutes so blocking_sessions has something to show ./demo/smoke-test.sh # curl-based end-to-end check of health, auth and two tool calls

Connect from Claude Code
claude mcp add --transport http pg-perf http://localhost:8080/mcp --header "Authorization: Bearer $MCP_API_KEY"

In PowerShell, set the key first, or the header goes out empty and the server answers 401:

$env:MCP_API_KEY = "<your MCP_API_KEY>"

claude mcp add --transport http pg-perf http://localhost:8080/mcp --header "Authorization: Bearer $env:MCP_API_KEY"

Or install it as a Claude Code plugin. Claude Code asks for the endpoint (default http://localhost:8080/mcp) and your MCP_API_KEY, which it keeps in secure storage:

/plugin install pg-perf --marketplace gouranshul/pg-perf-mcp

On Claude Code versions before 2.1.275, add the marketplace first: `/plu

ตัดมาแค่ช่วงต้น อ่านต่อใน repo

ถาม PopNx