Mcp Lyricscom

io.github.smeet666由 GitHub 帳號 smeet666 發布v2.1.0更新於 Nov 3, 2026

Search song lyrics on lyrics.com by word or by title, and fetch full lyrics. No API key required.

概覽

AI 產生的概覽

在 lyrics.com 上查詢歌詞:依記得的一句詞或依歌名與歌手搜尋,再分段讀取完整歌詞。

可以做什麼
  • 依歌詞中的詞句搜尋歌曲,可驗證比對並回傳命中該詞的那一行摘錄
  • 依歌名搜尋歌曲,可用歌手縮小範圍,回傳歌手、專輯、年份、id 與來源網址
  • 依 id 或網址分段讀取一首歌的完整歌詞,並以 offset 與 next_offset 續讀
  • 在歌詞中定位指定詞語並給出所在行號
  • 以 not_found、throttled、blocked_user_agent 等錯誤碼回報失敗原因與提示
適用情境
適合使用者只記得一句歌詞想找出歌名,或想請助理讀出某首歌的歌詞、專輯與年份的情況。它是單一用途的查詢工具,並非通用的音樂或媒體服務。
執行需求
以 stdio 在本機執行,可透過 npx(需 Node 24 以上)、Docker 映像或 MCP 安裝包部署;不需要帳號或 API 金鑰。需要能連線至 www.lyrics.com 的對外 HTTPS。所有環境變數皆為選用,包括 LYRICSCOM_USER_AGENT、LYRICSCOM_MIN_INTERVAL_MS 與 LYRICSCOM_LOG_LEVEL。
安裝前請注意
只向 lyrics.com 送出請求,不寫入磁碟,結果僅暫存在記憶體中。請求有節流限制,仍可能被網站限流;verify 設為 full 時每次搜尋最多抓取五個歌曲頁面。歌詞是作者與出版者的著作,展示時應標明歌手並附上來源網址。設定 LYRICSCOM_USER_AGENT 由使用者自行負責。本專案為非官方專案,與 lyrics.com 並無關聯。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mcp Lyricscom,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

mcp-lyricscom

[npm] [CI] [license] [MCP Registry] [Glama] [M8ven] [LobeHub] [Install in Cursor] [Install in VS Code]

lyrics.com is a large public catalogue of song lyrics. It files a song under its title, its artist, the album it appeared on and the year, and it holds the words themselves. Its search reaches inside those words.

This server connects a chat client to that catalogue. You can search for a song by a line you remember, search by title and artist, and read the words of one song, a slice at a time, with the words you were looking for located in the text. It needs no API key and no account.

Version française


Install

One-click install

[Install in Cursor] [Install in VS Code]

Claude Code

bash
claude mcp add lyricscom -- npx -y mcp-lyricscom

Claude Desktop, Cursor, and any client using the standard config format

json
{  "mcpServers": {    "lyricscom": {      "command": "npx",      "args": ["-y", "mcp-lyricscom"]    }  }}

Node 24 or later is required, and no environment variable has to be set.

With Docker

