
Beaucoup d'équipes présentent d'abord Model Context Protocol comme « le standard pour connecter des outils aux agents IA ». C'est vrai, mais encore trop vague pour guider une architecture sérieuse.
Une lecture plus utile :
La spécification officielle définit MCP comme un protocole basé sur JSON-RPC pour exposer tools, resources et prompts à des runtimes d'agents. Pour cadrer le sujet, voir la spécification, la section lifecycle et l'annonce initiale d'Anthropic sur Model Context Protocol.
En revanche, MCP ne corrige pas :
C'est pourquoi les équipes matures traitent MCP comme un protocole de diffusion, pas comme toute l'architecture.
Une erreur fréquente consiste à mettre chaque capacité derrière MCP simplement parce que cela paraît moderne. En pratique, il vaut mieux choisir la surface en fonction du rôle.
| Surface | Point fort | Limite | À utiliser quand |
|---|---|---|---|
| Serveur MCP | Discovery, exécution native pour agents, interopérabilité | Les payloads stables et les policies restent à concevoir | Le consommateur est un host d'agents et bénéficie de la sémantique tools/resources |
| API REST | Contrats déterministes, auth/gateways/caches matures | L'agent doit connaître la sémantique des endpoints | Vous avez besoin de contrats durables pour agents, apps et services |
| Skills | Distribution de workflows et de guardrails | Faible comme plan de données temps réel | Vous voulez diffuser des instructions et récupérer les données via MCP/API |
Règle simple :
Cette combinaison reste souvent la plus robuste.
Voir un MCP gouverné avec puppyoneGet startedUn mauvais tool MCP devient vite un gros wrapper « qui fait tout ». Un bon tool MCP reste étroit, typé et prévisible.
Principes de base :
import { McpServer } from "@modelcontextprotocol/sdk/server";
const server = new McpServer({ name: "org-context" });
server.tool(
"get_knowhow_item",
{
description: "Read one governed Know-How item by id",
inputSchema: {
type: "object",
properties: { id: { type: "string" } },
required: ["id"],
additionalProperties: false
}
},
async ({ id }, ctx) => {
const item = await ctx.store.read(id);
if (!ctx.policy.canRead(ctx.user, item.policyTag)) {
return {
ok: false,
error: { code: "forbidden", message: "Access not permitted" }
};
}
return {
ok: true,
data: {
id: item.id,
title: item.title,
version: item.version,
summary: ctx.redactor(item.summary)
},
trace: {
requestId: ctx.requestId,
policyTag: item.policyTag
}
};
}
);
La valeur vient du fait qu'on refuse d'exposer tout le système interne derrière une seule porte.
Beaucoup de tutoriels s'arrêtent à « le serveur tourne ». Ce n'est pas suffisant si ce serveur lit du contexte sensible ou déclenche des actions.
Base minimale de durcissement :
Les docs Docker sur HEALTHCHECK, Compose healthchecks, rootless/non-root et bind mounts restent très utiles.
FROM node:22-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci --ignore-scripts
COPY . .
RUN npm run build && npm prune --omit=dev
FROM gcr.io/distroless/nodejs22-debian12:nonroot
WORKDIR /app
COPY --from=build /app/dist ./dist
USER 65532:65532
ENV NODE_ENV=production
CMD ["/nodejs/bin/node", "dist/server.js"]
Qu'il soit local-first ou on-prem, un runtime sans frontières claires reste difficile à faire confiance.
MCP est excellent pour l'exécution native des agents, mais une API REST versionnée garde des avantages nets :
C'est pourquoi beaucoup d'équipes exposent le même contexte gouverné via MCP et via REST. Les guides d'API design d'Azure restent valables, tout comme RFC 6585 et RFC 9110 pour le throttling et Retry-After.
L'enjeu n'est pas de dupliquer, mais de spécialiser :
Si vous avez besoin des deux, c'est une architecture normale.
Skills est très utile pour distribuer une intention opératoire : quoi faire, quoi éviter, et dans quel ordre.
Cas d'usage typiques :
En revanche, Skills seul ne garantit ni fraîcheur, ni autorisation, ni retrieval structuré. La documentation Anthropic sur skills et le dépôt public anthropics/skills illustrent bien le format.
Le schéma pragmatique :
Si un agent utilise mal un tool, vous devez pouvoir répondre à :
OpenTelemetry et les logs structurés ne sont donc pas accessoires. Les docs sur context propagation et traces sont de bons points de départ. Pour la rétention et l'audit, voir NIST SP 800-92 et SP 800-53 Rev.5.
{
"ts": "2026-04-03T09:15:00Z",
"event": "tool.execute",
"requestId": "req_7ad2",
"tool": "get_knowhow_item",
"actor": "agent_ops_reader",
"decision": "allow",
"resultHash": "sha256:ab12...",
"latencyMs": 42
}
Si votre système ne peut pas produire quelque chose d'aussi reconstructible, le vrai problème n'est pas encore le choix du protocole.
La plupart des projets MCP échouent non pas à cause du protocole, mais à cause du contexte derrière le protocole :
Une base de contexte gouvernée vient combler cet écart. Les équipes évaluent puppyone pour structurer leur Know-How, appliquer du hybrid indexing et distribuer le même savoir gouverné via MCP, API ou packaging de workflow. Le serveur MCP n'a alors plus à reconstruire du contexte ad hoc à chaque appel.
Utile surtout quand :
Pour aller plus loin :
Si vous débutez, n'ouvrez pas avec une grande migration de protocole. Choisissez un workflow surtout en lecture et rendez-le simplement fiable :
Ensuite, vous pourrez étendre tools, Skills et orchestration avec bien moins de risques.
Planifier un rollout MCP avec puppyoneGet startedNon. MCP est fort pour l'exécution orientée agents ; REST reste meilleur pour les contrats stables, les contrôles gateway et la réutilisation plus large.
Non. Des tools trop larges sont difficiles à gouverner et à déboguer. Commencez par des capacités étroites, typées et prévisibles.
Le plus souvent non. Skills emballe bien l'intention du workflow, mais si fraîcheur, autorisation et auditabilité comptent, il faut s'appuyer sur des tools MCP ou des API pour les données runtime.