mcp-metacritic
An MCP server forMetacritic. Search films, shows and games, readMetascores and audience scores, and quote what individual critics wrote, withthe publication named and the article linked. No API key, no account, noconfiguration.
(Version française plus bas / French version below)
Quickstart
One-click install
Claude Code
claude mcp add metacritic -- npx -y mcp-metacritic
Claude Desktop, Cursor, and any client using the standard config format
{
"mcpServers": {
"metacritic": {
"command": "npx",
"args": ["-y", "mcp-metacritic"]
}
}
}
Tools
| Tool | What it does | Key parameters |
|---|---|---|
search_titles |
Finds films, shows and games by title. Compact rows. | query, kind, limit |
get_title |
Reads one entry, section by section. | slug, kind, sections, max_chars, offset |
get_reviews |
Individual critic or audience reviews, filtered by verdict. | slug, kind, source, sentiment, limit |
browse_titles |
Rankings: best rated, newest, most looked at. | kind, sort, genre, limit, offset |
Search returns a slug and a kind for every result, and the other tools takeboth. That is the intended chain: search, then read.
The server is read-only. It writes nothing back to Metacritic.
Things worth knowing
The two scores are on different scales. The critic Metascore runs to 100 andthe audience score to 10, so 73 and 8.9 describe similar opinions. Every scorethis server returns carries its own max, and the tool descriptions say so,because averaging the two is the single easiest mistake to make with this data.
Sections are opt-in because an entry is large. A detail response is 46 KBfor a film, most of it artwork variants. get_title returns basic andscores by default; awards, production, networks and where_to_watchcost an extra request each and are only fetched when asked for.
Reviews are a sample, not a page. Metacritic counts 36 critic reviews on agiven film and serves 7 through this route, whatever paging you ask for. Thetool says so rather than presenting the sample as the whole list, and links theentry page where the rest can be read.
A failure is never an empty result. Every response carries either a dataobject or an errors array, and this server reads that distinction rather thanguessing. A missing entry produces an error with a code; a request that couldnot be made says it could not be made, and never that Metacritic publishesnothing. Those are very different answers and a model cannot tell them apart onits own.
Search matches titles, and nothing else. It cannot find an entry from aplot detail, a person or a studio, it cannot page, and for a multi-word querythe site counts matches loosely: "the matrix" reports over 55 000 entriesbecause it counts anything matching either word.
Browse paging is approximate. Metacritic does not order tied entriesstably, so an entry can appear on two consecutive pages. Deduplicate by slugrather than counting rows.
Configuration
Every variable is optional. Set them in the env block of your MCP client config.
| Variable | Default | Purpose |
|---|---|---|
MC_USER_AGENT |
mcp-metacritic v<version> (<repo>) |
User-Agent sent to Metacritic. |
MC_MIN_INTERVAL_MS |
1000 |
Minimum gap between requests. Values below 500 ms are ignored. |
MC_TIMEOUT_MS |
15000 |
Per-request timeout. |
MC_MAX_RETRIES |
3 |
Retries on refusals and transient errors. |
MC_CACHE_TTL_MS |
86400000 |
Catalogue cache lifetime (24 hours). |
MC_SCORES_CACHE_TTL_MS |
3600000 |
Scores and reviews cache lifetime (1 hour). |
MC_CACHE_MAX_ENTRIES |
200 |
In-memory cache size. |
MC_LOG_LEVEL |
error |
silent, error, info or debug. Logs go to stderr. |
A User-Agent claiming to be a browser has the project's own identity appendedto it, so the traffic stays attributable whatever a caller sets.
How it works
Metacritic's website is served by a JSON backend atbackend.metacritic.com, and this server calls the same routes its own pagescall. It sends one request at a time, paces itself, backs off when refused, andkeeps two in-memory caches: a day for catalogue entries, which change whensomeone edits them, and an hour for scores and reviews, which move as reviewsland.
Streaming links arrive wrapped in click-tracking redirects of around 800characters, with the real destination inside. This server unwraps them: you getthe provider's own URL, not a tracker.
On the terms of use
metacritic.com/terms-of-use/ returns 404, so the terms could not be read.This is worth stating plainly rather than leaving implicit.
What is verifiable: the backend host serves no robots.txt at all, requires noAPI key, and did not throttle ten consecutive requests during testing. Thoseare the conditions this server operates under, and it does not take them aspermission to be greedy. It sends one request per second at most, identifiesitself, caches what it reads, and carries a link back to Metacritic on everyresult, including on every quoted review.
If Metacritic would rather it did not exist, opening an issue is enough.
Development
npm install
npm run build:fixtures # regenerate the JSON test fixtures
npm test # unit tests, no network
npm run typecheck
npm run build
MC_LIVE=1 npm run test:live # hits the real site, excluded from CI
npm run inspector # explore the tools in the MCP Inspector
Fixtures are generated, not captured: every title, quote, publication andstudio in test/fixtures is invented, so the tests are deterministic and nothird-party content lives in this repository.
The API layer (src/mc) does not import the MCP SDK and is publishedseparately as mcp-metacritic/client, so it can be used as a plain library. Itenforces the pacing floor and the identifying User-Agent itself, so those holdfor a library consumer too.
Reviews, scores and copyright
Metascores, review texts and the editorial work behind them belong toMetacritic and to the publications it aggregates. This project claims no rightsover them and ships none of their content.
Review quotes are returned as excerpts, capped in length, always with thepublication named and with a link to the original article where the siteprovides one. If you repeat a quote, keep both. If you cite a score, creditMetacritic and link the entry: every result carries a source_url.
This is an unofficial project, with no affiliation to or endorsement byMetacritic or Fandom.
License
MIT. See LICENSE. The license covers this source code only, not thedata retrieved through it.
mcp-metacritic (français)
Un serveur MCP pourMetacritic. Cherchez des films, séries et jeux,lisez les Metascores et les notes du public, et citez ce qu'ont écrit lescritiques, avec la publication nommée et l'article lié. Sans clé d'API, sanscompte, sans configuration.
Démarrage rapide
Installation en un clic
Claude Code
claude mcp add metacritic -- npx -y mcp-metacritic
Claude Desktop, Cursor, et tout client utilisant le format standard
{
"mcpServers": {
"metacritic": {
"command": "npx",
"args": ["-y", "mcp-metacritic"]
}
}
}
Outils
| Outil | Rôle | Paramètres principaux |
|---|---|---|
search_titles |
Trouve films, séries et jeux par titre. Lignes compactes. | query, kind, limit |
get_title |
Lit une fiche, section par section. | slug, kind, sections, max_chars, offset |
get_reviews |
Critiques presse ou public, filtrables par verdict. | slug, kind, source, sentiment, limit |
browse_titles |
Classements : mieux notés, plus récents, plus consultés. | kind, sort, genre, limit, offset |
La recherche renvoie un slug et un kind pour chaque résultat, que les autresoutils reprennent. C'est l'enchaînement prévu : chercher, puis lire.
Le serveur est en lecture seule. Il n'écrit rien vers Metacritic.
Ce qu'il faut savoir
Les deux notes ne sont pas sur la même échelle. Le Metascore critique vajusqu'à 100 et la note du public jusqu'à 10, donc 73 et 8,9 décrivent des avisvoisins. Chaque note renvoyée porte son propre max, et les descriptionsd'outils le disent, parce que les additionner est l'erreur la plus facile àcommettre avec ces données.
Les sections sont à la demande, car une fiche est volumineuse. Une réponsede détail fait 46 Ko pour un film, essentiellement des variantes d'illustration.get_title renvoie basic et scores par défaut ; awards, production,networks et where_to_watch coûtent une requête chacune et ne sont récupéréesque si on les demande.
Les critiques sont un échantillon, pas une page. Metacritic en compte 36 surun film donné et en sert 7 par cette route, quelle que soit la paginationdemandée. L'outil le dit au lieu de présenter l'échantillon comme la listecomplète, et renvoie vers la fiche où le reste se lit.
Un échec n'est jamais un résultat vide. Chaque réponse porte soit un objetdata, soit un tableau errors, et ce serveur lit cette distinction au lieu dela deviner. Une fiche absente produit une erreur avec un code ; une requête quin'a pas abouti dit qu'elle n'a pas abouti, jamais que Metacritic ne publie rien.Ce sont deux réponses très différentes, qu'un modèle ne peut pas distinguer seul.
La recherche porte sur les titres, et rien d'autre. Elle ne retrouve pas unefiche depuis un élément d'intrigue, une personne ou un studio, elle ne paginepas, et sur une requête de plusieurs mots le site compte large : « the matrix »annonce plus de 55 000 entrées parce qu'il compte tout ce qui correspond à l'undes deux mots.
La pagination des classements est approximative. Metacritic n'ordonne pasles ex æquo de façon stable, donc une entrée peut apparaître sur deux pagesconsécutives. Dédoublonnez par slug plutôt que de compter les lignes.
Configuration
Toutes les variables sont optionnelles, à déclarer dans le bloc env de votre client.
| Variable | Défaut | Rôle |
|---|---|---|
MC_USER_AGENT |
mcp-metacritic v<version> (<dépôt>) |
User-Agent envoyé à Metacritic. |
MC_MIN_INTERVAL_MS |
1000 |
Écart minimal entre requêtes. Sous 500 ms, la valeur est ignorée. |
MC_TIMEOUT_MS |
15000 |
Délai d'attente par requête. |
MC_MAX_RETRIES |
3 |
Tentatives en cas de refus ou d'erreur passagère. |
MC_CACHE_TTL_MS |
86400000 |
Durée de vie du cache catalogue (24 heures). |
MC_SCORES_CACHE_TTL_MS |
3600000 |
Durée de vie du cache notes et critiques (1 heure). |
MC_CACHE_MAX_ENTRIES |
200 |
Taille des caches mémoire. |
MC_LOG_LEVEL |
error |
silent, error, info ou debug. Logs sur stderr. |
Un User-Agent se faisant passer pour un navigateur se voit adjoindre l'identitédu projet, pour que le trafic reste attribuable quoi que règle l'appelant.
Fonctionnement
Le site de Metacritic est servi par un backend JSON à backend.metacritic.com,et ce serveur appelle les mêmes routes que leurs propres pages. Il envoie unerequête à la fois, s'impose un rythme, ralentit en cas de refus, et garde deuxcaches mémoire : un jour pour les fiches, qui ne bougent qu'à l'édition, et uneheure pour les notes et critiques, qui évoluent au fil des publications.
Les liens de streaming arrivent enveloppés dans des redirections publicitairesd'environ 800 caractères, avec la vraie destination à l'intérieur. Ce serveurles déballe : vous obtenez l'URL du fournisseur, pas celle d'un traqueur.
À propos des conditions d'utilisation
metacritic.com/terms-of-use/ renvoie une 404, les conditions n'ont donc pas puêtre lues. Autant le dire clairement plutôt que de le passer sous silence.
Ce qui est vérifiable : l'hôte du backend ne sert aucun robots.txt, ne demandeaucune clé, et n'a ralenti aucune de dix requêtes consécutives lors des tests.Ce sont les conditions dans lesquelles ce serveur opère, et il n'y voit pas uneautorisation d'être gourmand. Il envoie au plus une requête par seconde,s'identifie, met en cache ce qu'il lit, et porte un lien vers Metacritic surchaque résultat, y compris sur chaque critique citée.
Si Metacritic préfère qu'il n'existe pas, ouvrir une issue suffit.
Développement
npm install
npm run build:fixtures # régénère les fixtures JSON de test
npm test # tests unitaires, sans réseau
npm run typecheck
npm run build
MC_LIVE=1 npm run test:live # touche le vrai site, exclu de la CI
npm run inspector # explorer les outils dans le MCP Inspector
Les fixtures sont générées, pas capturées : chaque titre, citation, publicationet studio de test/fixtures est inventé, ce qui rend les tests déterministes etévite de stocker du contenu tiers dans ce dépôt.
La couche API (src/mc) n'importe pas le SDK MCP et est publiée séparément sousmcp-metacritic/client, utilisable comme simple bibliothèque. Elle appliqueelle-même le plancher de cadence et le User-Agent identifiant, qui valent doncaussi pour qui l'utilise en bibliothèque.
Critiques, notes et droits d'auteur
Les Metascores, les textes de critiques et le travail éditorial qui lessous-tend appartiennent à Metacritic et aux publications qu'il agrège. Ce projetne revendique aucun droit dessus et n'embarque aucun de leurs contenus.
Les citations sont renvoyées sous forme d'extraits, de longueur bornée, toujoursavec la publication nommée et un lien vers l'article d'origine quand le site enfournit un. Si vous reprenez une citation, conservez les deux. Si vous citez unenote, créditez Metacritic et liez la fiche : chaque résultat porte unsource_url.
Projet non officiel, sans affiliation à Metacritic ou Fandom ni approbation deleur part.
Licence
MIT, voir LICENSE. La licence couvre uniquement le code source, pasles données récupérées par son intermédiaire.