{
  "markdown": "# mcp-metacritic\n\n[![npm](https://img.shields.io/npm/v/mcp-metacritic.svg)](https://www.npmjs.com/package/mcp-metacritic)\n[![CI](https://github.com/smeet666/mcp-metacritic/actions/workflows/ci.yml/badge.svg)](https://github.com/smeet666/mcp-metacritic/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/mcp-metacritic.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-metacritic)\n[![Glama](https://glama.ai/mcp/servers/smeet666/mcp-metacritic/badges/score.svg)](https://glama.ai/mcp/servers/smeet666/mcp-metacritic)\n[![M8ven](https://m8ven.ai/badge/mcp/smeet666-mcp-metacritic-1yvblv?variant=verified)](https://m8ven.ai/mcp/smeet666-mcp-metacritic-1yvblv)\n[![LobeHub](https://lobehub.com/badge/mcp/smeet666-mcp-metacritic)](https://lobehub.com/mcp/smeet666-mcp-metacritic)\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=metacritic&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1tZXRhY3JpdGljIl19)\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=metacritic&config=%7B%22name%22%3A%22metacritic%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-metacritic%22%5D%7D)\n\n<!-- m8ven-verify: 01151bc5a8514e55175f063339bedc6f -->\n\n[Metacritic](https://www.metacritic.com) gathers what critics and audiences said\nabout films, television series and video games. Each entry carries the year, the\nage rating, the genres, and two scores of its own: the Metascore, a weighted\naverage of the professional reviews, and the user score, out of ten, from the\npeople who signed up to rate it. Under each entry sit the reviews themselves,\nwith the publication that ran them and the quoted line.\n\nThis server connects a chat client to that catalogue. You can search for a title,\nread its entry with its scores and its details, browse a catalogue by score,\nrecency or popularity, and read the reviews of one title, filtered by critic or\naudience and by how favourable they were. It needs no API key and no account.\n\n_[Version française](#mcp-metacritic-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=metacritic&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1tZXRhY3JpdGljIl19)\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=metacritic&config=%7B%22name%22%3A%22metacritic%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-metacritic%22%5D%7D)\n\n**Claude Code**\n\n```bash\nclaude mcp add metacritic -- npx -y mcp-metacritic\n```\n\n**Claude Desktop, Cursor, and any client using the standard config format**\n\n```json\n{\n  \"mcpServers\": {\n    \"metacritic\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-metacritic\"]\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    \"metacritic\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"ghcr.io/smeet666/mcp-metacritic: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`backend.metacritic.com`, and nothing else: no volume, no port, no credential.\n\n### Bundle, without npm\n\nDownload `mcp-metacritic-2.0.1.mcpb` from\n[the latest release](https://github.com/smeet666/mcp-metacritic/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- \"What did critics make of The Matrix?\"\n- \"Read me a few negative reviews of that game.\"\n- \"What are the best-reviewed horror films?\"\n- \"How does the user score compare to the Metascore?\"\n- \"What came out recently that reviewed well?\"\n\nThe ordinary path runs from a search to an entry: a row carries a `slug` and a\n`kind`, and `get_title` and `get_reviews` take both together.\n\n## Tools\n\n| Tool            | What it does                                                |\n| --------------- | ----------------------------------------------------------- |\n| `search_titles` | Finds films, series and games by title.                     |\n| `get_title`     | Reads one entry, its scores and its details.                |\n| `get_reviews`   | Reads the reviews of one entry, by source and by sentiment. |\n| `browse_titles` | Lists a catalogue by score, recency or popularity.          |\n\nA title is addressed by its `slug` together with its `kind`, since the same slug\ncan name a film and a game.\n\n### `search_titles`\n\nFinds films, series and games by title.\n\n| Argument | Type                                            | Required | What it does               |\n| -------- | ----------------------------------------------- | -------- | -------------------------- |\n| `query`  | string, at least 1 character                    | yes      | A title, or part of one.   |\n| `kind`   | `movie`, `show`, `game` or `any`, default `any` | no       | Which catalogue to search. |\n| `limit`  | integer, 1 to 50, default `10`                  | no       | Rows to serve.             |\n\n**In return:** rows carrying `slug` and `kind`, which `get_title` and\n`get_reviews` take together; `title`; `year`; `release_date`; `rating`, the age\nrating as published; `metascore`; `user_score`; and `source_url`. **A score the\nsite has not computed is `null`, never `0`:** on a scale that starts at zero the\ntwo would be indistinguishable, and a title with too few reviews carries none.\n\n### `get_title`\n\nReads one entry. The heavier parts are asked for rather than served by default,\nand each one beyond the default costs a request.\n\n| Argument    | Type                                                                                                            | Required | What it does                          |\n| ----------- | --------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------- |\n| `slug`      | string, at least 1 character                                                                                    | yes      | The identifier a row carries.         |\n| `kind`      | `movie`, `show` or `game`                                                                                       | yes      | Which catalogue it belongs to.        |\n| `sections`  | array of `basic`, `scores`, `awards`, `production`, `networks`, `where_to_watch`, default `[\"basic\", \"scores\"]` | no       | Which parts to return.                |\n| `max_chars` | integer, 200 to 20000, default `4000`                                                                           | no       | How much of the description to serve. |\n| `offset`    | integer, 0 or more, default `0`                                                                                 | no       | Where to resume the description.      |\n\n**In return:** the entry a search row carries, plus `description`, `tagline`,\n`genres`, `duration_minutes` and `imdb_id`, each `null` where the page states\nnothing. `total_chars`, `returned_chars` and `offset` describe the slice of the\ndescription served.\n\n### `get_reviews`\n\nReads the reviews of one entry.\n\n| Argument    | Type                                                      | Required | What it does                       |\n| ----------- | --------------------------------------------------------- | -------- | ---------------------------------- |\n| `slug`      | string, at least 1 character                              | yes      | The identifier a row carries.      |\n| `kind`      | `movie`, `show` or `game`                                 | yes      | Which catalogue it belongs to.     |\n| `source`    | `critic` or `user`, default `critic`                      | no       | Whose reviews to read.             |\n| `sentiment` | `all`, `positive`, `neutral` or `negative`, default `all` | no       | How favourable a review has to be. |\n| `limit`     | integer, 1 to 50, default `10`                            | no       | Reviews to serve.                  |\n| `offset`    | integer, 0 or more, default `0`                           | no       | Reviews to skip, for paging.       |\n\n**In return:** `reviews`, each with its `quote` as published, its `score`, the\n`max` that score is out of, which is 100 for a critic and 10 for a user, and the\n`publication` that ran it. **Name the publication when quoting a review.**\n`total_available` counts the reviews matching the source and the sentiment asked\nfor, and `next_offset` continues.\n\n### `browse_titles`\n\nLists a catalogue.\n\n| Argument | Type                                            | Required | What it does                           |\n| -------- | ----------------------------------------------- | -------- | -------------------------------------- |\n| `kind`   | `movie`, `show` or `game`, default `movie`      | no       | Which catalogue to list.               |\n| `sort`   | `score`, `recent` or `popular`, default `score` | no       | How the rows are ordered.              |\n| `genre`  | string                                          | no       | A single genre name, such as `Horror`. |\n| `limit`  | integer, 1 to 50, default `20`                  | no       | Rows to serve.                         |\n| `offset` | integer, 0 or more, default `0`                 | no       | Rows to skip, for paging.              |\n\n**In return:** the rows `search_titles` returns, with `total_available`,\n`offset`, `next_offset` and the `kind`, `sort` and `genre` the listing was read\nunder.\n\n## Two scores, two things measured\n\nThe Metascore is a weighted average of professional reviews, out of 100. The user\nscore is the average of what registered members gave, out of 10. They measure\ndifferent populations on different scales, and a title can carry one and not the\nother. Read each with the `max` its reviews state, and report a missing score as\nmissing.\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| `MC_USER_AGENT`          | the project identity | Names your application to the site, with an address where a person can be reached. |\n| `MC_MIN_INTERVAL_MS`     | `1000`               | Gap between two requests, from 500 to 60000.                                       |\n| `MC_TIMEOUT_MS`          | `15000`              | Deadline for one request, from 1000 to 120000.                                     |\n| `MC_MAX_RETRIES`         | `3`                  | Attempts after a transient failure, from 0 to 10.                                  |\n| `MC_CACHE_TTL_MS`        | `86400000`           | How long a catalogue entry stays in memory, from 0 to 604800000.                   |\n| `MC_SCORES_CACHE_TTL_MS` | `3600000`            | How long scores and reviews stay in memory, from 0 to 86400000.                    |\n| `MC_CACHE_MAX_ENTRIES`   | `200`                | Answers held in memory at once, from 0 to 10000.                                   |\n| `MC_LOG_LEVEL`           | `error`              | `silent`, `error`, `info` or `debug`, written to stderr.                           |\n\nScores move as reviews come in, especially around a release, so they are held for\nan hour where a catalogue entry is held for a day. A value outside its range\nfalls back to the default, and the reason is written to stderr.\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 entry.             | Check the slug and the kind with `search_titles`.                                                           |\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 entry is still there. |\n| `parse_failure` | The answer arrived in a shape this client cannot read.  | Report it at [the issue tracker](https://github.com/smeet666/mcp-metacritic/issues).                        |\n| `network_error` | The request did not complete.                           | Try again shortly.                                                                                          |\n| `timeout`       | The request passed its deadline.                        | Raise `MC_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 { McClient } from \"mcp-metacritic/client\";\n\nconst client = new McClient();\nconst { data, cached } = await client.getTitle({ slug: \"the-matrix\", kind: \"movie\" });\nconsole.log(data.title, data.metascore, cached);\n```\n\nEach read answers `{ data, cached }`, and throws an error carrying one of the six\ncodes. The floor between two requests holds here as well.\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. The `User-Agent` always\nends with the project identity and an address where a person can be reached.\n\nEvery result carries the address of the Metacritic page, and every quoted review\ncarries the publication that ran it. The reviews belong to their authors and to\nthe publications that ran them.\n\nThis MCP server is an unofficial project, with no affiliation to Metacritic.\n\n## Privacy\n\nThis server collects nothing about you and sends nothing to its author. It runs\non your machine, contacts `backend.metacritic.com` and nothing else, holds its\nanswers in memory while 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-metacritic/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 scores and the reviews belong to Metacritic and\nto the publications it quotes.\n\n---\n\n<a name=\"mcp-metacritic-français\"></a>\n\n# mcp-metacritic (français)\n\n_[English version](#mcp-metacritic)_\n\n[Metacritic](https://www.metacritic.com) rassemble ce que la critique et le\npublic ont dit des films, des séries et des jeux vidéo. Chaque fiche porte\nl'année, la classification par âge, les genres, et deux notes qui lui sont\npropres : le Metascore, moyenne pondérée des critiques professionnelles, et la\nnote des utilisateurs, sur dix, donnée par les inscrits. Sous chaque fiche se\ntrouvent les critiques elles-mêmes, avec la publication qui les a signées et la\nphrase citée.\n\nCe serveur relie un client de conversation à ce catalogue. On peut y chercher un\ntitre, lire sa fiche avec ses notes et ses détails, parcourir un catalogue par\nnote, par fraîcheur ou par popularité, et lire les critiques d'un titre, filtrées\npar source et par tonalité. 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=metacritic&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1jcC1tZXRhY3JpdGljIl19)\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=metacritic&config=%7B%22name%22%3A%22metacritic%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22mcp-metacritic%22%5D%7D)\n\n**Claude Code**\n\n```bash\nclaude mcp add metacritic -- npx -y mcp-metacritic\n```\n\n**Claude Desktop, Cursor, et tout client au format de configuration standard**\n\n```json\n{\n  \"mcpServers\": {\n    \"metacritic\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-metacritic\"]\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    \"metacritic\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"ghcr.io/smeet666/mcp-metacritic: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 `backend.metacritic.com`, et de rien d'autre : aucun volume, aucun\nport, aucun identifiant.\n\n### Bundle, sans npm\n\nTéléchargez `mcp-metacritic-2.0.1.mcpb` depuis\n[la dernière publication](https://github.com/smeet666/mcp-metacritic/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'a pensé la critique de Matrix ? »\n- « Lis-moi quelques critiques négatives de ce jeu. »\n- « Quels sont les films d'horreur les mieux notés ? »\n- « Comment la note du public se compare-t-elle au Metascore ? »\n- « Qu'est-il sorti récemment qui a été bien reçu ? »\n\nLe chemin ordinaire va d'une recherche à une fiche : une ligne porte un `slug` et\nun `kind`, et `get_title` comme `get_reviews` reprennent les deux ensemble.\n\n## Les outils\n\n| Outil           | Ce qu'il fait                                                 |\n| --------------- | ------------------------------------------------------------- |\n| `search_titles` | Trouve des films, des séries et des jeux par leur titre.      |\n| `get_title`     | Lit une fiche, ses notes et ses détails.                      |\n| `get_reviews`   | Lit les critiques d'une fiche, par source et par tonalité.    |\n| `browse_titles` | Liste un catalogue par note, par fraîcheur ou par popularité. |\n\nUn titre s'adresse par son `slug` accompagné de son `kind`, un même slug pouvant\nnommer un film et un jeu.\n\n### `search_titles`\n\nTrouve des films, des séries et des jeux par leur titre.\n\n| Argument | Type                                           | Requis | Ce qu'il fait             |\n| -------- | ---------------------------------------------- | ------ | ------------------------- |\n| `query`  | chaîne, au moins 1 caractère                   | oui    | Un titre, ou une partie.  |\n| `kind`   | `movie`, `show`, `game` ou `any`, défaut `any` | non    | Le catalogue où chercher. |\n| `limit`  | entier, 1 à 50, défaut `10`                    | non    | Lignes à servir.          |\n\n**En retour :** des lignes portant `slug` et `kind`, que `get_title` et\n`get_reviews` reprennent ensemble ; `title` ; `year` ; `release_date` ; `rating`,\nla classification par âge telle que publiée ; `metascore` ; `user_score` ; et\n`source_url`. **Une note que le site n'a pas calculée vaut `null`, jamais `0` :**\nsur une échelle qui commence à zéro les deux seraient indiscernables, et un titre\navec trop peu de critiques n'en porte aucune.\n\n### `get_title`\n\nLit une fiche. Les parties lourdes se demandent au lieu d'être servies par\ndéfaut, et chacune au-delà du défaut coûte une requête.\n\n| Argument    | Type                                                                                                             | Requis | Ce qu'il fait                        |\n| ----------- | ---------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------ |\n| `slug`      | chaîne, au moins 1 caractère                                                                                     | oui    | L'identifiant d'une ligne.           |\n| `kind`      | `movie`, `show` ou `game`                                                                                        | oui    | Le catalogue dont il relève.         |\n| `sections`  | tableau de `basic`, `scores`, `awards`, `production`, `networks`, `where_to_watch`, défaut `[\"basic\", \"scores\"]` | non    | Les parties à rendre.                |\n| `max_chars` | entier, 200 à 20000, défaut `4000`                                                                               | non    | La longueur de description à servir. |\n| `offset`    | entier, 0 ou plus, défaut `0`                                                                                    | non    | Où reprendre la description.         |\n\n**En retour :** la fiche que porte une ligne de recherche, plus `description`,\n`tagline`, `genres`, `duration_minutes` et `imdb_id`, chacun `null` là où la page\nn'indique rien. `total_chars`, `returned_chars` et `offset` décrivent la tranche\nde description servie.\n\n### `get_reviews`\n\nLit les critiques d'une fiche.\n\n| Argument    | Type                                                     | Requis | Ce qu'il fait                      |\n| ----------- | -------------------------------------------------------- | ------ | ---------------------------------- |\n| `slug`      | chaîne, au moins 1 caractère                             | oui    | L'identifiant d'une ligne.         |\n| `kind`      | `movie`, `show` ou `game`                                | oui    | Le catalogue dont il relève.       |\n| `source`    | `critic` ou `user`, défaut `critic`                      | non    | De qui lire les critiques.         |\n| `sentiment` | `all`, `positive`, `neutral` ou `negative`, défaut `all` | non    | La tonalité exigée d'une critique. |\n| `limit`     | entier, 1 à 50, défaut `10`                              | non    | Critiques à servir.                |\n| `offset`    | entier, 0 ou plus, défaut `0`                            | non    | Critiques à sauter, pour paginer.  |\n\n**En retour :** `reviews`, chacune avec sa `quote` telle que publiée, son\n`score`, le `max` sur lequel cette note est donnée, qui vaut 100 pour un critique\net 10 pour un utilisateur, et la `publication` qui l'a signée. **Nommez la\npublication quand vous citez une critique.** `total_available` compte les\ncritiques correspondant à la source et à la tonalité demandées, et `next_offset`\npoursuit.\n\n### `browse_titles`\n\nListe un catalogue.\n\n| Argument | Type                                           | Requis | Ce qu'il fait                         |\n| -------- | ---------------------------------------------- | ------ | ------------------------------------- |\n| `kind`   | `movie`, `show` ou `game`, défaut `movie`      | non    | Le catalogue à lister.                |\n| `sort`   | `score`, `recent` ou `popular`, défaut `score` | non    | L'ordre des lignes.                   |\n| `genre`  | chaîne                                         | non    | Un seul nom de genre, comme `Horror`. |\n| `limit`  | entier, 1 à 50, défaut `20`                    | non    | Lignes à servir.                      |\n| `offset` | entier, 0 ou plus, défaut `0`                  | non    | Lignes à sauter, pour paginer.        |\n\n**En retour :** les lignes que rend `search_titles`, avec `total_available`,\n`offset`, `next_offset` et les `kind`, `sort` et `genre` sous lesquels la liste a\nété lue.\n\n## Deux notes, deux choses mesurées\n\nLe Metascore est une moyenne pondérée des critiques professionnelles, sur 100. La\nnote des utilisateurs est la moyenne de ce qu'ont donné les membres inscrits, sur 10. Elles mesurent des populations différentes sur des échelles différentes, et\nun titre peut porter l'une sans l'autre. Lisez chacune avec le `max` que ses\ncritiques indiquent, et rapportez une note absente comme absente.\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| `MC_USER_AGENT`          | l'identité du projet | Nomme votre application auprès du site, avec une adresse où joindre une personne.  |\n| `MC_MIN_INTERVAL_MS`     | `1000`               | Écart entre deux requêtes, de 500 à 60000.                                         |\n| `MC_TIMEOUT_MS`          | `15000`              | Délai d'une requête, de 1000 à 120000.                                             |\n| `MC_MAX_RETRIES`         | `3`                  | Tentatives après un échec passager, de 0 à 10.                                     |\n| `MC_CACHE_TTL_MS`        | `86400000`           | Durée pendant laquelle une fiche reste en mémoire, de 0 à 604800000.               |\n| `MC_SCORES_CACHE_TTL_MS` | `3600000`            | Durée pendant laquelle les notes et critiques restent en mémoire, de 0 à 86400000. |\n| `MC_CACHE_MAX_ENTRIES`   | `200`                | Réponses gardées en mémoire à la fois, de 0 à 10000.                               |\n| `MC_LOG_LEVEL`           | `error`              | `silent`, `error`, `info` ou `debug`, écrit sur la sortie d'erreur.                |\n\nLes notes bougent au fil des critiques, surtout autour d'une sortie, donc elles\nsont gardées une heure là où une fiche l'est un jour. Une valeur hors de sa plage\nretombe sur le défaut, et la raison est écrite sur la sortie 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 le slug et le type avec `search_titles`.                                               |\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 réponse est arrivée dans une forme illisible ici. | Signalez-le sur [le suivi d'incidents](https://github.com/smeet666/mcp-metacritic/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 `MC_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 { McClient } from \"mcp-metacritic/client\";\n\nconst client = new McClient();\nconst { data, cached } = await client.getTitle({ slug: \"the-matrix\", kind: \"movie\" });\nconsole.log(data.title, data.metascore, cached);\n```\n\nChaque lecture répond `{ data, cached }`, et lève une erreur portant un des six\ncodes. Le plancher entre deux requêtes tient également ici.\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. Le\n`User-Agent` se termine toujours par l'identité du projet et une adresse où\njoindre une personne.\n\nChaque résultat porte l'adresse de la page Metacritic, et chaque critique citée\nporte la publication qui l'a signée. Les critiques appartiennent à leurs auteurs\net aux publications qui les ont publiées.\n\nCe MCP est un projet non officiel, sans affiliation à Metacritic.\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 `backend.metacritic.com`, garde ses réponses en\nmémoire le temps qu'il tourne, et n'écrit rien sur le disque.\n[PRIVACY.md](PRIVACY.md) dit ce qu'une requête emporte et quels réglages changent\ncela.\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-metacritic/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 notes et les critiques appartiennent à\nMetacritic et aux publications qu'il cite.\n",
  "bytes": 30307,
  "sha": "69abbaecd6115fe4baf3e44957490c3283ddbafb1e2b6a4023556a7346145782",
  "repo_slug": "smeet666/mcp-metacritic",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_smeet666_mcp_metacritic_227e1cf1/readme"
}