Skip to main content
Glama
giaminhgist

deepseek-mcp

by giaminhgist

deepseek-mcp

Ein MCP-Server, der es Claude Code ermöglicht, eine begrenzte Einheit von Repository-Arbeit an DeepSeek als lokalen Sub-Agenten zu delegieren.

Claude bleibt der Orchestrator: Es entscheidet über Umfang, Architektur und Korrektheit. DeepSeek ist ein Ausführungs-Worker für den token-intensiven Teil – das Erkunden des Repositorys, das Vornehmen routinemäßiger oder wiederholender Änderungen und das Ausführen der Tests – innerhalb eines einzigen autorisierten Arbeitsbereichs und unter harten Budgets.

Der Punkt ist, nicht zweimal für denselben Kontext zu bezahlen. Wenn Claude ein Subsystem liest und DeepSeek es dann erneut liest, ist nichts gespart; daher gehört die Delegationsentscheidung vor die breiten Lesevorgänge.

User
 ↓
Claude: plan + define goal/scope
 ↓
DeepSeek: inspect repo + read code + implement + test
 ↓
DeepSeek: compact structured summary
 ↓
Claude: review diff/results + final answer

DeepSeek ist der primäre Repository-Worker; Claude ist der Orchestrator. Claude plant, trifft die architektonischen und sicherheitsrelevanten Entscheidungen, überprüft den zurückgegebenen Diff und schreibt die endgültige Antwort. DeepSeek erledigt die Repository-Arbeit: Erkunden, Glob/Grep/Read, Verstehen des Codes, Implementieren, Testen und routinemäßige Korrekturen. Claude delegiert vor dem breiten Lesen von Quelldateien, und DeepSeek entdeckt die relevanten Dateien selbst innerhalb des autorisierten Umfangs und gibt eine kompakte strukturierte Zusammenfassung zurück – Claude sendet niemals Dateiinhalte.

Erfordert Python 3.11+ und einen DeepSeek-API-Schlüssel. Eine Laufzeitabhängigkeit: das MCP SDK. Alles andere ist die Standardbibliothek. ripgrep wird für die Suche verwendet, wenn vorhanden, und eine reine Python-Scan wird verwendet, wenn nicht.


1. Install

Das Paket ist noch nicht auf PyPI veröffentlicht, also installieren Sie es aus einem Checkout. Installieren Sie es einmal, global – es ist keine Projektabhängigkeit und funktioniert in jedem Repository.

git clone https://github.com/giaminhgist/DeepSeek_MCP.git
cd DeepSeek_MCP

uv tool install .          # recommended: isolated, and puts deepseek-mcp on PATH
# or
pipx install .
# or, into the current environment
pip install .

Bestätigen Sie, dass das Konsolenskript gefunden wird:

deepseek-mcp --version     # -> deepseek-mcp 0.1.0

Wenn der Befehl nicht gefunden wird, ist das Installationsverzeichnis nicht in Ihrem PATH. Mit uv führen Sie uv tool update-shell aus und öffnen eine neue Shell.

deepseek-mcp ohne Argumente startet den MCP-Server auf stdio. Das ist es, was Claude Code ausführt; Sie würden es normalerweise nicht selbst aufrufen.

Related MCP server: Hydra

2. Set the API key

Holen Sie sich einen Schlüssel von https://platform.deepseek.com/. Legen Sie ihn niemals in ein Projekt-Repository. Exportieren Sie ihn aus Ihrem Shell-Profil:

export DEEPSEEK_API_KEY="sk-your-key-here"     # ~/.bashrc, ~/.zshrc, …
# Windows PowerShell
setx DEEPSEEK_API_KEY "sk-your-key-here"

Dann prüfen Sie, ob der Server ihn sehen kann:

deepseek-mcp --check       # prints a health report as JSON; exits 1 if unusable

--check gibt "mode": "enabled" und "status": "ok" aus, wenn der Schlüssel lesbar ist. Der Schlüssel selbst erscheint nie im Bericht.

Drei unterstützte Schlüsselquellen, in Prioritätsreihenfolge:

  1. DEEPSEEK_MCP_API_KEY oder DEEPSEEK_API_KEY in der Serverumgebung.

  2. api_key_env in der Benutzerkonfigurationsdatei, die eine andere Umgebungsvariable zum Lesen benennt.

  3. api_key in der Benutzerkonfigurationsdatei – akzeptiert, aber abgeraten, und es erzeugt eine Startwarnung, weil es den Schlüssel auf die Festplatte legt.

Alles andere ist optional; siehe Konfigurationsreferenz. Die einzige andere Variable, die man vorab kennen sollte, ist DEEPSEEK_MCP_WORKSPACE, die das autorisierte Projektwurzelverzeichnis festlegt, anstatt es zu entdecken (siehe Workspace).

3. Add the server to Claude Code

Wenn DEEPSEEK_API_KEY bereits in der Umgebung exportiert ist, die Claude Code erbt:

claude mcp add deepseek --scope user -- deepseek-mcp

Wenn nicht – zum Beispiel ein Desktop-Start, der Ihr Shell-Profil nicht liest – übergeben Sie es explizit:

claude mcp add deepseek --scope user -e DEEPSEEK_API_KEY=sk-your-key-here -- deepseek-mcp

--scope user registriert es für jedes Projekt. Verwenden Sie --scope local nur für das aktuelle Projekt.

Äquivalente handgeschriebene Konfiguration:

{
  "mcpServers": {
    "deepseek": {
      "command": "deepseek-mcp",
      "env": {
        "DEEPSEEK_API_KEY": "sk-your-key-here"
      }
    }
  }
}