json
{  "mcpServers": {    "lyricscom": {      "command": "docker",      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lyricscom:2.1.0"]    }  }}

-i keeps stdin open, which is where the protocol travels, and -t is left out because a TTY rewrites the stream. The container needs outbound HTTPS to www.lyrics.com, and nothing else: no volume, no port, no credential.

Bundle, without npm

Download mcp-lyricscom-2.1.0.mcpb from the latest release and open it. A client that supports MCP bundles installs it on its own, with no npm and no configuration file to edit. The bundle carries its dependencies, so nothing is fetched at install time.

What you can ask

  • "Which song goes 'I've got a hand for you'?"
  • "Find me the lyrics of Wichita Lineman by Glen Campbell."
  • "Read me the second half of those words."
  • "Where does the word 'lineman' appear in that song?"
  • "What albums is that song on?"

The ordinary path runs from a search to a reading: a row carries an id, and get_lyrics takes that id.

Tools

ToolWhat it does
search_lyricsFinds a song from a line inside its words.
search_songsFinds songs by title, narrowed by artist.
get_lyricsReads the words of one song, a slice at a time.

search_lyrics

Finds a song from words inside its lyrics. The site ranks loosely, so a match is checked before it is served.

ArgumentTypeRequiredWhat it does
querystring, 1 to 120 charactersyesThe line, or part of it, to look for.
limitinteger, 1 to 50, default 10noRows to serve.
pageinteger, 1 to 20, default 1noWhich page of rows.
verifysnippet, full or none, default snippetnoHow to confirm the words really appear.
include_excerptboolean, default truenoCarry the matching line with each row.

verify decides what a row is worth. snippet checks the excerpt the site already returned and costs nothing. full fetches up to five song pages and checks the complete words, which is slow and can bring on rate limiting. none serves what the site ranked, unchecked.

In return: rows carrying id, which get_lyrics takes; title; artist; album and year, null where the catalogue states none; source_url; and excerpt, the matching line. raw_result_count is what the site returned and filtered_out how many rows the check removed, so the two together say how loose the ranking was. has_more and next_page continue.

search_songs

Finds songs by title, narrowed by artist.

ArgumentTypeRequiredWhat it does
titlestring, 1 to 120 charactersyesThe song title, or part of it.
artiststring, up to 120 charactersnoKeep the songs credited to this artist.
limitinteger, 1 to 50, default 10noRows to serve.
pageinteger, 1 to 20, default 1noWhich page of rows.
matchloose or strict, default loosenoHow closely the artist has to match.

In return: the rows search_lyrics returns, with artist_filter echoing what was asked for and filtered_out counting what the artist restriction removed. strict keeps the artists whose name matches as written; loose accepts a name written differently.

get_lyrics

Reads the words of one song. Long lyrics are served a slice at a time.

ArgumentTypeRequiredWhat it does
idstringone of twoThe song id a search row carries.
urla lyrics.com URLone of twoThe address of the song page.
max_charsinteger, 200 to 20000, default 6000noCharacters of text to serve in this call.
offsetinteger, 0 or more, default 0noCharacter offset to resume from.
highlightstring, up to 120 charactersnoWords to locate inside the text.

In return: status, reading ok or no_lyrics for a page the site holds without words; title, artist and source_url; and lyrics, the slice itself. The reading is described by total_chars, returned_chars, offset, next_offset and truncated: pass next_offset back to read on, and null there means the end. line_count counts the lines of the slice, and highlight answers for each word whether it was found and on which line_number, which is null when it was not.

Configuration

Every variable is optional. Set them in the env block of your client config.

VariableDefaultWhat it does
LYRICSCOM_USER_AGENTthe project identityNames your application to the site, with an address where a person can be reached.
LYRICSCOM_MIN_INTERVAL_MS1100Gap between two requests, from 500 to 60000.
LYRICSCOM_TIMEOUT_MS15000Deadline for one request, from 1000 to 120000.
LYRICSCOM_MAX_RETRIES3Attempts after a transient failure, from 0 to 10.
LYRICSCOM_CACHE_TTL_MS900000How long an answer stays in memory, from 0 to 86400000.
LYRICSCOM_CACHE_MAX_ENTRIES200Answers held in memory at once, from 0 to 10000.
LYRICSCOM_LOG_LEVELerrorsilent, error, info or debug, written to stderr.

A value outside its range falls back to the default, and the reason is written to stderr.

On the User-Agent. This server names the project and links to its repository, and the site serves that. It does refuse some generic tool agents outright: a plain curl gets a 403. A blocked_user_agent error means the identity was refused, and LYRICSCOM_USER_AGENT lets you set one of your choosing. What you put there is your call and your responsibility.

Errors

Every failure carries one of these codes, a message, and where it helps a hint naming the next move.

CodeWhat happenedWhat to do
not_foundThe site answered, and holds no such song.Check the id with search_songs.
invalid_inputThe arguments were refused before any request went out.Read the message, which names the argument.
throttledThe site asked this client to slow down.Wait, then call again with the same arguments. The song is still there.
blocked_user_agentThe site refused the identity this client sent.Set LYRICSCOM_USER_AGENT.
parse_failureThe page loaded and the expected content was absent.Report it at the issue tracker.
network_errorThe request did not complete.Try again shortly.
timeoutThe request passed its deadline.Raise LYRICSCOM_TIMEOUT_MS, or ask for a smaller max_chars.

throttled and blocked_user_agent are this server's two names for a refusal to serve, and a caller reading several sources normalises them onto whatever it calls rate limiting.

As a library

The layer reading the site is published on its own, with its pacing, its cache and its errors, and with no protocol attached.

ts
import { LyricsComClient } from "mcp-lyricscom/client";
const client = new LyricsComClient();const { data, cached } = await client.getSong({ id: "1234567" });console.log(data.title, data.artist, cached);

search and getSong each answer { data, cached }, and throw an error carrying one of the codes above. The floor between two requests holds here as well.

Pacing and attribution

Requests go out one at a time with at least a second between them, and the floor of half a second holds however the server is configured. A verify: "full" search fetches up to five song pages, which is the most expensive thing this server does.

Every result carries the artist, the title and the address of the song page. Song lyrics are the work of their authors and publishers. This project claims no rights over them, ships no database of them, and writes nothing to disk.

This MCP server is an unofficial project, with no affiliation to lyrics.com.

Privacy

This server collects nothing about you and sends nothing to its author. It runs on your machine, contacts www.lyrics.com and nothing else, holds its answers in memory while it runs, and writes nothing to disk. PRIVACY.md states what a request carries and which settings change any of it.

Development

bash
npm installnpm run build:fixturesnpm testnpm run check

Tests run against generated fixtures and make no network request. The live suite, npm run test:live, makes one request per route and runs nightly against the site itself.

Contributing

Bugs, questions and ideas belong in the issue tracker. Pull requests are welcome; opening an issue first helps agree on the shape of the change. See CONTRIBUTING.md.

License

MIT, see LICENSE. The lyrics belong to their authors and publishers.


mcp-lyricscom (français)

English version

lyrics.com est un grand catalogue public de paroles de chansons. Il classe une chanson sous son titre, son artiste, l'album où elle a paru et l'année, et il contient les paroles elles-mêmes. Sa recherche va à l'intérieur de ces paroles.

Ce serveur relie un client de conversation à ce catalogue. On peut y chercher une chanson par un vers dont on se souvient, chercher par titre et par artiste, et lire les paroles d'une chanson par tranches, avec les mots cherchés localisés dans le texte. Aucune clé d'API, aucun compte.

Installation

Installation en un clic

[Install in Cursor] [Install in VS Code]

Claude Code

bash
claude mcp add lyricscom -- npx -y mcp-lyricscom

Claude Desktop, Cursor, et tout client au format de configuration standard

json
{  "mcpServers": {    "lyricscom": {      "command": "npx",      "args": ["-y", "mcp-lyricscom"]    }  }}

Node 24 ou plus récent est nécessaire, et aucune variable d'environnement n'est à renseigner.

Avec Docker

json
{  "mcpServers": {    "lyricscom": {      "command": "docker",      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lyricscom:2.1.0"]    }  }}

-i garde l'entrée standard ouverte, qui est le canal du protocole, et -t est omis parce qu'un TTY réécrit le flux. Le conteneur a besoin d'un accès HTTPS sortant vers www.lyrics.com, et de rien d'autre : aucun volume, aucun port, aucun identifiant.

Bundle, sans npm

Téléchargez mcp-lyricscom-2.1.0.mcpb depuis la dernière publication et ouvrez-le. Un client qui gère les bundles MCP l'installe seul, sans npm et sans fichier de configuration à modifier. Le bundle emporte ses dépendances, donc rien n'est téléchargé à l'installation.

Ce qu'on peut demander

  • « Quelle est la chanson qui dit "I've got a hand for you" ? »
  • « Trouve-moi les paroles de Wichita Lineman par Glen Campbell. »
  • « Lis-moi la seconde moitié de ces paroles. »
  • « Où apparaît le mot "lineman" dans cette chanson ? »
  • « Sur quels albums cette chanson figure-t-elle ? »

Le chemin ordinaire va d'une recherche à une lecture : une ligne porte un id, et get_lyrics reprend cet identifiant.

Les outils

OutilCe qu'il fait
search_lyricsTrouve une chanson à partir d'un vers de ses paroles.
search_songsTrouve des chansons par titre, resserrées par artiste.
get_lyricsLit les paroles d'une chanson, par tranches.

search_lyrics

Trouve une chanson à partir de mots contenus dans ses paroles. Le site classe largement, donc une correspondance est vérifiée avant d'être servie.

ArgumentTypeRequisCe qu'il fait
querychaîne, 1 à 120 caractèresouiLe vers, ou une partie, à chercher.
limitentier, 1 à 50, défaut 10nonLignes à servir.
pageentier, 1 à 20, défaut 1nonQuelle page de lignes.
verifysnippet, full ou none, défaut snippetnonComment confirmer que les mots y figurent.
include_excerptbooléen, défaut truenonPorter le vers correspondant sur chaque ligne.

verify décide de ce que vaut une ligne. snippet vérifie l'extrait que le site a déjà rendu et ne coûte rien. full va chercher jusqu'à cinq pages de chansons et vérifie les paroles entières, ce qui est lent et peut déclencher une limitation. none sert ce que le site a classé, sans vérification.

En retour : des lignes portant id, que get_lyrics reprend ; title ; artist ; album et year, null là où le catalogue n'indique rien ; source_url ; et excerpt, le vers correspondant. raw_result_count est ce que le site a rendu et filtered_out le nombre de lignes que la vérification a retirées, si bien que les deux ensemble disent à quel point le classement était large. has_more et next_page poursuivent.

search_songs

Trouve des chansons par titre, resserrées par artiste.

ArgumentTypeRequisCe qu'il fait
titlechaîne, 1 à 120 caractèresouiLe titre de la chanson, ou une partie.
artistchaîne, jusqu'à 120 caractèresnonNe garder que les chansons de cet artiste.
limitentier, 1 à 50, défaut 10nonLignes à servir.
pageentier, 1 à 20, défaut 1nonQuelle page de lignes.
matchloose ou strict, défaut loosenonLa rigueur de la correspondance sur l'artiste.

En retour : les lignes que rend search_lyrics, avec artist_filter qui redonne ce qui a été demandé et filtered_out qui compte ce que la restriction sur l'artiste a retiré. strict garde les artistes dont le nom correspond tel qu'écrit ; loose accepte un nom écrit autrement.

get_lyrics

Lit les paroles d'une chanson. Des paroles longues sont servies par tranches.

ArgumentTypeRequisCe qu'il fait
idchaînel'un des deuxL'identifiant que porte une ligne.
urlune adresse lyrics.coml'un des deuxL'adresse de la page de la chanson.
max_charsentier, 200 à 20000, défaut 6000nonCaractères de texte à servir dans cet appel.
offsetentier, 0 ou plus, défaut 0nonPosition en caractères où reprendre.
highlightchaîne, jusqu'à 120 caractèresnonDes mots à localiser dans le texte.

En retour : status, valant ok ou no_lyrics pour une page que le site contient sans paroles ; title, artist et source_url ; et lyrics, la tranche elle-même. La lecture est décrite par total_chars, returned_chars, offset, next_offset et truncated : redonnez next_offset pour poursuivre, et null marque la fin. line_count compte les lignes de la tranche, et highlight répond pour chaque mot s'il a été found et à quel line_number, null quand il ne l'a pas été.

Configuration

Chaque variable est facultative. Elles se posent dans le bloc env de la configuration du client.

VariableDéfautCe qu'elle fait
LYRICSCOM_USER_AGENTl'identité du projetNomme votre application auprès du site, avec une adresse où joindre une personne.
LYRICSCOM_MIN_INTERVAL_MS1100Écart entre deux requêtes, de 500 à 60000.
LYRICSCOM_TIMEOUT_MS15000Délai d'une requête, de 1000 à 120000.
LYRICSCOM_MAX_RETRIES3Tentatives après un échec passager, de 0 à 10.
LYRICSCOM_CACHE_TTL_MS900000Durée pendant laquelle une réponse reste en mémoire, de 0 à 86400000.
LYRICSCOM_CACHE_MAX_ENTRIES200Réponses gardées en mémoire à la fois, de 0 à 10000.
LYRICSCOM_LOG_LEVELerrorsilent, error, info ou debug, écrit sur la sortie d'erreur.

Une valeur hors de sa plage retombe sur le défaut, et la raison est écrite sur la sortie d'erreur.

À propos du User-Agent. Ce serveur nomme le projet et renvoie vers son dépôt, et le site le sert. Il refuse en revanche certains agents d'outils génériques : un curl nu reçoit un 403. Une erreur blocked_user_agent signifie que l'identité envoyée a été refusée, et LYRICSCOM_USER_AGENT permet d'en poser une de votre choix. Ce que vous y mettez relève de votre décision et de votre responsabilité.

Erreurs

Chaque échec porte un de ces codes, un message, et quand cela aide une indication du geste suivant.

CodeCe qui s'est passéQue faire
not_foundLe site a répondu, et n'a pas cette chanson.Vérifiez l'identifiant avec search_songs.
invalid_inputLes arguments ont été refusés avant toute requête.Lisez le message, qui nomme l'argument.
throttledLe site demande à ce client de ralentir.Attendez, puis rappelez avec les mêmes arguments. La chanson est toujours là.
blocked_user_agentLe site a refusé l'identité envoyée par ce client.Posez LYRICSCOM_USER_AGENT.
parse_failureLa page a chargé et le contenu attendu est absent.Signalez-le sur le suivi d'incidents.
network_errorLa requête n'a pas abouti.Réessayez sous peu.
timeoutLa requête a dépassé son délai.Augmentez LYRICSCOM_TIMEOUT_MS, ou demandez un max_chars plus petit.

throttled et blocked_user_agent sont les deux noms que ce serveur donne à un refus de servir, et un appelant qui lit plusieurs sources les ramène sur ce qu'il appelle une limitation de débit.

Comme bibliothèque

La couche qui lit le site est publiée seule, avec son rythme, son cache et ses erreurs, sans protocole attaché.

ts
import { LyricsComClient } from "mcp-lyricscom/client";
const client = new LyricsComClient();const { data, cached } = await client.getSong({ id: "1234567" });console.log(data.title, data.artist, cached);

search et getSong répondent chacun { data, cached }, et lèvent une erreur portant un des codes ci-dessus. Le plancher entre deux requêtes tient également ici.

Rythme et attribution

Les requêtes partent une à une avec au moins une seconde entre elles, et le plancher d'une demi-seconde tient quelle que soit la configuration. Une recherche en verify: "full" va chercher jusqu'à cinq pages de chansons, ce qui est la chose la plus coûteuse que fait ce serveur.

Chaque résultat porte l'artiste, le titre et l'adresse de la page de la chanson. Les paroles sont l'œuvre de leurs auteurs et de leurs éditeurs. Ce projet ne revendique aucun droit dessus, n'embarque aucune base de paroles et n'écrit rien sur le disque.

Ce MCP est un projet non officiel, sans affiliation à lyrics.com.

Confidentialité

Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur. Il tourne sur votre machine, ne joint que www.lyrics.com, garde ses réponses en mémoire le temps qu'il tourne, et n'écrit rien sur le disque. PRIVACY.md dit ce qu'une requête emporte et quels réglages changent cela.

Développement

bash
npm installnpm run build:fixturesnpm testnpm run check

Les tests s'exécutent sur des fixtures engendrées et n'émettent aucune requête. La suite en direct, npm run test:live, émet une requête par route et tourne chaque nuit contre le site lui-même.

Contribuer

Les anomalies, les questions et les idées ont leur place dans le suivi d'incidents. Les propositions de modification sont bienvenues ; ouvrir un ticket d'abord aide à s'accorder sur la forme du changement. Voir CONTRIBUTING.md.

Licence

MIT, voir LICENSE. Les paroles appartiennent à leurs auteurs et à leurs éditeurs.

來源:README.md,提交 9c54a4e

工具

3

search_lyrics

Search lyrics by word

Search lyrics.com for songs whose lyrics contain a given word or phrase. Returns matching songs with artist, title, a short excerpt of the line where the word appears, and the lyrics.com id and URL needed to fetch the full text with get_lyrics. Use this when someone remembers a fragment of lyrics but not the song, or wants songs mentioning a word or theme. One call returns one page of lyrics.com results; to see more, increase 'page' rather than 'limit'. lyrics.com also returns loose and title-only matches, so results are filtered locally to keep only songs where the word genuinely appears in the lyrics. Set 'verify' to "none" to see the raw, unfiltered list.

輸入參數pagelimitquery必填verifyinclude_excerpt

search_songs

Search songs by title

Find songs on lyrics.com by their title. Returns candidate songs with artist, album, year, and the lyrics.com id and URL. Use this when someone names a song and you need its id to call get_lyrics, or to tell covers and versions by different artists apart. An optional 'artist' narrows the list. lyrics.com searches titles and lyrics together, so results are ranked and filtered locally by title match; use match="strict" to keep only genuine title matches.

輸入參數pagelimitmatchtitle必填artist

get_lyrics

Get full lyrics

Fetch the full lyrics of one song from lyrics.com, given the song id or URL returned by search_lyrics or search_songs. Lyrics can be long, so the response is truncated by default: check 'truncated' and call again with 'offset' set to 'next_offset' to continue reading. Some lyrics.com pages legitimately have no lyrics on file; those come back with status "no_lyrics" and an empty lyrics field, which is a valid answer and not an error, so do not retry them. Always cite 'source_url' and the artist when showing lyrics to a user.

輸入參數idurloffsethighlightmax_chars

版本歷史

2
  1. v2.1.0最新Oct 29, 2026
  2. v2.0.1Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分