Tous les skills

mcp-builder (anthropics/skills)

Guide la création de serveurs MCP en Python ou TypeScript exposant des services externes comme outils bien conçus.

mcp-builder : fait passer les serveurs MCP de 3.6 à 4.6/5 en ajoutant le nommage, les annotations et l'asynchrone, mais une checklist en une phrase obtient 4.9 pour 68 % des tokens

Selon les casSûr

Codex CLI · gpt-6-astra

21.6 / 30

Gain par rapport à sans skill : +1.04 · Selon les cas · 18 exécutions

Selon les cas : le total 21.6/30 est inférieur à 22. Pour être recommandé, il faut un total de 22/30, une qualité de sortie de 3.5 et un gain de +1.0.

SOTA

Réussi

Testé avec Codex.

Couvre Codex, Claude Code

Codex CLI 0.166 (palier SOTA) : 18 exécutions notées. Une réussite ici couvre aussi Claude Code selon notre règle de palier ; elle ne dit rien du second palier.

Scores

Chaque dimension va de 0 à 5 et les six forment le total sur 30. 5 est la meilleure note dans chaque dimension. Coût 5 signifie bon marché et rapide. Installation 5 signifie facile.

Fiabilité du déclenchement
5.0
Gain par rapport à sans skill
3.0
Qualité de sortie
4.6
Coût en tokens et en temps
3.0
Installation et portabilité
3.0
Sécurité
3.0

Revue de sécurité

Sûr

Scan statique : 8 CRITIQUE / 13 ÉLEVÉ / 7 MOYEN. Revue manuelle : sûr à exécuter dans un bac à sable sans réseau (résultats du scanner expliqués ; scripts fournis jamais exécutés). Un scan propre ne prouve pas qu'un skill est sûr.

Installer

npx skills@latest add anthropics/skills --skill mcp-builder

Source

Commit épinglé: ca45fc496a3436251f191354091d557da31c15b5

Testé: 2026-11-02