Lassen Sie den env-Block vollständig weg, wenn der Schlüssel bereits in der geerbten Umgebung vorhanden ist. Committen Sie keinen Schlüssel in eine Repository-Datei.

4. Verify the connection

Dann, innerhalb von Claude Code:

claude mcp list            # deepseek should be listed and connected
  • Führen Sie /mcp aus – deepseek sollte mit seinen zwei Tools erscheinen; * bitten Sie Claude, deepseek_health aufzurufen. Ein funktionierender Server antwortet mit status: "ok", mode: "enabled", dem Standard-model und der allowed_models-Zulassungsliste, dem aufgelösten Workspace-Root, den aktivierten Fähigkeiten, den Budgetgrenzen und einem usage-Objekt mit den laufenden Gesamtwerten des Workers für diesen Serverprozess.

Ohne konfigurierten Schlüssel startet der Server trotzdem und antwortet weiterhin auf deepseek_health – mit status: "error", mode: "disabled" – sodass das Problem von innerhalb von Claude Code diagnostizierbar ist. In diesem Zustand führt er keine Arbeit aus.

5. Troubleshooting

Symptom

Ursache und Lösung

deepseek-mcp: Befehl nicht gefunden

Das Installationsverzeichnis ist nicht in PATH. uv tool update-shell, dann eine neue Shell öffnen. Oder zeigen Sie mit dem MCP-Konfigurations-command auf den absoluten Pfad.

claude mcp list zeigt den Server als fehlgeschlagen

Führen Sie deepseek-mcp --check in einem Terminal aus. Es gibt dieselbe Diagnose aus, die der Server melden würde.

deepseek_health gibt mode: "disabled" zurück

Kein API-Schlüssel hat den Serverprozess erreicht. Überprüfen Sie das errors-Feld. Claude Code erbt nicht unbedingt Ihr Shell-Profil – übergeben Sie den Schlüssel mit -e DEEPSEEK_API_KEY=… oder einem env-Block.

Delegation gibt status: "blocked" zurück

Die Richtlinie hat die Anfrage vor jedem API-Aufruf abgelehnt: ein Modus, der Fähigkeiten anfordert, die der Server nicht gewährt, Verifikationsbefehle im read_only-Modus, ein model außerhalb der allowed_models-Zulassungsliste oder ein ungültiges Anfragefeld. Das error-Feld sagt, welches.

Delegation gibt status: "budget_exceeded" zurück

Die Arbeitseinheit war zu groß für die Grenzen, die deepseek_health meldet. Verengen Sie das Ziel oder erhöhen Sie das relevante Budget.

Ein Run-Befehl wird abgelehnt

Die Ausführungsrichtlinie ist eine Zulassungsliste. Siehe Befehlspolitik; fügen Sie projektspezifische Tools über commands.extra_allowed_executables hinzu.

Der Worker kann eine Datei nicht lesen

Pfade mit Geheimnissen und .git-Interna sind für jedes Tool gesperrt, und alles wird innerhalb eines Workspace-Roots aufgelöst. Überprüfen Sie workspace im Gesundheitsbericht.

Das Workspace-Root ist falsch

Es wird entdeckt, indem man vom Verzeichnis aus nach oben geht, in dem Claude Code den Server gestartet hat. Setzen Sie DEEPSEEK_MCP_WORKSPACE, um es festzulegen.

DEEPSEEK_MCP_CONFIG existiert nicht beim Start

Eine explizit angegebene Konfigurationsdatei fehlt. Korrigieren Sie den Pfad oder setzen Sie die Variable zurück; der Server wird nicht stillschweigend auf Standardwerte zurückfallen.

Logs gehen an stderr als event key=value-Datensätze, niemals an stdout. Erhöhen Sie die Detailstufe mit DEEPSEEK_MCP_LOG_LEVEL=DEBUG oder senden Sie sie mit DEEPSEEK_MCP_LOG_FILE=/absolute/path.log an eine Datei.


The tool surface

Zwei Tools, bewusst.

deepseek_health

Konfiguration und Gesundheit: Status, das Standard-model und die allowed_models-Zulassungsliste, das autorisierte Workspace-Root und wie es aufgelöst wurde, aktivierte Fähigkeiten, Budgetgrenzen und ein usage-Objekt mit den laufenden Gesamtwerten des Workers für diesen Serverprozess. Keine Geheimnisse. Verwenden Sie es, um zu bestätigen, dass der Worker verwendbar ist, und um eine Delegation zu dimensionieren, bevor Sie eine senden.

delegate_to_deepseek

Eine begrenzte Arbeitseinheit, als strukturierter Vertrag statt eines Prosa-Blobs:

Feld

Zweck

objective

Das erforderliche Ergebnis. Erforderlich.

scope

Workspace-relative Globs, zu denen die Arbeit gehört. Beschränkt Schreibvorgänge.

constraints

Nur die Projektregeln, die für diese Aufgabe relevant sind.

acceptance_criteria

Bedingungen, die den Erfolg definieren.

verification

Befehle, die vor dem Abschluss ausgeführt werden, als argv-Arrays.

mode

read_only, verify oder write.

model

DeepSeek-Modell nur für diese Delegation, z.B. deepseek-reasoner. Weglassen, um das konfigurierte Modell des Servers zu verwenden. Wenn der Server eine Modell-Zulassungsliste festlegt, wird ein Name außerhalb davon als blocked vor jedem API-Aufruf abgelehnt.

analysis

Geben Sie auch eine Repository-Karte zurück – important_files, architecture_notes, dependencies, suggested_scope und risks – damit Sie eine Änderung planen können, ohne das Repository selbst zu lesen. Passt natürlich zu mode="read_only" für einen reinen Inspektionsdurchgang.

