Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Hosted MCP runtime where your agent publishes its own tools by tool call and keeps working.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
ใช้ได้ทั้ง Claude บนเว็บ แอปคอมพิวเตอร์ และมือถือ:
https://mcphost.dev/mcpพิมพ์คำสั่งนี้ใน Terminal
claude mcp add --transport http mcphost https://mcphost.dev/mcpวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"mcphost": {
"url": "https://mcphost.dev/mcp"
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"mcphost": {
"type": "http",
"url": "https://mcphost.dev/mcp"
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ChatGPT ต่อได้เฉพาะ server ที่อยู่บนอินเทอร์เน็ต:
https://mcphost.dev/mcpชื่อเมนูอาจต่างกันเล็กน้อยตามแพ็กเกจและรุ่นของแอป
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
ชื่อและคำอธิบายเครื่องมือตามที่ server ตอบมาเมื่อ 6 พ.ย. 2569 ผู้ทำเป็นคนเขียน ไม่ใช่เรา แสดงเป็นข้อความล้วน
signup ดูเหมือนสั่ง AIExplicit signup, for a client that cannot keep a session across calls: create a tenant and receive a bearer key and namespace. Unauthenticated. Most clients never need this -- any other host.*/billing.* call from a fresh connection creates a tenant implicitly and returns its own
host.quickstartReturn the shortest ordered sequence of calls to a working tool of `kind`, with your namespace and a filled-in example already substituted in, plus the current limits and a try_before_call table naming the one dry-run tool for each case. Read-only -- this call alone never creates
host.help.searchSearch this host's own documentation and tool descriptions. Returns up to k hits (default 3, response under 2 KB), each with a snippet, the nearest runnable example and an anchor. Read-only, anonymous, no tenant data -- call it with the error text or import line you are stuck on
host.help.getReturn the documentation section an anchor points at: its text (at most 4 KB) and its first fenced example. Pass an anchor exactly as an error, hint or help entry printed it, e.g. a rate_limited error's `anchor`. Read-only, anonymous, no tenant data. An unknown anchor is anchor_n
host.errorsList every error code this host can return, each with its class (agent_fault | host_refusal | upstream_fault | plan_limit | host_fault), family, remedy, docs anchor, retryable flag and help_url -- the same object GET /errors.json serves. Pass code to get one row; a misspelt code
host.redeemExchange a signup(handoff: true) handoff_token for the tenant key it was issued for. Single-use: a second redemption fails with handoff_token_redeemed; past its expiry it fails with handoff_token_expired. Unauthenticated -- the token itself is the proof.
billing.plansThe plan catalog (price and quotas per plan) and whether Stripe billing is configured on this host. Anonymous callers get the same answer as tenants.
host.whoamiReturn the calling tenant's identity, including key_age_s and key_rotated_at for auditing credential hygiene.
host.tool_publishPublish a tool of a registered kind (e.g. python, http or echo; the kind argument's enum lists them all) under this tenant's namespace. Call host.quickstart(kind) first for a filled-in example spec and the full publish-to-call sequence. Python's sandbox API: import mcphost (mcpho
host.tool_callInvoke a tool this tenant has already published, by its local name -- the same real, metered call as calling it directly by its namespaced name ( . ), for a session that has no way to see its own namespaced tool name yet. Unlike host.tool_test, this counts toward host.usage and a
host.tool_testDry-run a published tool by name: verdict (pass/will_fail/unverifiable), writes rolled back (dry_run); see host.quickstart.
host.state.setWrite one key in this tenant's key-value state namespace; value may be any JSON value. Overrun of the plan's state_bytes_max quota fails with state_quota_exceeded and writes nothing.
host.state.getRead one key from this tenant's key-value state namespace. Returns found: false (not an error) if the key was never set.
host.state.listList keys (with their current values) in this tenant's key-value state namespace, optionally filtered by prefix.
host.tool_shareShare one of this tenant's published tools with everyone (visibility: "public") or with a named group this tenant owns (visibility: "group", group: ). The tool keeps running in this tenant's own sandbox with this tenant's own secrets; a caller reaches it as . .
host.feedback.sendTell the host's humans what you needed: kind, up to 2048 bytes of text, optional context. Works before signup. Returns feedback_id.
host.feedback.listList your own feedback (newest first, status received). Anonymous callers get [].
host.resumeResume where you left off in one call (at most 4096 bytes): your tools with each one's last call status, unfinished runs, your newest notes, what changed on the host since your last call, and one suggested next_call. truncated names any section that was cut -- call that section's
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันโดเมน mcphost.dev แล้ว (registry ตรวจความเป็นเจ้าของโดเมน)
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตอบกลับใน 597 ms (HTTP 200)
ไม่ต้องล็อกอิน
คำอธิบายเครื่องมือ 1 ตัวมีข้อความที่ดูเหมือนสั่ง AI อ่านรายการด้านล่างก่อนติดตั้ง
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 2 จาก 3 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนคลาวด์ของผู้ทำ ต่อผ่านอินเทอร์เน็ตได้เลย ไม่ต้องลงโปรแกรม แต่ข้อมูลที่ส่งให้จะผ่านเซิร์ฟเวอร์ของผู้ทำ
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.126.1) เข้า registry 4 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต่อผ่าน URL จึงใช้กับโปรแกรมที่รับ remote MCP ได้ เช่น ChatGPT ที่เปิดโหมดนักพัฒนา
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, First Sale Scout
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.
Playbooks and a 14-day checklist for founders winning their first paying customers.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
where agents host their own tools · mcphost.dev · status · llms.txt · llms-install.md
Find it in the registry: dev.mcphost/mcphost — connect with the one-URL quickstart at mcphost.dev.
mcphost is a remote MCP server where your agent publishes its own tools. Your agent writes a tool mid-task, publishes it with one call, and keeps working: the tool is live with no restart and no deploy, and it outlives the conversation that built it. A schedule can fire it while you sleep, another agent can share it, and every run lands in a log you can read.
Under the hood, mcphost serve is one Rust binary that speaks streamable-HTTP MCP at a single endpoint. Everything is a tool call: publish, run, schedule, log, meter, store secrets, share with another agent, act as one of your end users over OAuth. There is no dashboard; /status is the one page, and the operator works through admin.* tools on the same endpoint.
Measured, not promised: p95 34.2 ms across 200 concurrent calls with zero errors, committed next to the test that produces it. The public site is mcphost.dev; the machine-readable summary at /llms.txt is generated from the same source as the quickstart below (docs/agent-quickstart.md, scripts/gen-agent-docs.sh).
Paste one line into your client and it has mcphost. Your agent's first call creates its account on that connection: no signup form, no key to paste.
Claude Code
claude mcp add --transport http mcphost https://mcphost.dev/mcp
Docs: https://code.claude.com/docs/en/mcp (checked 2026-10-09)
Cursor
Add to Cursor, or add https://mcphost.dev/mcp to your MCP config directly.
Docs: https://docs.cursor.com/en/tools/mcp (checked 2026-10-09)
VS Code
Add to VS Code, or add https://mcphost.dev/mcp to your MCP config directly.
Docs: https://code.visualstudio.com/api/extension-guides/ai/mcp (checked 2026-10-09)
GitHub Copilot in VS Code
{
"servers": { "mcphost": { "type": "http", "url": "https://mcphost.dev/mcp" } } }
Docs: https://code.visualstudio.com/docs/agent-customization/mcp-servers (checked 2026-10-21)
Claude.ai
Docs: https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp (checked 2026-10-09)
ChatGPT
Docs: https://platform.openai.com/docs/mcp (checked 2026-10-09)
Codex CLI
codex mcp add mcphost --url https://mcphost.dev/mcp
Docs: https://developers.openai.com/codex/mcp (checked 2026-10-09)
Gemini CLI
gemini mcp add --transport http mcphost https://mcphost.dev/mcp
Docs: https://geminicli.com/docs/tools/mcp-server/ (checked 2026-10-09)
OpenCode
opencode mcp add mcphost --url https://mcphost.dev/mcp
Docs: https://opencode.ai/docs/mcp-servers/ (checked 2026-10-09)
Amp
amp mcp add mcphost https://mcphost.dev/mcp
Docs: https://ampcode.com/manual#mcp (checked 2026-10-09)
Goose
Docs: https://goose-docs.ai/docs/getting-started/using-extensions/ (checked 2026-10-09)
Warp
Docs: https://docs.warp.dev/agents/capabilities/mcp/ (checked 2026-10-09)
Windsurf
{
"mcpServers": { "mcphost": { "url": "https://mcphost.dev/mcp" } } }
Docs: https://docs.windsurf.com/windsurf/cascade/mcp (checked 2026-10-09)
Cline / Roo
{
"mcpServers": { "mcphost": { "type": "streamableHttp", "url": "https://mcphost.dev/mcp" } } }
Docs: https://docs.cline.bot/mcp/configuring-mcp-servers (checked 2026-10-09)
SDKs
{
"name": "mcphost", "type": "url", "url": "https://mcphost.dev/mcp" }
Docs: https://platform.claude.com/docs/en/agents-and-tools/mcp-connector (checked 2026-10-21)
See the live status page and the Acceptable Use Policy before you point production traffic at it. Plans and limits: plans / /plans.json (same numbers billing.plans returns, and docs/plans.md). Every error payload carries a help_url pointing at a generated /help/ page explaining it.
Support: support channel not configured (MCPHOST_SUPPORT_URL is unset).
Every release is a git tag, and every change is in CHANGELOG.md.
Ship an MCP tool, not a deployment project.
mcphost lets an agent create the tool it needs, mid-task, without a human in the loop: sign up with one unauthenticated tool call, publish with the next, and the new tool is live immediately — no restart, no deploy, no review queue.
Measured (panel run 0.26.3-20260908T085001Z, 21 sessions): median time from signup to a tenant's first successful host.tool.publish is 30.7s; median time from signup to a successful call on that tenant's own tool is 42.4s.
https://mcphost.dev/mcp -- paste that URL into your MCP client's config. No signup call, no credentials, nothing to paste into a header.host.quickstart() is read-only and hands back a worked example before you commit to anything; any other host.*/ billing.* call creates your tenant right then, on this connection, with no signup call at all -- host.whoami() is the simplest: host.whoami()
onboarding.url once, in that same response, and save it -- it's this tenant's own address and its credential in one; reconnecting through it later is how you come back as this same tenant. onboarding.memory_hint names where agents conventionally keep it. Reconnect rule: a later call on this SAME connection without a key is refused, naming the tenant you already are (data.tenant on the tenant_key_missing response) -- it never creates a second tenant. Use onboarding.url for every call from here on.onboarding.url. host.quickstart()'s own starter_tool is a ready-to-publish python spec; its publish_call is exactly: host.tool_publish(name="table_note", kind="python", spec={"source": "import mcphost\n\ndef main(args):\n mcphost.table.create(name='quickstart_notes', columns={'note': 'text'})\n mcphost.table.append(table='quickstart_notes', rows=[{'note': args.get('note', '')}])\n return {'appended': 1}\n"})
Three real kinds: submit code (python -- source required, args_schema/requirements inferred if omitted; js -- JavaScript source defining main(args), args_schema inferred if omitted) or wrap an API you already use (http -- url and method required, args_schema inferred if omitted). echo is a stub for testing the pipes, not a real tool. Before publishing anything, dry-run with host.tool_publish({..., dry_run: true}) -- every gate (secrets, env, network, deps, name, kind, spec size) reported at once, no tool row written -- or host.spec_test(kind, spec, invocations) for up to 5 example calls through the same sandbox a real call uses.
host.tool_test(name, args) dry-runs an already-published tool by name, or call it directly as . (its own entry in your tools/list): host.tool_test(name="table_note", args={"note": "hello"})
try_before_call: args may be omitted on host.tool_test -- the host then runs one example generated from the tool's own schema and returns it as example_args.
host.invite.create() returns an /i/ /mcp URL -- whoever connects there and makes their own first call gets a fresh tenant already in contact with you, with any tool names passed as share already shared (see "Share a tool, not a key" in www/llms.txt for sharing one tool while keeping its own key hidden): host.invite.create()
onboarding.url and the sentence "Claim this backend so it belongs to you: ." Never print the personal URL or the key anywhere but that one handoff.Also useful once you're past the first call: billing.plans()/ billing.status() for plan and quota; host.tool.list()/ host.tool.logs(name)/host.tool.remove(name)/host.usage(window) to inspect and manage; host.secret.set/host.secret.list() for credentials a published tool needs (secrets stored AES-256-GCM encrypted, with a separate plain env map alongside for everything that isn't one). Pass expose_spec: true on host.tool.share (or share names on host.invite.create) to also let a sharee read a tool's source, not just call it -- they read it with host.tool.spec_shared(tool=" . "); shared without expose_spec, the same call fails spec_not_exposed (see "Share a tool, not a key" in www/llms.txt for the full worked example). host.tool.share also takes scopes (what the grantee may do: call, read_source, fork; default ["call"]; url shares allow only call) and rate_per_hour_per_caller; a grantee with fork copies the tool with host.tool.fork(owner, tool, as), and after host.tool.unshare a past caller's next call fails share_revoked.
A client that can't hold a persistent connection across calls -- so there is no session for mcphost to implicitly bind a tenant to -- signs up directly instead of relying on its first call to create one:
tools/list with no credentials. The only tool offered is signup.signup(name). The response contains tenant, key (a bearer token, shown once), namespace, endpoint, and claim_url. Signup is rate-limited to 5 per IP per hour. Pass source (e.g. signup(name, source: "hn")) to tag which channel this signup came from -- recommended values are hn, reddit, discord, registry, plugin, docs; it's echoed back in the response and broken out in admin healthz, but never required. If signups are paused (an operator's kill switch for an abuse spike), the call fails with signup_paused and a retry_after_secs; try again later. An operator pauses and resumes signups without a shell with the admin tool admin.signup_pause (message to pause, optional until; resume: true toตัดมาแค่ช่วงต้น อ่านต่อใน repo