i18n/de/skills/build-custom-mcp-server/SKILL.md
Einen benutzerdefinierten MCP-Server (Model Context Protocol) erstellen, der domaenenspezifische Werkzeuge fuer KI-Assistenten bereitstellt. Umfasst Server-Implementierung in Node.js oder R, Werkzeugdefinitionen, Transport- Konfiguration und Tests mit Claude Code. Verwenden wenn benutzerdefinierte Funktionalitaet ueber mcptools hinaus bereitgestellt werden muss, beim Erstellen spezialisierter domaenenspezifischer KI-Integrationen oder beim Wrappen bestehender APIs oder Dienste als MCP-Werkzeuge.
npx skillsauth add pjt222/agent-almanac build-custom-mcp-serverInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Einen benutzerdefinierten MCP-Server erstellen, der domaenenspezifische Werkzeuge fuer KI-Assistenten bereitstellt.
Vor dem Schreiben von Code jedes Werkzeug definieren:
tools:
- name: query_database
description: Execute a read-only SQL query against the analysis database
parameters:
query:
type: string
description: SQL SELECT query to execute
required: true
limit:
type: integer
description: Maximum rows to return
default: 100
returns: JSON array of result rows
- name: run_analysis
description: Execute a predefined statistical analysis by name
parameters:
analysis_name:
type: string
description: Name of the analysis to run
enum: [descriptive, regression, survival]
dataset:
type: string
description: Dataset identifier
required: true
Erwartet: Eine YAML- oder Markdown-Spezifikation fuer jedes Werkzeug mit Name, Beschreibung, Parametern (einschliesslich Typen, Standardwerten und Pflichtflags) und Rueckgabetyp, dokumentiert vor dem Schreiben von Code.
Bei Fehler: Wenn Werkzeugspezifikationen unklar sind, den Domaenenexperten befragen oder die bestehende API-Dokumentation pruefen, um Parametertypen und Rueckgabeformate zu bestimmen.
// server.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "my-analysis-server",
version: "1.0.0",
});
// Define tools
server.tool(
"query_database",
"Execute a read-only SQL query against the analysis database",
{
query: z.string().describe("SQL SELECT query"),
limit: z.number().default(100).describe("Max rows to return"),
},
async ({ query, limit }) => {
// Validate read-only
if (!/^\s*SELECT/i.test(query)) {
return {
content: [{ type: "text", text: "Error: Only SELECT queries allowed" }],
isError: true,
};
}
const results = await executeQuery(query, limit);
return {
content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
};
}
);
server.tool(
"run_analysis",
"Execute a predefined statistical analysis",
{
analysis_name: z.enum(["descriptive", "regression", "survival"]),
dataset: z.string().describe("Dataset identifier"),
},
async ({ analysis_name, dataset }) => {
const result = await runAnalysis(analysis_name, dataset);
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
);
// Start server with stdio transport
const transport = new StdioServerTransport();
await server.connect(transport);
Erwartet: Eine funktionierende server.js-Datei, die das MCP SDK importiert, Werkzeuge mit Zod-Schemas definiert und ueber stdio-Transport verbindet. node server.js startet den Server ohne Fehler.
Bei Fehler: Sicherstellen, dass @modelcontextprotocol/sdk und zod installiert sind (npm install). Pruefen, dass die Import-Pfade zur SDK-Version passen (das SDK hat Exports zwischen Versionen umstrukturiert).
# server.R
library(mcptools)
# Register custom tools
mcp_tool(
name = "query_database",
description = "Execute a read-only SQL query",
parameters = list(
query = list(type = "string", description = "SQL SELECT query"),
limit = list(type = "integer", description = "Max rows", default = 100)
),
handler = function(query, limit = 100) {
if (!grepl("^\\s*SELECT", query, ignore.case = TRUE)) {
stop("Only SELECT queries allowed")
}
result <- DBI::dbGetQuery(con, paste(query, "LIMIT", limit))
jsonlite::toJSON(result, auto_unbox = TRUE)
}
)
# Start server
mcptools::mcp_server()
Erwartet: Eine funktionierende server.R-Datei, die benutzerdefinierte Werkzeuge mit mcp_tool() registriert und den Server mit mcp_server() startet. Rscript server.R startet den MCP-Server.
Bei Fehler: Sicherstellen, dass mcptools von GitHub installiert ist (remotes::install_github("posit-dev/mcptools")). Pruefen, dass die Handler-Funktionssignaturen zu den Parameterdefinitionen passen.
my-mcp-server/
├── package.json # Node.js dependencies
├── server.js # Server implementation
├── tools/ # Tool implementations
│ ├── database.js
│ └── analysis.js
├── test/ # Tests
│ └── tools.test.js
├── Dockerfile # Container packaging
└── README.md # Setup instructions
Erwartet: Projektverzeichnis erstellt mit server.js (oder server.R), package.json, tools/-Verzeichnis fuer modulare Werkzeugimplementierungen und test/-Verzeichnis fuer Tests.
Bei Fehler: Wenn die Verzeichnisstruktur nicht zur Implementierungssprache passt, entsprechend anpassen. R-Server verwenden moeglicherweise R/ statt tools/ und tests/testthat/ statt test/.
Manuelles Testen mit stdio:
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node server.js
Bei Claude Code registrieren:
claude mcp add my-server stdio "node" "/path/to/server.js"
Werkzeuge erscheinen verifizieren:
Eine Claude-Code-Sitzung starten und pruefen, dass benutzerdefinierte Werkzeuge aufgelistet und funktionsfaehig sind.
Erwartet: Der tools/list JSON-RPC-Aufruf gibt alle definierten Werkzeuge mit korrekten Namen und Schemas zurueck. claude mcp list zeigt den registrierten Server. Werkzeuge sind aus einer Claude-Code-Sitzung aufrufbar.
Bei Fehler: Wenn tools/list ein leeres Array zurueckgibt, wurden die Werkzeuge nicht vor server.connect() registriert. Wenn Claude Code den Server nicht finden kann, pruefen, dass der Befehlspfad in claude mcp add absolut ist und die Binaerdatei ausfuehrbar ist.
server.tool("risky_operation", "...", schema, async (params) => {
try {
const result = await performOperation(params);
return {
content: [{ type: "text", text: JSON.stringify(result) }],
};
} catch (error) {
return {
content: [{ type: "text", text: `Error: ${error.message}` }],
isError: true,
};
}
});
Erwartet: Jeder Werkzeug-Handler ist in try/catch gewrappt. Ungueltige Eingaben geben isError: true mit einer beschreibenden Nachricht zurueck, anstatt den Serverprozess zum Absturz zu bringen.
Bei Fehler: Wenn der Server bei schlechter Eingabe immer noch abstuerzt, pruefen, dass try/catch den gesamten Handler-Body einschliesslich aller asynchronen Operationen umschliesst. Sicherstellen, dass Promises innerhalb des try-Blocks awaited werden.
Eine package.json mit einem bin-Eintrag erstellen:
{
"name": "my-mcp-server",
"version": "1.0.0",
"bin": {
"my-mcp-server": "./server.js"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"zod": "^3.22.0"
}
}
Benutzer koennen dann installieren und konfigurieren:
npm install -g my-mcp-server
claude mcp add my-server stdio "my-mcp-server"
Erwartet: Eine package.json mit einem bin-Eintrag, der auf den Server-Einstiegspunkt zeigt. Benutzer koennen global mit npm install -g installieren und mit claude mcp add registrieren.
Bei Fehler: Wenn der bin-Eintrag nach globaler Installation nicht funktioniert, sicherstellen, dass server.js eine Shebang-Zeile hat (#!/usr/bin/env node) und als ausfuehrbar markiert ist. Pruefen, dass der Paketname nicht mit bestehenden npm-Paketen kollidiert.
tools/list gibt alle definierten Werkzeuge mit korrekten Schemas zurueckconfigure-mcp-server — Den gebauten Server mit Clients verbindentroubleshoot-mcp-connection — Verbindungsprobleme debuggencontainerize-mcp-server — Den Server in Docker paketierentesting
Launch all available agents in parallel waves for open-ended hypothesis generation on problems where the correct domain is unknown. Use when facing a cross-domain problem with no clear starting point, when single-agent approaches have stalled, or when diverse perspectives are more valuable than deep expertise. Produces a ranked hypothesis set with convergence analysis and adversarial refinement.
tools
Write integration tests for a Node.js CLI application using the built-in node:test module. Covers the exec helper pattern, output assertions, filesystem state verification, cleanup hooks, JSON output parsing, error case testing, and state restoration after destructive tests. Use when adding tests to an existing CLI, testing a new command, verifying adapter behavior across frameworks, or setting up CI for a CLI tool.
development
Screen a proposed trademark for conflicts and distinctiveness before filing. Covers trademark database searches (TMview, WIPO Global Brand Database, USPTO TESS), distinctiveness analysis using the Abercrombie spectrum, likelihood of confusion assessment using DuPont factors and EUIPO relative grounds, common law rights evaluation, and goods/services overlap analysis. Produces a conflict report with a risk matrix. Use before adopting a new brand name, logo, or slogan — distinct from patent prior art search, which uses different databases, legal frameworks, and analysis methods.
tools
Scaffold a new CLI command using Commander.js with options, action handler, three output modes (human-readable, quiet, JSON), and optional ceremony variant. Covers command naming, option design, shared context patterns, error handling, and integration testing. Use when adding a command to an existing Commander.js CLI, designing a new CLI tool from scratch, or standardizing command structure across a multi-command CLI.