{
  "markdown": "<img src=\"assets/icon-128.png\" alt=\"\" width=\"96\" align=\"right\">\n\n# mcp-bideetmusique\n\n[![npm](https://img.shields.io/npm/v/mcp-bideetmusique.svg)](https://www.npmjs.com/package/mcp-bideetmusique)\n[![CI](https://github.com/smeet666/mcp-bideetmusique/actions/workflows/ci.yml/badge.svg)](https://github.com/smeet666/mcp-bideetmusique/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/mcp-bideetmusique.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-bideetmusique)\n[![Glama](https://glama.ai/mcp/servers/smeet666/mcp-bideetmusique/badges/score.svg)](https://glama.ai/mcp/servers/smeet666/mcp-bideetmusique)\n[![M8ven](https://m8ven.ai/badge/mcp/smeet666-mcp-bideetmusique-1n4meg?variant=verified)](https://m8ven.ai/mcp/smeet666-mcp-bideetmusique-1n4meg)\n[![LobeHub](https://lobehub.com/badge/mcp/smeet666-mcp-bideetmusique)](https://lobehub.com/mcp/smeet666-mcp-bideetmusique)\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=bideetmusique&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1iaWRlZXRtdXNpcXVlIl19)\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=bideetmusique&config=%7B%22name%22%3A%22bideetmusique%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-bideetmusique%22%5D%7D)\n\n[Bide & Musique](https://www.bide-et-musique.com) is a French web radio and the\ncollection of records it plays, catalogued by hand by the volunteer association\nthat runs it. Its subject is the forgotten song: the flop, the novelty record,\nthe television theme, the single nobody reissued. A record's page carries the\nperformer, the writers and composers, the year, the label and its catalogue\nreference, the sleeve, the duration, the station's own chart placings, and the\nwords when a listener transcribed them.\n\nThis server connects a chat client to that collection. You can search it along\none axis at a time, by performer, title, writer, lyrics, label or year; read one\nrecord in full; read what the site holds about an artist with their discography;\ndraw a record at random; and see what has just been catalogued. It needs no API\nkey and no account.\n\n_[Version française](#mcp-bideetmusique-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=bideetmusique&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1iaWRlZXRtdXNpcXVlIl19)\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=bideetmusique&config=%7B%22name%22%3A%22bideetmusique%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-bideetmusique%22%5D%7D)\n\n**Claude Code**\n\n```bash\nclaude mcp add bideetmusique -- npx -y mcp-bideetmusique\n```\n\n**Claude Desktop, Cursor, and any client using the standard config format**\n\n```json\n{\n  \"mcpServers\": {\n    \"bideetmusique\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-bideetmusique\"]\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    \"bideetmusique\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"ghcr.io/smeet666/mcp-bideetmusique: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.bide-et-musique.com`, and nothing else: no volume, no port, no credential.\n\n### Bundle, without npm\n\nDownload `mcp-bideetmusique-2.0.1.mcpb` from\n[the latest release](https://github.com/smeet666/mcp-bideetmusique/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- « Qu'est-ce que Bide & Musique a de Jacques Dutronc ? »\n- \"Which songs mention a submarine in their words?\"\n- \"Read me that record: the label, the year, who wrote it.\"\n- \"Play me something at random from the collection.\"\n- \"What has been catalogued lately?\"\n\nThe ordinary path runs from a search to a record: a row carries a `song_id`, and\n`get_song` reads it.\n\n## Tools\n\n| Tool              | What it does                                                    |\n| ----------------- | --------------------------------------------------------------- |\n| `search_songs`    | Searches the collection along one axis at a time.               |\n| `get_song`        | Reads one record in full, words included.                       |\n| `get_artist`      | Reads an artist and the records the collection holds of theirs. |\n| `get_random_song` | Draws a record nobody chose.                                    |\n| `list_new_songs`  | Reads what the collection has just catalogued.                  |\n\n### `search_songs`\n\nSearches along one axis, which has to be named: each asks a different question,\nand an answer on one says nothing about the others. A name that returns nothing\nas a performer may still be a title.\n\n| Argument      | Type                                                        | Required | What it does                   |\n| ------------- | ----------------------------------------------------------- | -------- | ------------------------------ |\n| `query`       | string, up to 200 characters                                | yes      | What to look for on that axis. |\n| `search_type` | `performer`, `title`, `writer`, `lyrics`, `label` or `year` | yes      | The axis to search along.      |\n| `page`        | integer, 1 to 200, default `1`                              | no       | Which page of rows.            |\n| `limit`       | integer, 1 to 50, default `20`                              | no       | Rows to serve.                 |\n\n| `search_type` | Finds                             |\n| ------------- | --------------------------------- |\n| `performer`   | the artist credited on the record |\n| `title`       | the name of the song              |\n| `writer`      | who wrote or composed it          |\n| `lyrics`      | the words sung in it              |\n| `label`       | the label it came out on          |\n| `year`        | the year printed on it            |\n\nThe `year` axis takes one four-digit year and nothing else: the site drops any\nother word there instead of filtering on it. Several keywords are combined with\nAND and each is matched inside words, so every extra word narrows the search, and\na quoted phrase returns nothing whatever the site's own form offers.\n\n**In return:** rows carrying `song_id`, which `get_song` takes; `title`; `url`;\nand the `artist`. `total_matches` is the number the site prints, counting\nmatching songs across every page, so it exceeds the rows of one page.\n`page_served` is the page the site actually served, since it answers a page past\nthe last one with the last page and no error: read it rather than assuming the\npage asked for. `page_count` and `has_more_pages` are `null` where the site\nprinted neither.\n\n### `get_song`\n\nReads one record in full.\n\n| Argument         | Type                        | Required | What it does                                        |\n| ---------------- | --------------------------- | -------- | --------------------------------------------------- |\n| `song_id`        | string, up to 20 characters | yes      | The id a search row carries.                        |\n| `include_lyrics` | boolean, default `true`     | no       | Carry the transcribed words when the page has them. |\n\n**In return:** `title`, `artist`, `credited_performer`, `year`, `writers`,\n`duration` with the text exactly as the record prints it and its `precision`,\n`labels` with one entry per label, `catalogue_reference`, `presentation`,\n`sleeve_credits`, `image_url`, `added_on` as an ISO date, the station's chart\nplacings, `favourites` and `comments`. The title, the artist and the duration are\nalways stated; the rest is absent on some records and comes back `null` rather\nthan guessed, and a counter the page prints nothing for is unknown rather than\nzero. `lyrics.available` says whether the page carries a transcription, and\n`lyrics.text` holds the words with the `transcriber` who wrote them down.\n\n### `get_artist`\n\nReads what the collection holds about one artist, with the records it has of\ntheirs.\n\n| Argument    | Type                             | Required | What it does                    |\n| ----------- | -------------------------------- | -------- | ------------------------------- |\n| `artist_id` | string, up to 20 characters      | yes      | The artist id a record carries. |\n| `limit`     | integer, 1 to 200, default `100` | no       | Records of theirs to serve.     |\n\n**In return:** `name`, `aliases`, `surname`, `first_name`, `nationality`,\n`birth_date`, `presentation`, `see_also`, `links` and `photo_url`, each `null` or\nempty where the page states nothing. `discography` carries their records, each\nwith its `song_id` for `get_song`, its `title`, `url`, `year` and how often the\nstation programmed it. `discography_count` counts the records served and\n`songs_on_page` the records the page held, so a truncated discography is visible.\n\n### `get_random_song`\n\nDraws a record nobody chose, over the ids the site serves. It is for browsing the\ncollection when no particular song is being asked about.\n\n| Argument         | Type                    | Required | What it does                                        |\n| ---------------- | ----------------------- | -------- | --------------------------------------------------- |\n| `include_lyrics` | boolean, default `true` | no       | Carry the transcribed words when the page has them. |\n\n**In return:** the record `get_song` returns.\n\n### `list_new_songs`\n\nReads what the collection has just catalogued.\n\n| Argument | Type                           | Required | What it does   |\n| -------- | ------------------------------ | -------- | -------------- |\n| `limit`  | integer, 1 to 50, default `20` | no       | Rows to serve. |\n\n**In return:** rows carrying `song_id`, `title` read off the line the feed\npublishes, `artist_name`, `listed_as`, `url` and `published_at`.\n`entries_in_feed` is the number of entries the feed holds, which is a fixed\nnumber and says nothing about how many records the collection holds.\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| `BIDE_USER_AGENT`        | the project identity | Names your application to the site, with an address where a person can be reached. |\n| `BIDE_MIN_INTERVAL_MS`   | `3000`               | Gap between two requests, from 2000 to 60000.                                      |\n| `BIDE_TIMEOUT_MS`        | `20000`              | Deadline for one request, from 1000 to 120000.                                     |\n| `BIDE_MAX_RETRIES`       | `3`                  | Attempts after a transient failure, from 0 to 10.                                  |\n| `BIDE_CACHE_TTL_MS`      | `900000`             | How long a page stays in memory, from 0 to 86400000.                               |\n| `BIDE_CACHE_MAX_ENTRIES` | `200`                | Pages held in memory at once, from 0 to 10000.                                     |\n| `BIDE_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## Errors\n\nEvery failure carries one of six 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 record.            | 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| `rate_limited`  | The site asked this client to slow down.                | Wait the number of seconds the hint names and call again with the same arguments. The record is still there. |\n| `parse_failure` | The page loaded and the expected content was absent.    | Report it at [the issue tracker](https://github.com/smeet666/mcp-bideetmusique/issues).                      |\n| `network_error` | The request did not complete.                           | Try again shortly.                                                                                           |\n| `timeout`       | The request passed its deadline.                        | Raise `BIDE_TIMEOUT_MS`, or ask for fewer rows.                                                              |\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 { BideEtMusiqueClient } from \"mcp-bideetmusique/client\";\n\nconst client = new BideEtMusiqueClient();\nconst { data, cached } = await client.getSong(\"1234\");\nconsole.log(data.title, data.labels, cached);\n```\n\n`search`, `getSong`, `getArtist` and `getNewSongs` each answer `{ data, cached }`,\nand throw an error carrying one of the six codes. The two-second floor between\ntwo requests holds here as well.\n\n## Pacing and attribution\n\nRequests go out one at a time with at least three seconds between them, and the\nfloor of two seconds holds however the server is configured. Bide & Musique is\nrun by a volunteer association on its own means, and this pacing is what the\ncollection is owed. The `User-Agent` always ends with the project identity and an\naddress where a person can be reached.\n\nEvery result carries the address of the record's page. The catalogue is the work\nof the association and of the listeners who built it, transcriptions included.\n\nThis MCP server is an unofficial project, with no affiliation to Bide & Musique.\n\n## Privacy\n\nThis server collects nothing about you and sends nothing to its author. It runs\non your machine, contacts `www.bide-et-musique.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-bideetmusique/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 catalogue belongs to Bide & Musique and to the\nlisteners who built it.\n\n---\n\n<a name=\"mcp-bideetmusique-français\"></a>\n\n# mcp-bideetmusique (français)\n\n_[English version](#mcp-bideetmusique)_\n\n[Bide & Musique](https://www.bide-et-musique.com) est une radio web française et\nla collection de disques qu'elle diffuse, cataloguée à la main par l'association\nbénévole qui la tient. Son sujet est la chanson oubliée : le bide, le disque de\nfantaisie, le générique de télévision, le 45 tours que personne n'a réédité. La\npage d'un disque porte l'interprète, les auteurs et compositeurs, l'année, le\nlabel et sa référence de catalogue, la pochette, la durée, les classements du\nhit-parade de la station, et les paroles quand un auditeur les a transcrites.\n\nCe serveur relie un client de conversation à cette collection. On peut y chercher\nselon un axe à la fois, par interprète, titre, auteur, paroles, label ou année ;\nlire une fiche en entier ; lire ce que le site contient sur un artiste avec sa\ndiscographie ; tirer un disque au hasard ; et voir ce qui vient d'être catalogué.\nAucune 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=bideetmusique&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1iaWRlZXRtdXNpcXVlIl19)\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=bideetmusique&config=%7B%22name%22%3A%22bideetmusique%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-bideetmusique%22%5D%7D)\n\n**Claude Code**\n\n```bash\nclaude mcp add bideetmusique -- npx -y mcp-bideetmusique\n```\n\n**Claude Desktop, Cursor, et tout client au format de configuration standard**\n\n```json\n{\n  \"mcpServers\": {\n    \"bideetmusique\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-bideetmusique\"]\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    \"bideetmusique\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"ghcr.io/smeet666/mcp-bideetmusique: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.bide-et-musique.com`, et de rien d'autre : aucun volume, aucun\nport, aucun identifiant.\n\n### Bundle, sans npm\n\nTéléchargez `mcp-bideetmusique-2.0.1.mcpb` depuis\n[la dernière publication](https://github.com/smeet666/mcp-bideetmusique/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- « Qu'est-ce que Bide & Musique a de Jacques Dutronc ? »\n- « Quelles chansons parlent d'un sous-marin dans leurs paroles ? »\n- « Lis-moi cette fiche : le label, l'année, qui l'a écrite. »\n- « Fais-moi écouter quelque chose au hasard dans la collection. »\n- « Qu'est-ce qui a été catalogué récemment ? »\n\nLe chemin ordinaire va d'une recherche à une fiche : une ligne porte un\n`song_id`, et `get_song` la lit.\n\n## Les outils\n\n| Outil             | Ce qu'il fait                                             |\n| ----------------- | --------------------------------------------------------- |\n| `search_songs`    | Cherche dans la collection selon un axe à la fois.        |\n| `get_song`        | Lit une fiche en entier, paroles comprises.               |\n| `get_artist`      | Lit un artiste et les disques que la collection a de lui. |\n| `get_random_song` | Tire un disque que personne n'a choisi.                   |\n| `list_new_songs`  | Lit ce que la collection vient de cataloguer.             |\n\n### `search_songs`\n\nCherche selon un axe, qu'il faut nommer : chacun pose une question différente, et\nune réponse sur l'un ne dit rien des autres. Un nom qui ne rend rien comme\ninterprète peut très bien être un titre.\n\n| Argument      | Type                                                        | Requis | Ce qu'il fait                 |\n| ------------- | ----------------------------------------------------------- | ------ | ----------------------------- |\n| `query`       | chaîne, jusqu'à 200 caractères                              | oui    | Ce qu'on cherche sur cet axe. |\n| `search_type` | `performer`, `title`, `writer`, `lyrics`, `label` ou `year` | oui    | L'axe de recherche.           |\n| `page`        | entier, 1 à 200, défaut `1`                                 | non    | Quelle page de lignes.        |\n| `limit`       | entier, 1 à 50, défaut `20`                                 | non    | Lignes à servir.              |\n\n| `search_type` | Trouve                          |\n| ------------- | ------------------------------- |\n| `performer`   | l'artiste crédité sur le disque |\n| `title`       | le nom de la chanson            |\n| `writer`      | qui l'a écrite ou composée      |\n| `lyrics`      | les mots qui y sont chantés     |\n| `label`       | le label qui l'a publiée        |\n| `year`        | l'année imprimée dessus         |\n\nL'axe `year` prend une année à quatre chiffres et rien d'autre : le site laisse\ntomber tout autre mot au lieu de filtrer dessus. Plusieurs mots-clés sont\ncombinés par ET et chacun est cherché à l'intérieur des mots, donc chaque mot\nsupplémentaire resserre la recherche, et une expression entre guillemets ne rend\nrien, quoi qu'en propose le formulaire du site.\n\n**En retour :** des lignes portant `song_id`, que `get_song` reprend ; `title` ;\n`url` ; et l'`artist`. `total_matches` est le nombre que le site imprime,\ncomptant les chansons correspondantes sur toutes les pages, donc il dépasse les\nlignes d'une page. `page_served` est la page que le site a réellement servie,\npuisqu'il répond à une page au-delà de la dernière par la dernière page et sans\nerreur : lisez-la plutôt que de supposer la page demandée. `page_count` et\n`has_more_pages` valent `null` là où le site n'a imprimé ni l'un ni l'autre.\n\n### `get_song`\n\nLit une fiche en entier.\n\n| Argument         | Type                          | Requis | Ce qu'il fait                                      |\n| ---------------- | ----------------------------- | ------ | -------------------------------------------------- |\n| `song_id`        | chaîne, jusqu'à 20 caractères | oui    | L'identifiant que porte une ligne.                 |\n| `include_lyrics` | booléen, défaut `true`        | non    | Porter les paroles transcrites quand la page en a. |\n\n**En retour :** `title`, `artist`, `credited_performer`, `year`, `writers`,\n`duration` avec le texte exactement comme la fiche l'imprime et sa `precision`,\n`labels` avec une entrée par label, `catalogue_reference`, `presentation`,\n`sleeve_credits`, `image_url`, `added_on` en date ISO, les classements du\nhit-parade de la station, `favourites` et `comments`. Le titre, l'artiste et la\ndurée sont toujours indiqués ; le reste est absent sur certaines fiches et revient\n`null` plutôt que deviné, et un compteur que la page n'imprime pas est inconnu\nplutôt que nul. `lyrics.available` dit si la page porte une transcription, et\n`lyrics.text` contient les mots avec le `transcriber` qui les a notés.\n\n### `get_artist`\n\nLit ce que la collection contient sur un artiste, avec les disques qu'elle a de\nlui.\n\n| Argument    | Type                          | Requis | Ce qu'il fait                                |\n| ----------- | ----------------------------- | ------ | -------------------------------------------- |\n| `artist_id` | chaîne, jusqu'à 20 caractères | oui    | L'identifiant d'artiste que porte une fiche. |\n| `limit`     | entier, 1 à 200, défaut `100` | non    | Disques de lui à servir.                     |\n\n**En retour :** `name`, `aliases`, `surname`, `first_name`, `nationality`,\n`birth_date`, `presentation`, `see_also`, `links` et `photo_url`, chacun `null`\nou vide là où la page n'indique rien. `discography` porte ses disques, chacun\navec son `song_id` pour `get_song`, son `title`, `url`, `year` et le nombre de\nfois où la station l'a programmé. `discography_count` compte les disques servis\net `songs_on_page` ceux que la page contenait, si bien qu'une discographie\ntronquée se voit.\n\n### `get_random_song`\n\nTire un disque que personne n'a choisi, parmi les identifiants que le site sert.\nIl sert à parcourir la collection quand aucune chanson précise n'est en\nquestion.\n\n| Argument         | Type                   | Requis | Ce qu'il fait                                      |\n| ---------------- | ---------------------- | ------ | -------------------------------------------------- |\n| `include_lyrics` | booléen, défaut `true` | non    | Porter les paroles transcrites quand la page en a. |\n\n**En retour :** la fiche que rend `get_song`.\n\n### `list_new_songs`\n\nLit ce que la collection vient de cataloguer.\n\n| Argument | Type                        | Requis | Ce qu'il fait    |\n| -------- | --------------------------- | ------ | ---------------- |\n| `limit`  | entier, 1 à 50, défaut `20` | non    | Lignes à servir. |\n\n**En retour :** des lignes portant `song_id`, `title` lu sur la ligne que le flux\npublie, `artist_name`, `listed_as`, `url` et `published_at`. `entries_in_feed`\nest le nombre d'entrées que le flux contient, qui est un nombre fixe et ne dit\nrien du nombre de disques que la collection contient.\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| `BIDE_USER_AGENT`        | l'identité du projet | Nomme votre application auprès du site, avec une adresse où joindre une personne. |\n| `BIDE_MIN_INTERVAL_MS`   | `3000`               | Écart entre deux requêtes, de 2000 à 60000.                                       |\n| `BIDE_TIMEOUT_MS`        | `20000`              | Délai d'une requête, de 1000 à 120000.                                            |\n| `BIDE_MAX_RETRIES`       | `3`                  | Tentatives après un échec passager, de 0 à 10.                                    |\n| `BIDE_CACHE_TTL_MS`      | `900000`             | Durée pendant laquelle une page reste en mémoire, de 0 à 86400000.                |\n| `BIDE_CACHE_MAX_ENTRIES` | `200`                | Pages gardées en mémoire à la fois, de 0 à 10000.                                 |\n| `BIDE_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## Erreurs\n\nChaque échec porte un des six codes, un message, et quand cela aide une\nindication du 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 fiche.         | 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| `rate_limited`  | Le site demande à ce client de ralentir.           | Attendez les secondes indiquées et rappelez avec les mêmes arguments. La fiche est toujours là. |\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-bideetmusique/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 `BIDE_TIMEOUT_MS`, ou demandez moins de lignes.                                       |\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 { BideEtMusiqueClient } from \"mcp-bideetmusique/client\";\n\nconst client = new BideEtMusiqueClient();\nconst { data, cached } = await client.getSong(\"1234\");\nconsole.log(data.title, data.labels, cached);\n```\n\n`search`, `getSong`, `getArtist` et `getNewSongs` répondent chacun\n`{ data, cached }`, et lèvent une erreur portant un des six codes. Le plancher de\ndeux secondes entre deux requêtes tient également ici.\n\n## Rythme et attribution\n\nLes requêtes partent une à une avec au moins trois secondes entre elles, et le\nplancher de deux secondes tient quelle que soit la configuration. Bide & Musique\nest tenu par une association bénévole sur ses propres moyens, et ce rythme est ce\nqu'on doit à la collection. Le `User-Agent` se termine toujours par l'identité du\nprojet et une adresse où joindre une personne.\n\nChaque résultat porte l'adresse de la page de la fiche. Le catalogue est l'œuvre\nde l'association et des auditeurs qui l'ont bâti, transcriptions comprises.\n\nCe MCP est un projet non officiel, sans affiliation à Bide & Musique.\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.bide-et-musique.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-bideetmusique/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). Le catalogue appartient à Bide & Musique et aux\nauditeurs qui l'ont bâti.\n",
  "bytes": 30486,
  "sha": "d4efa5bd93828614b7b3771f9413c885a0624afb4c02be42b5423bb9b89df515",
  "repo_slug": "smeet666/mcp-bideetmusique",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_smeet666_mcp_bideetmusique_796ae28a/readme"
}