Lerne als Softwareentwickler, wie du KI-Agenten mit Skills, Tool Use, MCP und RAG baust. Von der Tool-Definition über MCP-Server bis zur Multi-Agent-Orchestrierung -- alles praxisnah mit Code-Beispielen.
Klicken zum Vergrößern
Claude Code hat sich von einem reinen Coding-Assistenten zu einer vollständigen Plattform für autonome KI-Agenten entwickelt. Für Softwareentwickler, die eigene Agenten bauen wollen, ist das Verständnis der fünf tragenden Säulen entscheidend: Skills, Tool Use, MCP, RAG und Agentic Patterns.
Dieser Kurs richtet sich an Softwareentwickler, die verstehen wollen, wie KI-Agenten auf Werkzeuge zugreifen, externen Speicher nutzen und über standardisierte Protokolle kommunizieren. Nach Abschluss können Sie:
| Säule | Funktion | Analogie |
|---|---|---|
| Skills | Erweiterbare Fähigkeiten | Plug-ins für den Agenten |
| Tool Use | Strukturierte Werkzeug-Aufrufe | API-Calls mit Typsicherheit |
| MCP | Standardisiertes Integrationsprotokoll | USB-C für KI |
| RAG | Externer Wissenszugriff | Nachschlagewerk für den Agenten |
| Agentic Patterns | Orchestrierungsmuster | Teamorganisation |
Die Entwicklung von KI-Anwendungen hat sich fundamental verändert: Statt einzelner Prompts arbeiten moderne Systeme mit iterativen Agenten-Schleifen. Der Agent denkt nach, wählt ein Werkzeug, beobachtet das Ergebnis und wiederholt den Prozess -- bis die Aufgabe erledigt ist. Dieses "ReAct"-Pattern (Reason + Act) ist die Grundlage aller modernen KI-Agenten.
Skills sind modulare, wiederverwendbare Fähigkeiten, die einen KI-Agenten erweitern. In Claude Code besteht jeder Skill aus einem Ordner mit einer `SKILL.md`-Datei plus optionalen Begleitdateien. Skills folgen dem offenen Standard agentskills.io, der auch mit Cursor, Gemini CLI und anderen kompatiblen IDEs funktioniert.
Das geniale an Skills ist das Prinzip der Progressive Disclosure: Statt alle Instruktionen sofort in das Kontextfenster zu laden (wie bei MCP-Servern mit Dutzenden Tool-Definitionen), entdeckt der Agent Fähigkeiten erst bei Bedarf.
Die drei Ebenen:
> "Usually the skill description is about 5% of the total context of the skill. That's all you're loading up front." -- Cole Medin
1. Verzeichnis anlegen: ``` .claude/skills/fix-issü/SKILL.md ```
2. SKILL.md schreiben: ```yaml
name: fix-issü description: Fix a GitHub issü by number. Reads the issü, implements the fix, writes tests, and creates a commit. disable-model-invocation: trü allowed-tools: Bash(gh *), Read, Grep, Glob, Write, Edit
Fix GitHub issü $ARGUMENTS following our coding standards.
3. Aufrufen: `/fix-issü 142`
| Speicherort | Sichtbarkeit | Einsatz |
|---|---|---|
| `~/.claude/skills/` | Persönlich, alle Projekte | Eigene Workflows |
| `.claude/skills/` | Projektspezifisch, per Git teilbar | Team-Workflows |
| Enterprise Managed Settings | Organisationsweit | Unternehmensstandards |
Skills sind nicht auf Claude Code beschränkt! Sie funktionieren in jedem Agent-Framework. Dafür brauchen Sie nur zwei Tools:
```python
import os from pathlib import Path
def get_skill_descriptions(skills_dir: str) -> str: """Sammelt alle Skill-Beschreibungen für den System-Prompt.""" descriptions = [] for skill_path in Path(skills_dir).glob("*/SKILL.md"): content = skill_path.read_text()
frontmatter = content.split("---")[1] descriptions.append(frontmatter) return "\n".join(descriptions) ```
Claude Code bringt bereits nützliche Skills mit:
| Skill | Funktion |
|---|---|
| `/batch | Parallele Änderungen über Git-Worktrees |
| `/claude-api` | Lädt API-Referenz für die Projektsprache |
| `/debug [description]` | Debugging über Debug-Log-Analyse |
| `/loop [interval] | Wiederholte Ausführung nach Zeitplan |
| `/simplify [focus]` | Code-Review mit 3 parallelen Review-Agents |
Tool Use (auch Function Calling) erlaubt Claude, strukturiertes JSON auszugeben, das reale Aktionen auslöst -- API-Aufrufe, Datenbankabfragen, Berechnungen oder beliebige andere Operationen. Der Entwickler definiert die verfügbaren Tools mit Name, Beschreibung und JSON Schema.
```
Die `description`-Felder sind der primäre Steuerungsmechanismus. Investieren Sie hier genauso viel Sorgfalt wie in Code-Dokumentation:
```json { "name": "database_query", "description": "Führt eine SQL-SELECT-Abfrage auf der Produktdatenbank aus. Nur lesende Zugriffe erlaubt. Gibt maximal max_rows Zeilen zurück.", "input_schema": { "type": "object", "properties": { "query": { "type": "string", "description": "Die SQL-SELECT-Abfrage. Beispiel: SELECT name, price FROM products WHERE category = 'electronics'" }, "max_rows": { "type": "integer", "default": 100, "description": "Maximale Anzahl zurückgegebener Zeilen (1-1000)" } }, "required": ["query"] }, "input_examples": [ {"query": "SELECT * FROM products LIMIT 10", "max_rows": 10}, {"query": "SELECT name FROM customers WHERE city = 'Berlin'"} ] } ```
| Parameter | Wirkung |
|---|---|
| `strict: trü` | Erzwingt exakte Schema-Konformität |
| `tool_choice: "auto"` | Claude entscheidet, ob es ein Tool nutzt |
| `tool_choice: "any"` | Claude muss mindestens ein Tool nutzen |
| `tool_choice: {"type": "tool", "name": "X"}` | Bestimmtes Tool erzwingen |
| `input_examples` | Beispiele verbessern Genauigkeit von 72% auf 90% |
Claude kann mehrere Tools gleichzeitig aufrufen. Alle `tool_result`-Blocks müssen in einer User-Message zusammengefasst werden:
```python import anthropic
client = anthropic.Anthropic()
response = client.messages.create( model="claude-sonnet-4-5-20250514", max_tokens=1024, tools=[weather_tool, calendar_tool], messages=[{"role": "user", "content": "Wie wird das Wetter morgen und was steht im Kalender?"}] )
```
Fehler werden als `tool_result` mit `is_error: trü` zurückgegeben. Claude kann den Fehler analysieren, korrigieren und erneut versuchen:
```json { "type": "tool_result", "tool_use_id": "toolu_xyz", "is_error": trü, "content": "Fehler: Tabelle 'users' existiert nicht. Verfügbare Tabellen: customers, orders, products." } ```
Bei grossen Tool-Bibliotheken (>10 Tools) spart `defer_loading: trü` massiv Token. Statt alle Definitionen vorab zu laden, durchsucht Claude dynamisch den Tool-Katalog:
Das Model Context Protocol ist ein offener Standard, der das "N x M-Integrationsproblem" löst. Statt für jede Kombination aus LLM und Datenquelle eine eigene Integration zu bauen, bietet MCP ein einheitliches Protokoll -- vergleichbar mit USB-C für Hardware.
MCP wurde im November 2024 von Anthropic veröffentlicht und ist seit Ende 2025 unter der Linux Foundation / AAIF als Industriestandard etabliert. OpenAI, Google und Microsoft unterstützen das Protokoll ebenfalls.
``` +------------------+ +------------------+ +------------------+
| MCP Host | MCP Client | MCP Server | ||
|---|---|---|---|---|
| (Claude Desktop, | <--> | (Vermittler, | <--> | (Stellt Tools, |
| IDE, eigene | 1 pro Server) | Resources und | ||
| Anwendung) | Prompts bereit) |
+------------------+ +------------------+ +------------------+ ```
| Primitive | Steuerung | Funktion | Analogie |
|---|---|---|---|
| Tools | Model-gesteuert | Ausführbare Aktionen | POST-Endpoint |
| Resources | App-gesteuert | Daten bereitstellen | GET-Endpoint |
| Prompts | User-gesteuert | Template-Vorlagen | Gespeicherte Abfragen |
stdio (empfohlen für lokal):
Streamable HTTP (empfohlen für remote):
SSE (deprecated):
```typescript 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: "firmenwiki", version: "1.0.0" });
// Tool registrieren server.tool( "search_wiki", "Durchsucht das Firmenwiki nach einem Stichwort", { query: z.string(), max_results: z.number().default(5) }, async ({ query, max_results }) => { const results = await searchWikiDatabase(query, max_results); return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] }; } );
// Resource registrieren server.resource( "wiki://articles/{id}", "Einzelner Wiki-Artikel", async (uri) => { const id = uri.pathname.split("/").pop(); const article = await getArticle(id); return { contents: [{ uri: uri.href, mimeType: "text/markdown", text: article.content }] }; } );
// Server starten const transport = new StdioServerTransport(); await server.connect(transport); ```
Der Discovery-Prozess läuft dynamisch:
```bash
claude mcp add firmenwiki -- node /pfad/zu/firmenwiki-server.js
{ "mcpServers": { "firmenwiki": { "command": "node", "args": ["/pfad/zu/firmenwiki-server.js"] } } } ```
Ein weit verbreitetes Missverständnis: "RAG ist tot." Die Realität ist differenzierter:
| Datentyp | Empfohlene Strategie | Warum |
|---|---|---|
| Quellcode | Agentic Search (Grep, Glob) | Code ist hochstrukturiert mit exakten Bezeichnern |
| Dokumente, Wikis | RAG mit Vektordatenbank | Semantische Suche für unstrukturierte Texte |
| API-Referenzen | MCP-Server oder Skills | Strukturierte Daten, definierte Endpunkte |
| Grosse Wissensbasen | Hybrid RAG | ~100x günstiger als Agentic Search bei Skalierung |
Anthropics "Contextual Retrieval" ist der aktülle Gold-Standard. Der Schlüssel: Vor dem Chunking wird jedem Chunk ein erklärenden Kontext hinzugefügt.
Die Pipeline:
``` Dokumente --> Chunking (512-1024 Token mit Overlap) --> Kontextgenerierung (Claude Haiku pro Chunk) --> Dual-Indexierung: Dense Embeddings + BM25 --> Hybrid Search mit Reciprocal Rank Fusion --> Reranking (Top 150 -> Top 20) --> Finale LLM-Antwort (Claude Sonnet/Opus) ```
Ergebnis: Bis zu 67% weniger Retrieval-Fehler gegenüber klassischem RAG.
Statt einen nackten Text-Chunk einzubetten, wird jeder Chunk mit Kontext angereichert:
Vorher (klassisch): > "Der Preis beträgt 49,99 Euro pro Monat bei jährlicher Abrechnung."
Nachher (Contextual): > "Dieser Abschnitt stammt aus der Preisliste des Enterprise-Plans unserer SaaS-Plattform. Er beschreibt die monatlichen Kosten bei Jahresabonnement. Der Preis beträgt 49,99 Euro pro Monat bei jährlicher Abrechnung."
```python from qdrant_client import QdrantClient from qdrant_client.models import Distance, VectorParams, PointStruct import anthropic
qdrant = QdrantClient("localhost", port=6333) qdrant.create_collection( collection_name="firmenwissen", vectors_config=VectorParams(size=1024, distance=Distance.COSINE) )
def enrich_and_index(chunks: list[str], document_title: str): claude = anthropic.Anthropic() for i, chunk in enumerate(chunks):
context_response = claude.messages.create( model="claude-3-5-haiku-20241022", max_tokens=200, messages=[{ "role": "user", "content": f"Beschreibe in einem Satz, worum es in diesem Abschnitt aus '{document_title}' geht:\n\n{chunk}" }] ) enriched = f"{context_response.content[0].text}\n\n{chunk}"
embedding = get_embedding(enriched) # Voyage AI oder OpenAI qdrant.upsert( collection_name="firmenwissen", points=[PointStruct( id=i, vector=embedding, payload={"text": enriched, "source": document_title} )] )
def ask(question: str) -> str: query_embedding = get_embedding(question) results = qdrant.search( collection_name="firmenwissen", query_vector=query_embedding, limit=10 ) context = "\n---\n".join([r.payload["text"] for r in results])
claude = anthropic.Anthropic() response = claude.messages.create( model="claude-sonnet-4-5-20250514", max_tokens=2048, messages=[{ "role": "user", "content": f"Beantworte die Frage basierend auf folgendem Kontext.\n\nKontext:\n{context}\n\nFrage: {question}" }] ) return response.content[0].text ```
| Datenbank | Stärke | Empfehlung |
|---|---|---|
| Qdrant | Hybrid Search nativ, Rust-Performance, Named Vectors | Production mit Filtering |
| Pinecone | Managed Service, einfaches Setup | Teams ohne Infra-Expertise |
| ChromaDB | Lightweight, Python-native | Prototyping und lokale Dev |
| Weaviate | Multi-Tenancy, GraphQL-API | Enterprise mit komplexen Schemas |
Google NotebookLM kann über einen MCP-Server direkt in Claude Code eingebunden werden:
```bash claude mcp add notebook-lm npx notebook-lm-mcp@latest ```
Damit wird NotebookLM zur Wissensbasis und Claude Code zum Interface -- kostenlos und sofort einsetzbar.
Das fundamentale Pattern aller modernen KI-Agenten:
```
Claude Code nutzt dieses Pattern nativ. Es denkt nach (Extended Thinking), wählt ein Tool, beobachtet das Ergebnis und iteriert.
Cole Medin's WHISK-Framework adressiert das grösste Problem bei Agenten: Context Rot -- 80% der Agent-Fehler entstehen durch schlechtes Kontext-Management.
| Buchstabe | Strategie | Umsetzung |
|---|---|---|
| Write | Externalisieren | Git-Log als Langzeitgedächtnis, standardisierte Commits, Handoff-Dateien |
| H (Isolate) | Isolieren | Sub-Agenten für Recherche (90% weniger Token im Hauptkontext) |
| I (Select) | Gezielt auswählen | 4-Schichten: Globale Regeln, On-Demand-Kontext, Skills, Prime-Commands |
| S (Compress) | Komprimieren | Handoff-Dokumente, /compact -- aber: beste Kompression ist keine Kompression |
| K | Frisch starten | Immer in neuem Kontextfenster coden, Planung und Implementierung trennen |
| Ansatz | Kontext | Kommunikation | Ideal für |
|---|---|---|---|
| Einzelner Prompt | Geteilt | -- | Einfache Aufgaben |
| Sub-Agent | Eigenes Fenster, Ergebnis zurück | Nur Rückmeldung | Fokussierte Teilaufgaben |
| Agent Team | Eigenes Fenster, unabhängig | Direkt untereinander | Komplexe Zusammenarbeit |
| Skill mit `context: fork` | Fork mit Agent-Typ | Ergebnis zurück | Spezialisierte Workflows |
Das offizielle SDK für eigene Agenten (Python und TypeScript):
```python from claude_agent_sdk import Agent, Tool
agent = Agent( model="claude-sonnet-4-5-20250514", tools=[ Tool(name="read_file", fn=read_file_impl), Tool(name="write_file", fn=write_file_impl), Tool(name="run_tests", fn=run_tests_impl), ], system_prompt="Du bist ein erfahrener Python-Entwickler..." )
result = agent.run("Implementiere eine REST-API für Benutzer-Verwaltung") ```
Kernfeatures:
Effektive Agenten brauchen harte Leitplanken:
| Ebene | Mechanismus | Beispiel |
|---|---|---|
| Tool-Ebene | `allowed-tools` in SKILL.md | Nur bestimmte Git-Befehle |
| Schema-Ebene | JSON Schema Validierung | Parameter-Typen prüfen |
| Code-Ebene | Linter, Formatter als Hard Gates | ESLint, Prettier, mypy |
| Pipeline-Ebene | CI/CD als finale Prüfung | Tests müssen grün sein |
| Kontext-Ebene | Token-Limits, Compaction | Auto-Zusammenfassung |
Der `/batch`-Skill zeigt Multi-Agent-Orchestrierung in Aktion:
Ein produktionsreifer KI-Agent kombiniert alle fünf Säulen:
``` +-------------------+
| Agent (Claude) |
|---|
| ReAct-Loop |
+-------------------+ | +------------------+------------------+
+-----v-----+ +------v------+ +------v------+
| Skills | Tool Use | RAG | ||
|---|---|---|---|---|
| Progressive | JSON Schema | Contextual | ||
| Disclosure | Validation | Retrieval |
+-----+-----+ +------+------+ +------+------+
+------------------+------------------+ | +------v------+
| MCP |
|---|
| Unified |
| Integration |
+-------------+ | +------------+------------+
Datenbank APIs/Services Dateisystem ```