In this article
So erstellen Sie Node.js-MCP-Server, die Datenressourcen für LLMs bereitstellen
MCPs sind dafür bekannt, Tools bereitzustellen, mit denen Large Language Models (LLMs) Aktionen ausführen und generische Funktionen aufrufen können, die MCP-Server implementieren. Doch auch die Bereitstellung von Datenressourcen für LLMs ist wichtig.

Was sind MCP-Server-Ressourcen?
Ressourcen ermöglichen es MCP-Servern, Daten als schreibgeschützte Informationen bereitzustellen, die LLMs als Kontext verwenden und nach Datenpunkten abfragen können. Ein MCP-Server kann beispielsweise Datenbankeinträge, den Status einer Anwendung oder beliebige andere Text- oder Binärdaten als Ressourcen definieren.
Zu den praktischen Beispielen für MCP-Server-Ressourcen gehören:
Ein Organigramm eines Unternehmens.
Ein Dokumentationsserver, der API-Daten bereitstellt.
Produkt-FAQs und Anleitungen zur Fehlerbehebung.

MCP-Server-Ressourcen werden über einen eindeutigen URI definiert und verfügen häufig über ein eigenes benutzerdefiniertes Protokollschema. Aufbauend auf den obigen Beispielen könnte eine MCP-Server-Ressource für ein Unternehmensorganigramm beispielsweise org-chart://company-wide, org-chart://engineering, org-chart://cto und so weiter lauten.
Diese URI-Anfragen werden vom MCP-Client an den MCP-Server gesendet. Dieser muss dafür spezifische Routen als Teil der MCP-Server-API server.setRequestHandler definieren.
Einen Node.js-MCP-Server für Ressourcen erstellen
Erstellen wir einen MCP-Server in JavaScript, der in einer Node.js-Laufzeitumgebung ausgeführt wird, und definieren wir Ressourcen als Datenpunkte dieses MCP-Servers.
Erstellen Sie zunächst die Datei ./resources/index.js. Sie enthält die Definition der MCP-Server-Ressourcen. Importieren Sie darin zunächst den erforderlichen Code aus dem Model Context Protocol sowie ein praktisches Logger-Hilfsprogramm:
import {
ListResourcesRequestSchema,
ReadResourceRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { initLogger } from "../utils/logger.js";
const logger = initLogger();Als Nächstes definieren wir unsere zentrale exportierte Funktion, die die Ressource erstellt. In dieser Funktion ist unsere Ressource eine Open-Source-SVG-Darstellung des Veröffentlichungsplans der Node.js-Laufzeitumgebung. Anschließend können wir Fragen dazu abfragen, etwa when is the next LTS version of the Node.js runtime planned for?.
Implementieren wir nun die Logik zum Abrufen dieser Daten:
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();Der obige Code ruft einfach die Daten ab, umfasst eine allgemeine Fehlerbehandlung und erstellt aus der SVG-Datei eine Ressource mit Textdaten.
Als Nächstes definieren wir ein Array von Ressourcen. Jede MCP-Server-Ressourcendefinition hat folgende Eigenschaften:
Einen URI.
Einen Namen.
Eine Beschreibung.
Einen MIME-Typ.
Außerdem haben wir eine Handler-Funktion definiert, um alle Ressourcen dynamisch aufzulösen. Im Folgenden setzen wir unsere Funktion initializeResources fort. Sie verwendet die API server.setRequestHandler, um die Ressourcen aufzulisten und bereitzustellen. Dazu wird die Route anhand von request.params.uri aus der eingehenden Anfrage (vom MCP-Client) aufgelöst und anschließend die Handler-Funktion der Ressource aufgerufen:
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}`);
});
}Fügen wir nun alles in zwei Dateien zusammen: index.js und server.js. Diese stellen den MCP-Server bereit. Anschließend verpacken wir alles als generischen Node.js-Anwendungsprozess:
Wie oben beschrieben, deklariert server.js den MCP-Server mit STDIO-Transport und stellt ihn bereit:
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;
}Anschließend importiert die Datei index.js die MCP-Server-Definition und startet den Server:
#!/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();MCP-Server erstellen
Wenn Sie besser verstehen möchten, wie die MCP-Architektur funktioniert, aus welchen Hauptkomponenten sie besteht und worin sich MCP von REST und Function Calls unterscheidet, empfehle ich Ihnen den visuellen Leitfaden für Einsteiger zum Verständnis der MCP-Architektur.
Wenn MCP für Sie noch ganz neu ist, lesen Sie unseren Artikel Was ist MCP in der KI? Antworten auf alle Ihre Fragen. Er bietet einen guten Einstieg in die Grundlagen und zeigt, welche Probleme MCP löst.
Meine letzte Empfehlung: Wenn Sie KI-Coding-Tools wie Cursor und andere zum Schreiben von Code verwenden, empfehle ich Ihnen, den Snyk CLI MCP Server hinzuzufügen. Er versorgt Ihren agentischen Code-Workflow mit Kontext zu unsicheren Programmiermustern und anfälligen Abhängigkeiten, sodass Sicherheitsprobleme automatisiert eingedämmt werden können.
Sichern Sie KI-generierten Code ab
Erstellen Sie Ihr kostenloses Snyk-Konto und sichern Sie KI-generierten Code in wenigen Minuten ab. Oder buchen Sie eine Demo mit unseren Experten und erfahren Sie, wie Snyk Ihre Anwendungsfälle für Entwicklersicherheit unterstützt.