{
  "objective": "Treat a None row as invalid and cover it with a test.",
  "scope": ["src/importer/**", "tests/importer/**"],
  "constraints": ["Do not change the public response schema."],
  "acceptance_criteria": ["validate_row(None) returns False."],
  "verification": [["pytest", "tests/importer", "-q"]],
  "mode": "write"
}

Der Worker schleift dann selbst – glob, grep, read, edit, run, repair – und gibt ein kompaktes Ergebnis zurück, niemals ein Transkript:

{
  "status": "completed",
  "summary": "Treated a None row as invalid and added a regression test.",
  "changed_files": ["src/importer/validate.py"],
  "created_files": ["tests/importer/test_none.py"],
  "deleted_files": [],
  "inspected_files": ["src/importer/__init__.py"],
  "verification": [
    {"argv": ["pytest", "tests/importer", "-q"], "exit_code": 0, "summary": "24 passed"}
  ],
  "warnings": [],
  "unresolved": [],
  "assumptions": [],
  "diff_stat": " src/importer/validate.py | 3 ++-",
  "metrics": {
    "turns": 7, "tool_calls": 12, "prompt_tokens": 18400,
    "completion_tokens": 2100, "duration_seconds": 41.2,
    "files_read": 4, "files_changed": 2, "compactions": 0
  },
  "session_usage": {
    "delegations": 3, "turns": 19, "tool_calls": 31,
    "prompt_tokens": 51200, "completion_tokens": 6400,
    "total_tokens": 57600, "since": "server start"
  },
  "model": "deepseek-chat",
  "analysis": {
    "important_files": ["src/importer/validate.py"],
    "architecture_notes": ["validate_row is the single entry point for row checks."],
    "dependencies": ["src/importer/schema.py"],
    "suggested_scope": ["src/importer/**", "tests/importer/**"],
    "risks": ["Changing the None handling may affect callers that rely on the old behaviour."]
  },
  "debug_ledger": ["R src/importer/validate.py", "E src/importer/validate.py", "X pytest tests/importer -q"]
}

model ist das Modell, das die Delegation tatsächlich ausgeführt hat, nach der Auflösung der Aufgaben-Override. analysis ist nur vorhanden, wenn die Delegation danach gefragt hat, und trägt die fünf Repository-Kartenfelder. debug_ledger ist das kompakte Ausführungsprotokoll mit einer Zeile pro Tool-Aufruf, das nur befüllt wird, wenn der Server mit debug aktiviert läuft. metrics meldet den eigenen Token-Verbrauch und die Form dieser Delegation; session_usage trägt die laufenden Gesamtwerte des Workers für diesen Serverprozess, einschließlich dieser Delegation – delegations, turns, tool_calls, prompt_tokens, completion_tokens, total_tokens und since (immer das Literal "server start").

Der Zähler hinter usage und session_usage liegt im Arbeitsspeicher und ist auf den Serverprozess beschränkt: Er wird zurückgesetzt, wenn der MCP-Server neu startet, was genau das since-Feld festhält. Er wird nicht auf der Festplatte gespeichert. Nur Delegationen, die den Worker erreicht haben, werden gezählt – eine früher abgelehnte Anfrage (Server deaktiviert, ungültiges Anfragefeld oder ein Modell außerhalb der allowed_models-Zulassungsliste) hat nie ein Modell aufgerufen und erhöht daher weder delegations noch irgendeinen Token-Zähler. total_tokens wird aus seinen Bestandteilen berechnet und nicht gespeichert, kann also nicht abweichen.

Statuswerte: completed, partial, blocked, failed, budget_exceeded, disabled. Erwartbare Fehler – fehlerhafte Konfiguration, ein abgelehnter Pfad, ein verweigerter Befehl, ein erschöpftes Budget, ein Provider-Fehler – werden alle als einer dieser Werte mit einer Begründung zurückgegeben. Ein Python-Traceback niemals.

Ergebnisse enthalten Schlussfolgerungen, niemals rohe Read/Grep/Tool-Transkripte. Das Debug-Ledger ist das kompakte Ledger – eine Zeile pro Tool-Aufruf – nicht die Tool-Ausgabe, selbst wenn Debug aktiviert ist.

Modi verengen, erweitern nie

Modus

Lesen & Suchen

Befehle ausführen

Dateien schreiben

read_only

ja

nein

nein

verify

ja

ja

nein

write

ja

ja

ja, innerhalb von scope

Ein Modus wird mit den konfigurierten Fähigkeiten des Servers geschnitten. Eine Anfrage, die mehr verlangt, als der Server gewährt, wird vor jedem API-Aufruf abgelehnt – sie kann die Richtlinie niemals erweitern.

Was dem Worker nicht anvertraut wird

Zwei Dinge im Ergebnis stammen nicht vom Modell:

  • Die Liste der geänderten Dateien stammt aus der Beobachtung der Tools plus einem git status-Vergleich mit einem vor dem Lauf erstellten Schnappschuss, sodass bereits vorhandene, nicht committete Änderungen eines Benutzers nie als Arbeit des Workers gemeldet werden.

  • Der Status. Ein beanspruchtes completed wird auf partial herabgestuft, wenn die angeforderte Verifikation nie ausgeführt wurde oder mit einem Nicht-Null-Exitcode endete. failed und budget_exceeded sind Urteile des Servers und können vom Worker überhaupt nicht beansprucht werden.

Verifizieren Sie trotzdem. git status --short, git diff --stat, dann lesen Sie die geänderten Hunks proportional zum Risiko. completed ist eine Behauptung, kein Beweis.

Budgets

