HowLongToBeat MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@HowLongToBeat MCPHow long does it take to beat Hollow Knight with all extras?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
HowLongToBeat MCP
Serveur MCP en lecture seule pour rechercher des jeux et consulter leurs durées sur HowLongToBeat, depuis Claude Code ou Codex local (application, CLI ou extension). Basé sur ckatzorke/howlongtobeat, il conserve le modèle de jeu et le calcul de similarité d'origine, avec un accès réseau adapté au site actuel. Aucun compte HowLongToBeat ni clé API n'est nécessaire.
Projet communautaire indépendant, sans affiliation avec HowLongToBeat.
Installation locale
Prérequis : Node.js 22 ou plus, npm et Git.
git clone https://github.com/pierro-bn/howlongtobeat-mcp.git
cd howlongtobeat-mcp
npm ci --ignore-scripts
npm run buildLe fichier à lancer est dist/index.js. Utiliser son chemin absolu, entre
guillemets si nécessaire. npm start lance également le serveur ; l'absence
de sortie est normale, il attend des messages MCP sur stdin.
Le projet est distribué sous forme de sources sur GitHub, sans publication npm.
Le champ private: true du manifeste empêche une publication npm accidentelle ;
il ne concerne pas la visibilité du dépôt GitHub.
Related MCP server: Video Games MCP Server
Claude Code
claude mcp add --transport stdio --scope user howlongtobeat -- node "/chemin/absolu/howlongtobeat-mcp/dist/index.js"
claude mcp listSur Windows, remplacer le chemin par exemple par
C:/outils/howlongtobeat-mcp/dist/index.js. Si node n'est pas dans le PATH du
client, utiliser le chemin absolu de node.exe.
Pour une configuration par projet, fusionner cette entrée dans .mcp.json
sans écraser les autres serveurs :
{
"mcpServers": {
"howlongtobeat": {
"type": "stdio",
"command": "node",
"args": ["C:/outils/howlongtobeat-mcp/dist/index.js"]
}
}
}Relancer Claude Code, puis vérifier /mcp.
Documentation Claude Code.
Codex
codex mcp add howlongtobeat -- node "/chemin/absolu/howlongtobeat-mcp/dist/index.js"
codex mcp listAutre possibilité : ajouter cette section dans ~/.codex/config.toml en
préservant la configuration existante :
[mcp_servers.howlongtobeat]
command = "node"
args = ["C:/outils/howlongtobeat-mcp/dist/index.js"]
startup_timeout_sec = 15
tool_timeout_sec = 40Redémarrer le client ou ouvrir une nouvelle session pour charger le serveur. Documentation officielle MCP de Codex.
ChatGPT dans un navigateur : le site web ne lit pas le fichier local de Codex. Ce serveur expose uniquement stdio, sans endpoint HTTP public. Pour un environnement ChatGPT disposant de Secure MCP Tunnel, le processus local peut être relié par le tunnel selon les accès du compte. Le tunnel n'est pas installé ni configuré par ce projet. Publier du code sur GitHub ne crée pas un endpoint MCP accessible à ChatGPT.
Outils
Outil | Paramètres | Résultat |
|
| Première page de résultats avec IDs HLTB, titres, durées et similarité du titre |
|
| Fiche d'un jeu avec ses durées |
detail vaut compact par défaut ; detailed ajoute description, plateformes
et image lorsqu'elles sont disponibles. Pour la description complète, utiliser
hltb_get_game : la recherche ne fournit généralement pas de résumé.
Chaque réponse réussie inclut la source et l'heure de récupération ; chaque jeu
inclut son lien HowLongToBeat. Les données sont rendues à la fois en texte JSON et dans
structuredContent pour les clients MCP compatibles.
Exemples d'appels :
{"query":"Portal","limit":3}{"game_id":"7230","detail":"detailed"}Exemples de demandes à l'assistant :
« Combien de temps faut-il pour terminer Portal, avec et sans les objectifs secondaires ? »
« Cherche Hollow Knight sur HowLongToBeat et montre-moi la fiche correspondante. »
Interprétation et limites
Les durées sont des estimations en heures, pas des garanties.
nullindique une estimation absente ou nulle dans la source.Les champs
comp_main,comp_plusetcomp_100sont convertis de secondes en heures sans arrondi à l'heure entière.precisionvautsource_seconds_converted_to_hours. Les chiffres peuvent différer des valeurs arrondies affichées sur le site ; ils restent des estimations communautaires.time_labelsdécrit les trois catégories de complétion. Le temps multijoueur n'est pas substitué à une durée de campagne manquante.Un ID HLTB n'est pas un ID Steam. La similarité mesure le texte du titre, pas la certitude qu'il s'agit du bon jeu ou de la bonne édition.
Le serveur demande uniquement la première page, avec une taille de 20 résultats.
coverageindique cette couverture limitée ;truncatedindique seulement silimita écarté des jeux de cette page.truncated: falsene signifie donc pas que tout le catalogue a été parcouru.no_resultsne prouve pas l'absence du jeu.Aucun cache persistant, aucune écriture distante et aucune télémétrie ajoutée. La session de recherche est conservée en mémoire pendant dix minutes et renouvelée une seule fois si la recherche reçoit HTTP 401/403. Les titres recherchés et IDs sont envoyés directement à HowLongToBeat par le serveur.
Le site n'offre pas ici une API contractuelle : blocages réseau et changements de format peuvent rendre le fournisseur inutilisable. Les descriptions récupérées doivent être traitées comme du contenu externe non fiable.
Tests et diagnostic
Validation du 18 octobre 2026 : 20 tests réussis, compilation réussie et recherche de Portal avec lecture de sa fiche vérifiées sur le site réel via MCP stdio. La CI a également réussi sur Windows/Linux avec Node 22 et 24. Ces tests ne garantissent pas la disponibilité future du site.
npm test
npm run test:live
npm audit --omit=devLes tests ordinaires n'accèdent pas au site : validation, erreurs, durées
inconnues, limites, annulation, timeout, protocole stdio, initialisation et
renouvellement de session, erreurs HTTP et données structurées de fiche.
Un test conserve la vérification de la bibliothèque d'origine avec Axios.
test:live interroge vraiment Portal via le processus MCP et renvoie un code non nul si la recherche ou la fiche
échoue. Il ne fait pas partie de la CI déterministe.
Codes d'erreur : UPSTREAM_UNAVAILABLE, UPSTREAM_FORMAT_CHANGED,
UPSTREAM_FORBIDDEN, UPSTREAM_RATE_LIMITED, UPSTREAM_NOT_FOUND, TIMEOUT,
CANCELLED, INTERNAL_ERROR. Une erreur de lecture n'est jamais convertie en
résultat vide. Le délai global est de 25 secondes pour l'ensemble d'un appel,
avec annulation transmise à chaque requête HTTP. Un HTTP 429 n'est pas retenté.
En cas d'erreur : vérifier l'accès au site depuis la machine du client puis
relancer test:live. Un HTTP 403 ne permet pas de distinguer à lui seul un
blocage réseau, un refus du site ou une route devenue obsolète. Ne pas désactiver
TLS ou contourner les restrictions d'accès pour faire passer le test.
La CI couvre Node 22/24 sur Windows/Linux. Aucune configuration personnelle Claude/Codex n'est modifiée par les commandes de compilation ou de test.
Mise à jour
Depuis le dossier du dépôt, avec une copie de travail sans modifications locales :
git pull --ff-only
npm ci --ignore-scripts
npm run buildRedémarrer ensuite le client MCP pour qu'il lance la nouvelle version compilée.
Soutenir le projet
Si ce serveur MCP vous est utile, vous pouvez soutenir son développement et sa maintenance avec un don facultatif sur Ko-fi. Merci pour votre soutien !
Licence et provenance
MIT pour le serveur MCP ; WTFPL v2 pour la bibliothèque d'origine. Le modèle
HowLongToBeatEntry et le calcul de similarité d'origine sont conservés.
L'accès réseau et la lecture des fiches sont implémentés dans src/provider.ts
pour suivre le format actuel du site. Voir
THIRD_PARTY_NOTICES.md. Le verrouillage npm inclut une
mise à jour d'Axios imposée à la dépendance amont pour éviter sa version 0.22.
Available Tools
2 toolshltb_get_gameGet HowLongToBeat gameARead-onlyIdempotent
Read a game detail page using an HLTB ID returned by search. Missing or unreadable pages produce an error, never fabricated durations.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Use detailed for description, platforms and image URL. | compact |
| game_id | Yes | HowLongToBeat numeric ID as a string; not a Steam app ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered and the bar is lower. The description still adds real value beyond that: it promises that missing or unreadable pages throw an error and that durations are never fabricated, which tells the agent how to handle failure rather than silently trusting output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, zero filler, with the input requirement front-loaded ahead of the error-behavior note. Every phrase carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with full annotation coverage and complete schema documentation, the description covers the essential prerequisite and the failure mode. There is no output schema, so it could say a bit more about what the detail page yields (e.g., duration fields), but that gap is minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (game_id with its "not a Steam app ID" clarification, and detail's compact/detailed enum) are already fully documented in the schema. The description only reinforces that the ID comes from search; it adds no format or constraint detail beyond what structured data provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read a game detail page") and specifies the exact input it needs (an HLTB ID returned by search), which cleanly separates it from the hltb_search_games sibling that produces those IDs. An agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "using an HLTB ID returned by search" establishes the prerequisite workflow and implicitly points to the search sibling as the way to obtain game_id. It stops short of naming the alternative tool explicitly or stating when not to use this one, so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hltb_search_gamesSearch HowLongToBeatARead-onlyIdempotent
Find games by title with estimated main story, extras and completion times. Returns only the first upstream page, not exhaustive results. No account or API key required.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Game title, preferably its official title. | |
| detail | No | Use detailed for description, platforms and image URL. | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lowered. The description still adds genuinely useful behavior: results are capped at the first upstream page rather than exhaustive, and no account or API key is needed, which tells the agent the call is unauthenticated and may be incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: purpose, then the truncation caveat, then the auth note. The purpose is front-loaded and every sentence carries distinct information with no repetition of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no output schema, the description covers what is returned (three time estimates), how much is returned (first page only), and access requirements. What remains unstated, such as response shape and whether pagination is possible, is minor for a search endpoint that returns a capped list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: query and detail are documented in the schema, while limit is only constrained (1-20, default 5) with no prose. The description adds nothing about limit, detail, or result-count tradeoffs, so it neither compensates for the gap nor falls below the baseline for a mostly-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find games by title') and adds what the results contain (main story, extras, completion times), which is more than a tautology. It implies the search-vs-fetch distinction against the sibling hltb_get_game by scoping itself to title lookup, but never names or contrasts with that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Find games by title' implies the lookup use case, and the note that it returns only the first upstream page sets a boundary on when to rely on it. However, it never states when to prefer hltb_get_game over this search or any prerequisites, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
hltb_get_game - First observed
hltb_search_games
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: hltb_search_games finds games by title, while hltb_get_game retrieves a specific game's detail page by ID. The description explicitly links them (get uses an ID returned by search), so an agent cannot confuse the two.
Both tools follow a consistent hltb_ + verb_noun pattern (hltb_get_game, hltb_search_games) with the server prefix applied uniformly. The singular/plural difference is semantically natural, not a convention break.
Two tools is on the thin side, but it matches the narrow read-only scope of a game-length lookup service where search plus detail retrieval is the complete workflow. Nothing extraneous, though there is little room for agent flexibility.
The search-then-get pattern covers the core lookup lifecycle for this domain, and the descriptions transparently flag limits (first page only, error instead of fabricated data). No update/create/delete is expected for a read-only reference service, so there is no real dead end.
Maintenance
Related MCP Connectors
- NDEX PricingOAuthapp.nd-x
Swiss market prices for video games and consoles, with provenance. Read-only, OAuth 2.1.
Hosted Airtable MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Explore and discover video games from the Internet Game Database. Search titles, view detailed inf…
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis server enables Claude to access Team Fight Tactics (TFT) game data, allowing users to retrieve match histories and detailed match information through the Riot Games API.11 npm9MIT
- AlicenseNot gradedqualityDmaintenanceProvides direct access to the RAWG gaming database, allowing users to search for games, retrieve detailed metadata, and explore genres within Claude. It streamlines game research by offering information on ratings, platforms, and release dates through natural language queries.3MIT
- AlicenseAqualityDmaintenanceA local MCP server that lets Claude fetch data from your Steam game library via the Steam Web API. All tools are read-only.5Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn MCP server that provides structured game data and scraped guides for video games, enabling natural language queries via Claude Code skills. Currently supports Clair Obscur: Expedition 33 with tools to search pictos, weapons, bosses, and more.-