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: claude-code

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.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.

  • Deterministic AI code review, with an audit record. Governance inside the agent loop.

  • Coding agents from Claude Code, Cursor and Codex claim jobs and lock files on one shared board.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/giaminhgist/DeepSeek_MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server