Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Defensive hardening against automated reverse engineering - the defensive mirror of REA.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"reashield": {
"command": "npx",
"args": [
"-y",
"reashield"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add reashield -- npx -y reashieldวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"reashield": {
"command": "npx",
"args": [
"-y",
"reashield"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"reashield": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"reashield"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub HMAKT99 ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.7.1) เข้า registry เมื่อวาน
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Python MCP
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.
Local-only Python MCP server for the Files.com API.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
## REA reverse-engineers any app. REAShield makes it come back empty.
REA — the #1 trending repo on GitHub — lets an AI agent reverse-engineer your shipped app in one command, no source code needed. REAShield is the defensive counter: drop it into your build and it hardens what you ship (JavaScript / Electron / Python) so automated reverse engineering comes back empty.
rea-agents) recovered 6 protected tokens → 0 after hardening.npm i -D reashield
npx reashield build # hardened client + generated server skeleton npx reashield test --rea # run the REAL REA on before/after; score what it recovers
Python front-end: pip install reashield (see python/).
### Honest promise & limits — read this
Offline code can never be made unbreakable. If a machine must run it, the
machine has it, so it can always be extracted given effort — obfuscation, WASM and
bytecode only raise the cost. REAShield's job is to defeat the automated attack
(the one REA just handed everyone) and raise a human analyst's cost from minutes to
days. The only *truly* unrecoverable code is code you don't ship — run it
server-side (
mode: "relocate"). Defensive-only, behavior-preserving, transparent
(no phone-home). It hardens code you own and ship; it won't help bypass anyone
else's DRM, license checks, or anti-cheat.
REA is an MCP server that hands an agent *reverse-engineering* tools. REAShield ships the defensive mirror — an MCP server that hands an agent hardening tools, so Claude Code / Cursor can inspect, harden, and measure a project from chat.
Tools: `reashield_doctor` (what's exposed), `reashield_harden` (harden it), `reashield_measure` (run the real REA and report the recovery score).
# Claude Code
claude mcp add reashield -- npx -y reashield-mcp
REAShield is a monorepo. The same durable idea — move secrets off-device, turn static facts into runtime facts, and measure the result — is implemented for two ecosystems:
| Front-end | Install | Protects | Status |
|---|---|---|---|
| JavaScript / npm / Electron (this package) | npm i -D reashield | shipped JS bundles, app.asar | published |
Python (python/) | pip install -e python | shipped .py apps | in this repo |
Both share the pillar ordering below. The Python package mirrors relocation, sealing (AES-GCM), string indirection, name mangling, polymorphism, decoys, and a measurement harness — with a safety analyzer that refuses rather than miscompiles. See python/README.md.
Interpreted / source-shipped languages are the natural fit; compiled-to-native (Go, Rust, C/C++) ship no source and are a different reverse-engineering game.
REA's JavaScript/Electron path is static — it never runs your app. It reads your bundle, rebuilds a graph of modules, imports, routes, IPC channels and strings, then hands a coding agent a compact summary to reason over. It honestly leaves anything computed at runtime unresolved and drops relationships when a graph gets too big.
So the durable defenses either move secrets off-device or turn static facts into runtime facts REA can't resolve. Plain obfuscation — the thing LLM-assisted deobfuscation erodes fastest — is the replaceable outer skin, not the foundation.
| Pillar | mode / layer | What it does | Honest limit |
|---|---|---|---|
| Server-side relocation | relocate | Moves the real body to a generated server skeleton; ships only an opaque remote-call stub through one endpoint. The secret never ships. | Needs a secured backend; the request/response boundary is observable. |
Encrypted sealing (max) | seal | Ships the module as ciphertext, decrypted at runtime with a key fetched from your server. | Needs connectivity; does not stop a human dumping decrypted memory. |
| WASM | wasm | Compiles numeric-subset logic to a real WebAssembly module, off REA's JS graph path. | Numeric subset only; falls back to obfuscate (reported) outside it; wasm can still be decompiled. |
Dynamic graph (max) | dynamicGraph | Computed imports + runtime dispatch table — deletes the call/import edges REA recovers. | CPU cost; scoped to protected regions. |
| Graph starvation | flattenBundle, stripSourceMaps, stringIndirection, dynamicChannels | One module, no maps, no semantic plaintext strings, computed channel names. | Obfuscation erodes over time. |
| Polymorphism | polymorphic | Per-build re-randomization of names, strings and structure — defeats version diffing. | Cosmetic alone; pairs with the above. |
| Decoys | decoys | Inert fake "feature" clusters (hub + ring-linked members + a fake entry) with plausible route/IPC/key strings, shaped to look central in REA's summary. | Experimental; measured, can add size. |
| Integrity | integrity (off) | Fail-safe anti-tamper. | Does not defend REA's static path (REA never runs your app). |
npm install --save-dev reashield
npx reashield init # scaffold shield.config.cjs
npx reashield build # emit hardened client + server skeleton npx reashield doctor # show config, layers, costs, deps npx reashield test # measure before vs after (static; add --rea for real REA)
shield.config.cjs)module.exports = {
input: "src/index.js", output: "dist-shielded", preset: "balanced", // low | balanced | max protect: [ { name: "licenseCheck", mode: "relocate" }, // strongest: off-device { name: "sealedCalc", mode: "seal" }, // ciphertext + remote key (max) { name: "pricingLogic", mode: "wasm" }, // off the JS graph (fast-follow) { name: "featureGate", mode: "obfuscate" }, // harden in place ], server: { enabled: true, out: "server-shielded", adapter: "express", endpoint: "/s", keyEndpoint: "/s/k", decoyCalls: false, }, polymorphic: { enabled: true, seed: "auto" }, // "auto" rotates every build layers: { stripSourceMaps: true, flattenBundle: true, obfuscate: true, stringIndirection: true, dynamicChannels: true, dynamicGraph: false, decoys: { enabled: true, count: 5 }, integrity: false, }, };
protect: ["a", "b"] (a plain string array) is also accepted; each defaults to mode: "obfuscate". You can also put the config under a reashield key in package.json.
doctor flags it.Instead of the CLI, harden as part of an esbuild / Rollup / Vite build. The plugin runs the source-level pillars per module, then finalizes each output chunk (decoys + obfuscation + source-map stripping + client-runtime injection) and writes the server skeleton. flattenBundle is a no-op here — your bundler already bundles; the plugin hardens its output. Configure the relocated/sealed transport once via the global the plugin installs: globalThis.__configureShield({ transport, keyTransport }) (or let the default fetch transport call your endpoints).
// rollup.config.mjs
import { reashieldRollup } from "reashield/plugins"; export default { input: "src/index.js", output: { dir: "dist", format: "esm" }, plugins: [reashieldRollup({ configPath: "shield.config.cjs" })], };
// vite.config.mjs (Vite consumes the Rollup plugin interface)
import { reashieldVite } from "reashield/plugins"; export default { plugins: [reashieldVite({ configPath: "shield.config.cjs" })] };
// esbuild build script
import { build } from "esbuild"; import { reashieldEsbuild } from "reashield/plugins"; await build({ entryPoints: ["src/index.js"], bundle: true, outdir: "dist", plugins: [reashieldEsbuild({ configPath: "shield.config.cjs" })], });
Each plugin accepts { config | configPath, cwd, seed }. Note: the plugin hardens every emitted JS chunk, so obfuscation cost applies to the whole output — scope your build accordingly.
relocate and seal emit a server-shielded/ directory holding the real logic and keys. Never ship it to users. You run it behind your own auth + TLS. REAShield scaffolds the Express/Fastify wiring and an in-process handler for tests; securing the endpoint is your responsibility (it does not add auth for you).
Auth seam (you supply it). Until you call setAuthVerifier, the endpoint is open — secure it before shipping. The client attaches a token from a source you configure; the server verifies it:
// server
import { setAuthVerifier } from "./server-shielded/handlers.js"; setAuthVerifier(async (token, ctx) => (await myAuth.verify(token)) === true);
// client (wire once at startup) configureShield({ authToken: () => myAuth.currentToken() }); // (or globalThis.configureShield in plugin builds)
Adapters. adapter: "express" | "fastify" | "web" | "generic". The skeleton always exports a cross-runtime webHandler(request: Request): Promise that drops into Hono, Cloudflare Workers, Deno, Bun, or a Next.js route handler:
import { webHandler } from "./server-shielded/handlers.js";
export const POST = (req) => webHandler(req); // Next.js app route, Workers fetch, ...
Relocated/sealed functions become async (they do a round-trip). Make sure your call sites await them. They must be self-contained (no closure over client-only module state).
Hardening must never change what your program does. The bundled example (examples/sample-package) proves identical outputs before and after hardening — including relocated and sealed code, exercised through an in-process server — and asserts decoys never execute. Run it with npm run example:test.
For Electron apps, REAShield adds an Electron-specific path (pair it with the JS pillars above):
ipcMain/ipcRenderer/ webContents channel strings into runtime-computed ones. REA leaves dynamically-computed IPC names unresolved by design, so this directly starves its graph. Value-preserving: both sides compute the identical string. Enable with layers.ipcChannels: true, or run standaตัดมาแค่ช่วงต้น อ่านต่อใน repo