Jede Delegation ist begrenzt, und der Lauf endet mit einer strukturierten Begründung statt mit Überschreitung: Turns (24), Tool-Aufrufe (80), Wanduhrzeit (15 Min), Ausgabe pro Tool-Aufruf (20.000 Zeichen), Read-Fenster (250 Zeilen), Grep-Treffer (100), Glob-Pfade (300) und geschätzter aktiver Kontext (96.000 Tokens).

Kontext wird als budgetierte Ressource behandelt und nicht als wachsendes Transkript. Oberhalb einer Schwelle werden alte Tool-Payloads durch einzeilige Einträge aus einem deterministischen Ausführungs-Ledger ersetzt; wenn das nicht ausreicht, werden ganze alte Turns verworfen, da das Ledger weiterhin festhält, was sie getan haben. Das Systemprompt, der ursprüngliche Aufgabenvertrag, die letzten Turns und das Ledger bleiben immer erhalten. Für Zusammenfassungen wird nie ein zusätzlicher Modellaufruf ausgegeben, und wenn der Worker ein entferntes Detail benötigt, liest er die Datei erneut.

Alle Grenzen sind konfigurierbar und werden von deepseek_health gemeldet.


Konfigurationsreferenz

Als reserviert markierte Einstellungen werden beim Start validiert, aber noch nicht verwendet.

Rangfolge

Umgebungsvariable > Benutzerkonfigurationsdatei > eingebauter Standardwert

Die Modellauswahl hat eine weitere Ebene darüber: Eine einzelne Delegation kann ihr eigenes Modell benennen, die vollständige Reihenfolge lautet also

Aufgabenmodell > Umgebungsvariable > Benutzerkonfigurationsdatei > eingebauter Standardwert

Das Aufgabenmodell ist der Parameter model von delegate_to_deepseek. Wenn allowed_models des Servers nicht leer ist, handelt es sich um eine Zulassungsliste, und eine Anfrage, die etwas anderes benennt, wird vor jedem API-Aufruf als blocked abgelehnt – die Modellwahl verengt sich auf das, was der Betreiber erlaubt hat, genau wie Delegationsmodi sich auf die Fähigkeiten des Servers verengen.

Eine fehlende, fehlerhaft formatierte oder widersprüchliche Einstellung ist ein Fehler. Der Server fällt nicht auf einen breiteren Arbeitsbereich oder eine permissivere Richtlinie zurück.

Wenn das Laden der Konfiguration fehlschlägt, startet der Prozess trotzdem und beantwortet weiterhin deepseek_health, meldet aber status: "error", mode: "disabled" und leistet keine Arbeit. Führen Sie deepseek-mcp --check aus, um denselben Bericht auf der Befehlszeile zu sehen.

Speicherort der Konfigurationsdatei

Die Benutzerkonfigurationsdatei liegt außerhalb jedes Projekts:

Plattform

Pfad

Linux/BSD

$XDG_CONFIG_HOME/deepseek-mcp/config.json, sonst ~/.config/deepseek-mcp/config.json

macOS

~/.config/deepseek-mcp/config.json

Windows

%APPDATA%\deepseek-mcp\config.json

DEEPSEEK_MCP_CONFIG überschreibt den Pfad. Wenn es gesetzt ist und die Datei nicht existiert, schlägt der Start fehl, statt stillschweigend Standardwerte zu verwenden. Eine fehlende Konfigurationsdatei am Standardort ist in Ordnung; eine leere Datei ist in Ordnung; unbekannte Schlüssel sind ein Fehler.

Schema der Konfigurationsdatei

Jeder Schlüssel ist optional.

{
  "model": "deepseek-chat",
  "allowed_models": ["deepseek-chat", "deepseek-reasoner"],
  "base_url": "https://api.deepseek.com/v1",
  "api_key_env": "DEEPSEEK_API_KEY",
  "workspace": "/absolute/path/to/project",
  "tools": {
    "enabled": ["Read", "Glob", "Grep", "Edit", "Write", "Run"],
    "max_write_bytes": 2000000,
    "allow_secret_paths": false,
    "secret_path_exceptions": []
  },
  "provider": {
    "timeout_seconds": 120,
    "max_retries": 3,
    "retry_base_delay": 0.5,
    "retry_max_delay": 8.0,
    "temperature": 0.0,
    "max_output_tokens": 4096
  },
  "budgets": {
    "max_turns": 24,
    "max_tool_calls": 80,
    "max_wall_seconds": 900,
    "max_tool_output_chars": 20000,
    "read_window_lines": 250,
    "max_grep_matches": 100,
    "max_glob_paths": 300,
    "max_context_tokens": 96000,
    "compaction_threshold_ratio": 0.7
  },
  "commands": {
    "default_timeout_seconds": 120,
    "max_timeout_seconds": 600,
    "extra_denied_executables": [],
    "extra_allowed_executables": [],
    "allow_unsafe_shell": false
  },
  "logging": { "level": "INFO", "file": null, "log_task_text": false },
  "debug": false
}

Ein api_key-Schlüssel wird hier akzeptiert, ist aber nicht empfehlenswert: Er legt den Schlüssel auf der Festplatte ab und erzeugt eine Startwarnung. Bevorzugen Sie api_key_env, das stattdessen die zu lesende Umgebungsvariable benennt.

allowed_models ist eine optionale Zulassungsliste von Modellnamen, die eine Delegation anfordern darf. Wenn sie nicht leer ist, muss das konfigurierte model darin enthalten sein (sonst widersprechen sich die Einstellungen), und ein Aufgaben-model, das etwas außerhalb davon benennt, wird vor jedem API-Aufruf als blocked abgelehnt. Leer bedeutet, dass jeder wohlgeformte Modellname akzeptiert wird.

Anmeldedaten und Endpunkt

Variable

Wirkung

DEEPSEEK_MCP_API_KEY

API-Schlüssel, höchste Rangfolge

