In this article
Comment créer des serveurs MCP Node.js qui exposent des ressources de données aux LLM
Les MCP sont réputés pour exposer des outils qui augmentent les capacités des grands modèles de langage (LLM), en leur permettant d’effectuer des actions et d’appeler des fonctions génériques implémentées par les serveurs MCP. Mais exposer des ressources de données aux LLM est tout aussi important.

Que sont les ressources d’un serveur MCP ?
Les ressources permettent aux serveurs MCP d’exposer des données en lecture seule que les LLM peuvent utiliser comme contexte et interroger pour obtenir des points de données. Par exemple, un serveur MCP peut définir comme ressources des enregistrements de base de données, l’état d’une application ou tout autre type de contenu textuel ou binaire.
Voici quelques exemples concrets de ressources de serveur MCP :
Un organigramme d’entreprise.
Un serveur de documentation exposant des données d’API.
Une FAQ produit et des guides de dépannage.

Les ressources d’un serveur MCP sont définies à l’aide d’un URI unique et utilisent souvent leur propre schéma de protocole. En reprenant les exemples ci-dessus, une ressource de serveur MCP pour un organigramme d’entreprise pourrait être org-chart://company-wide, org-chart://engineering, org-chart://cto, et ainsi de suite.
Ces requêtes URI sont envoyées par le client MCP au serveur MCP, qui doit définir des routes spécifiques dans le cadre de l’API server.setRequestHandler du serveur MCP.
Créer un serveur MCP Node.js pour les ressources
Créons un serveur MCP en JavaScript qui s’exécute avec Node.js et définissons des ressources parmi les points de données de ce serveur MCP.
Commencez par créer le fichier ./resources/index.js, qui héberge la définition des ressources du serveur MCP. Nous allons y importer le code nécessaire du Model Context Protocol ainsi qu’un utilitaire de journalisation pratique :
import {
ListResourcesRequestSchema,
ReadResourceRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { initLogger } from "../utils/logger.js";
const logger = initLogger();Nous allons ensuite définir la fonction principale exportée qui crée la ressource. Dans cette fonction, notre ressource sera une représentation SVG open source du calendrier des versions du runtime Node.js. Nous pourrons alors poser des questions comme when is the next LTS version of the Node.js runtime planned for?
Implémentons la logique de récupération de ces données :
export async function initializeResources(server) {
logger.info({ msg: "Initializing resources..." });
const resourceNodejsReleasesChartURL =
"https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true";
const resourceNodejsReleasesChart = await fetch(
resourceNodejsReleasesChartURL
);
if (!resourceNodejsReleasesChart.ok) {
logger.error({
msg: `Failed to fetch Node.js releases chart: ${resourceNodejsReleasesChart.status} ${resourceNodejsReleasesChart.statusText}`,
});
throw new Error(
`Failed to fetch Node.js releases chart: ${resourceNodejsReleasesChart.status} ${resourceNodejsReleasesChart.statusText}`
);
}
const resourceNodejsReleasesChartSVGText =
await resourceNodejsReleasesChart.text();Le code ci-dessus récupère simplement les données, inclut une gestion générique des erreurs et crée la ressource sous forme de données textuelles à partir du fichier SVG.
Nous définissons ensuite un tableau de ressources. Chaque définition de ressource de serveur MCP comporte les propriétés suivantes :
Un URI.
Un nom.
Une description.
Un type MIME.
Nous avons également défini une fonction de gestionnaire pour résoudre dynamiquement toutes les ressources. Voici la suite de notre fonction initializeResources : elle utilise l’API server.setRequestHandler pour répertorier les ressources et les implémenter en acheminant la requête en fonction de request.params.uri, reçu dans la requête entrante (provenant du client MCP), puis en appelant la fonction de gestionnaire de notre ressource :
const resources = [
{
uri: "nodejs://releases-schedule-chart.svg",
name: "Node.js Releases Schedule Chart",
description: "A chart showing the release schedule of Node.js versions.",
mimeType: "image/svg+xml",
func: async (request) => {
logger.info({ msg: "Resource URI Access:", uri: request.params.uri });
return {
contents: [
{
uri: request.params.uri,
text: resourceNodejsReleasesChartSVGText,
},
],
};
},
},
];
// Implement dynamic resource definition for listing and implementation by
// looping over the `resources` array and defining each resource:
server.setRequestHandler(ListResourcesRequestSchema, async () => {
const resourcesList = resources.map((resource) => {
return {
uri: resource.uri,
name: resource.name,
description: resource.description,
mimeType: resource.mimeType || "text/plain",
};
});
return {
resources: resourcesList,
};
});
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
const resource = resources.find((resource) => {
return resource.uri === request.params.uri;
});
if (resource) {
return await resource.func(request);
}
throw new Error(`Resource not found: ${request.params.uri}`);
});
}Assemblons maintenant le tout dans deux fichiers, index.js et server.js, qui exposeront le serveur MCP, puis regroupons tout cela dans un processus d’application Node.js générique :
Comme indiqué précédemment, server.js déclarera le serveur MCP avec le transport STDIO et l’exposera :
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { initLogger } from "./utils/logger.js";
import { initializeResources } from "./resources/index.js";
const logger = initLogger();
export async function createMcpServer() {
const server = new Server(
{
name: "nodejs-module-api-documentation",
description:
"Search built-in core Node.js modules API Documentation. Use whenever the user asks questions about Node.js API, Node.js modules or Node.js functions.",
version: "1.0.0",
},
{
capabilities: {
resources: {},
},
}
);
// await initializeDocumentationServer(server);
await initializeResources(server);
// Start receiving messages on stdin and sending messages on stdout
logger.info({
msg: "MCP Server instance created",
name: server.name,
version: server.version,
});
return server;
}Le fichier index.js importe ensuite la définition du serveur MCP et le démarre :
#!/usr/bin/env node
import { createMcpServer } from "./server.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { initLogger } from './utils/logger.js';
const logger = initLogger();
// Initialize the server with Node.js API documentation
async function startServer() {
let server
try {
server = await createMcpServer();
} catch (error) {
logger.error({ err: error, msg: 'Failed to create MCP server' });
console.error(`Fatal error during server creation.`);
process.exit(1);
}
try {
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);
logger.info({ msg: 'Server connected to transport. Ready.' });
} catch (error) {
logger.error({ err: error, msg: 'Failed to initialize server' });
console.error(`Fatal error during server transport init.`);
process.exit(1);
}
}
startServer();Créer des serveurs MCP
Pour mieux comprendre le fonctionnement de l’architecture MCP, ses principaux composants et les différences entre MCP et REST, ainsi qu’entre MCP et les appels de fonction, je vous recommande de lire le guide du débutant pour comprendre visuellement l’architecture MCP.
Si vous découvrez les MCP, consultez notre article Qu’est-ce que le MCP en IA ? Toutes les réponses à vos questions. C’est un excellent point de départ pour comprendre les problèmes que les MCP permettent de résoudre.
Enfin, si vous utilisez des outils de codage IA comme Cursor pour écrire du code, je vous invite à ajouter le serveur MCP Snyk CLI. Il aidera votre agent à repérer les pratiques de codage non sécurisées et les dépendances vulnérables dans votre flux de travail de développement agentique, afin de prévenir automatiquement les problèmes de sécurité.
Commencez à sécuriser le code généré par l’IA
Créez gratuitement votre compte Snyk pour commencer à sécuriser le code généré par l’IA en quelques minutes. Vous pouvez aussi réserver une démonstration avec un expert pour découvrir comment Snyk répond à vos besoins en sécurité des développeurs.