Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Transparent audit proxy for MCP servers: logs every tool call, flags poisoning and rug pulls.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"audit-proxy": {
"command": "npx",
"args": [
"-y",
"mcp-audit-proxy"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add audit-proxy -- npx -y mcp-audit-proxyวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"audit-proxy": {
"command": "npx",
"args": [
"-y",
"mcp-audit-proxy"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"audit-proxy": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-audit-proxy"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub firatmio ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.0) เข้า registry 3 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Dialyne
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Real phone calls in France for AI agents: dial +33 numbers, menus, hold, AI disclosure.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
A package-lock and flight recorder for MCP tool descriptions.
An MCP server's tool descriptions go straight into your model's context, and a server can change them at any time. mcp-audit sits transparently in front of any MCP server and:
mcp-audit lock diff and approves it with mcp-audit lock approve;Everything runs locally. No account, no cloud, no telemetry: nothing leaves your machine unless you configure a webhook. One Go binary, Apache 2.0.
$ mcp-audit run -- npx -y @modelcontextprotocol/server-filesystem /tmp
mcp-audit dev | mode: stdio, wrapping "npx -y @modelcontextprotocol/server-filesystem /tmp" mcp-audit config: built-in defaults (no config file found) mcp-audit policy: shadow (recording only, nothing is blocked) mcp-audit detectors: rug-pull, tool-poisoning, result-injection mcp-audit audit log: /home/you/.mcp-audit/logs/events.jsonl
That is the whole setup. No config file, nothing blocked, everything recorded.
The recording is scripts/demo.sh, which runs the whole story end to end against a stub server, in a temp directory that leaves your real state alone:
./scripts/demo.sh # watch it
TYPING_SPEED=0 PAUSE=0 ./scripts/demo.sh # run it instantly, as a smoke test vhs docs/demo.tape # re-record docs/demo.gif
No install needed — run it through npm, in front of the server you already use:
npx mcp-audit-proxy run -- npx -y @modelcontextprotocol/server-filesystem /tmp
Or download a binary for your platform from the latest release.
Note: the npm package and the release binaries are still 0.1.0, which
predates
mcp-audit lockand result scanning. Until 0.2.0 is out, build from
source to get them.
Build from source — Go 1.24 or newer, no other dependencies:
go build -o mcp-audit ./cmd/mcp-audit
Or install straight into your GOBIN:
go install github.com/firatmio/mcp-audit-proxy/cmd/mcp-audit@latest
Put mcp-audit run -- in front of the command you already run:
mcp-audit run -- npx -y @modelcontextprotocol/server-filesystem /tmp
Point the proxy at the upstream server and your client at the proxy:
mcp-audit serve --target https://example.com/mcp --listen :9000
Authentication is not touched: Authorization headers, OAuth flows and Mcp-Session-Id all pass through exactly as they arrive.
Every message is one JSON line:
$ tail -1 ~/.mcp-audit/logs/events.jsonl | jq
{ "timestamp": "2026-08-12T13:05:08.466Z", "event_id": "236d1568-e1f0-4ab4-ba75-f10f74f7b2c9", "client_id": "", "server_name": "server-filesystem", "direction": "request", "method": "tools/call", "tool_name": "read_file", "arguments": { "path": "/etc/hosts" } }
Some things you can do with it straight away:
# Which tools has this agent called, and how often?
jq -r 'select(.direction=="request" and .tool_name) | .tool_name' \ ~/.mcp-audit/logs/events.jsonl | sort | uniq -c | sort -rn
jq -c 'select(.policy_flags)' ~/.mcp-audit/logs/events.jsonl
jq -c 'select(.tool_name=="read_file") | {timestamp, arguments}' \ ~/.mcp-audit/logs/events.jsonl
See examples/clients/ for drop-in config snippets for Claude Desktop, Cursor and Windsurf. The pattern is always the same: keep the command you had, and put mcp-audit run -- in front of it.
Recording is the default. These checks run on top of it and, apart from RBAC, never block anything — they flag the event and print an alarm to stderr.
A poisoned MCP server hides instructions in a tool *description*. The user only sees a tool called echo; the model reads the rest. mcp-audit scans every advertised description and schema field for seven patterns:
| Rule | What it looks for |
|---|---|
instruction_override | "ignore all previous instructions" and variants |
hidden_instruction | markup aimed at the model: , , |
concealment | "do not tell the user", "without informing the user" |
credential_bait | ~/.ssh, id_rsa, .env, ~/.aws/credentials, /etc/shadow |
exfiltration | "send/upload/post …" with a URL nearby |
cross_tool_instruction | orders about *other* tools — the tool-shadowing attack |
invisible_characters | zero-width and bidi-override characters a human cannot see |
mcp-audit: ALERT possible tool poisoning on server "demo": tool "echo" description matched hidden_instruction: "<IMPORTANT>"
mcp-audit: ALERT possible tool poisoning on server "demo": tool "echo" description matched concealment: "do not mention this to the user"
A heuristic that flags every tool gets ignored, so the false-positive rate is measured, not guessed. testdata/corpus/benign holds the tool lists of real MCP servers — the official reference servers, and servers published by Microsoft (Playwright), the Chrome DevTools team, Notion, Supabase and others — captured with scripts/corpus-capture and pinned to exact package versions. testdata/corpus/benign-results holds real tool results: the filesystem server reading the MCP specification. Everything is run through the same policy engine the proxy uses, with the default configuration:
| Benign set | Items | Flagged | False-positive rate |
|---|---|---|---|
| Tool descriptions from 15 real MCP servers | 213 | 0 | 0.0% |
| Tool results from 1 real MCP server | 35 | 0 | 0.0% |
The table is generated by go test ./internal/corpus, which fails if it no longer matches what the detectors do. Every flagged item, and the heuristic behind it, is listed in testdata/corpus/RESULTS.md. The result set is small and comes from a single server, so treat its rate as a first reading rather than a settled number.
This measures false alarms only. It says nothing about how many attacks the heuristics catch: a detector that flags nothing would score 0% here too. A detection rate needs a corpus of real attacks, which does not exist here yet.
A tool's description is written by the server's author. Its *result* is often written by nobody you trust: the issue someone filed, the page a search returned, the ticket a customer opened. Instructions in that content reach the model the same way the real data does, with no malicious server involved.
mcp-audit scans every tools/call result — text blocks, embedded resources, resource links, structuredContent, and JSON-RPC error messages — for language addressed to the model, and flags the event result_injection_suspect:
mcp-audit: ALERT possible prompt injection in a result from server "fetch", tool "fetch": matched instruction_override: "ignore all previous instruction"
It uses only three of the description rules: instruction_override, hidden_instruction and concealment. The others misfire on ordinary content: measured on the benign results, exfiltration matched OAuth documentation sending the user to an https:// URL and cross_tool_instruction matched "before invoking any tool". credential_bait and invisible_characters are left out without having misfired there, because file reads in a coding session mention .env and ~/.ssh all the time, and zero-width joiners and tag characters are ordinary parts of emoji.
The cost of a scan is bounded, because the stdio pump reads the next message only once it is done:
go test ./internal/policy -bench ResultScan measures it on your machine. A result is matched to its request by id, so a response whose request the proxy did not see is not scanned. Turn it off with policy.result_scanning: false.
A rug pull is a server that advertises a harmless tool, waits for you to approve it, and changes the description days later. mcp-audit fingerprints every tool (SHA-256 over description + input schema) and remembers it in ~/.mcp-audit/state/tools.json, so the check survives restarts — which is the only way it could ever catch the attack.
mcp-audit: ALERT rug pull on server "demo": tool "read_file" changed its description or schema (first seen 2026-08-05T20:30:04Z, hash c203dda7a9ea -> 3f6e61538bfc)
The approved version stays the baseline, so the alarm repeats every session until a person looks at the change and decides. Think package-lock.json, for tool descriptions:
$ mcp-audit lock status
1 tool(s) changed since they were approved: files / read_file a1b2c3d4e5f6 -> 9f8e7d6c5b4a (changed 2026-10-19 09:00 UTC)
$ mcp-audit lock diff files / read_file a1b2c3d4e5f6 -> 9f8e7d6c5b4a Reads a file. Returns its text.
$ mcp-audit lock approve files read_file
lock status exits with status 1 while anything is pending, so it also works as a CI or pre-launch check.
The one check that can block. With no rules it allows everything; add a rule and a refused call never reaches the server — the client gets a JSON-RPC error instead.
policy:
rbac: default: allow rules:
mcp-audit: blocked: tool "shell_exec" is denied by rule for client "*" (deny: "shell_exec")
Other tools cover some of the same ground, and some of them cover more. What each one documents:
| mcp-audit | agent-scan (formerly Invariant's mcp-scan) | mcp-context-protector | P4ST4S/mcp-audit | |
|---|---|---|---|---|
| How it runs | proxy in front of each server (stdio, HTTP) | on-demand scan of the agent configs on a machine | wrapper in front of each server (stdio, HTTP, SSE) | proxy in front of each server (stdio, HTTP) |
| Pins tools, reacts when they change | alarms until a person approves (lock) | — | blocks tool calls until
ตัดมาแค่ช่วงต้น อ่านต่อใน repo