LehrerApp.Desktop und LehrerApp.McpBridge emulieren die Named Pipe unter
macOS/Linux über eine Socket-Datei unter TMPDIR. Von Finder/Dock
gestartet bekommt Desktop das reguläre Session-TMPDIR unter
/var/folders/.../T, während die Bridge als Kindprozess von Claude
Desktop oft eine reduzierte Umgebung mit TMPDIR=/tmp erbt - beide
suchten die Pipe-Datei dann an unterschiedlichen Orten und fanden sich
nie ("MCP nicht erreichbar", obwohl beide Prozesse liefen). TMPDIR wird
jetzt in beiden Prozessen vor der ersten Pipe-Instanz hart auf denselben,
von ApplicationData abgeleiteten Ordner gesetzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
38 lines
2.1 KiB
C#
38 lines
2.1 KiB
C#
namespace LehrerApp.Core.Mcp;
|
|
|
|
/// <summary>
|
|
/// Named-Pipe-Konvention zwischen dem Avalonia-Hauptprozess (Pipe-Server, siehe
|
|
/// LehrerApp.Desktop/Services/Mcp) und LehrerApp.McpBridge (Pipe-Client). Bewusst als einzelne
|
|
/// geteilte Konstante statt eigener Bibliothek — die Bridge reicht JSON-RPC-Nachrichten unverändert
|
|
/// durch und braucht sonst keine gemeinsamen Typen mit der App (siehe Planungsdokument).
|
|
/// </summary>
|
|
public static class McpPipeConstants
|
|
{
|
|
public const string PipeName = "LehrerApp.Mcp";
|
|
|
|
/// <summary>
|
|
/// Unter macOS/Linux emuliert .NET Named Pipes über eine Socket-Datei unter
|
|
/// <see cref="Path.GetTempPath"/> (intern "CoreFxPipe_" + Name), und die liest dafür die
|
|
/// TMPDIR-Umgebungsvariable des jeweiligen Prozesses. LehrerApp.Desktop (von Finder/Dock
|
|
/// gestartet) bekommt das reguläre per-Login-Session-TMPDIR unter /var/folders/.../T,
|
|
/// während LehrerApp.McpBridge als Kindprozess von Claude Desktop oft eine reduzierte
|
|
/// Umgebung mit TMPDIR=/tmp erbt - beide Prozesse suchen die Pipe-Datei dann an
|
|
/// unterschiedlichen Orten und finden sich nie ("MCP nicht erreichbar, obwohl LehrerApp
|
|
/// läuft", auch wenn beide Prozesse laufen und die Pipe grundsätzlich offen ist). Fix: TMPDIR
|
|
/// für beide Prozesse hart auf denselben Ordner setzen, bevor die erste
|
|
/// NamedPipeServerStream/-ClientStream-Instanz entsteht - dieselbe ApplicationData-Basis wie
|
|
/// AppBootstrapper (siehe dort) wird anders als TMPDIR zuverlässig an Kindprozesse
|
|
/// weitergereicht. Muss als eine der ersten Anweisungen in Main aufgerufen werden (Desktop wie
|
|
/// Bridge), auf Windows ein No-op (dort nutzen Named Pipes den Kernel-Namespace, keine
|
|
/// Socket-Datei).
|
|
/// </summary>
|
|
public static void EnsureStableUnixSocketDirectory()
|
|
{
|
|
if (OperatingSystem.IsWindows()) return;
|
|
var dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
|
"LehrerApp", "ipc");
|
|
Directory.CreateDirectory(dir);
|
|
Environment.SetEnvironmentVariable("TMPDIR", dir);
|
|
}
|
|
}
|