Einrichtungs-Guide
RAGRAF an DeepSeek Harness anbinden
--agent-kind external MCP · stdio · JSON-RPC mcp__ragraf__ragraf_* durch Messungen bestätigt · dsh 0.2.0-rc.2
Die Electron-App DeepSeek Harness 0.2.0-rc.2 mit eingebautem MCP-Client (Plugin @deepseek-ai/dsh-mcp-client). RAGRAF verbindet sich als MCP-Server über stdio; die Tools erscheinen als mcp__ragraf__ragraf_*. Die Anbindung wurde vollständig durchdebuggt und durch Messungen einer Live-Sitzung bestätigt: alles Folgende sind nachvollziehbare Befehle, Pfade und gemessene Ausgaben.
- dsh 0.2.0-rc.2 · Electron
- 24 ragraf_*-Tools
- 3 RAGRAF-Korrekturen
- 4 Überprüfungsstufen
Notation in Befehlen: $repo — Pfad zum lokalen RAGRAF-Klon (die Snippets setzen ihn in der ersten Zeile), $dsh — die mitgelieferte CLI der App. Befehle und Ausgaben sind wie gemessen zitiert — einschließlich der russischen Zeilen, die das Produkt ausgibt.
Quelle: das Integrationssitzungs-Dokument „RAGRAF × DeepSeek Harness“ — reproduzierbare Befehle, Pfade und gemessene Ausgaben einer Live-Sitzung (dsh 0.2.0-rc.2).
So funktioniert es
Warum stdio und nicht streamable-http
Der MCP-Client von HARNESS deklariert capabilities: {} — der Server erhält keine Roots. Würde man RAGRAF als einzelnen Dienst über HTTP anbieten, gäbe es keine Möglichkeit zu bestimmen, „welches Projekt gerade aktiv ist": Das aktuelle Verzeichnis des Clients erreicht den Server nicht. Ein stdio-Server kennt das Arbeitsverzeichnis seines Prozesses, und der Korpus wird über das Entwicklungs-Registry bestimmt.
Warum ein Server für alle Projekte
Der HARNESS-Client erlaubt den RAGRAF-Tools nicht, ihn neu zu starten, und ein Server pro Projekt würde bedeuten, eine Indexkopie pro Projekt im Speicher zu halten. Stattdessen wird der Korpus mit der Operation mcp__ragraf__use_project umgeschaltet; der Standardkorpus wird über das Arbeitsverzeichnis aus dem Registry bestimmt. Wird keiner gefunden, startet der Server trotzdem, beantwortet catalog und use_project ehrlich und verweigert die übrigen Operationen mit Begründung.
| Was | Wo |
|---|---|
| Einstiegspunkt des Servers | tools/ragraf-mcp.py · репозиторий RAGRAF |
| 24 eingebaute Tools | src/ragraf/mcp_server.py |
| Operationsfassade (22) | src/ragraf/facade.py |
| Korpus-Registry | catalog/catalog.json |
| Patch-Ebene des Profils | %USERPROFILE%\.dsh\profiles\desktop\cordis.patch.yml |
| Skill | %USERPROFILE%\.dsh\skills\ragraf-core\SKILL.md |
| Globale Regeln | %USERPROFILE%\.dsh\AGENTS.md · раздел 6 |
Was in RAGRAF nachgebessert wurde
Der Defekt war nicht „unbequem", sondern „funktioniert überhaupt nicht": Die allererste Antwort mit russischem Text tötete den Server. Durch Ausführen gemessen — drei Ursachen, jede durch eine Messung bestätigt.
UnicodeEncodeError: 'charmap' codec can't encode characters in position 97-105
File "src/ragraf/mcp_server.py", line 551, in send
sys.stdout.write(json.dumps(message, ensure_ascii=False) + "\n")- Stream-KodierungDas MCP-SDK gibt nur 12 Variablen an den Kindprozess weiter (APPDATA, PATH, TEMP, USERPROFILE usw. — DEFAULT_INHERITED_ENV_VARS), und HARNESS entfernt zusätzlich Namen mit PASSWORD|SECRET|TOKEN|KEY sowie alle DSH_*. Weder PYTHONUTF8 noch PYTHONIOENCODING sind dabei — die Prozess-Locale bleibt cp1252. Fix: force_utf8_stdio() konfiguriert stdin, stdout und stderr auf UTF-8, ohne sich auf die Umgebung zu verlassen.
- Abhängigkeitenfastembed, PyYAML, sqlite_vec, tree_sitter und ijson waren für den Interpreter aus PATH nur über die Variable PYTHONUSERBASE erreichbar — HARNESS entfernt sie, und der Server meldet „PyYAML ist nicht installiert". Lösung: Der Server wird mit dem Interpreter der projektinternen .venv gestartet — gemessen importiert er alle Pakete auch bei vollständig entfernten PYTHON*-Variablen.
- Pflichtparameter --projectEin Client, der den Server ohne Argumente startet, konnte ihn überhaupt nicht starten. Fix: --project ist nicht mehr Pflicht — der Korpus wird über das Arbeitsverzeichnis aus dem Registry bestimmt (_resolve_default_project()), zum manuellen Umschalten kam das Tool ragraf_use_project hinzu, und --agent wird zusätzlich aus der Variable RAGRAF_AGENT gelesen.
| Datei | Was getan wurde |
|---|---|
| src/ragraf/mcp_server.py | force_utf8_stdio(); --project nicht mehr Pflicht; _resolve_default_project(); Tool ragraf_use_project; --agent auch aus RAGRAF_AGENT; Verweigerung ohne gewählten Korpus — verständlicher Text statt ConfigError |
| src/ragraf/cli.py | der Befehl reindex schreibt den Lauf jetzt wie index in das Registry |
| tests/test_mcp_compat.py | neue Datei: Prüfungen für bereinigte Umgebung, Korpus-Autodetektion und Umschalten |
| tools/Invoke-ProjectDoctrine.ps1 | Prüfungen Test-McpClientCompatibility und Test-ExternalOpsAreRecorded; die Registry-Regel prüft jetzt jede Funktion, die den Indexer startet, statt der ganzen Datei (16 Prüfungen statt 14) |
| README.md · INTEGRATION.md · AGENTS.md | Zahlen an den Code angeglichen: 24 Tools; die „drei Fallen" mit Messungen dokumentiert |
Die Kompatibilität mit früheren Clients bleibt erhalten: AutoClaw und SagaAI übergeben --project explizit und setzen PYTHONIOENCODING — für sie ändert sich nichts.
Installation — drei Schritte
Alle drei Schritte legen Dateien im HARNESS-Home-Verzeichnis ab (%USERPROFILE%\.dsh oder $DSH_HOME); die fertigen Blöcke liegen im Verzeichnis harness/ des RAGRAF-Repositorys. In den Befehlen unten ist $repo der Pfad zum lokalen RAGRAF-Klon und $dsh die mitgelieferte CLI der App.
- MCP-Server anbindenDer fertige Block harness/ragraf-mcp.patch.yml wird an das Ende der Patch-Ebene des Profils cordis.patch.yml angehängt. Die App speichert Patches als Array, daher wird der Block als separate Zeile „- insert:" eingefügt. Zuerst ein Backup — die Datei gehört dem Benutzer.Patch-Block anhängen (PowerShell)
$repo = 'C:\AutoClaw\RAGRAF' # путь к локальному клону RAGRAF $src = Join-Path $repo 'harness\ragraf-mcp.patch.yml' $dst = Join-Path ([Environment]::GetFolderPath('UserProfile')) '.dsh\profiles\desktop\cordis.patch.yml' # 1. бэкап (обязательно: файл принадлежит пользователю) Copy-Item $dst "$dst.bak-$(Get-Date -Format yyyyMMdd-HHmmss)" # 2. проверить, что блока ещё нет Select-String -LiteralPath $dst -Pattern 'mcp-ragraf' # 3. дописать блок (слой патчей — массив; блок вставляется отдельной строкой "- insert:") Add-Content -LiteralPath $dst -Value (Get-Content -LiteralPath $src -Raw) -Encoding utf8NoBOMPrüfen, dass der Patch greift — ohne die App zu starten:
Prüfung über dsh --dump-config$dsh = Join-Path $env:LOCALAPPDATA 'Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd' & $dsh --profile headless --patch $src --dump-config | Select-String 'serverName: ragraf' -Context 1,3Das Profil desktop ist das Arbeitsprofil der App; headless dient Einmalaufgaben von der Kommandozeile. Für ein anderes Profil wird der Block auf dieselbe Weise in dessen cordis.patch.yml gelegt.
- Skill installierenDas Skill-Stammverzeichnis %USERPROFILE%\.dsh\skills liest der Provider @deepseek-ai/dsh-skill-filesystem: Auf der obersten Ebene sucht er <name>/SKILL.md. Ein Skill in diesem Verzeichnis wird ohne Neustart entdeckt — der Provider überwacht das Verzeichnis.Installation des Skills ragraf-core
$skills = Join-Path ([Environment]::GetFolderPath('UserProfile')) '.dsh\skills\ragraf-core' New-Item -ItemType Directory -Path $skills -Force | Out-Null Copy-Item (Join-Path $repo 'harness\skills\ragraf-core\SKILL.md') "$skills\SKILL.md" -Force - Regel zu den globalen Anweisungen hinzufügenHARNESS liest %USERPROFILE%\.dsh\AGENTS.md (Modul dsh-agent-instructions; dshHome = $DSH_HOME oder ~/.dsh). Der einzufügende Abschnitt ist harness/agents-section.md; er wird vor dem Abschnitt „Änderungsprotokoll" platziert, sonst landet die Regel nach der Historie (in der verifizierten Installation ist es Abschnitt 6). Erwartetes Verhalten: Auf die Frage „Womit beginnt eine Code-Aufgabe?" antwortet der Agent mit mcp__ragraf__ensure und verweist auf diesen Abschnitt.
Verifikation — vier Stufen
Von eng nach breit: der Server allein → ein Live-Start in der App → der Skill → der Projekt-Checker. Jede Stufe ist ein Befehl und eine erwartete Ausgabe, gemessen in der Live-Sitzung.
Die Prüfung genau jenes Defekts: PYTHONUTF8 und PYTHONIOENCODING werden vor dem Start entfernt — genau wie HARNESS es tut. Der Test ist tests/test_mcp_compat.py: bereinigte Umgebung, Korpus-Autodetektion, Umschalten.
cd $repo
Remove-Item Env:\PYTHONUTF8, Env:\PYTHONIOENCODING -ErrorAction SilentlyContinue
python tests\test_mcp_compat.pyErwartete Ausgabe
ИТОГ: пройдено 13, провалено 0Eine Aufgabe des headless-Profils, in der der Agent ein Tool aufrufen muss. Im Ereignisstrom erscheinen tool_call und tool_result mit vollständigem Envelope: op, rev, capability.
& $dsh --profile headless --patch $src --json `
"Вызови mcp__ragraf__index_status и приведи первую строку ответа"Erwartete Ausgabe
{"type":"tool_call","tool":"mcp__ragraf__ragraf_index_status","input":{}}
{"type":"tool_result","status":"completed","result":"op=index_status rev=rev-0043 capability=full ..."}Der Provider entdeckt ragraf-core ohne Neustart; die Prüfung stellt sicher, dass der Agent den Skill tatsächlich lädt und sich auf seinen Inhalt stützt.
& $dsh --profile headless --patch $src "Загрузи навык ragraf-core и назови первый шаг"Erwartete Ausgabe
{"type":"tool_call","tool":"skill","input":{"name":"ragraf-core"}}Eine Kompatibilitätseigenschafts-Regel im Doktrin-Checker des Projekts — damit eine Umgebungs-Regression vor dem App-Start erkannt wird, nicht mitten in der Sitzung.
pwsh -NoLogo -NoProfile -NonInteractive -File tools\Invoke-ProjectDoctrine.ps1Erwartete Ausgabe
checks: 16, errors: 0, warnings: 0, Result: PASS
[PASS] MCP server survives a scrubbed client environment
[PASS] operations outside the facade are recordedDrei Einschränkungen, die man kennen sollte
Neustart der App ist Pflicht
Profileinstellungen werden beim Start gelesen. Der eingefügte Block mcp-ragraf wirkt erst nach einem Neustart von DeepSeek Harness; bis dahin sind keine mcp__ragraf__*-Tools in der Oberfläche sichtbar. Das ist normales Verhalten, keine Störung.
Hängender Joern-Server bei der Indizierung
Die vollständige Indizierung startet Joern (JVM) auf Port 9500. Gemessen: Nach der ersten Neuindizierung blieb ein java.exe-Prozess mit 3 GB zurück, der den Port hielt; entfernt zusammen mit dem Elternprozess cmd.exe (taskkill /PID <cmd> /T /F). Vor und nach langen Läufen Prozesse und Port prüfen:
Get-CimInstance Win32_Process -Filter "Name='java.exe'" |
Select-Object ProcessId, @{n='MB';e={[int]($_.WorkingSetSize/1MB)}}
Get-NetTCPConnection -LocalPort 9500 -ErrorAction SilentlyContinue
# висящий сервер снимается вместе с родительским процессом:
taskkill /PID <PID родительского cmd.exe> /T /Freindex verlor den Laufdatensatz im Registry
Gefunden und behoben bei der Arbeit an derselben Aufgabe: index schrieb das Ergebnis ins Registry, reindex nicht. Gemessen am RAGRAF-eigenen Korpus: rev-0046 im Index, rev-0045 im Registry — dadurch indizierte check den Korpus bei jeder Prüfung neu, was wie „RAGRAF ist langsam" wirkte. Das Symptom: catalog zeigt eine andere Revision als index_status. Die Checker-Regel prüft jetzt jede Funktion, die den Indexer startet.
Rollback
HARNESS: Patch-Ebene und AGENTS.md aus den Backups wiederherstellen (deren Namen die Installation ausgegeben hat), das Skill-Verzeichnis ragraf-core entfernen.
$home2 = [Environment]::GetFolderPath('UserProfile')
# 1. вернуть слой патчей из бэкапа (имя печатала установка)
Copy-Item "$home2\.dsh\profiles\desktop\cordis.patch.yml.bak-<метка>" `
"$home2\.dsh\profiles\desktop\cordis.patch.yml" -Force
# 2. вернуть глобальные правила
Copy-Item "$home2\.dsh\AGENTS.md.bak-<метка>" "$home2\.dsh\AGENTS.md" -Force
# 3. убрать навык
Remove-Item "$home2\.dsh\skills\ragraf-core" -Recurse -ForceRAGRAF: Die Änderungen sind additiv — sie berühren weder Index, Speicherschema, Revisionsnummerierung noch Registry, daher erfordert ein Rollback keine Neuindizierung. Für das frühere Verhalten genügen drei Änderungen: den Aufruf von force_utf8_stdio() entfernen, required=True bei --project wiederherstellen und das Tool ragraf_use_project aus TOOLS und _handlers löschen.
HARNESS-Verhalten: Was liegt wo
| Was | Wo |
|---|---|
| App-Installation | %LOCALAPPDATA%\Programs\DeepSeek Harness |
| HARNESS-Plugins | resources\app.asar · дерево dsh/node_modules |
| HARNESS-Home-Verzeichnis | %USERPROFILE%\.dsh |
| Profileinstellungen | %USERPROFILE%\.dsh\profiles\<имя> |
| Electron-Daten | %APPDATA%\@deepseek-ai\dsh-desktop |
| Plugin-Registry | https://registry.npmjs.org/ |
| CLI | resources\runtime\cli\bin\dsh.cmd |
Das Home-Verzeichnis steuern die Variablen DSH_HOME (expliziter Pfad gewinnt) und DSH_AGENTS_HOME (gemeinsames Agent-Skill-Verzeichnis, Standard ~/.agents). HARNESS entfernt beide aus Kindprozess-Umgebungen — auf den Start des MCP-Servers wirkt sich das nicht aus: Er liest nur --project und das Arbeitsverzeichnis.
Auflösungsreihenfolge der Skill-Wurzeln (Rang): <projekt>/.dsh/skills (100), <projekt>/.agents/skills (200), benutzerdefinierte customSkillDirs (300), ~/.dsh/skills (400), ~/.agents/skills (500). Die Projektwurzel ist das nächste Verzeichnis mit .git.
HARNESS wird in einem privaten Repository entwickelt (github.com/deepseek-ai/deepseek-harness); eine öffentliche API-Prüfung fand nicht statt. Der Vertrag oben ist aus den Fakten der aktuellen Installation beschrieben — lib/index.js und READMEs der Pakete in app.asar — nicht aus der Dokumentation.
Agenten-Regime
Das Regime kommt in zwei Schichten: der Skill ragraf-core (der Provider lädt ihn ohne Neustart) und ein Abschnitt der globalen Regeln %USERPROFILE%\.dsh\AGENTS.md — „eine Code-Aufgabe beginnt mit mcp__ragraf__ensure“. Das universelle Regime-Fragment (Seite Integrationen) ist die Grundlage des Skills; es funktioniert auch allein.
Telemetrie
Die Telemetrie entspricht anderen external-Agenten: kind=external, Argument-Hashes statt voller Anfragetexte, Token-Schätzung (Zeichen/4) in usage_call — so lässt sich die Wirtschaftlichkeit der Paarung mit dem grep-Ansatz vergleichen. Der Agent-Name kommt aus --agent im Patch-Block oder der Variable RAGRAF_AGENT: Der Server liest sie seit den HARNESS-Fixes.