DEEPSEEK_API_KEY

API-Schlüssel (Standard-Variablenname; mit api_key_env überschreibbar)

DEEPSEEK_MCP_MODEL, DEEPSEEK_MODEL

Modellname. DEEPSEEK_MCP_MODEL wird bevorzugt; DEEPSEEK_MODEL ist der Fallback. Standard deepseek-chat

DEEPSEEK_MCP_ALLOWED_MODELS

Kommagetrennte Zulassungsliste von Modellnamen, die eine Delegation anfordern darf. Leer bedeutet jeder wohlgeformte Name. Ein Aufgaben-model außerhalb davon wird als blocked abgelehnt

DEEPSEEK_MCP_BASE_URL, DEEPSEEK_BASE_URL

OpenAI-kompatible Basis-URL. Muss http(s) sein. Standard https://api.deepseek.com/v1

DEEPSEEK_MCP_CONFIG

Pfad zur Konfigurationsdatei

Kein API-Schlüssel bedeutet keine Arbeit: Der Start meldet den Server als deaktiviert.

Arbeitsbereich

Variable

Wirkung

DEEPSEEK_MCP_WORKSPACE

Absoluter Pfad zum autorisierten Projektstamm

Ohne expliziten Arbeitsbereich wird der Stamm gefunden, indem vom Prozess-Arbeitsverzeichnis aus aufwärts nach .git, .hg, .svn, pyproject.toml, package.json, go.mod oder Cargo.toml gesucht wird. Wird keines gefunden, wird das Arbeitsverzeichnis selbst verwendet und eine Warnung aufgezeichnet.

Ein expliziter Arbeitsbereich, der fehlt, nicht lesbar ist, kein Verzeichnis ist, relativ ist oder das Dateisystem-Root ist, ist ein Startfehler. Er degradiert nie zum Arbeitsverzeichnis. Der Server muss nicht in Ihrem Projekt leben, und er modifiziert nie ein Projekt, um sich selbst zu aktivieren.

Tools

Variable

Wirkung

DEEPSEEK_MCP_ENABLED_TOOLS

Kommagetrennte Liste aus Read, Glob, Grep, Edit, Write, Run, NotebookEdit. Groß-/Kleinschreibung egal. Read ist Pflicht. Unbekannte Namen sind ein Fehler

DEEPSEEK_MCP_MAX_WRITE_BYTES

Obergrenze für die Schreibgröße und die größte vorhandene Datei, die der Worker überschreiben wird

DEEPSEEK_MCP_ALLOW_SECRET_PATHS

Standardmäßig aus: .env, .env.*, *.pem, *.key, id_rsa, .netrc, .ssh/, .aws/ und Ähnliches sind für jedes Tool gesperrt

Standardmäßig aktivierte Tools sind alle außer NotebookEdit. NotebookEdit ist ein anerkannter Name ohne Implementierung, daher ist das Aktivieren ein Startfehler und kein Tool, das dem Worker angeboten wird und das er nicht nutzen kann. Read ist Pflicht.

.git-, .hg- und .svn-Interna sind über die Dateisystem-Tools niemals les- oder schreibbar; verwenden Sie stattdessen einen schreibgeschützten git-Befehl über Run.

Budgetgrenzen

Alle pro Delegation durchgesetzt und von deepseek_health gemeldet, damit Claude eine Delegation vor dem Senden dimensionieren kann.

Variable

Standard

Wirkung

DEEPSEEK_MCP_MAX_TURNS

24

Provider-Aufrufe pro Delegation

DEEPSEEK_MCP_MAX_TOOL_CALLS

80

Tool-Ausführungen pro Delegation

DEEPSEEK_MCP_MAX_WALL_SECONDS

900

Gesamte Wanduhrzeit; begrenzt auch Befehls-Timeouts

DEEPSEEK_MCP_MAX_TOOL_OUTPUT_CHARS

20000

Pro Tool-Ergebnis, Kopf und Ende werden behalten

DEEPSEEK_MCP_READ_WINDOW_LINES

250

Zeilen pro Read und dessen harte Obergrenze

DEEPSEEK_MCP_MAX_GREP_MATCHES

100

Treffer pro Grep und dessen harte Obergrenze

DEEPSEEK_MCP_MAX_GLOB_PATHS

300

Pfade pro Glob

DEEPSEEK_MCP_MAX_CONTEXT_TOKENS

96000

Harte Obergrenze für den geschätzten aktiven Kontext

DEEPSEEK_MCP_COMPACTION_THRESHOLD_RATIO

0.7

Anteil der Obergrenze, der Kompaktierung auslöst

Das Überschreiten eines Budgets beendet die Delegation mit status: "budget_exceeded" und einer Begründung, nachdem gemeldet wurde, welche Arbeit bereits gelandet ist.

Provider

Variable

Standard

Wirkung

DEEPSEEK_MCP_REQUEST_TIMEOUT_SECONDS

120

Timeout pro Anfrage, begrenzt auf das verbleibende Wanduhrzeit-Budget

DEEPSEEK_MCP_MAX_RETRIES

3

Wiederholungen nach dem ersten Versuch, nur vorübergehende Fehler

DEEPSEEK_MCP_RETRY_BASE_DELAY

0.5

Exponentielle Backoff-Basis, mit Jitter

DEEPSEEK_MCP_RETRY_MAX_DELAY

8.0

Backoff-Obergrenze

DEEPSEEK_MCP_TEMPERATURE

0.0

Sampling-Temperatur

DEEPSEEK_MCP_MAX_OUTPUT_TOKENS

4096

Obergrenze für Abschluss pro Turn

