MCP Connector Guide for Claude
Best Practices fĂŒr das Erstellen, Einrichten und Deployen von MCP-Connectors in Claude.ai, Claude Desktop und Claude Code.
1. Ăberblickâ
MCP (Model Context Protocol) ist ein offener Standard (JSON-RPC 2.0), der AI-Clients (Claude, Cursor, VS Code, etc.) mit externen Tools ĂŒber eine einheitliche Schnittstelle verbindet. Ein MCP-Server exponiert Tools, Resources und Prompts, die Claude zur Laufzeit entdeckt und aufruft.
Spec-Version: 2025-11-25 (aktuell)
Transport: Streamable HTTP (remote) / stdio (lokal)
Offizielle Spec: https://modelcontextprotocol.io/specification/2025-11-25
2. Architekturâ
âââââââââââââââ JSON-RPC 2.0 âââââââââââââââ API Calls ââââââââââââ
â Claude.ai â ââââââââââââââââââââș â MCP Server â âââââââââââââââââș â GitHub â
â (MCP Client)â Streamable HTTP â (dein Code) â â Slack â
â â â â â DB etc. â
âââââââââââââââ âââââââââââââââ ââââââââââââ
Primitives eines MCP-Servers:
| Primitive | Zweck | Beispiel |
|---|---|---|
| Tool | AusfĂŒhrbare Aktion, die das LLM aufrufen kann | create_issue, search_repos |
| Resource | Read-only Daten (URI-basiert) | github://repos/{owner}/{repo}/readme |
| Prompt | Wiederverwendbare Prompt-Templates | summarize_pr |
3. Voraussetzungenâ
- Claude-Plan: Pro, Max, Team oder Enterprise (Free: 1 Custom Connector)
- SDK: TypeScript (
@modelcontextprotocol/sdk) oder Python (mcpmit FastMCP) - Transport: Streamable HTTP fĂŒr Remote-Server (HTTPS zwingend fĂŒr Claude.ai)
- Auth: OAuth 2.0 oder Bearer Token, je nach Zielservice
4. Technologie-Wahlâ
TypeScript (empfohlen fĂŒr Production)â
npm install @modelcontextprotocol/sdk zod
Vorteile: Type Safety via Zod-Schemas, native Streamable HTTP, ideal fĂŒr Cloudflare Workers / Vercel Edge / Node.
Python (empfohlen fĂŒr Prototyping)â
pip install mcp
Vorteile: FastMCP-Decorators, Schema-Generierung aus Type Hints + Docstrings, schneller Einstieg.
Entscheidungshilfeâ
| Kriterium | TypeScript | Python |
|---|---|---|
| Type Safety | Zod-Schemas (explizit, strikt) | Type Hints (implizit) |
| Prototyping-Speed | Mittel | Hoch (FastMCP) |
| Remote HTTP Deploy | Nativ (Edge, Workers) | FastAPI / uvicorn |
| Ecosystem | Node.js Infra | ML/Data Pipelines |
5. MCP-Server bauenâ
5.1 TypeScript â Minimal-Beispielâ
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
const server = new McpServer({
name: "github-connector",
version: "1.0.0",
});
server.tool(
"search_issues",
"Search GitHub issues by query string",
{
repo: z.string().describe("owner/repo format"),
query: z.string().describe("Search query"),
state: z.enum(["open", "closed", "all"]).default("open"),
},
async ({ repo, query, state }) => {
const response = await fetch(
`https://api.github.com/search/issues?q=${encodeURIComponent(query)}+repo:${repo}+state:${state}`,
{ headers: { Authorization: `Bearer ${process.env.GITHUB_TOKEN}` } }
);
const data = await response.json();
return {
content: [
{
type: "text",
text: JSON.stringify(data.items?.map((i: any) => ({
number: i.number,
title: i.title,
state: i.state,
url: i.html_url,
})), null, 2),
},
],
};
}
);
5.2 Python â FastMCP Minimal-Beispielâ
from mcp.server.fastmcp import FastMCP
import httpx
mcp = FastMCP("github-connector")
@mcp.tool()
async def search_issues(repo: str, query: str, state: str = "open") -> str:
"""Search GitHub issues in a repository.
Args:
repo: Repository in owner/repo format
query: Search query string
state: Issue state filter (open, closed, all)
"""
async with httpx.AsyncClient() as client:
resp = await client.get(
"https://api.github.com/search/issues",
params={"q": f"{query} repo:{repo} state:{state}"},
headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"},
)
data = resp.json()
return json.dumps([
{"number": i["number"], "title": i["title"], "url": i["html_url"]}
for i in data.get("items", [])
], indent=2)
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="0.0.0.0", port=8000)
6. Tool-Design Best Practicesâ
6.1 Naming & Descriptionsâ
- Tool-Namen:
snake_case, verb_noun-Pattern (create_issue,list_repos,search_pull_requests) - Descriptions: Klar, fĂŒr das LLM geschrieben. Das LLM entscheidet anhand der Description, ob es das Tool aufruft. Keine Marketing-Sprache, keine AbkĂŒrzungen ohne Kontext.
- Parameter-Descriptions: Jeder Parameter braucht eine
.describe()(Zod) oder einen Docstring-Eintrag (Python). Format-Hinweise einbauen:"Repository in owner/repo format, e.g. 'anthropics/claude-code'"
6.2 GranularitĂ€tâ
- Ein Tool = eine Aktion. Kein God-Tool, das alles kann.
- Lese- und Schreib-Operationen trennen:
get_issuevs.update_issue - Suchbare Listen mit Filtern statt "gib mir alles": Pagination, Limit-Parameter
6.3 Error Handlingâ
// GOOD: Return a structured error message
return {
content: [{ type: "text", text: `Error: Repository '${repo}' not found (404)` }],
isError: true,
};
// BAD: Throwing an uncontrolled exception can terminate the connection
throw new Error("Not found");
- Fehler immer als
isError: trueContent zurĂŒckgeben, nie die Connection crashen lassen. - Actionable Error Messages: Was ist schiefgelaufen, was kann der User tun?
6.4 Structured Responsesâ
- JSON fĂŒr maschinenlesbare Daten, Markdown fĂŒr menschenlesbare Zusammenfassungen.
- GroĂe Payloads kĂŒrzen: Das LLM hat ein Kontextfenster. Keine 500-Issue-Listen zurĂŒckgeben â Pagination erzwingen.
7. Transport & Deploymentâ
7.1 Streamable HTTP (Remote â fĂŒr Claude.ai Connectors)â
Der aktuelle Standard-Transport fĂŒr Remote-Server. SSE (Server-Sent Events) ist deprecated seit MCP Spec 2025-03-26, wird aber noch fĂŒr Backwards Compatibility unterstĂŒtzt.
Anforderungen:
- HTTPS zwingend (kein self-signed fĂŒr Claude.ai)
- Endpoint muss MCP Streamable HTTP implementieren
- CORS-Header korrekt setzen, wenn der Server direkt aus dem Browser angesprochen wird
Deploy-Optionen:
| Plattform | Stack | Anmerkung |
|---|---|---|
| Cloudflare Workers | TypeScript | Edge, global, gĂŒnstig |
| Vercel Edge Functions | TypeScript | Gut fĂŒr Next.js-Stacks |
| Fly.io | TypeScript / Python | Container-basiert, persistent |
| Railway / Render | Beliebig | Einfaches Container-Hosting |
| Eigener VPS (Nginx + Docker) | Beliebig | Volle Kontrolle |
7.2 stdio (Lokal â fĂŒr Claude Desktop / Claude Code)â
FĂŒr lokale MCP-Server, die auf deiner Maschine laufen. Konfiguration ĂŒber claude_desktop_config.json (Claude Desktop) oder claude mcp add (Claude Code).
Claude Desktop Config (~/.config/Claude/claude_desktop_config.json):
{
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxx"
}
}
}
}
Claude Code:
# HTTP remote server
claude mcp add-json github \
'{"type":"http","url":"https://api.githubcopilot.com/mcp/","headers":{"Authorization":"Bearer YOUR_PAT"}}'
# Local stdio server
claude mcp add github -s user -- docker run -i --rm \
-e GITHUB_PERSONAL_ACCESS_TOKEN ghcr.io/github/github-mcp-server
8. Authentifizierungâ
8.1 OAuth 2.0 (empfohlen fĂŒr Claude.ai Connectors)â
Claude.ai unterstĂŒtzt OAuth-Flows bei Custom Connectors. Dein MCP-Server muss den OAuth-Dance implementieren, damit Claude den User beim Verbinden authentifizieren kann.
8.2 Bearer Token / PATâ
FĂŒr lokale Server oder API-only-Setups. Token ĂŒber Environment-Variable injizieren, nie hardcoden.
8.3 Security-Checklisteâ
- Tokens nur ĂŒber Env-Vars, nie im Code
- Scopes minimal halten (Least Privilege)
- Rate Limiting implementieren (das LLM ruft Tools aggressiv auf)
- Input Validation auf allen Tool-Parametern (SQL Injection, Path Traversal)
- Keine sensitiven Daten in Tool-Responses, die nicht angefragt wurden
- Logging nur zu stderr/Files, nie stdout (bei stdio-Transport)
9. Connector in Claude.ai einrichtenâ
9.1 Custom Connector hinzufĂŒgenâ
- Claude.ai â Customize â Connectors (oder
claude.ai/settings/connectors) - "+" â "Add custom connector"
- Name: Sprechender Name (z.B. "GitHub â Production")
- URL: HTTPS-URL deines MCP-Servers
- Advanced Settings (optional):
- OAuth Client ID / Client Secret (wenn OAuth implementiert)
- Authentifizieren (Browser-Popup fĂŒr OAuth oder Token-Eingabe)
9.2 Bestehende Connectors aus dem Directoryâ
Ăber 200 vorgefertigte Connectors im Directory verfĂŒgbar. Einige davon sind interaktiv (rendern UI im Chat): Figma, Canva, Asana, Slack, Box, etc.
9.3 GitHub-Connector speziellâ
Stand Juni 2026: Der offizielle GitHub MCP-Server (ghcr.io/github/github-mcp-server) erfordert OAuth ĂŒber eine registrierte GitHub App. Das wird von Claude.ai Custom Connectors noch nicht nativ unterstĂŒtzt. Workarounds:
- Claude Desktop / Claude Code: Lokaler Docker-basierter stdio-Server mit PAT (funktioniert sofort, siehe Abschnitt 7.2)
- Eigener Proxy: MCP-Server bauen, der PAT-Auth akzeptiert und GitHub API wrapped â als Custom Connector in Claude.ai einbinden
- GitHub Copilot MCP Endpoint:
https://api.githubcopilot.com/mcp/mit Bearer PAT (funktioniert in Claude Code, experimentell in Claude.ai)
10. Testenâ
10.1 MCP Inspectorâ
Das offizielle Debug-Tool fĂŒr MCP-Server:
# TypeScript
npx @modelcontextprotocol/inspector node build/index.js
# Python
npx @modelcontextprotocol/inspector python your_server.py
Ăffnet ein lokales Web-UI, in dem du Tools manuell aufrufen, den Handshake prĂŒfen und Responses inspizieren kannst.
10.2 Checkliste vor Deploymentâ
- Alle Tools im Inspector einzeln getestet
- Error Cases getestet (ungĂŒltige Parameter, Auth-Fehler, Rate Limits)
- Response-GröĂen geprĂŒft (keine Monster-Payloads)
- Capability Negotiation korrekt (Server deklariert
tools,resources,prompts) - Transport getestet (stdio lokal, Streamable HTTP remote)
- CORS-Header korrekt (wenn Browser-basierter Client)
11. Production Checklistâ
- Logging: stderr oder File, nie stdout (stdout ist der stdio-Transportkanal)
- Error Handling: Jeder Tool-Call in try/catch, saubere Fehlermeldungen zurĂŒckgeben
- Input Validation: Zod (TS) / Type Hints + explizite Checks (Python)
- Rate Limiting: Das LLM ruft Tools in Bursts auf â externe API-Rate-Limits beachten
- Idempotenz: Schreibende Tools sollten bei erneutem Aufruf nicht doppelt schreiben
- Timeouts: Externe API-Calls mit Timeout versehen (LLM wartet nicht ewig)
- Health Check: Endpoint fĂŒr Monitoring bereitstellen
- Versioning: Server-Version in
McpServerKonstruktor setzen
12. Referenzenâ
| Ressource | URL |
|---|---|
| MCP Specification | https://modelcontextprotocol.io/specification/2025-11-25 |
| TypeScript SDK | https://github.com/modelcontextprotocol/typescript-sdk |
| Python SDK | https://github.com/modelcontextprotocol/python-sdk |
| MCP Inspector | npx @modelcontextprotocol/inspector |
| Claude Connectors Docs | https://support.claude.com/en/articles/11175166 |
| Claude API MCP Connector | https://docs.claude.com/en/docs/agents-and-tools/mcp-connector |
| GitHub MCP Server | https://github.com/github/github-mcp-server |
| GitHub MCP Server Install (Claude) | https://github.com/github/github-mcp-server/blob/main/docs/installation-guides/install-claude.md |
Dieses Dokument ist ein Entwurf und sollte vor externer Verwendung geprĂŒft werden.