Figma Context MCP
Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
MCP server for programmatic image comparison and visual diff generation.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"image-diff": {
"command": "npx",
"args": [
"-y",
"@pulsemcp/image-diff-mcp-server"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add image-diff -- npx -y @pulsemcp/image-diff-mcp-serverวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"image-diff": {
"command": "npx",
"args": [
"-y",
"@pulsemcp/image-diff-mcp-server"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"image-diff": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pulsemcp/image-diff-mcp-server"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 6 พ.ย. 2569
ชื่อใน registry ยืนยันโดเมน pulsemcp.com แล้ว (registry ตรวจความเป็นเจ้าของโดเมน)
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.3) เข้า registry 5 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Figma Context MCP, Claude Real Video, Figma MCP Server
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.
Let any LLM watch a video locally — and search everything it has ever watched.
server ทางการของ Figma ส่งข้อมูลงานออกแบบให้ AI อ่าน เพื่อเปลี่ยนแบบเป็นโค้ดหรืออธิบายแบบได้ตรงขึ้น ต่อผ่านคลาวด์ของ Figma
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
A Model Context Protocol (MCP) server for programmatic image comparison and visual diff generation. Compares two images pixel-by-pixel, identifies clusters of visual differences, and generates heatmap visualizations.
Designed for comparing design mock screenshots against actual UI implementations.
cluster_gap using nearest-neighbor distance analysis, merging nearby clusters into meaningful groupsget_diff_of_imagesCompare two images and get structured diff results.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
source_image | string | Yes | - | Absolute path to the reference image |
target_image | string | Yes | - | Absolute path to the comparison image |
threshold | number | No | 0.1 | Color matching sensitivity (0-1, lower = more sensitive) |
include_aa | boolean | No | false | Count anti-aliased pixels as differences |
min_cluster_size | number | No | 4 | Minimum connected pixels to form a cluster |
cluster_gap | number | No | auto | Max pixel gap to merge nearby clusters. When omitted, an optimal gap is auto-computed using nearest-neighbor distance analysis with natural breaks. Set to 0 for no merging, or any positive integer for manual control. |
Returns:
identical: boolean indicating if images matchsummary: overall diff statistics (pixel counts, percentages, cluster count)clusters: array of diff regions with bounding boxes, severity ratings, and intensity metricsclustering: gap used, whether it was auto-computed, and suggested alternative gap valuesalignment (when images differ in size): position coordinates, confidence score, strategy used, and timingdimensions: width and height of the compared regionheatmapPath: file path to the generated heatmap imagecompositePath: file path to the heatmap overlaid on the source imageRequirements:
MCP tool call input (minimal — just the two required paths):
{
"name": "get_diff_of_images", "arguments": { "source_image": "/path/to/design-mock.png", "target_image": "/path/to/screenshot.png" } }
MCP tool call input (with all optional parameters):
{
"name": "get_diff_of_images", "arguments": { "source_image": "/path/to/design-mock.png", "target_image": "/path/to/screenshot.png", "threshold": 0.05, "include_aa": true, "min_cluster_size": 10, "cluster_gap": 15 } }
MCP response (same-size images with differences):
{
"content": [ { "type": "text", "text": "{\n \"identical\": false,\n \"summary\": {\n \"totalPixels\": 480000,\n \"diffPixels\": 737,\n \"diffPercentage\": 0.154,\n \"antiAliasedPixels\": 1034,\n \"matchingPixels\": 478229,\n \"clusterCount\": 11,\n \"description\": \"0.15% of pixels differ across 11 cluster(s). Severity breakdown: 5 major, 5 minor, 1 trivial.\"\n },\n \"clustering\": {\n \"gapUsed\": 4,\n \"autoGap\": true,\n \"suggestedSmallerGap\": 3,\n \"suggestedLargerGap\": 5\n },\n \"clusters\": [ ... ],\n \"heatmapPath\": \"/tmp/image-diff-output/heatmap-1234567890.png\",\n \"compositePath\": \"/tmp/image-diff-output/composite-1234567890.png\",\n \"dimensions\": { \"width\": 800, \"height\": 600 }\n}" } ] }
The text field contains the full JSON result as a string. When parsed, the full response shape looks like this:
Full parsed response shape (same-size images, with differences)
{
"identical": false, "summary": { "totalPixels": 480000, "diffPixels": 737, "diffPercentage": 0.154, "antiAliasedPixels": 1034, "matchingPixels": 478229, "clusterCount": 11, "description": "0.15% of pixels differ across 11 cluster(s). Severity breakdown: 5 major, 5 minor, 1 trivial." }, "clustering": { "gapUsed": 4, "autoGap": true, "suggestedSmallerGap": 3, "suggestedLargerGap": 5 }, "clusters": [ { "id": 1, "left": 444, "top": 157, "right": 504, "bottom": 165, "width": 61, "height": 9, "pixelCount": 170, "totalImagePixels": 480000, "areaPercentage": 0.035, "meanIntensity": 0.111, "maxIntensity": 0.343, "severity": "minor" } ], "heatmapPath": "/tmp/image-diff-output/heatmap-1234567890.png", "compositePath": "/tmp/image-diff-output/composite-1234567890.png", "dimensions": { "width": 800, "height": 600 } }
Full parsed response shape (identical images)
{
"identical": true, "summary": { "totalPixels": 480000, "diffPixels": 0, "diffPercentage": 0, "antiAliasedPixels": 0, "matchingPixels": 480000, "clusterCount": 0, "description": "Images are identical (no differences detected)." }, "clustering": { "gapUsed": 0, "autoGap": true, "suggestedSmallerGap": null, "suggestedLargerGap": null }, "clusters": [], "heatmapPath": "/tmp/image-diff-output/heatmap-1234567890.png", "compositePath": "/tmp/image-diff-output/composite-1234567890.png", "dimensions": { "width": 800, "height": 600 } }
Full parsed response shape (different-size images — auto-alignment)
{
"identical": false, "summary": { "totalPixels": 108800, "diffPixels": 9031, "diffPercentage": 8.301, "antiAliasedPixels": 329, "matchingPixels": 99440, "clusterCount": 7, "description": "8.30% of pixels differ across 7 cluster(s). Severity breakdown: 1 major, 3 moderate, 3 minor." }, "clustering": { "gapUsed": 4, "autoGap": true, "suggestedSmallerGap": 1, "suggestedLargerGap": 6 }, "clusters": [ { "id": 1, "left": 20, "top": 185, "right": 299, "bottom": 215, "width": 280, "height": 31, "pixelCount": 8372, "totalImagePixels": 108800, "areaPercentage": 7.695, "meanIntensity": 0.242, "maxIntensity": 0.244, "severity": "major" } ], "alignment": { "x": 680, "y": 212, "confidence": 0.993, "strategy": "opencv-zncc-hybrid", "alignmentTimeMs": 89, "templateImage": "target", "originalDimensions": { "source": { "width": 1024, "height": 768 }, "target": { "width": 320, "height": 340 } } }, "heatmapPath": "/tmp/image-diff-output/heatmap-1234567890.png", "compositePath": "/tmp/image-diff-output/composite-1234567890.png", "dimensions": { "width": 320, "height": 340 } }
Note: The alignment field only appears when images have different dimensions. The dimensions field reflects the size of the compared region (the template size after alignment, not the full scene). The compositePath field is optional in the interface but always present when called via the MCP tool.
All examples below use this dashboard as the source image (800x600):
When two images are pixel-identical, the engine short-circuits and returns immediately.
| Source | Target | Composite |
|---|---|---|
The composite overlay shows the source image with no heatmap highlights — because there are no differences.
Structured output
{
"identical": true, "summary": { "totalPixels": 480000, "diffPixels": 0, "diffPercentage": 0, "antiAliasedPixels": 0, "matchingPixels": 480000, "clusterCount": 0, "description": "Images are identical (no differences detected)." }, "clustering": { "gapUsed": 0, "autoGap": true, "suggestedSmallerGap": null, "suggestedLargerGap": null } }
The target has updated stat values ("12,847" -> "13,205", "$48,290" -> "$52,180") and different percentage text. The engine finds 11 clusters (auto gap=4) across the changed text and numbers.
| Source | Target |
|---|---|
| Standalone Heatmap | Composite Overlay |
|---|---|
The standalone heatmap shows only the diff pixels on a transparent background — yellow means lower intensity, red means higher intensity. The composite overlay blends the heatmap onto the source image so you can see exactly where differences occur in context.
Structured output (11 clusters, top 3 shown)
{
"identical": false, "summary": { "totalPixels": 480000, "diffPixels": 737, "diffPercentage": 0.154, "antiAliasedPixels": 1034, "matchingPixels": 478229, "clusterCount": 11, "description": "0.15% of pixels differ across 11 cluster(s). Severity breakdown: 5 major, 5 minor, 1 trivial." }, "clustering": { "gapUsed": 4, "autoGap": true, "suggestedSmallerGap": 3, "suggestedLargerGap": 5 }, "clusters": [ { "id": 1, "left": 444, "top": 157, "right": 504, "bottom": 165, "width": 61, "height": 9, "pixelCount": 170, "areaPercentage": 0.035, "meanIntensity": 0.111, "maxIntensity": 0.343, "severity": "minor" }, { "id": 2, "left": 450, "top": 125, "right": 478, "bottom": 142, "width": 29, "height": 18, "pixelCount": 112, "areaPercentage": 0.023, "meanIntensity": 0.677, "maxIntensity": 0.738, "severity": "major" }, { "id": 3, "left": 284, "top": 126, "right": 308, "bottom": 142, "width": 25, "height": 17, "pixelCount": 91, "areaPercentage": 0.019, "meanIntensity": 0.682, "maxIntensity": 0.738, "severity": "major" } ] }
_8 more clusters omitted._
The entire page is re-rendered with a serif font (Georgia). Every text element shifts slightly, producing many glyph-level differences. With the default auto-gap, the engine computes an optimal `c
ตัดมาแค่ช่วงต้น อ่านต่อใน repo