Timeouts, Verbindungsfehler, 429 und 5xx werden erneut versucht. Ein 4xx tritt sofort auf, weil das erneute Versuchen eines falschen Schlüssels oder einer fehlerhaften Anfrage nur Zeit verschwendet. Weiterleitungen werden grundsätzlich abgelehnt, damit der Authorization-Header nicht an einen anderen Host erneut gesendet werden kann.

Befehlsrichtlinie

Variable

Standard

Wirkung

DEEPSEEK_MCP_COMMAND_TIMEOUT_SECONDS

120

Standard-Timeout pro Befehl

DEEPSEEK_MCP_MAX_COMMAND_TIMEOUT_SECONDS

600

Obergrenze, die der Worker nicht anheben kann

DEEPSEEK_MCP_ALLOW_UNSAFE_SHELL

false

Reserviert. Die rohe Shell-Ausführung ist nicht implementiert; diese Einstellung gewährt nichts

Run führt ein argv-Array mit shell=False aus. Die ausführbare Datei muss auf einer Zulassungsliste stehen, und gefährliche Unterbefehle werden strukturell abgelehnt. Verwenden Sie commands.extra_allowed_executables in der Konfigurationsdatei, um ein projektspezifisches Werkzeug hinzuzufügen, und extra_denied_executables, um eines zu entfernen. Ein zusätzlicher Zulassungseintrag kann ein hart gesperrtes Programm nicht wieder aktivieren.

Standardmäßig abgelehnt: Rechteausweitung, Paketinstallation, Veröffentlichung, Netzwerkdienstprogramme, Shells und Inline-Code-Interpreter, destruktive Dateisystemoperationen, In-Place-Editoren sowie mutierende oder entfernte Git-Unterbefehle. Schreibgeschütztes Git (status, diff, log, show, ls-files, rev-parse, blame, …) ist erlaubt.

Allzweck-Dateileser wie cat, head und grep sind bewusst nicht auf der Zulassungsliste: Sie wären eine Ein-Befehl-Umgehung der Sperrliste für geheime Pfade, die Read, Glob und Grep durchsetzen. Fügen Sie einen nur über extra_allowed_executables wieder hinzu, wenn Sie das akzeptieren.

Protokollierung

Variable

Wirkung

DEEPSEEK_MCP_LOG_LEVEL

DEBUG, INFO, WARNING, ERROR, CRITICAL. Standard INFO

DEEPSEEK_MCP_LOG_FILE

Absoluter Pfad. Wird mit 0600 erstellt, wo die Plattform dies unterstützt

DEEPSEEK_MCP_LOG_TASK_TEXT

Reserviert. Opt-in-Protokollierung von Aufgabentext. Standardmäßig aus und noch nicht verwendet

DEEPSEEK_MCP_DEBUG

Reserviert. Debug-Details in Ergebnissen. Noch nicht verwendet

Die Delegationsprotokollierung enthält nur Metadaten: Ereignisname, Status, Modus, Anzahl der Runden und Tool-Aufrufe, Token-Anzahl, Dauer und Dateianzahl. Kein Aufgabentext, keine Dateiinhalte, keine Befehlsausgabe und keine Prompt-Texte. Protokolle gehen an stderr, niemals an stdout — stdout transportiert ausschließlich MCP-Protokollverkehr. Der API-Schlüssel wird aus jedem Datensatz als Sicherheitsnetz bereinigt.


Sicherheitslage

Lesen Sie diesen Abschnitt, bevor Sie entscheiden, worauf Sie den Worker ausrichten.

Die hier beschriebenen Schutzmaßnahmen werden durch die Modellauswahl- und Analysefunktionen nicht verändert: begrenzter Kontext mit Kompaktierung, die Workspace-Sandbox, die Befehls-Zulassungsliste, kein Commit oder Push, standardmäßig keine Paketinstallation oder Netzwerkzugriff sowie ein strukturiertes Ergebnis mit Token- und Tool-Metriken.

Was im Code durchgesetzt wird:

  • Jeder Pfad wird gegen eine einzige Workspace-Wurzel aufgelöst. Symlinks werden zuerst verfolgt und das Ergebnis wird validiert, sodass ein Link aus dem Baum heraus abgelehnt wird. Bei Schreibzielen wird das übergeordnete Verzeichnis unmittelbar vor dem Schreiben erneut validiert.

  • Ein explizit konfigurierter Workspace, der fehlt oder nicht nutzbar ist, ist ein Startfehler. Er fällt niemals stillschweigend auf ein breiteres Verzeichnis zurück.

  • Pfade mit Geheimnissen (.env, .env.*, *.pem, *.key, id_rsa, .netrc, .ssh/, .aws/ und ähnliche) sowie .git/.hg/.svn-Interna sind für jedes Tool gesperrt und werden aus Suchergebnissen ausgelassen, statt lediglich unlesbar zu sein.

  • Der scope einer Delegation schränkt Schreibvorgänge ein. Lesezugriffe bleiben über den gesamten Workspace offen, weil der Worker erkunden muss, um seine Aufgabe zu erfüllen.

  • Run verwendet shell=False. Es gibt keine Shell, sodass &&, |, $(...) und > als wörtlicher Argumenttext ankommen und keinen zweiten Befehl verketten können. Die ausführbare Datei muss auf einer Zulassungsliste stehen, gefährliche Unterbefehle werden strukturell über argv abgelehnt, absolute Pfadargumente müssen innerhalb des Workspace liegen, und ein Argument, das einen vorhandenen gesperrten Pfad benennt, wird abgelehnt.

  • Paketinstallation, Veröffentlichung, Netzwerkdienstprogramme, Rechteausweitung sowie mutierende oder entfernte Git-Unterbefehle werden standardmäßig abgelehnt. Ebenso Allzweck-Dateileser wie cat und grep, die andernfalls eine Ein-Befehl-Umgehung der Sperrliste für geheime Pfade wären.

  • Unterprozesse erhalten eine Umgebung ohne Anmeldeinformationen, sodass der eigene API-Schlüssel des Workers nicht in der Befehlsausgabe oder einem Protokoll auftauchen kann.

  • Schreibvorgänge sind atomar (temporäre Datei, fsync, Umbenennung), sodass ein unterbrochener Schreibvorgang die Originaldatei intakt lässt. Edit kann die SHA-256-Prüfsumme verlangen, die Read zurückgegeben hat, sodass eine veraltete Bearbeitung abgelehnt statt angewendet wird.

  • Der System-Prompt stellt fest, dass Repository-Inhalte Daten und keine Anweisungen sind — und die oben genannten Grenzen werden serverseitig durchgesetzt, sodass eine Datei, die dem Worker sagt, er solle seine Anweisungen ignorieren, ihm nichts gewähren kann.

  • Protokolle enthalten standardmäßig nur Metadaten: Ereignis, Status, Anzahl, Dauer. Kein Aufgabentext, keine Dateiinhalte, keine Befehlsausgabe und keine Prompt-Texte. Der API-Schlüssel wird aus jedem Datensatz als Sicherheitsnetz bereinigt.

