Zum Inhalt springen
RAGRAF

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.

WasWo
Einstiegspunkt des Serverstools/ragraf-mcp.py · репозиторий RAGRAF
24 eingebaute Toolssrc/ragraf/mcp_server.py
Operationsfassade (22)src/ragraf/facade.py
Korpus-Registrycatalog/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.

So sah der Defekt aus (Messung)
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")
  1. 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.
  2. 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.
  3. 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.
DateiWas getan wurde
src/ragraf/mcp_server.pyforce_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.pyder Befehl reindex schreibt den Lauf jetzt wie index in das Registry
tests/test_mcp_compat.pyneue Datei: Prüfungen für bereinigte Umgebung, Korpus-Autodetektion und Umschalten
tools/Invoke-ProjectDoctrine.ps1Prü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.mdZahlen 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.

  1. 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 utf8NoBOM

    Prü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,3

    Das 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.

  2. 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
  3. 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.

Kompatibilitätstest (PowerShell)
cd $repo
Remove-Item Env:\PYTHONUTF8, Env:\PYTHONIOENCODING -ErrorAction SilentlyContinue
python tests\test_mcp_compat.py

Erwartete Ausgabe

Text
ИТОГ: пройдено 13, провалено 0

Drei 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:

Prüfung auf hängendes Joern (PowerShell)
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 /F

reindex 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.

Rollback — HARNESS-Einstellungen (PowerShell)
$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 -Force

RAGRAF: 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

WasWo
App-Installation%LOCALAPPDATA%\Programs\DeepSeek Harness
HARNESS-Pluginsresources\app.asar · дерево dsh/node_modules
HARNESS-Home-Verzeichnis%USERPROFILE%\.dsh
Profileinstellungen%USERPROFILE%\.dsh\profiles\<имя>
Electron-Daten%APPDATA%\@deepseek-ai\dsh-desktop
Plugin-Registryhttps://registry.npmjs.org/
CLIresources\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.