@atezer/figma-mcp-bridge 1.6.4 → 1.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -5
- package/dist/core/plugin-bridge-server.js +1 -1
- package/dist/local-plugin-only.js +1 -1
- package/dist/local.js +1 -1
- package/f-mcp-plugin/ui.html +25 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,14 +19,16 @@ Her şey **bilgisayarınızda** kalır. Tasarım verileriniz internete gönderil
|
|
|
19
19
|
## Öne çıkan özellikler
|
|
20
20
|
|
|
21
21
|
- **46 araç** — okuma, yazma, export, variable yönetimi, bileşen arama ve daha fazlası
|
|
22
|
-
- **Figma API token tüketmez
|
|
22
|
+
- **Figma API token tüketmez\*** — Varsayılan olarak plugin üzerinden çalışır, Figma API kotanızı kullanmaz
|
|
23
23
|
- **Veri güvenliği** — Tasarım verisi sadece kendi bilgisayarınızda kalır (Zero Trust)
|
|
24
24
|
- **Çoklu dosya** — Aynı anda birden fazla Figma/FigJam dosyası ile çalışabilirsiniz
|
|
25
25
|
- **Çoklu AI aracı** — Claude ve Cursor aynı anda kullanılabilir (farklı portlarda)
|
|
26
26
|
- **SVG/PNG export** — Vektörel veya bitmap, toplu export (1-50 node)
|
|
27
|
-
- **REST API desteği** —
|
|
27
|
+
- **REST API desteği** — İsteğe bağlı token ile yorum okuma, versiyon geçmişi, görsel export
|
|
28
28
|
- **Figma Desktop + Tarayıcı** — Her ikisinde de çalışır
|
|
29
29
|
|
|
30
|
+
> \* **REST API isteğe bağlıdır.** Temel araçlar (okuma, yazma, export, variable) token olmadan plugin üzerinden çalışır. Yorum okuma, versiyon geçmişi gibi ek özellikler için Figma API token'ı ekleyebilirsiniz — plugin'deki Advanced panelinden girin, kalan API limitinizi plugin üzerinde takip edin.
|
|
31
|
+
|
|
30
32
|
## Hızlı başlangıç (3 adım)
|
|
31
33
|
|
|
32
34
|
### 1. Node.js kurun
|
|
@@ -163,7 +165,7 @@ Detaylı sorun giderme: [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)
|
|
|
163
165
|
|
|
164
166
|
| Bilgi | Kaynak |
|
|
165
167
|
|-------|--------|
|
|
166
|
-
| Güncel sürüm | **1.6.
|
|
168
|
+
| Güncel sürüm | **1.6.5** ([package.json](package.json)) |
|
|
167
169
|
| Değişiklik geçmişi | [CHANGELOG.md](CHANGELOG.md) |
|
|
168
170
|
| GitHub sürümleri | [Releases](https://github.com/atezer/FMCP/releases) |
|
|
169
171
|
| npm paketi | [@atezer/figma-mcp-bridge](https://www.npmjs.com/package/@atezer/figma-mcp-bridge) |
|
|
@@ -196,9 +198,25 @@ Detaylı sorun giderme: [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)
|
|
|
196
198
|
- **KVKK / GDPR uyumlu** mimari
|
|
197
199
|
- Detay: [PRIVACY.md](PRIVACY.md)
|
|
198
200
|
|
|
199
|
-
## Kurumsal kullanım
|
|
201
|
+
## Kurumsal kullanım (Tüm şirkette tek seferde)
|
|
202
|
+
|
|
203
|
+
Plugin'i herkesin tek tek yüklemesi gerekmez. Figma Organization hesabınız varsa plugin'i **private plugin** olarak yayınlayabilirsiniz:
|
|
204
|
+
|
|
205
|
+
**Publish plugin** → **Publish to** → **Organizasyon adınız (Private)** seçin.
|
|
206
|
+
|
|
207
|
+
Yayınladıktan sonra:
|
|
208
|
+
- Tüm ekip üyeleri **Plugins** menüsünden tek tıkla erişir
|
|
209
|
+
- Kimsenin "manifest import" yapmasına gerek kalmaz
|
|
210
|
+
- Plugin güncellemelerini merkezden yönetirsiniz
|
|
211
|
+
- Review süreci yok (private plugin) — yayınladıktan hemen sonra kullanılabilir
|
|
212
|
+
|
|
213
|
+
**Gereksinimler:**
|
|
214
|
+
- Figma **Organization** veya **Enterprise** planı
|
|
215
|
+
- Yayınlama: Figma → Plugins → Publish → **Publish to** kısmında organizasyonunuzu seçin
|
|
216
|
+
|
|
217
|
+
> Her kullanıcının kendi bilgisayarında sadece AI aracı config'ini (Claude/Cursor) ayarlaması yeterli. Plugin zaten şirketin Figma'sında hazır olur.
|
|
200
218
|
|
|
201
|
-
|
|
219
|
+
Kurumsal özellikler (audit log, air-gap, org plugin detayı): [ENTERPRISE.md](docs/ENTERPRISE.md)
|
|
202
220
|
|
|
203
221
|
## Lisans
|
|
204
222
|
|
|
@@ -247,7 +247,7 @@ export class PluginBridgeServer {
|
|
|
247
247
|
logger.info({ clientId, fileKey: incomingFileKey, fileName: incomingFileName }, "Plugin bridge: client registered (fileKey=%s, fileName=%s)", incomingFileKey, incomingFileName);
|
|
248
248
|
ws.send(JSON.stringify({
|
|
249
249
|
type: "welcome",
|
|
250
|
-
bridgeVersion: "1.6.
|
|
250
|
+
bridgeVersion: "1.6.5",
|
|
251
251
|
port: this.port,
|
|
252
252
|
clientId,
|
|
253
253
|
multiClient: true,
|
|
@@ -89,7 +89,7 @@ export async function main() {
|
|
|
89
89
|
bridge.start();
|
|
90
90
|
const server = new McpServer({
|
|
91
91
|
name: "F-MCP ATezer Bridge (Plugin-only)",
|
|
92
|
-
version: "1.6.
|
|
92
|
+
version: "1.6.5",
|
|
93
93
|
});
|
|
94
94
|
// ---- figma_list_connected_files (multi-client discovery) ----
|
|
95
95
|
server.registerTool("figma_list_connected_files", {
|
package/dist/local.js
CHANGED
package/f-mcp-plugin/ui.html
CHANGED
|
@@ -232,14 +232,28 @@
|
|
|
232
232
|
</div>
|
|
233
233
|
<div id="token-status" style="font-size:10px;color:rgba(255,255,255,0.35);margin-top:3px;display:none;"></div>
|
|
234
234
|
<div id="token-expiry-info" style="font-size:9px;color:rgba(255,255,255,0.3);margin-top:2px;display:none;"></div>
|
|
235
|
+
<div id="token-expiry-note" style="font-size:8px;color:rgba(255,255,255,0.2);margin-top:1px;display:none;">Figma'daki token suresiyle eslestiginden emin olun</div>
|
|
235
236
|
<div id="rate-limit-bar" style="display:none;margin-top:4px;">
|
|
236
|
-
<div style="display:flex;justify-content:space-between;font-size:9px;color:rgba(255,255,255,0.4);">
|
|
237
|
-
<span>API Limit</span>
|
|
237
|
+
<div style="display:flex;justify-content:space-between;align-items:center;font-size:9px;color:rgba(255,255,255,0.4);">
|
|
238
|
+
<span style="display:flex;align-items:center;gap:3px;">API Limit <span id="rate-limit-info" onclick="var t=document.getElementById('rate-limit-tip');if(t)t.style.display=t.style.display==='block'?'none':'block';" style="cursor:pointer;display:inline-flex;align-items:center;justify-content:center;width:11px;height:11px;border-radius:50%;border:1px solid rgba(255,255,255,0.25);font-size:7px;color:rgba(255,255,255,0.4);user-select:none;">i</span></span>
|
|
238
239
|
<span id="rate-limit-text">—</span>
|
|
239
240
|
</div>
|
|
241
|
+
<div id="rate-limit-tip" style="display:none;font-size:8px;color:rgba(255,255,255,0.35);margin-top:3px;padding:4px 6px;background:rgba(255,255,255,0.05);border-radius:3px;line-height:1.5;">
|
|
242
|
+
<div style="margin-bottom:3px;color:rgba(255,255,255,0.5);">Limiti ne tuketir?</div>
|
|
243
|
+
<div>○ Yorum okuma/yazma</div>
|
|
244
|
+
<div>○ Versiyon gecmisi</div>
|
|
245
|
+
<div>○ Gorsel export (REST ile)</div>
|
|
246
|
+
<div>○ Dosya bilgisi (REST ile)</div>
|
|
247
|
+
<div style="margin-top:3px;color:rgba(255,255,255,0.5);">Limiti tuketmeyen (sinirsiz):</div>
|
|
248
|
+
<div>● Dosya okuma, yazma, silme</div>
|
|
249
|
+
<div>● Variable/token yonetimi</div>
|
|
250
|
+
<div>● Bilesen arama, export (plugin)</div>
|
|
251
|
+
<div>● Screenshot, frame olusturma</div>
|
|
252
|
+
</div>
|
|
240
253
|
<div style="height:3px;background:rgba(255,255,255,0.08);border-radius:2px;overflow:hidden;margin-top:2px;">
|
|
241
254
|
<div id="rate-limit-fill" style="height:100%;background:#4ecdc4;border-radius:2px;transition:width 0.3s;width:100%;"></div>
|
|
242
255
|
</div>
|
|
256
|
+
<div id="rate-limit-note" style="font-size:8px;color:rgba(255,255,255,0.2);margin-top:2px;display:none;">REST API cagrisi sonrasi guncellenir</div>
|
|
243
257
|
<div id="rate-limit-warning" style="display:none;font-size:9px;margin-top:2px;font-weight:600;"></div>
|
|
244
258
|
</div>
|
|
245
259
|
</div>
|
|
@@ -974,13 +988,22 @@
|
|
|
974
988
|
fillEl.style.animation = 'none';
|
|
975
989
|
}
|
|
976
990
|
}
|
|
991
|
+
// Hide "no data" note when real data exists
|
|
992
|
+
var noteEl = document.getElementById('rate-limit-note');
|
|
993
|
+
if (noteEl) noteEl.style.display = 'none';
|
|
977
994
|
} else if (barEl) {
|
|
978
995
|
barEl.style.display = hasToken ? 'block' : 'none';
|
|
979
996
|
if (textEl) textEl.textContent = '—';
|
|
980
997
|
if (fillEl) { fillEl.style.width = '100%'; fillEl.style.animation = 'none'; }
|
|
981
998
|
var warnEl2 = document.getElementById('rate-limit-warning');
|
|
982
999
|
if (warnEl2) warnEl2.style.display = 'none';
|
|
1000
|
+
// Show "no data" note when token exists but no rate limit data
|
|
1001
|
+
var noteEl2 = document.getElementById('rate-limit-note');
|
|
1002
|
+
if (noteEl2) noteEl2.style.display = hasToken ? 'block' : 'none';
|
|
983
1003
|
}
|
|
1004
|
+
// Token expiry note
|
|
1005
|
+
var expiryNoteEl = document.getElementById('token-expiry-note');
|
|
1006
|
+
if (expiryNoteEl) expiryNoteEl.style.display = (hasToken && expiresAt > 0) ? 'block' : 'none';
|
|
984
1007
|
requestUiResize();
|
|
985
1008
|
}
|
|
986
1009
|
|
package/package.json
CHANGED