Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Hands bulk reading to cheap OpenRouter models, masks secrets, checks each answer against the source
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
CHEAP_EYES_OPENROUTER_KEY, CHEAP_EYES_CONFIGค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"cheap-eyes": {
"command": "npx",
"args": [
"-y",
"cheap-eyes"
],
"env": {
"CHEAP_EYES_OPENROUTER_KEY": "ใส่ค่าของคุณ",
"CHEAP_EYES_CONFIG": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add cheap-eyes --env CHEAP_EYES_OPENROUTER_KEY='ใส่ค่าของคุณ' --env CHEAP_EYES_CONFIG='ใส่ค่าของคุณ' -- npx -y cheap-eyesเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"cheap-eyes": {
"command": "npx",
"args": [
"-y",
"cheap-eyes"
],
"env": {
"CHEAP_EYES_OPENROUTER_KEY": "ใส่ค่าของคุณ",
"CHEAP_EYES_CONFIG": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"cheap-eyes": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"cheap-eyes"
],
"env": {
"CHEAP_EYES_OPENROUTER_KEY": "ใส่ค่าของคุณ",
"CHEAP_EYES_CONFIG": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
CHEAP_EYES_CONFIG envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub st412m ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: CHEAP_EYES_OPENROUTER_KEY
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.2.1) เข้า registry 12 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, OpenTakeoff
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.
Construction takeoff for AI agents: load plans, set scale, measure, count, export with provenance.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
Cheap eyes for an expensive agent.
An AI agent's context is expensive. When it reads a big log, a long doc, a web page or a whole code tree, it burns that context on lines it mostly doesn't need. cheap-eyes is an MCP server that hands the reading to a cheap model. It then checks every line of that model's answer against the source, so the agent gets back a short answer it can trust.
A real header from the server (trimmed), with a stubbed model answer. The agent asked for every ERROR line after 08:10 in an app log, plus the traceback that follows it:
eyes_run result: 2026-09-26_152246-extract-889090
model: alias fast -> qwen/qwen3.6-35b-a3b (used: qwen/qwen3.6-35b-a3b) tokens in 412 / out 96; cost $0.000080; 2 ms check (extract): refs ok 4 / bad 1 — ok 4, ok~ 0, partial 0, not-in-input 0 L9 [bad] text differs from the source line --- untrusted model output --- L3| 2026-09-20 08:14:09.031 ERROR [sync] upload failed: timeout after 30 s L4| 2026-09-20 08:14:09.032 Traceback (most recent call last): L6| TimeoutError: timed out L8| 2026-09-20 08:15:31.550 ERROR [sync] upload failed: HTTP 503 from api.example.com L9| 2026-09-20 08:16:00.000 ERROR [sync] retry 2/3 failed --- end ---
The model quoted five lines. In the real log, line 9 says INFO [sync] retry 2/3 ok, so the model made up an error. The check compared each quote with the source line and flagged L9 as bad. The agent sees that before it relies on the answer.
[token], [key] and so on, in the files and in the task.| Runtime | Node.js ≥ 22.17, or Docker, or Home Assistant OS / Supervised |
| Architecture (Home Assistant app) | amd64, aarch64 |
| Network | outbound HTTPS to openrouter.ai, and to the web pages you name in a job; for claude.ai, a TLS reverse proxy reachable from the internet |
| Disk | about 56 MB installed, 33 MB of it pdfjs-dist with its CMaps and fonts; the optional @napi-rs/canvas adds a native binary of about 37 MB that text extraction does not need (npm install --omit=optional skips it) |
| OpenRouter | an API key with its own daily limit |
~/.config/cheap-eyes/config.json, or %APPDATA%\cheap-eyes\config.json on Windows (see Configuration).npx -y cheap-eyes check-config claude mcp add --env CHEAP_EYES_OPENROUTER_KEY=<OPENROUTER_KEY> --transport stdio cheap-eyes -- npx -y cheap-eyes
Claude Desktop, .mcp.json and a global install: installation.
Home Assistant renamed *add-ons* to *apps* in 2026.2; on older versions the same menus say *Add-ons* and *Add-on Store*.
Or by hand: Settings → Apps → App Store → ⋮ → Repositories → + Add, paste https://github.com/st412m/cheap-eyes, select Add.
openrouter_key, an http_token of at least 32 characters (openssl rand -hex 32 gives one) and your read_roots.Options and the connector URL: app documentation.
cheap-eyes serve --http runs the same server over Streamable HTTP with a token; the repository's Dockerfile and compose.example.yaml wrap it. See installation.
A JSON config file. The fields to set first:
| Field | What it is |
|---|---|
read_roots | The folders (or single files) the server may read. Absolute paths. |
models | Aliases: an alias like fast is a short name for a list of model ids. |
defaults | The alias each mode uses when a call names none. |
daily_budget_usd | Local spending cap per UTC day, default 1.0. |
{
"read_roots": ["/home/me/notes"], "models": { "fast": { "ids": ["qwen/qwen3.6-35b-a3b"], "params": { "reasoning": { "effort": "none" } } } }, "defaults": { "extract": "fast", "draft": "fast", "edits": "fast" } }
The key goes in the env var CHEAP_EYES_OPENROUTER_KEY, never in the file. Every field, env var and file location: configuration.
Run the HTTP server (or the Home Assistant app) and publish it through a reverse proxy that terminates TLS. The endpoint is:
https://<your-host>/private_<your-token>/mcp
Add it in claude.ai → Settings → Connectors → Add custom connector. A wrong path gets a bare 404, and there is no OAuth by design. See security.
You talk to your agent as usual. It calls cheap-eyes when a job fits. Pick the mode by what you want back:
Files can be text, HTML, PDF (with a text layer), Word (DOCX, DOC), RTF, PowerPoint (PPTX, PPT), OpenDocument text and presentations (ODT, ODP), EPUB, FB2 and mail (EML, MSG, attachments included), or an http(s) URL that the server fetches itself. Spreadsheets and scans are refused with the reason. Refs name the page, slide, chapter or attachment of a line: L40 (slide 3), L12 (attachment: offer.pdf, p.2) (formats).
Prompts you might type (the files must lie inside your read_roots):
What each check catches and misses: checks.
cheap-eyes pays off for reading by meaning over large text: logs, archives, long documents, web pages, "everything about X", chronologies. For exact lookups — a key, which blocks contain X, a list by a field, a value in a table — and for files under about 30 KB, grep, a ranged read or code is cheaper and more reliable. That is why spreadsheets are not read at all.
On a benchmark of 2026-09-30 with independent ground truth:
A snippet for CLAUDE.md or your Claude settings:
Reading by meaning over large text (logs, archives, long documents, web pages, "everything about X") → cheap-eyes eyes_run (extract/draft; fields → schema). Exact values, structure, small files (< ~30 KB) → grep / ranged read (no model: eyes_run mode grep). Verify any value from cheap-eyes against the source (eyes_result source) before relying on it.
To compare models on your own documents, run cheap-eyes bench.
eyes_run — does the job and returns a short, checked header.eyes_result — reads a stored result: pages, grep, the check report, the source text the model was given; cancels a running job.eyes_stats — spend today and all time, your key's status; on request, the model table.Inputs and outputs: tools.
No model is pinned in code. You name models in your config under aliases (fast, long, …), and switching means editing the config and restarting. Each alias lists model ids in priority order; if one can't be used, the next is tried. The example ids were valid on 2026-09-26 and will age. To pick new ones:
cheap-eyes models --candidates
This lists cheap Zero Data Retention models, and shows how well each of your aliases passed its checks on your own jobs. If your OpenRouter account's Guardrails don't allow a model, cheap-eyes skips it and marks it blocked by account. Allow it at openrouter.ai → Guardrails if you want it used.
With cheap models a job costs fractions of a cent. Your key's own daily limit on OpenRouter is the real ceiling. On top of that, daily_budget_usd (default $1 a day) stops calls before they would go over. More: models and spending.
ตัดมาแค่ช่วงต้น อ่านต่อใน repo