Eigenen MCP-Server für Claude Code bauen
Einen eigenen Claude Code MCP-Server in Node.js bauen. Tool-Definitionen, Request-Handler, REST- und Postgres-Muster, plus die Konfiguration, die Claude Code zum Laden braucht.
Hören Sie auf zu konfigurieren. Fangen Sie an zu bauen.
SaaS-Builder-Vorlagen mit KI-Orchestrierung.
Problem: Die öffentlichen MCP-Server reden nicht mit den Systemen, die du tatsächlich nutzt. Deine interne API, das Firmen-Postgres, ein eigener Workflow, den sonst niemand anfasst. Damit Claude Code diese erreicht, musst du den Server selbst schreiben.
Quick Win: Fünf Minuten Node.js bringen Claude zum Sprechen mit jeder REST-API:
// my-api-server.js - Connect Claude to your API
const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
const server = new Server({ name: "my-api-server", version: "1.0.0" });
server.setRequestHandler("tools/list", async () => ({
tools: [
{
name: "fetch_user_data",
description: "Get user information from our internal API",
inputSchema: {
type: "object",
properties: {
userId: { type: "string", description: "User ID to fetch" },
},
required: ["userId"],
},
},
],
}));
server.setRequestHandler("tools/call", async (request) => {
const { name, arguments: args } = request.params;
if (name === "fetch_user_data") {
const response = await fetch(
`https://api.yourcompany.com/users/${args.userId}`,
{
headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
},
);
return {
content: [{ type: "text", text: JSON.stringify(await response.json()) }],
};
}
});
server.connect(process.stdio);Speichere die Datei als my-api-server.js. Führe node my-api-server.js zum Testen aus. Das ist eine funktionierende Integration.
Was ein MCP-Server eigentlich ist
Ein MCP-Server ist ein Node.js-Prozess, der Claude Code eine Liste aufrufbarer Tools übergibt. Er läuft eigenständig, getrennt vom Editor, und gibt Claude eine Verbindung zu allem, was du von Node aus erreichst: APIs, Datenbanken, interne Dienste.
Jeder Server liefert vier Dinge:
- Tool-Definitionen: die Funktionen, die Claude aufrufen darf
- Tool-Handler: der Code, der läuft, wenn Claude einen aufruft
- Fehlerbehandlung: nützliche Meldungen, wenn der Aufruf scheitert
- Authentifizierung: ein sicherer Weg, die dahinterliegenden Systeme zu erreichen
Muster, die die meisten Fälle abdecken
Mit einer REST-API sprechen
Richte Claude auf jeden HTTP-Endpunkt mit einem kleinen Connector:
// Generic API connector pattern
const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
const server = new Server({ name: "api-connector", version: "1.0.0" });
server.setRequestHandler("tools/list", async () => ({
tools: [
{
name: "api_get",
description: "GET request to any endpoint",
inputSchema: {
type: "object",
properties: {
endpoint: { type: "string", description: "API endpoint path" },
params: { type: "object", description: "Query parameters" },
},
required: ["endpoint"],
},
},
],
}));
server.setRequestHandler("tools/call", async (request) => {
const { name, arguments: args } = request.params;
if (name === "api_get") {
const url = new URL(`${process.env.API_BASE_URL}${args.endpoint}`);
if (args.params) {
Object.entries(args.params).forEach(([key, value]) =>
url.searchParams.append(key, value),
);
}
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
});
return {
content: [
{ type: "text", text: JSON.stringify(await response.json(), null, 2) },
],
};
}
});
server.connect(process.stdio);Dieselbe Form funktioniert für Stripe, Shopify, dein internes Dashboard, alles was HTTP spricht.
Mit einer Datenbank sprechen
Tausch den fetch-Aufruf gegen einen Datenbank-Client:
// Database connector for PostgreSQL, MySQL, SQLite
const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
const { Client } = require("pg");
const server = new Server({ name: "database-connector", version: "1.0.0" });
const client = new Client({ connectionString: process.env.DATABASE_URL });
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "query_database") {
const result = await client.query(request.params.arguments.query);
return {
content: [{ type: "text", text: JSON.stringify(result.rows, null, 2) }],
};
}
});Claude kann jetzt SQL ausführen und bei Datenbankarbeit helfen.
Einrichtung und Tests
Starte das Projekt:
mkdir my-mcp-server && cd my-mcp-server
npm init -y && npm install @modelcontextprotocol/sdkDann weise Claude Code in seiner MCP-Konfigurationsdatei auf den Server. Wo diese Datei liegt, hängt davon ab, wie du Claude betreibst:
- Claude Code CLI:
~/.claude.json(Nutzerebene) oder.mcp.json(Projektebene) - Claude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) oder%APPDATA%\Claude\claude_desktop_config.json(Windows)
{
"mcpServers": {
"my-custom-server": {
"command": "node",
"args": ["/path/to/your/server.js"],
"env": { "API_TOKEN": "your-token" }
}
}
}Starte Claude Code nach dem Speichern neu. Der neue Server lädt beim Start.
Wenn etwas kaputt geht
Server nicht gefunden: Der Konfigurations-Pfad oder das JSON ist falsch. Überprüfe den Dateipfad doppelt. Nutze einen absoluten Pfad für command.
Tool-Timeout: Lang laufende Calls blockieren das Tool. Wickle sie in deinen eigenen Timeout, damit sie sauber scheitern.
Authentifizierung fehlgeschlagen: Die Umgebungsvariablen in der Konfiguration erreichen den Server nicht. Prüfe, ob sie richtig geschrieben und vorhanden sind.
Dinge, die sich von Anfang an lohnen
- Jeder externe Aufruf kommt in ein try-catch, damit Fehler als Text auftauchen, nicht als Absturz
- Tokens leben in Umgebungsvariablen, nie im Quellcode
- Rate-limitierte APIs brauchen ihren eigenen Throttle, damit Claude dein Kontingent nicht verbrennt
console.log-Ausgaben tauchen in Claudes Logs auf, nutze das also frei zum Debuggen
Nächste Schritte
Such dir eine Sache zum Einbinden aus und bau von dort:
- Mit einer API starten: der, die du jeden Tag anfasst
- Das REST-Muster kopieren: der Connector oben ist das Template
- Bestätigen, dass es geladen ist: frag Claude "What MCP tools are available?" und dein neues Tool sollte erscheinen
- Gute Tool-Beschreibungen schreiben: MCP Tool Search nutzt sie, um zu entscheiden, wann dein Server geladen wird
- Weiterlesen: der MCP-Grundlagen-Guide und die Liste der beliebten MCP-Server zeigen, was als nächstes zu bauen ist
Ein eigener MCP-Server macht Claude Code zum Client für deinen eigenen Stack. Ein Server pro Woche und die Liste der Dinge, die Claude erreichen kann, wird leise länger.
Hören Sie auf zu konfigurieren. Fangen Sie an zu bauen.
SaaS-Builder-Vorlagen mit KI-Orchestrierung.