{
  "markdown": "# mcp-lyricscom\n\n[![npm](https://img.shields.io/npm/v/mcp-lyricscom.svg)](https://www.npmjs.com/package/mcp-lyricscom)\n[![CI](https://github.com/smeet666/mcp-lyricscom/actions/workflows/ci.yml/badge.svg)](https://github.com/smeet666/mcp-lyricscom/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/mcp-lyricscom.svg)](./LICENSE)\n[![MCP Registry](https://img.shields.io/badge/MCP_Registry-listed-6E56CF)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.smeet666/mcp-lyricscom)\n[![Glama](https://glama.ai/mcp/servers/smeet666/mcp-lyricscom/badges/score.svg)](https://glama.ai/mcp/servers/smeet666/mcp-lyricscom)\n[![M8ven](https://m8ven.ai/badge/mcp/smeet666-mcp-lyricscom-pptp4t?variant=verified)](https://m8ven.ai/mcp/smeet666-mcp-lyricscom-pptp4t)\n[![LobeHub](https://lobehub.com/badge/mcp/smeet666-mcp-lyricscom)](https://lobehub.com/mcp/smeet666-mcp-lyricscom)\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=lyricscom&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1seXJpY3Njb20iXX0%3D)\n[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=lyricscom&config=%7B%22name%22%3A%22lyricscom%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-lyricscom%22%5D%7D)\n\n<!-- m8ven-verify: 3c4d434dcafaac3c25dc86631fb1393b -->\n\n[lyrics.com](https://www.lyrics.com) is a large public catalogue of song lyrics.\nIt files a song under its title, its artist, the album it appeared on and the\nyear, and it holds the words themselves. Its search reaches inside those words.\n\nThis server connects a chat client to that catalogue. You can search for a song\nby a line you remember, search by title and artist, and read the words of one\nsong, a slice at a time, with the words you were looking for located in the text.\nIt needs no API key and no account.\n\n_[Version française](#mcp-lyricscom-français)_\n\n---\n\n## Install\n\n**One-click install**\n\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=lyricscom&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1seXJpY3Njb20iXX0%3D)\n[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=lyricscom&config=%7B%22name%22%3A%22lyricscom%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-lyricscom%22%5D%7D)\n\n**Claude Code**\n\n```bash\nclaude mcp add lyricscom -- npx -y mcp-lyricscom\n```\n\n**Claude Desktop, Cursor, and any client using the standard config format**\n\n```json\n{\n  \"mcpServers\": {\n    \"lyricscom\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-lyricscom\"]\n    }\n  }\n}\n```\n\nNode 24 or later is required, and no environment variable has to be set.\n\n### With Docker\n\n```json\n{\n  \"mcpServers\": {\n    \"lyricscom\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"ghcr.io/smeet666/mcp-lyricscom:2.0.1\"]\n    }\n  }\n}\n```\n\n`-i` keeps stdin open, which is where the protocol travels, and `-t` is left out\nbecause a TTY rewrites the stream. The container needs outbound HTTPS to\n`www.lyrics.com`, and nothing else: no volume, no port, no credential.\n\n### Bundle, without npm\n\nDownload `mcp-lyricscom-2.0.1.mcpb` from\n[the latest release](https://github.com/smeet666/mcp-lyricscom/releases/latest)\nand open it. A client that supports MCP bundles installs it on its own, with no\nnpm and no configuration file to edit. The bundle carries its dependencies, so\nnothing is fetched at install time.\n\n## What you can ask\n\n- \"Which song goes 'I've got a hand for you'?\"\n- \"Find me the lyrics of Wichita Lineman by Glen Campbell.\"\n- \"Read me the second half of those words.\"\n- \"Where does the word 'lineman' appear in that song?\"\n- \"What albums is that song on?\"\n\nThe ordinary path runs from a search to a reading: a row carries an `id`, and\n`get_lyrics` takes that id.\n\n## Tools\n\n| Tool            | What it does                                    |\n| --------------- | ----------------------------------------------- |\n| `search_lyrics` | Finds a song from a line inside its words.      |\n| `search_songs`  | Finds songs by title, narrowed by artist.       |\n| `get_lyrics`    | Reads the words of one song, a slice at a time. |\n\n### `search_lyrics`\n\nFinds a song from words inside its lyrics. The site ranks loosely, so a match is\nchecked before it is served.\n\n| Argument          | Type                                           | Required | What it does                            |\n| ----------------- | ---------------------------------------------- | -------- | --------------------------------------- |\n| `query`           | string, 1 to 120 characters                    | yes      | The line, or part of it, to look for.   |\n| `limit`           | integer, 1 to 50, default `10`                 | no       | Rows to serve.                          |\n| `page`            | integer, 1 to 20, default `1`                  | no       | Which page of rows.                     |\n| `verify`          | `snippet`, `full` or `none`, default `snippet` | no       | How to confirm the words really appear. |\n| `include_excerpt` | boolean, default `true`                        | no       | Carry the matching line with each row.  |\n\n`verify` decides what a row is worth. `snippet` checks the excerpt the site\nalready returned and costs nothing. `full` fetches up to five song pages and\nchecks the complete words, which is slow and can bring on rate limiting. `none`\nserves what the site ranked, unchecked.\n\n**In return:** rows carrying `id`, which `get_lyrics` takes; `title`; `artist`;\n`album` and `year`, `null` where the catalogue states none; `source_url`; and\n`excerpt`, the matching line. `raw_result_count` is what the site returned and\n`filtered_out` how many rows the check removed, so the two together say how loose\nthe ranking was. `has_more` and `next_page` continue.\n\n### `search_songs`\n\nFinds songs by title, narrowed by artist.\n\n| Argument | Type                                 | Required | What it does                            |\n| -------- | ------------------------------------ | -------- | --------------------------------------- |\n| `title`  | string, 1 to 120 characters          | yes      | The song title, or part of it.          |\n| `artist` | string, up to 120 characters         | no       | Keep the songs credited to this artist. |\n| `limit`  | integer, 1 to 50, default `10`       | no       | Rows to serve.                          |\n| `page`   | integer, 1 to 20, default `1`        | no       | Which page of rows.                     |\n| `match`  | `loose` or `strict`, default `loose` | no       | How closely the artist has to match.    |\n\n**In return:** the rows `search_lyrics` returns, with `artist_filter` echoing\nwhat was asked for and `filtered_out` counting what the artist restriction\nremoved. `strict` keeps the artists whose name matches as written; `loose`\naccepts a name written differently.\n\n### `get_lyrics`\n\nReads the words of one song. Long lyrics are served a slice at a time.\n\n| Argument    | Type                                  | Required   | What it does                              |\n| ----------- | ------------------------------------- | ---------- | ----------------------------------------- |\n| `id`        | string                                | one of two | The song id a search row carries.         |\n| `url`       | a lyrics.com URL                      | one of two | The address of the song page.             |\n| `max_chars` | integer, 200 to 20000, default `6000` | no         | Characters of text to serve in this call. |\n| `offset`    | integer, 0 or more, default `0`       | no         | Character offset to resume from.          |\n| `highlight` | string, up to 120 characters          | no         | Words to locate inside the text.          |\n\n**In return:** `status`, reading `ok` or `no_lyrics` for a page the site holds\nwithout words; `title`, `artist` and `source_url`; and `lyrics`, the slice\nitself. The reading is described by `total_chars`, `returned_chars`, `offset`,\n`next_offset` and `truncated`: pass `next_offset` back to read on, and `null`\nthere means the end. `line_count` counts the lines of the slice, and `highlight`\nanswers for each word whether it was `found` and on which `line_number`, which is\n`null` when it was not.\n\n## Configuration\n\nEvery variable is optional. Set them in the `env` block of your client config.\n\n| Variable                      | Default              | What it does                                                                       |\n| ----------------------------- | -------------------- | ---------------------------------------------------------------------------------- |\n| `LYRICSCOM_USER_AGENT`        | the project identity | Names your application to the site, with an address where a person can be reached. |\n| `LYRICSCOM_MIN_INTERVAL_MS`   | `1100`               | Gap between two requests, from 500 to 60000.                                       |\n| `LYRICSCOM_TIMEOUT_MS`        | `15000`              | Deadline for one request, from 1000 to 120000.                                     |\n| `LYRICSCOM_MAX_RETRIES`       | `3`                  | Attempts after a transient failure, from 0 to 10.                                  |\n| `LYRICSCOM_CACHE_TTL_MS`      | `900000`             | How long an answer stays in memory, from 0 to 86400000.                            |\n| `LYRICSCOM_CACHE_MAX_ENTRIES` | `200`                | Answers held in memory at once, from 0 to 10000.                                   |\n| `LYRICSCOM_LOG_LEVEL`         | `error`              | `silent`, `error`, `info` or `debug`, written to stderr.                           |\n\nA value outside its range falls back to the default, and the reason is written to\nstderr.\n\n**On the User-Agent.** This server names the project and links to its repository,\nand the site serves that. It does refuse some generic tool agents outright: a\nplain `curl` gets a 403. A `blocked_user_agent` error means the identity was\nrefused, and `LYRICSCOM_USER_AGENT` lets you set one of your choosing. What you\nput there is your call and your responsibility.\n\n## Errors\n\nEvery failure carries one of these codes, a message, and where it helps a hint\nnaming the next move.\n\n| Code                 | What happened                                           | What to do                                                                          |\n| -------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------- |\n| `not_found`          | The site answered, and holds no such song.              | Check the id with `search_songs`.                                                   |\n| `invalid_input`      | The arguments were refused before any request went out. | Read the message, which names the argument.                                         |\n| `throttled`          | The site asked this client to slow down.                | Wait, then call again with the same arguments. The song is still there.             |\n| `blocked_user_agent` | The site refused the identity this client sent.         | Set `LYRICSCOM_USER_AGENT`.                                                         |\n| `parse_failure`      | The page loaded and the expected content was absent.    | Report it at [the issue tracker](https://github.com/smeet666/mcp-lyricscom/issues). |\n| `network_error`      | The request did not complete.                           | Try again shortly.                                                                  |\n| `timeout`            | The request passed its deadline.                        | Raise `LYRICSCOM_TIMEOUT_MS`, or ask for a smaller `max_chars`.                     |\n\n`throttled` and `blocked_user_agent` are this server's two names for a refusal to\nserve, and a caller reading several sources normalises them onto whatever it\ncalls rate limiting.\n\n## As a library\n\nThe layer reading the site is published on its own, with its pacing, its cache\nand its errors, and with no protocol attached.\n\n```ts\nimport { LyricsComClient } from \"mcp-lyricscom/client\";\n\nconst client = new LyricsComClient();\nconst { data, cached } = await client.getSong({ id: \"1234567\" });\nconsole.log(data.title, data.artist, cached);\n```\n\n`search` and `getSong` each answer `{ data, cached }`, and throw an error\ncarrying one of the codes above. The floor between two requests holds here as\nwell.\n\n## Pacing and attribution\n\nRequests go out one at a time with at least a second between them, and the floor\nof half a second holds however the server is configured. A `verify: \"full\"`\nsearch fetches up to five song pages, which is the most expensive thing this\nserver does.\n\nEvery result carries the artist, the title and the address of the song page. Song\nlyrics are the work of their authors and publishers. This project claims no\nrights over them, ships no database of them, and writes nothing to disk.\n\nThis MCP server is an unofficial project, with no affiliation to lyrics.com.\n\n## Privacy\n\nThis server collects nothing about you and sends nothing to its author. It runs\non your machine, contacts `www.lyrics.com` and nothing else, holds its answers in memory\nwhile it runs, and writes nothing to disk.\n[PRIVACY.md](PRIVACY.md) states what a request carries and which settings change\nany of it.\n\n## Development\n\n```bash\nnpm install\nnpm run build:fixtures\nnpm test\nnpm run check\n```\n\nTests run against generated fixtures and make no network request. The live suite,\n`npm run test:live`, makes one request per route and runs nightly against the\nsite itself.\n\n## Contributing\n\nBugs, questions and ideas belong in\n[the issue tracker](https://github.com/smeet666/mcp-lyricscom/issues). Pull\nrequests are welcome; opening an issue first helps agree on the shape of the\nchange. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nMIT, see [LICENSE](LICENSE). The lyrics belong to their authors and publishers.\n\n---\n\n<a name=\"mcp-lyricscom-français\"></a>\n\n# mcp-lyricscom (français)\n\n_[English version](#mcp-lyricscom)_\n\n[lyrics.com](https://www.lyrics.com) est un grand catalogue public de paroles de\nchansons. Il classe une chanson sous son titre, son artiste, l'album où elle a\nparu et l'année, et il contient les paroles elles-mêmes. Sa recherche va à\nl'intérieur de ces paroles.\n\nCe serveur relie un client de conversation à ce catalogue. On peut y chercher une\nchanson par un vers dont on se souvient, chercher par titre et par artiste, et\nlire les paroles d'une chanson par tranches, avec les mots cherchés localisés\ndans le texte. Aucune clé d'API, aucun compte.\n\n## Installation\n\n**Installation en un clic**\n\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=lyricscom&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1seXJpY3Njb20iXX0%3D)\n[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=lyricscom&config=%7B%22name%22%3A%22lyricscom%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-lyricscom%22%5D%7D)\n\n**Claude Code**\n\n```bash\nclaude mcp add lyricscom -- npx -y mcp-lyricscom\n```\n\n**Claude Desktop, Cursor, et tout client au format de configuration standard**\n\n```json\n{\n  \"mcpServers\": {\n    \"lyricscom\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-lyricscom\"]\n    }\n  }\n}\n```\n\nNode 24 ou plus récent est nécessaire, et aucune variable d'environnement n'est à\nrenseigner.\n\n### Avec Docker\n\n```json\n{\n  \"mcpServers\": {\n    \"lyricscom\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"ghcr.io/smeet666/mcp-lyricscom:2.0.1\"]\n    }\n  }\n}\n```\n\n`-i` garde l'entrée standard ouverte, qui est le canal du protocole, et `-t` est\nomis parce qu'un TTY réécrit le flux. Le conteneur a besoin d'un accès HTTPS\nsortant vers `www.lyrics.com`, et de rien d'autre : aucun volume, aucun port,\naucun identifiant.\n\n### Bundle, sans npm\n\nTéléchargez `mcp-lyricscom-2.0.1.mcpb` depuis\n[la dernière publication](https://github.com/smeet666/mcp-lyricscom/releases/latest)\net ouvrez-le. Un client qui gère les bundles MCP l'installe seul, sans npm et\nsans fichier de configuration à modifier. Le bundle emporte ses dépendances, donc\nrien n'est téléchargé à l'installation.\n\n## Ce qu'on peut demander\n\n- « Quelle est la chanson qui dit \"I've got a hand for you\" ? »\n- « Trouve-moi les paroles de Wichita Lineman par Glen Campbell. »\n- « Lis-moi la seconde moitié de ces paroles. »\n- « Où apparaît le mot \"lineman\" dans cette chanson ? »\n- « Sur quels albums cette chanson figure-t-elle ? »\n\nLe chemin ordinaire va d'une recherche à une lecture : une ligne porte un `id`,\net `get_lyrics` reprend cet identifiant.\n\n## Les outils\n\n| Outil           | Ce qu'il fait                                          |\n| --------------- | ------------------------------------------------------ |\n| `search_lyrics` | Trouve une chanson à partir d'un vers de ses paroles.  |\n| `search_songs`  | Trouve des chansons par titre, resserrées par artiste. |\n| `get_lyrics`    | Lit les paroles d'une chanson, par tranches.           |\n\n### `search_lyrics`\n\nTrouve une chanson à partir de mots contenus dans ses paroles. Le site classe\nlargement, donc une correspondance est vérifiée avant d'être servie.\n\n| Argument          | Type                                          | Requis | Ce qu'il fait                                  |\n| ----------------- | --------------------------------------------- | ------ | ---------------------------------------------- |\n| `query`           | chaîne, 1 à 120 caractères                    | oui    | Le vers, ou une partie, à chercher.            |\n| `limit`           | entier, 1 à 50, défaut `10`                   | non    | Lignes à servir.                               |\n| `page`            | entier, 1 à 20, défaut `1`                    | non    | Quelle page de lignes.                         |\n| `verify`          | `snippet`, `full` ou `none`, défaut `snippet` | non    | Comment confirmer que les mots y figurent.     |\n| `include_excerpt` | booléen, défaut `true`                        | non    | Porter le vers correspondant sur chaque ligne. |\n\n`verify` décide de ce que vaut une ligne. `snippet` vérifie l'extrait que le site\na déjà rendu et ne coûte rien. `full` va chercher jusqu'à cinq pages de chansons\net vérifie les paroles entières, ce qui est lent et peut déclencher une\nlimitation. `none` sert ce que le site a classé, sans vérification.\n\n**En retour :** des lignes portant `id`, que `get_lyrics` reprend ; `title` ;\n`artist` ; `album` et `year`, `null` là où le catalogue n'indique rien ;\n`source_url` ; et `excerpt`, le vers correspondant. `raw_result_count` est ce que\nle site a rendu et `filtered_out` le nombre de lignes que la vérification a\nretirées, si bien que les deux ensemble disent à quel point le classement était\nlarge. `has_more` et `next_page` poursuivent.\n\n### `search_songs`\n\nTrouve des chansons par titre, resserrées par artiste.\n\n| Argument | Type                                | Requis | Ce qu'il fait                                  |\n| -------- | ----------------------------------- | ------ | ---------------------------------------------- |\n| `title`  | chaîne, 1 à 120 caractères          | oui    | Le titre de la chanson, ou une partie.         |\n| `artist` | chaîne, jusqu'à 120 caractères      | non    | Ne garder que les chansons de cet artiste.     |\n| `limit`  | entier, 1 à 50, défaut `10`         | non    | Lignes à servir.                               |\n| `page`   | entier, 1 à 20, défaut `1`          | non    | Quelle page de lignes.                         |\n| `match`  | `loose` ou `strict`, défaut `loose` | non    | La rigueur de la correspondance sur l'artiste. |\n\n**En retour :** les lignes que rend `search_lyrics`, avec `artist_filter` qui\nredonne ce qui a été demandé et `filtered_out` qui compte ce que la restriction\nsur l'artiste a retiré. `strict` garde les artistes dont le nom correspond tel\nqu'écrit ; `loose` accepte un nom écrit autrement.\n\n### `get_lyrics`\n\nLit les paroles d'une chanson. Des paroles longues sont servies par tranches.\n\n| Argument    | Type                               | Requis        | Ce qu'il fait                                |\n| ----------- | ---------------------------------- | ------------- | -------------------------------------------- |\n| `id`        | chaîne                             | l'un des deux | L'identifiant que porte une ligne.           |\n| `url`       | une adresse lyrics.com             | l'un des deux | L'adresse de la page de la chanson.          |\n| `max_chars` | entier, 200 à 20000, défaut `6000` | non           | Caractères de texte à servir dans cet appel. |\n| `offset`    | entier, 0 ou plus, défaut `0`      | non           | Position en caractères où reprendre.         |\n| `highlight` | chaîne, jusqu'à 120 caractères     | non           | Des mots à localiser dans le texte.          |\n\n**En retour :** `status`, valant `ok` ou `no_lyrics` pour une page que le site\ncontient sans paroles ; `title`, `artist` et `source_url` ; et `lyrics`, la\ntranche elle-même. La lecture est décrite par `total_chars`, `returned_chars`,\n`offset`, `next_offset` et `truncated` : redonnez `next_offset` pour poursuivre,\net `null` marque la fin. `line_count` compte les lignes de la tranche, et\n`highlight` répond pour chaque mot s'il a été `found` et à quel `line_number`,\n`null` quand il ne l'a pas été.\n\n## Configuration\n\nChaque variable est facultative. Elles se posent dans le bloc `env` de la\nconfiguration du client.\n\n| Variable                      | Défaut               | Ce qu'elle fait                                                                   |\n| ----------------------------- | -------------------- | --------------------------------------------------------------------------------- |\n| `LYRICSCOM_USER_AGENT`        | l'identité du projet | Nomme votre application auprès du site, avec une adresse où joindre une personne. |\n| `LYRICSCOM_MIN_INTERVAL_MS`   | `1100`               | Écart entre deux requêtes, de 500 à 60000.                                        |\n| `LYRICSCOM_TIMEOUT_MS`        | `15000`              | Délai d'une requête, de 1000 à 120000.                                            |\n| `LYRICSCOM_MAX_RETRIES`       | `3`                  | Tentatives après un échec passager, de 0 à 10.                                    |\n| `LYRICSCOM_CACHE_TTL_MS`      | `900000`             | Durée pendant laquelle une réponse reste en mémoire, de 0 à 86400000.             |\n| `LYRICSCOM_CACHE_MAX_ENTRIES` | `200`                | Réponses gardées en mémoire à la fois, de 0 à 10000.                              |\n| `LYRICSCOM_LOG_LEVEL`         | `error`              | `silent`, `error`, `info` ou `debug`, écrit sur la sortie d'erreur.               |\n\nUne valeur hors de sa plage retombe sur le défaut, et la raison est écrite sur la\nsortie d'erreur.\n\n**À propos du User-Agent.** Ce serveur nomme le projet et renvoie vers son dépôt,\net le site le sert. Il refuse en revanche certains agents d'outils génériques :\nun `curl` nu reçoit un 403. Une erreur `blocked_user_agent` signifie que\nl'identité envoyée a été refusée, et `LYRICSCOM_USER_AGENT` permet d'en poser une\nde votre choix. Ce que vous y mettez relève de votre décision et de votre\nresponsabilité.\n\n## Erreurs\n\nChaque échec porte un de ces codes, un message, et quand cela aide une indication\ndu geste suivant.\n\n| Code                 | Ce qui s'est passé                                 | Que faire                                                                                 |\n| -------------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------- |\n| `not_found`          | Le site a répondu, et n'a pas cette chanson.       | Vérifiez l'identifiant avec `search_songs`.                                               |\n| `invalid_input`      | Les arguments ont été refusés avant toute requête. | Lisez le message, qui nomme l'argument.                                                   |\n| `throttled`          | Le site demande à ce client de ralentir.           | Attendez, puis rappelez avec les mêmes arguments. La chanson est toujours là.             |\n| `blocked_user_agent` | Le site a refusé l'identité envoyée par ce client. | Posez `LYRICSCOM_USER_AGENT`.                                                             |\n| `parse_failure`      | La page a chargé et le contenu attendu est absent. | Signalez-le sur [le suivi d'incidents](https://github.com/smeet666/mcp-lyricscom/issues). |\n| `network_error`      | La requête n'a pas abouti.                         | Réessayez sous peu.                                                                       |\n| `timeout`            | La requête a dépassé son délai.                    | Augmentez `LYRICSCOM_TIMEOUT_MS`, ou demandez un `max_chars` plus petit.                  |\n\n`throttled` et `blocked_user_agent` sont les deux noms que ce serveur donne à un\nrefus de servir, et un appelant qui lit plusieurs sources les ramène sur ce qu'il\nappelle une limitation de débit.\n\n## Comme bibliothèque\n\nLa couche qui lit le site est publiée seule, avec son rythme, son cache et ses\nerreurs, sans protocole attaché.\n\n```ts\nimport { LyricsComClient } from \"mcp-lyricscom/client\";\n\nconst client = new LyricsComClient();\nconst { data, cached } = await client.getSong({ id: \"1234567\" });\nconsole.log(data.title, data.artist, cached);\n```\n\n`search` et `getSong` répondent chacun `{ data, cached }`, et lèvent une erreur\nportant un des codes ci-dessus. Le plancher entre deux requêtes tient également\nici.\n\n## Rythme et attribution\n\nLes requêtes partent une à une avec au moins une seconde entre elles, et le\nplancher d'une demi-seconde tient quelle que soit la configuration. Une recherche\nen `verify: \"full\"` va chercher jusqu'à cinq pages de chansons, ce qui est la\nchose la plus coûteuse que fait ce serveur.\n\nChaque résultat porte l'artiste, le titre et l'adresse de la page de la chanson.\nLes paroles sont l'œuvre de leurs auteurs et de leurs éditeurs. Ce projet ne\nrevendique aucun droit dessus, n'embarque aucune base de paroles et n'écrit rien\nsur le disque.\n\nCe MCP est un projet non officiel, sans affiliation à lyrics.com.\n\n## Confidentialité\n\nCe serveur ne collecte rien sur vous et n'envoie rien à son auteur. Il tourne sur\nvotre machine, ne joint que `www.lyrics.com`, garde ses réponses en mémoire le temps qu'il\ntourne, et n'écrit rien sur le disque. [PRIVACY.md](PRIVACY.md) dit ce qu'une\nrequête emporte et quels réglages changent cela.\n\n## Développement\n\n```bash\nnpm install\nnpm run build:fixtures\nnpm test\nnpm run check\n```\n\nLes tests s'exécutent sur des fixtures engendrées et n'émettent aucune requête.\nLa suite en direct, `npm run test:live`, émet une requête par route et tourne\nchaque nuit contre le site lui-même.\n\n## Contribuer\n\nLes anomalies, les questions et les idées ont leur place dans\n[le suivi d'incidents](https://github.com/smeet666/mcp-lyricscom/issues). Les\npropositions de modification sont bienvenues ; ouvrir un ticket d'abord aide à\ns'accorder sur la forme du changement. Voir [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Licence\n\nMIT, voir [LICENSE](LICENSE). Les paroles appartiennent à leurs auteurs et à\nleurs éditeurs.\n",
  "bytes": 27685,
  "sha": "9312c36e0ef7265e5de67253d953615b5ffde25801ea0d68ca679b1b9273fe25",
  "repo_slug": "smeet666/mcp-lyricscom",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_smeet666_mcp_lyricscom_fac632b1/readme"
}