Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
US bank, savings and credit-card signup bonuses, each source-checked, with expiry dates.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
ใช้ได้ทั้ง Claude บนเว็บ แอปคอมพิวเตอร์ และมือถือ:
https://aiagentscity.com/benefits/mcpพิมพ์คำสั่งนี้ใน Terminal
claude mcp add --transport http benefits-city https://aiagentscity.com/benefits/mcpวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"benefits-city": {
"url": "https://aiagentscity.com/benefits/mcp"
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"benefits-city": {
"type": "http",
"url": "https://aiagentscity.com/benefits/mcp"
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ChatGPT ต่อได้เฉพาะ server ที่อยู่บนอินเทอร์เน็ต:
https://aiagentscity.com/benefits/mcpชื่อเมนูอาจต่างกันเล็กน้อยตามแพ็กเกจและรุ่นของแอป
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
ชื่อและคำอธิบายเครื่องมือตามที่ server ตอบมาเมื่อ 8 พ.ย. 2569 ผู้ทำเป็นคนเขียน ไม่ใช่เรา แสดงเป็นข้อความล้วน
search_bonusesUse when a user wants to find a US bank account, savings, credit card or brokerage signup bonus, or asks which offers are worth opening. Returns matching offers sorted by bonus value, highest first — except when balance_transfer is true, which sorts by intro window instead.
get_bonusUse before recommending an offer, to read its exact requirements, minimum deposit, direct-deposit rules, expiry date, state availability and the date its terms were last verified. Quote the requirements rather than paraphrasing money amounts.
expiring_soonUse when timing matters — a user asking what is about to end, or whether to act now. Offers with no stated end date are never included here.
compare_bonusesUse when a user is choosing between specific offers. Returns each offer's key fields plus a summary naming the highest bonus and the earliest expiry.
benefits_api_docsUse when you need field definitions, ordering guarantees or the error format before calling another tool.
benefits_examplesUse to copy a working example call instead of guessing tool arguments.
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 10 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub entradox ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตอบกลับใน 996 ms (HTTP 200)
ไม่ต้องล็อกอิน
อ่านคำอธิบายเครื่องมือ 6 ตัวแล้ว ไม่พบคำสั่งแอบแฝงถึง AI
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 3 จาก 3 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนคลาวด์ของผู้ทำ ต่อผ่านอินเทอร์เน็ตได้เลย ไม่ต้องลงโปรแกรม แต่ข้อมูลที่ส่งให้จะผ่านเซิร์ฟเวอร์ของผู้ทำ
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.3.0) เข้า registry 38 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต่อผ่าน URL จึงใช้กับโปรแกรมที่รับ remote MCP ได้ เช่น ChatGPT ที่เปิดโหมดนักพัฒนา
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Valuein — SEC EDGAR Fundamentals & Smart-Money Data
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว 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.
Point-in-time, survivorship-free SEC EDGAR fundamentals + smart-money signals for AI agents.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
US bank account opening bonuses and credit card signup bonuses, verified by hand — served two ways:
| Audience | Interface | How |
|---|---|---|
| Humans | Server-rendered site: landing, filterable browse, bonus detail pages, agent docs | npm start → /, /bonuses, /bonuses/:id, /agents |
| Agents | MCP server — 6 tools over Streamable HTTP (POST /mcp) and stdio | npm start → /mcp · npm run mcp |
| Agents | JSON feeds + llms.txt | /api/bonuses.json, /api/bonuses/:id, /api/stats, /llms.txt |
| Operators | CLI, same data/logic as MCP, JSON on stdout | npm run cli -- … |
One database, two first-class interfaces. Live stats on the landing page are computed from the real data — they can't go stale.
cd ~/workspace/bank-bonus-agent
npm install # builds better-sqlite3 (metrics); with --ignore-scripts run npm rebuild better-sqlite3 npm run build # tsc -> dist/ npm run test # tsc + node:test suite (dist/tests) npm run freshness # daily source check -> data/review-queue.json (see REFRESH_PLAN.md) npm start # prestart seeds data/bonuses.json, then serves on PORT (default 3000)
Useful env vars:
| Var | Default | What |
|---|---|---|
PORT | 3000 | listen port (Railway injects its own) |
BASE_PATH | "" | mount under a subpath, e.g. /benefits — all links/assets/forms follow |
PUBLIC_URL | derived | canonical public URL for docs/llms.txt, e.g. https://aiagentscity.com/benefits |
BONUS_DB_PATH | data/bonuses.json | override the JSON store location |
Other commands: npm run mcp (stdio MCP server), npm run cli -- …, npm run seed (re-runnable upsert), npm run typecheck.
Streamable HTTP — any MCP-compatible client (Claude, Claude Code, Muse, …), no API key (see /auth.md):
POST {PUBLIC_URL}/mcp
Claude Code, one line:
claude mcp add --transport http benefits-city https://aiagentscity.com/benefits/mcp
Discovery: /server.json (MCP registry manifest, also at /.well-known/mcp.json), /.well-known/agent.json, /.well-known/mcp/server-card.json (generated from the live tool list), /openapi.json (OpenAPI 3.1), /auth.md, /llms.txt, /skill.md (also served as a skill://benefits-city/benefits-city/SKILL.md MCP resource), /docs (alias of /agents), and /changelog (+ /changelog.json, /feed.xml; data in changelog/changelog.json).
REST parity with the MCP tools: GET /api/search, /api/expiring, /api/compare?ids=a,b, /api/bonuses/:id, /api/bonuses.json, /api/stats — same filters, same public shaping, errors as {"error":{"type","message","code?","param?"}} (400 names the bad parameter; 404 for unknown/expired ids).
Claude Code / Claude Desktop config (via mcp-remote):
{
"mcpServers": { "benefits-city": { "command": "npx", "args": ["-y", "mcp-remote", "https://aiagentscity.com/benefits/mcp"] } } }
Local stdio (self-hosted): node dist/mcp-server.js after npm run build.
Example agent interactions:
# Which checking bonuses pay $400+ and don't require direct deposit?
search_bonuses({ "bonus_type": "bank_account", "min_bonus_amount_usd": 400, "direct_deposit_required": false })
get_bonus({ "id": "chase-total-checking-400" })
expiring_soon({ "days": 14 })
compare_bonuses({ "ids": ["bmo-checking-600", "sofi-checking-savings-400"] })
Same via shell (use node dist/cli.js directly when piping — npm run prints a banner):
node dist/cli.js search --type bank_account --state TX --min 300 --pretty
node dist/cli.js get chase-total-checking-400 --pretty node dist/cli.js expiring --days 30 node dist/cli.js compare bmo-checking-600 sofi-checking-savings-400
Via HTTP:
curl localhost:3000/api/bonuses.json | jq '.[].id'
curl localhost:3000/api/bonuses/us-bank-smartly-checking-450 curl localhost:3000/api/stats | jq '{total_offers, total_bonus_usd}' curl localhost:3000/llms.txt
| Tool | Inputs | Output | |||
|---|---|---|---|---|---|
search_bonuses | bonus_type? (bank_account\ | credit_card\ | savings\ | brokerage), state? (2-letter code; nationwide always matches), min_bonus_amount_usd?, direct_deposit_required?, query? (bank/product substring), limit? (1–100, default 25) | Array of bonus records, highest bonus first |
get_bonus | id | Full record, or typed not_found error | |||
expiring_soon | days? (1–365, default 30) | Records with stated expiry inside the window, soonest first. No-stated-expiry offers excluded | |||
compare_bonuses | ids (2–4) | { bonuses: [...], summary: { highest_bonus_usd, earliest_expiry } }, or typed not_found error listing unknown ids | |||
benefits_api_docs | — | Markdown docs: tools, fields, ordering guarantees, error format | |||
benefits_examples | — | Runnable example calls {title, tool, arguments} |
Every record returned by MCP/CLI/feeds is shaped by toPublic() (src/links.ts): the raw affiliate_url is never published; consumers get apply_url (our /go/:id tracked link), sponsored (bool) and disclosure_url. Ordering is bonus value descending (ties by id) and is never influenced by commissions (enforced by a test). Expired offers are never returned. Errors use {"error":{"type","message","code?","param?"}}.
Tool definitions live in src/mcp-tools.ts, shared by the stdio server and the Streamable HTTP transport so the contract can't drift. (Stateless HTTP follows the SDK pattern: one fresh server + transport per request.)
id (kebab-case) · bank_or_issuer · product_name · bonus_type (bank_account \| credit_card \| savings \| brokerage) · bonus_amount_usd (bank accounts: advertised bonus; credit cards: estimated USD value of the points/miles bonus — valuation basis stated in `requirements`) · bonus_points · annual_fee_usd · requirements[] (plain-English qualifying steps) · min_deposit_usd · direct_deposit_required · expiry_date (YYYY-MM-DD, null = no stated end) · states_available ("nationwide" or state-code array) · application_url · source_url (where live terms were confirmed) · last_verified_date · verification (issuer_page = the issuer's own page was fetched; aggregator_consensus = 3+ reputable listings agree; plus verified_at and sources[]) · status (active \| expired \| needs_review) · offer_history[] · eligibility (structured, nullable) · affiliate_url (input only — used by /go/:id, never published).
"Today" is the US Eastern calendar date: an offer valid through 9/30 is served all day on 9/30 ET.
33 records (15 bank account, 17 credit card, 1 savings). The base set was verified live on 2026-09-20; on 2026-09-30 (D-1518) the soonest-expiring and highest-impact records were re-verified, 4 offers were added from issuer pages, and unverifiable claims were deliberately left out. Every record carries source_url, verification and last_verified_date; nothing was invented. See REFRESH_PLAN.md.
Known caveats: for Chase and Wells Fargo no verbatim official offer-page URL surfaced, so application_url points at the page where terms were confirmed; BMO's record uses a Doctor of Credit page for both URL fields. Swap in true bank URLs / affiliate links later.
AFFILIATE_PLACEHOLDER in src/site.ts; also update the disclosure page's "Current status" section).npm run freshness reports expired / changed / amount-mismatch offers into a review queue; a human or agent edits seed-data/ — see REFRESH_PLAN.md.data/bonuses.json, atomic writes). Fine at this scale; move to Postgres/SQLite if concurrent writers ever appear.The app is Railway-ready (start script, PORT respected, engines: node >= 20, one native dep (better-sqlite3, prebuilt binaries), prestart seeds the DB). It lives at aiagentscity.com/benefits via reverse proxy with BASE_PATH=/benefits. Foolproof steps: [RAILWAY_DEPLOY.md](RAILWAY_DEPLOY.md).
src/
web-server.ts site + feeds + /mcp (Streamable HTTP) + /api/stats [npm start] site.ts server-rendered pages: landing, browse, detail, agents, about/disclosure/contact stats.ts live stats computed from the real data mcp-tools.ts MCP tool definitions (shared by stdio + HTTP) mcp-server.ts MCP server (stdio) — npm run mcp cli.ts operator CLI (JSON on stdout) db.ts JSON data store + query functions (search/get/expiring/list) compare.ts shared compare logic (MCP + CLI) seed.ts seed loader (validates, upserts AND prunes: seed-data/*.json is the source of truth) types.ts Bonus schema types links.ts apply-URL resolution, toPublic() shaping, disclosure wording meta.ts version constants, server.json + auth.md builders freshness.ts pure source-page classifier (blocked is not dead) freshness-cli.ts daily check runner -> data/review-queue.json (--canary proves it can go red) tests/ node:test suite (npm run test) skill/ product skill served over MCP (skill://benefits-city/benefits-city/SKILL.md) seed-data/ researched offers (bank-account, credit-card, savings, brokerage JSON files) data/ bonuses.json (generated by npm run seed / prestart; gitignored) public/assets/ site.css (no build step) public/llms.txt static reference copy (server generates the live one per-host) screenshots/ headless-Chromium captures of the pages REFRESH_PLAN.md how the feed stays fresh RAILWAY_DEPLOY.md foolproof Railway + reverse-proxy steps