Skip to main content
Glama
pierro-bn

HowLongToBeat MCP

by pierro-bn

HowLongToBeat MCP

Soutenir sur Ko-fi CI

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 build

Le 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 list

Sur 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 list

Autre 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 = 40

Redé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

hltb_search_games

query (1–200 caractères), limit (1–20, défaut 5), detail

Première page de résultats avec IDs HLTB, titres, durées et similarité du titre

hltb_get_game

game_id (ID HLTB numérique sous forme de chaîne), detail

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.

  • null indique une estimation absente ou nulle dans la source.

  • Les champs comp_main, comp_plus et comp_100 sont convertis de secondes en heures sans arrondi à l'heure entière. precision vaut source_seconds_converted_to_hours. Les chiffres peuvent différer des valeurs arrondies affichées sur le site ; ils restent des estimations communautaires.

  • time_labels dé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. coverage indique cette couverture limitée ; truncated indique seulement si limit a écarté des jeux de cette page. truncated: false ne signifie donc pas que tout le catalogue a été parcouru. no_results ne 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=dev

Les 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 build

Redé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 tools
hltb_get_gameGet HowLongToBeat gameA
Read-onlyIdempotent

Read a game detail page using an HLTB ID returned by search. Missing or unreadable pages produce an error, never fabricated durations.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoUse detailed for description, platforms and image URL.compact
game_idYesHowLongToBeat numeric ID as a string; not a Steam app ID.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 HowLongToBeatA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesGame title, preferably its official title.
detailNoUse detailed for description, platforms and image URL.compact

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 2 tool updatesv0.1.0
    • First observedhltb_get_game
    • First observedhltb_search_games

TDQS

A4.1/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    This 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 npm
    9
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    3
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    -