Was dies nicht ist: Sandboxing auf Betriebssystemebene gegen Angreifer.

Dies ist eine Richtlinie auf Anwendungsebene. Sie begrenzt die Kategorie von Aktionen, die ein verwirrter, fehlgeleiteter oder prompt-injizierter Worker ausführen kann. Sie ist keine Eindämmungsgrenze gegen einen entschlossenen Angreifer, und die beiden sind nicht gleichwertig.

Konkret:

  • Ein zugelassener Test-Runner führt den Code Ihres Projekts aus. pytest importiert das Repository; make test führt aus, was das Makefile vorgibt. Alles, was auf diesem Weg erreichbar ist, ist erreichbar, einschließlich Dateien, die die Pfadrichtlinie abgelehnt hätte.

  • Es gibt keine Prozess-, Dateisystem- oder Netzwerkisolation — keinen Container, kein bubblewrap oder seccomp, kein macOS-Sandbox-Profil, kein Windows-Job-Objekt, keinen Netzwerk-Namespace. Ein Befehl, der erlaubt ist, läuft mit denselben Rechten wie der Serverprozess.

  • Die Sperrlisten sind strukturell und nicht erschöpfend. Sie sind der Grund, warum die Richtlinie für ausführbare Dateien eine Zulassungsliste ist: Unbekannte Programme werden abgelehnt, statt als sicher angenommen zu werden.

Richten Sie dies nicht auf ein Repository, aus dem Sie keine Tests ausführen würden, und behandeln Sie es nicht als Ersatz für die Prüfung des Diffs.

Bekannte Einschränkungen

  • NotebookEdit ist ein erkannter Tool-Name ohne Implementierung. Das Aktivieren ist ein Startfehler und kein Tool, das dem Worker angeboten wird und das er nicht nutzen kann.

  • commands.allow_unsafe_shell wird validiert, bewirkt aber nichts; es gibt keine rohe Shell-Ausführung.

  • Der Worker kann keine Dateien löschen. Es gibt kein Lösch-Tool, und rm wird abgelehnt.

  • Keine Sandbox auf Betriebssystemebene, wie oben beschrieben.

  • Die Kontextschätzung ist eine Zeichen-Heuristik, die anhand der vom Anbieter gemeldeten Nutzung nach oben kalibriert wird. Sie ist bewusst konservativ, nicht exakt.

  • Das Suchverhalten unterscheidet sich geringfügig zwischen den Engines ripgrep und reinem Python, da sich die Regex-Dialekte unterscheiden. Die verwendete Engine wird in jedem Ergebnis genannt.

  • Windows wird unterstützt und in CI getestet, aber die Beendigung von Prozessgruppen bei Timeout ist dort im Vergleich zu POSIX nur bestmöglich.

  • Eine Delegation pro Aufruf. Es gibt keine Hintergrundjobs, keinen persistenten Worker-Speicher und keinen automatischen Git-Commit oder -Push.

Entwicklung

uv venv && uv pip install -e ".[dev]"
python -m pytest          # the full suite; no API key and no network needed
python -m ruff check .
python -m ruff format --check .
python -m mypy

Die Testsuite ruft niemals eine kostenpflichtige API auf: Ein skriptierter Fake-Provider springt ein, und die MCP-Integrationstests steuern einen echten Server-Unterprozess über stdio gegen temporäre Git-Repositories.

phases/ enthält die Implementierungsreihenfolge, aus der dieser Server aufgebaut wurde, zur Referenz aufbewahrt.

GLOBAL_CLAUDE.md ist nicht Teil dieser Codebasis. Es ist eine Anweisungsdatei auf Benutzerebene für Claude Code, die beschreibt, wann delegiert werden soll — kopieren Sie sie nach ~/.claude/CLAUDE.md oder führen Sie sie mit der Datei zusammen, die Sie bereits haben.

Lizenz

MIT.

Available Tools

3 tools
deepseek_reviewA

