Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Live runtime data from a running Flutter app: exceptions, logs, network, frames, diagnosis.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"flutter-lamp": {
"command": "npx",
"args": [
"-y",
"flutter-lamp"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add flutter-lamp -- npx -y flutter-lampวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"flutter-lamp": {
"command": "npx",
"args": [
"-y",
"flutter-lamp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"flutter-lamp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"flutter-lamp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 6 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub itsonu ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.21.0) เข้า registry 38 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, topo^alpin
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.
Avalanche bulletins and mountain weather forecasts for any place in the Alps.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
An MCP server that connects Claude Code, Claude Desktop, Cursor, Codex & Gemini directly to a running Flutter app through the Dart VM Service Protocol — streaming exceptions, logs, network calls, frame timings and memory as structured data, plus an evidence-first root-cause diagnosis engine and a live browser dashboard.
Today you debug Flutter with your AI by copy-pasting stack traces, flutter run output and DevTools screenshots. The AI is blind between messages.
Flutter Lamp makes the AI runtime-aware. It reads the app's live state over official Flutter/Dart APIs (never scraping DevTools), so instead of *"paste the error"* the AI can ask the app *"what just happened, and why?"*
❌ You: *pastes 40 lines of red stack trace*
✅ AI: connect_vm → get_exceptions → diagnose_runtime → "RenderFlex overflow in Column at home.dart:42, triggered right after GET /api/user returned 500. Confidence 85%. Fix: …"
dart:developer)dart:io profiling — covers Dio & package:http, no interceptor neededhttp://127.0.0.1:7373 — streams everything over WebSocket, independent of the AI connection| Tool | Purpose | Safety |
|---|---|---|
connect_vm | Connect to a running app's Dart VM Service (ws:// or http://). | mutates |
ensure_tcp_device | Android transports; recommend wireless, optionally promote USB. | mutates |
runtime_health | One-call triage — verdict plus exception/network/frame/log/memory summary. | read-only |
what_changed | Evidence from the window before a failure, with a timeline. | read-only |
get_navigation | Current route and recent transitions, with per-route failures. | read-only |
get_rebuilds | Widget rebuild hotspots resolved to widget, file and line. | read-only |
get_state_activity | Riverpod, Provider and Bloc activity over time, and how often it coincides with build-heavy frames. | read-only |
export_session | The whole session as versioned JSON — brief (diagnoses + cited evidence) or full. | read-only |
explain_diagnosis | Why a diagnosis was reached: resolved evidence, alternatives, gaps. | read-only |
get_capabilities | Active collectors, tool safety classes, what cannot be observed. | read-only |
runtime_status | Connection, session, reconnect state, event counts, retention window, what the session has cost in responses, and the VM-to-host clock offset. | read-only |
get_logs | Console + dart:developer logs (filter by severity / source / text). | read-only |
get_exceptions | Framework & unhandled exceptions with stack traces. | read-only |
get_frames | Frame build/raster timings; onlyJanky filter. | read-only |
get_network | HTTP requests (Dio & package:http); headers + timing on failures. | read-only |
get_widget_tree | Widget-tree snapshot from the Flutter Inspector. | read-only |
get_selected_widget | Widget currently selected in the Inspector. | read-only |
get_memory | Dart heap + external memory (MB). | read-only |
get_timeline | Recent VM timeline events (build/paint/layout/GC). | mutates |
diagnose_runtime | Root cause with a stable cause label, evidence ids, timeline, alternatives, and coverage — including which categories nothing could observe. | read-only |
diagnose_performance | Why the app is janky — percentiles, phase split, rebuild attribution. | read-only |
get_dashboard_url | URL of the live browser dashboard. | read-only |
mutates means the tool changes app or VM state, not your project — nothing here writes code or files. connect_vm enables dart:io HTTP timeline logging on the app so network capture works; get_timeline with recordFrom: true changes the VM's recording flags. Every tool carries an MCP readOnlyHint annotation so a client can enforce this itself.
Agents should not call all of them. The recommended flow is runtime_health → what_changed → a targeted get_* → diagnose_runtime; see AI Agent Integration.
Requires Node ≥ 20. Nothing to clone — npx fetches it on first run:
npx -y flutter-lamp
Or install it globally:
npm install -g flutter-lamp
From source
git clone https://github.com/itsonu/flutter-lamp.git
cd flutter-lamp npm install npm run build node dist/index.js
Claude Code plugin (recommended) — installs the MCP server *and* the flutter-runtime-diagnosis skill in one step:
/plugin marketplace add itsonu/flutter-lamp
/plugin install flutter-lamp@flutter-lamp
The plugin pins an exact, published server version. Flutter Lamp is also listed in the MCP Registry as io.github.itsonu/flutter-lamp.
Or add the server to your MCP client config yourself, then restart the client.
Claude Code — .mcp.json in your project:
{
"mcpServers": { "flutter-lamp": { "command": "npx", "args": ["-y", "flutter-lamp"] } } }
Or from the CLI:
claude mcp add --scope user flutter-lamp -- npx -y flutter-lamp
--scope user makes it available in every project; drop it to register for the current project only.
Cursor (~/.cursor/mcp.json) and Claude Desktop (claude_desktop_config.json) use the same mcpServers shape.
Running from a clone instead? Point command at node and args at /absolute/path/to/flutter-lamp/dist/index.js.
Optional environment variables:
| Var | Default | Meaning | |
|---|---|---|---|
DASHBOARD_PORT | 7373 | Dashboard HTTP/WS port. | read-only |
DASHBOARD_HOST | 127.0.0.1 | Bind address (localhost only by default). | read-only |
DASHBOARD_DISABLE | — | Set to 1 to disable the dashboard. | read-only |
FLUTTER_LAMP_REDACT | on | Set to off to keep raw credential values. | read-only |
FLUTTER_LAMP_REDACT_EXTRA | — | Comma-separated extra header-name patterns to redact. | read-only |
flutter run
Copy the line it prints:
A Dart VM Service on <device> is available at: http://127.0.0.1:PORT/TOKEN=/
Tip:
flutter run --vm-service-port=8181gives a stable URI across restarts.
and tell me why it's throwing."* With the bundled skill, Claude Code runs the whole flow (connect → gather → diagnose_runtime) automatically and never asks you to paste logs when the VM Service is reachable.A flutter run started over USB loses its VM Service tunnel the moment the cable moves; one started over a TCP transport does not. Ask the server which transports exist:
ensure_tcp_device # read-only: lists transports, recommends one
ensure_tcp_device { promote: true } # puts a USB-only device on TCP (needs the cable once)
Then launch against the wireless serial it recommends:
flutter run -d 192.168.88.3:5555
The cable is only needed for the one-time promotion. Reverse it any time with adb usb.
A zero-dependency dark UI (native HTTP + WebSocket, no build step) that streams runtime data as it happens:
Overview — a session report: health, FPS, memory, worst frame, MCP activity, and findings that link through to the events behind them (the worst-frame finding opens the timeline filtered to that frame) · Logs (search / filter / auto-scroll) · Network (expandable headers & timing) · Exceptions (expandable stack traces) · Timeline · Performance (live canvas charts) · MCP — which agent connected, every tool it called, with latency, errors and response size · Inspector — which inspection links exist and which are pull-only · Diagnostics — the measured topology, per-collector health, and what this target cannot observe at all.
Controls: pause/resume · clear view · export JSON · per-tab search · auto-reconnect.
The UI distinguishes states that look alike and are not: 0 MB is a measurement, not sampled yet is the absence of one, and an empty tab says whether a filter is hiding rows, the collector is blind on this target, or the collector is watching and has seen nothing. Readings taken before a disconnect are labelled as such rather than left looking live.
Running Flutter app
│ Dart VM Service Protocol (JSON-RPC over WebSocket) ▼ VmService client ──▶ Collectors (log · exception · frame · network · …) │ ▼ RuntimeStore (one centralized, capped event stream; every event: timestamp · source · severity · category) │ │ ┌──────────┘ └──────────┐ ▼ ▼ MCP tools (stdio) Dashboard (HTTP + WebSocket) → Claude Code / Cursor / … → your browser
Everything flows through one event store. Adding a new runtime source = implement the Collector interface and register it — no other layer changes. Design principles: official Flutter/Dart APIs only, structured JSON over text, never scrape DevTools, and never claim a cause the evidence doesn't support.
dart:io HTTP profiling are not available in release builds.dart:io HTTP, so requests are fetched when get_network or diagnose_runtime runs — not streamed continuously.Debug.PauseException needs pause-on-exception enabled in the app to fire. Flutter.Error is posted by the widget inspector only while structured error reporting is on, which the framework disables in profile mode and on the webตัดมาแค่ช่วงต้น อ่านต่อใน repo