Ce que nous avons testé

  • Serveur MCP Python pour une API de librairie — Écrivez server.py : un serveur MCP en Python pour une API REST d'inventaire de librairie (URL de base depuis l'environnement, token bearer depuis l'environnement). Outils : rechercher des livres, obtenir un livre, mettre à jour le stock d'un livre, supprimer un livre. Utilisez le SDK Python officiel mcp (FastMC…
  • Serveur MCP TypeScript pour une API météo — Écrivez src/index.ts et package.json : un serveur MCP en TypeScript pour une API REST météo (URL de base et clé API depuis l'environnement). Outils : météo actuelle d'une ville, prévisions à 5 jours, lister les lieux enregistrés, supprimer un lieu enregistré. Utilisez le SDK officiel MCP…
  • Réparer un serveur MCP écrit à la hâte — server.py est un serveur MCP pour notre API d'entrepôt qui fonctionne mais a été écrit à la hâte. Corrigez-le pour qu'il suive les bonnes pratiques des serveurs MCP. Modifiez server.py sur place et gardez-le connecté à la même API. Il n'y a ni réseau ni installation de paquets ici ; écrivez juste…

Points forts

  • Fait passer le score moyen de 3.57 à 4.61 par rapport à sans skill (+1.04).
  • Le skill a été détecté sans être nommé : son fichier a été lu dans 6/6 exécutions avec skill.
  • Qualité absolue élevée avec le skill : 4.61 sur 5.

Points faibles

  • Un prompt d'une phrase obtient 4.88, contre 4.61 avec le skill (-0.27).
  • Consomme 1.51 fois plus de tokens que sans skill.
  • n=2 par tâche et par bras ; les écarts inférieurs à environ 1 point sont du bruit.

Avis

Codex CLI 0.166 (gpt-6-astra, low reasoning) sur un PC Windows de test dédié, un projet temporaire neuf et des HOME/TMPDIR/caches temporaires à chaque exécution, skill installé (traitement) ou absent (contrôle) ou absent avec l'exigence centrale du skill compressée en une phrase ajoutée au prompt (groupe « prompt d'une phrase »), 2 exécutions par groupe et par tâche, réseau coupé, écritures dans /tmp bloquées. Les prompts ne mentionnent jamais le skill (sauf la formulation indiquée ci-dessous). Trois tâches : écrire un serveur MCP Python pour une API REST de librairie, écrire un serveur MCP TypeScript pour une API météo, et corriger un server.py existant bricolé pour suivre les bonnes pratiques. Rien ne nécessite le réseau (l'agent ne peut pas installer le SDK MCP ; il écrit seulement du code). Le prompt du groupe avec skill est le même que le contrôle.

Comparaison à trois bras

BrasScore moyen (0-5)Tokens par exécution
Sans le skill3.5773k
Prompt d'une phrase4.8875k
Avec le skill4.61110k

Mesuré avec Codex CLI sur 18 exécutions, noté par des contrôles basés sur des règles, sans juge LLM. Total 21.6 / 30, verdict Selon les cas.

Verdict : Selon les cas (21.6 / 30). Source : anthropics/skills, skills/mcp-builder, épinglé au commit ca45fc4. Installation : npx skills@latest add anthropics/skills --skill mcp-builder. Licence : Propriétaire : LICENSE.txt d'anthropics/skills (code source disponible ; évaluation uniquement, non redistribué).

Ce que c'est

Le skill mcp-builder d'anthropics/skills : un guide pour construire des serveurs Model Context Protocol (rechercher et planifier, implémenter, relire et tester, écrire des évaluations). Il fournit des guides de langage pour Python (FastMCP) et TypeScript, des notes de bonnes pratiques MCP et deux scripts auxiliaires pour exécuter des évaluations contre un serveur. Licence propriétaire (code source disponible).

Comment nous avons testé

Codex CLI 0.166 (gpt-6-astra, raisonnement faible) sur un PC de test Windows dédié, un projet temporaire neuf et des caches HOME/TMPDIR temporaires à chaque exécution, skill installé (groupe avec skill) ou absent (groupe témoin) ou absent avec l'exigence centrale du skill compressée en une phrase ajoutée à la fin du prompt (groupe prompt d'une phrase), 2 exécutions par groupe et par tâche, réseau coupé, écritures dans /tmp bloquées. Les prompts ne mentionnent jamais le skill (sauf la formulation indiquée ci-dessous).

Trois tâches : écrire un serveur MCP Python pour une API REST de librairie, écrire un serveur MCP TypeScript pour une API météo, et corriger un server.py existant bricolé à la va-vite pour suivre les bonnes pratiques. Rien ne nécessite le réseau (l'agent ne peut pas installer le SDK MCP ; il écrit uniquement du code). Le prompt du groupe avec skill est le même que celui du témoin.

  1. Serveur MCP Python pour une API de librairie — Écrivez server.py : un serveur MCP en Python pour une API REST d'inventaire de librairie (URL de base depuis l'environnement, jeton bearer depuis l'environnement). Outils : rechercher des livres, obtenir un livre, mettre à jour le stock d'un livre, supprimer un livre. Utilisez le SDK Python officiel mcp (FastMC…
  2. Serveur MCP TypeScript pour une API météo — Écrivez src/index.ts et package.json : un serveur MCP en TypeScript pour une API REST météo (URL de base et clé API depuis l'environnement). Outils : obtenir la météo actuelle d'une ville, obtenir une prévision à 5 jours, lister les lieux enregistrés, supprimer un lieu enregistré. Utilisez le SDK officiel MC…
  3. Réparer un serveur MCP écrit à la hâte — server.py est un serveur MCP pour notre API d'entrepôt qui fonctionne mais a été écrit à la hâte. Corrigez-le pour qu'il respecte les bonnes pratiques des serveurs MCP. Modifiez server.py sur place et faites en sorte qu'il parle toujours à la même API. Il n'y a ni réseau ni installation de paquets ici ; écrivez juste…

La notation est programmatique (tests cachés / détection de problèmes implantés / vérifications de contraintes / rendu + OCR le cas échéant), de 0 à 5 par exécution. Aucun juge LLM n'a décidé d'un seul score.

Résultats

Le prompt d'une phrase donné au troisième groupe : "Concevez le serveur MCP comme un expert : noms d'outils cohérents, préfixés par le service et orientés action (par exemple bookstore_search_books), schémas d'entrée typés (Pydantic ou Zod) avec champs décrits, annotations (readOnlyHint, destructiveHint, idempotentHint), résultats paginés et limités en taille, messages d'erreur exploitables, secrets uniquement depuis des variables d'environnement, E/S asynchrones, et rien d'imprimé sur stdout en transport stdio."

TâcheScore sans skillPrompt d'une phraseAvec le skillTokens sans skillTokens prompt d'une phraseTokens avec skillSkill lu
t1-python1.434.644.260k64k97k2/2
t2-typescript4.295.04.6460k55k100k2/2
t3-fix5.05.05.097k106k133k2/2

Score moyen : 3.57 sans le skill contre 4.61 avec (delta +1.04). Tokens par exécution : 73k contre 110k (1.51x) ; temps 80s contre 89s. Groupe prompt d'une phrase : 4.88 (gain du skill par rapport au prompt d'une phrase : -0.27 ; gain du prompt d'une phrase par rapport à l'absence de skill : +1.31) ; 75k tokens par exécution pour le prompt d'une phrase, donc le skill coûte 1.47x le prompt d'une phrase.

Ce qui s'est passé

  • Là où cela compte, le skill aide : sur les deux serveurs écrits de zéro, le témoin a manqué les bases (noms d'outils avec un préfixe de service commun 2/4 exécutions, annotations d'outils comme readOnlyHint 2/2 exécutions Python, outils asynchrones 2/2 exécutions Python, messages d'erreur exploitables 2/2 exécutions Python). Score moyen 3.57 témoin, 4.61 skill.
  • Le groupe prompt d'une phrase a fait mieux que le skill : 4.88, avec une vérification manquée sur 18 exécutions, contre 5 manquées pour le groupe avec skill. La phrase énumère les mêmes propriétés que celles recherchées par les vérifications ; elle constitue donc une borne haute pour un prompt court, mais coûte 75k tokens par exécution contre 110k pour le skill et 73k pour le témoin.
  • Un vrai défaut dans le groupe avec skill : les deux exécutions TypeScript avec skill ont produit un createServer() pour le nouveau paquet @modelcontextprotocol/server mais n'ont jamais démarré de transport (ni stdio ni Streamable HTTP), donc le fichier serveur ne peut pas être lancé tel quel ; les exécutions du témoin et du prompt d'une phrase incluaient bien un transport.
  • Sur la tâche de réparation, les trois groupes ont obtenu le même score (9/9 vérifications dans les six exécutions) : face à un serveur existant, Codex seul appliquait déjà les pratiques.
  • Le skill est lourd à charger : SKILL.md et des guides de référence ; les exécutions avec skill ont laissé environ 12 fichiers de skill dans le dossier .agents du projet et lu les guides, ce qui explique les 1.5x tokens. Ses scripts auxiliaires (harnais d'évaluation) n'ont pas été exécutés dans le bac à sable hors ligne.

Scores par dimension

DimensionScorePourquoi
1_output_quality4.61

Score moyen 4.61/5 avec le skill (vérifications programmatiques, voir le tableau par tâche).

2_lift_vs_no_skill3.04

+1.04 point contre 3.57 sans le skill (n=2 par tâche ; moins d'environ 1 point relève du bruit).

3_trigger5.0Fichier du skill lu dans 6/6 exécutions avec skill.
4_instructions_portability3

Un large ensemble de références, réparti entre guides par langage ; les scripts auxiliaires nécessitent des paquets Python et un serveur actif.

5_efficiency31.51x tokens (110k contre 73k par exécution) et 1.11x temps (89s contre 80s).
6_safety_hygiene3

Le scanner signale 8 CRITICAL / 13 HIGH, tous lus en contexte : du code de serveur d'exemple et le passage de variables d'environnement dans les scripts auxiliaires ; licence propriétaire.

Limites de ce test

  • Vérifications basées sur des règles portant sur le texte du code ; aucun des serveurs générés n'a été réellement démarré ni connecté à un client.
  • Pas de réseau : l'agent ne pouvait pas installer ni importer le SDK MCP, donc les détails d'API (par exemple le nouveau paquet TypeScript v2) n'ont pas été validés.
  • L'étape d'évaluation du skill (génération de questions et exécution contre le serveur) n'a pas été exercée.
  • n = 2 par groupe et par tâche : les écarts inférieurs à environ 1 point relèvent du bruit.
  • La notation basée sur des règles mesure ce que les vérifications peuvent voir ; elle ne juge ni le goût ni si le résultat est le meilleur possible.

Sécurité

Voir security.md. Scan : 8 CRITICAL / 13 HIGH / 7 MEDIUM. Verdict : exécution sûre (bac à sable hors ligne). Un scan propre ne prouve pas qu'un skill est sûr.

En résumé

Pour un serveur écrit de zéro, le skill bat clairement un agent sans guide sur le nommage, les annotations, l'asynchronisme et la gestion des erreurs, au prix de 1.5x tokens. Une courte phrase de liste de contrôle a obtenu les mêmes propriétés pour moins de tokens et sans le défaut de transport manquant ; installez-le donc pour les guides de référence et la cohérence, pas pour un saut de qualité par rapport à un bon prompt.

Transcription

Journal d'exécution : mcp-builder (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.)
Colonnes : tâche, groupe-exécution, score (0-5), tokens, secondes, vérifications réussies, fichiers de la skill ouverts par l'agent.

t1-python control-1: score 1.79, tokens 51610, s 53.2, vérifications 4/9, rien ouvert
t1-python control-2: score 1.07, tokens 69259, s 98.6, vérifications 3/9, rien ouvert
t1-python oneliner-1: score 5.0, tokens 74072, s 101.3, vérifications 9/9, rien ouvert
t1-python oneliner-2: score 4.29, tokens 54692, s 126.2, vérifications 8/9, rien ouvert
t1-python treatment-1: score 3.39, tokens 101809, s 72.0, vérifications 6/9, ouvert mcp-builder
t1-python treatment-2: score 5.0, tokens 93275, s 66.9, vérifications 9/9, ouvert mcp-builder
t2-typescript control-1: score 4.29, tokens 52126, s 59.1, vérifications 8/9, rien ouvert
t2-typescript control-2: score 4.29, tokens 69042, s 61.5, vérifications 8/9, rien ouvert
t2-typescript oneliner-1: score 5.0, tokens 55412, s 104.3, vérifications 9/9, rien ouvert

18 exécutions, 3 artefacts

Exemple de sortie

SOTA · With the skill: server.py (t1-python, run 1, Codex)

"""Bookstore MCP server (Python 3.10+, official mcp SDK, httpx, Pydantic 2). Required environment variables: BOOKSTORE_BASE_URL: API root, e.g. https://inventory.example.com/api/v1 BOOKSTORE_API_TOKEN: bearer token (without the 'Bearer ' prefix) Assumed REST contract (adjust paths/fields here to match your API): GET /books?q=...&limit=...&offset=... -> JSON search results GET /books/{book_id} -> JSON book PATCH /books/{book_id}/stock body: {"stock": nonnegative integer} DELETE /books/{book_id} Updates and deletes may return JSON or an empty success response. Search pagination and response shape are supplied by the upstream API. Run with `python server.py` in an environment with the dependencies installed. Transport is stdio; stdout is reserved for MCP protocol messages. """ import os from contextlib import asynccontextmanager from dataclasses import dataclass from typing import Annotated, Any, AsyncIterator from urllib.parse import quote, urlsplit import httpx from mcp.server.fastmcp import Context, FastMCP from mcp.server.fastmcp.exceptions import ToolError from pydantic import Field @dataclass class AppState: client: httpx.AsyncClient @asynccontextmanager async def lifespan(server: FastMCP) -> AsyncIterator[AppState]: base_url = os.environ.get("BOOKSTORE_BASE_URL", "").strip() token = os.environ.get("BOOKSTORE_API_TOKEN", "").strip() if not base_url or not token: raise RuntimeError("Set BOOKSTORE_BASE_URL and BOOKSTORE_API_TOKEN.") try: parsed = urlsplit(base_url) valid = ( parsed.scheme in {"http", "https"} and bool(parsed.hostname) and parsed.username is None and parsed.password is None and not parsed.query and not parsed.fragment ) parsed.port # Validate a supplied port without exposing the URL. except ValueError: valid = False if not valid: raise RuntimeError("BOOKSTORE_BASE_URL must be an HTTP(S) API root without credentials, query, or fragment.") if any(ord(char) < 33 or ord(char) > 126 for char in token): raise RuntimeError("BOOKSTORE_API_TOKEN must contain printable ASCII without whitespace.") async with httpx.AsyncClient( base_url=base_url.rstrip("/") + "/", headers={"Authorization": f"Bearer {token}", "Accept": "application/json"}, timeout=httpx.Timeout(30.0, connect=10.0), follow_redirects=False, trust_env=False, ) as client: yield AppState(client=client) mcp = FastMCP("bookstore_mcp", lifespan=lifespan) BookId = Annotated[str, Field(min_length=1, max_length=256, description="Book identifier, e.g. 'book-123'.")] def book_path(book_id: str) -> str: if not book_id.strip() or book_id in {".", ".."}: raise ToolError("Provide a nonblank book identifier other than '.' or '..'.") return "books/" + quote(book_id, safe="") async def api_request( ctx: Context, method: str, path: str, *, params: dict[str, Any] | None = None, payload: dict[str, Any] | None = None, ) -> dict[str, Any]: state: AppState = ctx.r [... excerpt: first 3200 of 7129 characters]

Voir Pro