First-pass code review by the DeepSeek worker of working/staged/head diffs or named files. Findings carry severity, confidence, and path:line evidence. Output is advisory — Claude does final review — and ends with a DeepSeek token usage footer.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNoOptional additional review instruction.
pathsNoOptional repository-relative path filters (diff scopes) or files under review (scope=paths).
scopeNoReview scope. One of: working | staged | head | paths.working
review_focusNoFocus areas. Subset of: correctness | security | performance | tests | maintainability.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does meaningful work: it discloses the advisory nature, the final-review handoff to Claude, the structure of findings (severity, confidence, path:line evidence), and the token usage footer. It does not explicitly state that the operation is read-only, but the review framing and lack of mutation language are reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences carry the purpose, scope, output structure, advisory role, and footer behavior with no filler. The most important identifying information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no required parameters, an output schema, and clear parameter documentation, the description covers the essential role, scope, and output characteristics. It falls short only in not giving explicit usage boundaries against the sibling tools, which is a minor gap given the strong schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds only marginal semantic value by mapping "working/staged/head diffs or named files" to the scope choices, but it does not meaningfully elaborate on task, paths, or review_focus beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: "First-pass code review by the DeepSeek worker of working/staged/head diffs or named files." It clearly separates this from the sibling tools by framing it as an advisory review rather than a general task or usage query, so an agent can tell what it is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this is a first-pass code review whose output is advisory and followed by Claude's final review. This implies when it should be used, though it does not explicitly name alternatives or state when-not-to-use conditions relative to deepseek_task or deepseek_usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deepseek_taskA

Delegate a high-context repository task to the DeepSeek worker. Use it for exploration, architecture tracing, evidence collection, debugging, and — when write/Bash tools are enabled — bounded implementation, targeted test execution, and status/diff inspection. The worker should complete the assigned repository work end to end when safe and supported. Output is advisory and ends with a DeepSeek token usage footer.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesThe repository task to delegate. For code changes, request the complete loop: inspect, implement, write/update targeted tests, run checks, inspect status/diff, and report evidence. Keep the task bounded, recoverable, and testable.
repo_rootNoRepository root override; only honored when repository.allow_repo_root_argument is true.
focus_pathsNoOptional repository-relative paths to inspect first; the worker may follow evidence elsewhere.
output_detailNoResult compactness: brief, normal (default), or detailed. One of: brief | normal | detailed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose that output is 'advisory,' that the worker completes work 'end to end when safe and supported,' and that output includes a 'DeepSeek token usage footer.' However, it does not explicitly warn about potential file modifications, command execution side effects, latency, or cost implications beyond the token footer, leaving meaningful behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core delegation purpose, then adds use cases and behavioral caveats. Every sentence earns its place, and the content is dense but readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 100% schema coverage, an output schema, and the description's explicit use-case list, the definition is largely complete for selecting and invoking the tool. The main gap is the lack of direct comparison with deepseek_review and deepseek_usage, which would help an agent choose among siblings in ambiguous situations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds general guidance about keeping tasks 'bounded, recoverable, and testable,' but it does not enrich individual parameter meaning beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-plus-resource statement: 'Delegate a high-context repository task to the DeepSeek worker.' It enumerates concrete use cases (exploration, architecture tracing, evidence collection, debugging, bounded implementation) that make the tool's scope understandable. It does not explicitly distinguish itself from sibling tools deepseek_review and deepseek_usage, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context about when to use the tool, listing several task categories and adding the important condition 'when write/Bash tools are enabled' for implementation-related work. It does not name alternatives or provide explicit when-not-to-use guidance, so it does not reach the 5 level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deepseek_usageA

Report DeepSeek worker usage statistics (last run or process-wide totals) plus configured budgets and pricing. Makes no DeepSeek API call and costs nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoWhich statistics to show. One of: last_run | process.process

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the disclosure burden. It clearly states the tool has no external side effect ('Makes no DeepSeek API call and costs nothing') and describes the kind of data returned. This is solid behavioral transparency for a read-only reporting tool, though it does not cover error cases or exact output details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence conveys the tool's purpose, scope options, and the important no-cost/no-call behavior. Every clause earns its place, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has one well-documented optional parameter, and has an output schema for return value details. The description tells the agent when to use it and what it covers, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the single scope parameter. The description adds some context by mentioning 'last run or process-wide totals', which maps to the scope options, but does not materially improve on the schema's own explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Report' and names the exact resource: DeepSeek worker usage statistics, budgets, and pricing. It also clarifies that the tool makes no API call, which sharply distinguishes it from the sibling tools deepseek_task and deepseek_review.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this tool is for inspecting usage and budget information rather than performing DeepSeek tasks or reviews, especially by noting it costs nothing and makes no API call. It does not explicitly name alternatives, but the context is strong enough for an agent to choose it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observeddeepseek_review
    • First observeddeepseek_task
    • First observeddeepseek_usage

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: deepseek_task covers general repository work, deepseek_review is narrowly scoped to code review of diffs/files, and deepseek_usage reports statistics without making API calls. There is no realistic overlap that would cause an agent to pick the wrong tool.

Naming Consistency5/5

All tools follow the same deepseek_ prefix followed by a single descriptive noun: deepseek_task, deepseek_review, deepseek_usage. The naming pattern is uniform and predictable.

Tool Count5/5

Three tools is a well-scoped surface for a focused DeepSeek worker integration: one general-purpose execution tool, one specialized review tool, and one usage/accounting tool. Each tool earns its place without redundancy or bloat.

Completeness4/5

The surface covers the core operations for this domain: delegating task work, performing reviews, and checking usage/budgets. Minor gaps exist such as explicit cancellation, configuration, or history listing, but these are secondary and likely handled outside the MCP interface.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Run DeepSeek as a real sub-agent inside Claude Code / Codex CLI — not just a single LLM call. DeepSeek gets its own 7-tool agent loop (Read/Write/Edit/Bash/Glob/Grep/NotebookEdit) inside a sandboxed workspace.
    2
    40
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables Codex to delegate routine repository exploration, implementation, refactors, tests, and fixes to DeepSeek Harness in isolated Git worktrees, returning compact results and patches for review while keeping the main workspace protected.
    5
    11 npm
    MIT