Figma Context MCP
Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Public Spotify metadata, lyrics and podcasts for LLM agents. No API key, read-only.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"spotifyscraper": {
"command": "uvx",
"args": [
"spotifyscraper"
],
"env": {
"SPOTIFY_SP_DC": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add spotifyscraper --env SPOTIFY_SP_DC='ใส่ค่าของคุณ' -- uvx spotifyscraperวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"spotifyscraper": {
"command": "uvx",
"args": [
"spotifyscraper"
],
"env": {
"SPOTIFY_SP_DC": "ใส่ค่าของคุณ"
}
}
}
}วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"spotifyscraper": {
"type": "stdio",
"command": "uvx",
"args": [
"spotifyscraper"
],
"env": {
"SPOTIFY_SP_DC": "ใส่ค่าของคุณ"
}
}
}
}ค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 5 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub AliAkhtari78 ซึ่งเป็นเจ้าของ repo
มีการแก้โค้ดล่าสุด 2 เดือนที่ผ่านมา
ใช้ MIT
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
ต้องอ่านรายการเครื่องมือของ server ก่อน จะเริ่มตรวจในขั้นถัดไป
เทียบเฉพาะ server ที่อยู่ในต้นแบบนี้ ไม่ใช่ทั้ง registry
จากการตรวจเบื้องต้นของเรา ผ่าน 3 จาก 3 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: SPOTIFY_SP_DC
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด 2 เดือนที่ผ่านมา และส่งรุ่นล่าสุด (3.9.2) เข้า registry 4 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี 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 รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
Extract public Spotify data — tracks, albums, artists, playlists, and podcasts — without the official API or an API key.
🎧 [Try it live in your browser →](https://aliakhtari.com/spotify/) — paste any Spotify link and watch SpotifyScraper pull typed data, cover art, and a preview, with the exact Python that does it. (How it was built.)
SpotifyScraper bootstraps an anonymous token from Spotify's own public embed pages and reads the same JSON endpoints the web player uses, returning typed, immutable models. v3 is a ground-up rewrite focused on reliability and a clean, modern API. Public data needs no login; the opt-in logged-in features (lyrics, podcast transcripts, and account info) add your own Spotify sp_dc cookie — never a password or an API key.
Upgrading from v2? See the migration guide. The previous line lives on the
v2.xbranch.
spotipy wraps Spotify's official Web API — the right choice when you need to write to a user's account or read private/library data. SpotifyScraper reads the public data the web player already exposes, so it skips the setup entirely.
| SpotifyScraper | spotipy (official API) | |
|---|---|---|
| API key / app registration | ❌ not needed | ✅ required |
| OAuth flow | ❌ not needed | ✅ required for most data |
| Rate-limit quota / billing | none | Spotify quota |
| Sync and async | ✅ | sync only |
| Fully typed, immutable models | ✅ | partial |
| Lyrics & podcast transcripts | ✅ (cookie) | ❌ |
| MCP server for Claude / LLM agents | ✅ | ❌ |
| Write / playback / private data | ❌ (read-only public) | ✅ |
Use spotipy for authenticated writes and private, market-accurate data; use SpotifyScraper for fast, key-free access to public metadata, lyrics, and previews — plus a drop-in MCP server for AI agents.
Hit by the official-API deprecations? Spotify's
audio-features,
recommendations, andrelated-artistsendpoints have returned403for new
apps since Nov 2024. SpotifyScraper still returns **related artists and
recommendations** with no API key. (It can't bring back
audio-features—
Spotify removed that data entirely, from every tool.)
pip install spotifyscraper # core (only depends on httpx)
pip install "spotifyscraper[media]" # + cover/preview embedding (mutagen) pip install "spotifyscraper[browser]" # + Playwright browser fallback & login pip install "spotifyscraper[cli]" # + the spotifyscraper command-line tool pip install "spotifyscraper[keyring]" # + store the login cookie in the OS keyring pip install "spotifyscraper[mcp]" # + the spotifyscraper-mcp MCP server for LLM hosts pip install "spotifyscraper[all]" # everything
Python 3.10+.
from spotify_scraper import SpotifyClient
with SpotifyClient() as client: track = client.get_track("https://open.spotify.com/track/4uLU6hMCjMI75M1A2tKUQC") print(track.name, "—", track.artists[0].name) print(track.duration_ms, "ms |", track.preview_url)
print(track.to_dict()) # JSON-safe dict, if you prefer dicts
Every entity has its own method — get_track, get_album, get_artist, get_playlist, get_episode, get_show — each accepting a URL, URI, or bare ID.
import asyncio
from spotify_scraper import AsyncSpotifyClient
async def main(): async with AsyncSpotifyClient() as client: track, album = await asyncio.gather( client.get_track("4uLU6hMCjMI75M1A2tKUQC"), client.get_album("6N9PS4QXF1D0OWPk0Sxtb4"), ) print(track.name, "|", album.name)
asyncio.run(main())
from spotify_scraper import SpotifyClient
with SpotifyClient() as client: track = client.get_track("4uLU6hMCjMI75M1A2tKUQC") client.download_cover(track, dest="covers/") client.download_preview(track, dest="previews/", embed_cover=True) # needs [media]
Pass locale — a BCP-47 language tag: a bare language subtag ("de", "ja") or a language-region tag ("ja-JP") — to localize the *language* of display names. Set it per client or override it per call:
with SpotifyClient(locale="ja-JP") as client: # default for every call
track = client.get_track("4uLU6hMCjMI75M1A2tKUQC") other = client.get_track("4uLU6hMCjMI75M1A2tKUQC", locale="de-DE") # per-call wins
It is sent as the Accept-Language header and changes only how names are *spelled*. It is not a country/market code — a bare "US" is meaningless as a language and is ignored — and it does not filter regional availability or vary preview URLs: anonymous Spotify resolves country from the request IP, and its pathfinder silently ignores a market variable. True market/availability filtering requires the authenticated Web API, which this library does not implement; for region-specific results, point the client's proxy at the target region. See the localization guide.
SearchResults.get_user() (name, follower counts, public playlists).spotifyscraper-mcp (batch tools + a one-call get_track_visuals); also ships as a container on ghcr.io.locale) to set the language of names.get_account() / is_premium(), plus cookie-free session_info().get_*s([...]) with partial-failure-safe results and managed concurrency.to_dict() / from_dict().httpx); media and browser support are optional extras.With the cli extra installed, a spotifyscraper command is available:
spotifyscraper track 4uLU6hMCjMI75M1A2tKUQC # entity metadata as JSON
spotifyscraper playlist --max-tracks 50 --pretty spotifyscraper download preview -o ./previews --embed-cover
Every command emits JSON, so it composes with tools like jq. See the CLI guide.
Each getter has a plural sibling (get_tracks, get_albums, …) that fetches many inputs and returns one BatchItem per input — index-aligned, and a dead input never aborts the rest:
items = client.get_tracks(["4uLU6hMCjMI75M1A2tKUQC", "bad-id"])
ok = [i.result for i in items if i.ok] failed = {i.value: i.error for i in items if not i.ok}
The async client runs them concurrently, bounded by max_concurrency (default 5). See the batch guide.
For repeated lookups, enable an opt-in persistent cache. It only stores token-free pathfinder responses — never the embed pages that carry the anonymous token — so no credential is ever written to disk:
from spotify_scraper import SpotifyClient, CacheConfig, FileCache
with SpotifyClient(cache=CacheConfig(store=FileCache())) as client: client.get_track("4uLU6hMCjMI75M1A2tKUQC") # first call hits the network client.get_track("4uLU6hMCjMI75M1A2tKUQC") # served from the cache
Default TTL is 24h; the FileCache is stdlib-only and the backend is pluggable. See the caching guide.
search() runs one anonymous, aggregate query across every entity type and returns a typed SearchResults:
from spotify_scraper import SpotifyClient
with SpotifyClient() as client: results = client.search("daft punk", types=("track", "artist"), limit=5) print(results.total, "track matches") for track in results.tracks: print(track.name, "—", track.artists[0].name)
Hits are sparse (pass an id to get_album()/get_show() for the full entity); total is the track-match count. See the search guide.
Lyrics and podcast transcripts need a Spotify account cookie (sp_dc); the library handles the token handshake for you, and one cookie powers both:
from spotify_scraper import SpotifyClient
with SpotifyClient(cookies="cookies.txt") as client: # or cookies={"sp_dc": "..."} lyrics = client.get_lyrics("4uLU6hMCjMI75M1A2tKUQC") for line in lyrics.lines: print(line.start_ms, line.text)
transcript = client.get_transcript("07gKzPFkbvGF0cHoeG7ARS") # a podcast episode for line in transcript.lines: print(line.s