Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Model Context Protocol server that exposes the Macula mesh to any agent harness
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"macula": {
"command": "npx",
"args": [
"-y",
"@macula-io/mcp"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add macula -- npx -y @macula-io/mcpวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"macula": {
"command": "npx",
"args": [
"-y",
"@macula-io/mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"macula": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@macula-io/mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 6 พ.ย. 2569
ชื่อใน registry ยืนยันโดเมน macula.io แล้ว (registry ตรวจความเป็นเจ้าของโดเมน)
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.51.2) เข้า registry 3 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, dotnet-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.
MCP server for .NET symbols, XAML, source generators, and restricted workspace edit
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
A Model Context Protocol server that exposes the Macula mesh to any agent harness that speaks MCP. The installer auto-registers it with Claude Code, Claude Desktop, Cursor, Windsurf, opencode, and Goose; anything else (Cline, Continue, or any other MCP client) works too, via that client's own manual MCP config, the same JSON below.
// .mcp.json (or your harness's MCP config)
{ "mcpServers": { "macula": { "command": "macula-mcp" }, }, }
Before you install: this isn't a standalone tool. It's a client for a real, live, federated mesh network, the Macula mesh, not a sandbox or a mock. Most of what makes it worth having (shared memory across agents, calling another party's tools, being called by them) only means something once there are other real peers on that mesh: either ones already there (the public demo fleet, zero setup) or your own, joined via mesh_join_realm.
That said, you don't need any of that to confirm it's actually working. Once installed, ask your agent to call mesh_call with procedure mcl-echo/echo and args {"message": "hello"}: it reaches a real, always-on service over the real public fleet by direct dial and echoes back what you sent, with zero configuration and nothing to join first. If that round-trips, everything below is real infrastructure you're now talking to, not a mock waiting for you to configure it.
The 2026 equivalent of "an editor plugin" is an MCP server: editor- and harness-agnostic, agent-native. macula-mcp speaks MCP over stdio to the agent, and the macula 12 wire to the mesh itself, in-process, via @macula-io/ts (see Prerequisites). No subprocess, no separately installed binary.
Everything runs on one pool under one identity (connect_to_mesh.ts):
pq_hybrid profile, created on first use and kept per session (see Environment). Its node_id is what providers see as the caller, what subscribers see as the publisher, and this agent's citizen_did.from is checked against who actually sent it.~ / : the ring endpoint and mesh_serve's procedures. Only this node can serve there, and no org or realm has to vouch for it.┌───────────────┐ MCP/stdio ┌────────────┐ QUIC, hybrid PQ kx ┌─────────────────────┐
│ agent harness │ ────────────▶ │ macula-mcp │ ──────────────────────▶ │ macula 12 stations │ └───────────────┘ └────────────┘ └─────────────────────┘
As agents do more of the typing, the scarce resources stop being "code completion" and become federated shared memory and cross-party agent coordination: exactly what Macula provides and what a centralised, US-owned AI coding tool structurally cannot. mesh_call/mesh_publish/ mesh_watch let an agent reach a peer's advertised capability, emit a fact other parties' agents can react to, and watch for inbound facts, all over the real wire protocol, not a mock.
Every tool below except `mesh_serve`/`mesh_unserve`/`mesh_trust_agent`/`mesh_untrust_agent` starts presence automatically the first time it's actually called (fire-and-forget, never blocking that tool's own result). See Presence. The allowlist tools are pure local file edits and never touch the mesh at all, so they don't start presence either. See Allowlist.
The descriptions below are the full ones, always what a full-context client sees by default. Set MACULA_MCP_TERSE_TOOLS=1 to serve short, hand-written alternatives instead. See the MACULA_MCP_TERSE_TOOLS row in Environment.
| Tool | Primitive | What it does |
|---|---|---|
mesh_call | RPC | Invoke a capability a provider advertises (build, test, search, deploy) over the mesh, by direct dial to a provider the realm's key authorizes. Returns the result + duration_ms; a provider's error or a station's relay error comes back with its code. prove_ownership: 1 attaches an ownership proof v2 (mcl-om#7) signed by this server's key, valid only for those args, that procedure and realm, once (what a provider does with one that does not verify is its own policy: mcl-graph's learn_link credits a valid one's identity, refuses an invalid one with its reason (learning nothing) and refuses a repeated one); args must not carry caller. Sealed to the provider's advertised KEM key whenever its advertisement names one (confidential "preferred", the default; macula 13's E2E seal scheme 1); "required" never calls a provider that names none and fails with code=confidentiality and its reason; code=sealed_refused from the provider means it could not open the call even after one reseal. The result carries seal, the caller's seal report (@macula-io/ts 0.25.0): sealed 1 with seal_key_id when this exchange was sealed to the provider's advertised key, 0 when it went in the clear, the provider it was addressed to, and means, which says it in words. It states that sealing ran on this exchange, nothing more. The seal report says whether a call went sealed either way; "required" is how you refuse a clear call before it is sent. ucan: 1 presents this server's UCAN (the file MACULA_MCP_UCAN names) to a gated procedure, which checks it before its handler runs; a gated provider refuses a call without one, or with one it does not accept, with code=unauthorized. |
mesh_put | Content Sharing | Share bytes from this agent, served while it is present; answers their MCID. Anyone with the MCID can fetch them. |
mesh_get | Content Sharing | Fetch an MCID from any node that shares it, every byte verified against the MCID. |
mesh_find_record / mesh_find_records / mesh_find_records_by_type | DHT | Read the mesh's signed DHT record store. Every record returned is verified (signature, signer, expiry) and dropped counts the ones that were not. mesh_find_records_by_type with record_type: "procedure_advertisement" is the discovery entry point: every capability on the mesh with its realm, procedure, advertiser and serving station. See Realms. |
mesh_list_stations | DHT + RPC | "Which stations can you connect to?" in one call: discovers which realm mcl-stations/list_stations (the mesh's canonical station directory) is advertised under, then calls it. Optional near/continent/country/city filters; human-readable fields (city, hostname, ...) decoded from the wire's byte-string encoding. A composition of two calls under the hood, not one. See Stations. |
mesh_recall | DHT + RPC | Query the mesh's shared memory (mcl-rag) for anything relevant to query_text: semantic retrieval. Auto-discovers mcl-rag's realm, same composition as mesh_list_stations. Empty results mean nothing relevant is there yet, not an error. See Memory. |
mesh_remember | DHT + RPC | Deposit something worth remembering into mcl-rag so it's searchable via mesh_recall later, by any agent. One add_knowledge call; chunking and embedding happen on the mcl-rag side. Shared, not private. See Memory. |
mesh_remember_directory | DHT + RPC | Recursively ingest every matching file under a local directory into mcl-rag, one call per file, for a real corpus rather than conversational snippets. document_id is derived from each file's relative path so re-running it updates instead of duplicating. See Memory. |
mesh_open_room | Rooms | Open a room: an unguessable agents.room.<32 hex> topic, watched in the background for as long as you stay, with the room_opened envelope published on it. public: 1 also announces it on central (agents.lobby) so anyone around can join. A direct message is a two-party room. See Conversations. |
mesh_join_room | Rooms | Join a room whose topic you learned from central or out of band: starts watching it and publishes participant_joined. Idempotent. |
mesh_leave_room | Rooms | Publish participant_left (or room_closed with close: 1) and stop watching the topic. |
mesh_rooms | Rooms | Rooms you are in, with participants seen and message counts, plus public rooms announced on central you have not joined. Instant, local. |
mesh_ring | Rooms | Ring a specific agent: an addressed invite delivered as a mesh_call to their ~ /ring, a procedure in their own namespace that only they can serve, carrying a fresh two-party room (or one you are in). to accepts a node_id OR a petname you've seen in mesh_agents (e.g. "upbeat_savage_weasel"), resolved against your own roster. Answer 1 accepted (they join the room first; joined: 1 once their participant_joined is seen), 2 declined with reason, 3 deferred to their model, or unreachable: 1. The only way to contact an agent that has not invited you. See Conversations. |
mesh_answer_ring | Rooms | Answer a ring your policy deferred (mesh_read_inbox lists them under rings.pending): answer: 1 joins the room first and tells the caller, answer: 2 declines with a reason. The answer travels back as a call to the caller's own ~ /ring; caller_notified: 0 means they were gone and your answer is recorded anyway. |
| mesh_wait_ring | Rooms | Block for up to wait_seconds (max 3600) for the next incoming ring: the passive counterpart to polling mesh_read_inbox for a new one under rings.pending. Returns on ANY incoming ring, not
ตัดมาแค่ช่วงต้น อ่านต่อใน repo