60 lines
3.3 KiB
C#
60 lines
3.3 KiB
C#
using System.Text.Json;
|
|
using ModelContextProtocol.Protocol;
|
|
using ModelContextProtocol.Server;
|
|
|
|
namespace LehrerApp.McpBridge;
|
|
|
|
/// <summary>
|
|
/// Einziges Werkzeug, das die Bridge anbietet, solange keine Verbindung zu LehrerApp besteht (siehe
|
|
/// <see cref="RealServerBridge"/>). Ohne dieses Werkzeug hätte ein KI-Client keine Möglichkeit zu
|
|
/// erfahren, WARUM gerade keine LehrerApp-Werkzeuge da sind, sondern sähe nur eine leere
|
|
/// Werkzeugliste - der Assistent könnte dem Nutzer dann nicht erklären, dass LehrerApp erst
|
|
/// gestartet werden muss. Versucht bei jedem Aufruf aktiv erneut zu verbinden; klappt das, ersetzt
|
|
/// <see cref="RealServerBridge"/> dieses Werkzeug automatisch durch die echte Werkzeugliste, und der
|
|
/// Client wird per "notifications/tools/list_changed" benachrichtigt (siehe
|
|
/// <see cref="McpServerPrimitiveCollection{T}"/>).
|
|
/// </summary>
|
|
internal sealed class StatusMcpServerTool(RealServerBridge bridge) : McpServerTool
|
|
{
|
|
public override Tool ProtocolTool { get; } = new()
|
|
{
|
|
Name = "lehrerapp_status",
|
|
Description = "Prüft, ob LehrerApp erreichbar ist, und versucht bei Bedarf erneut zu " +
|
|
"verbinden. Solange keine Verbindung besteht, sind alle anderen LehrerApp-Werkzeuge " +
|
|
"(Schüler, Noten, Stundenplanung, Kompetenzen, ...) nicht verfügbar - sie erscheinen erst " +
|
|
"nach einer erfolgreichen Verbindung in der Werkzeugliste. Bei einer Fehlermeldung eines " +
|
|
"anderen LehrerApp-Werkzeugs, die auf eine fehlende Verbindung hindeutet, dieses Werkzeug " +
|
|
"aufrufen, um den Grund zu klären, statt den Nutzer ohne Erklärung zu vertrösten. Nach " +
|
|
"einem erfolglosen Versuch NICHT im selben Zug erneut aufrufen (ein Verbindungsversuch " +
|
|
"dauert bis zu mehrere Sekunden, wiederholte Aufrufe direkt hintereinander können vom " +
|
|
"Client blockiert werden) - stattdessen den Nutzer informieren; ein Hintergrund-Prozess " +
|
|
"verbindet automatisch neu, sobald LehrerApp läuft, und die Werkzeugliste aktualisiert " +
|
|
"sich dann von selbst.",
|
|
InputSchema = JsonDocument.Parse("""{"type":"object","properties":{}}""").RootElement,
|
|
};
|
|
public override IReadOnlyList<object> Metadata { get; } = [];
|
|
|
|
public override async ValueTask<CallToolResult> InvokeAsync(
|
|
RequestContext<CallToolRequestParams> request, CancellationToken cancellationToken)
|
|
{
|
|
var connected = await bridge.TryReconnectAsync(cancellationToken);
|
|
return new CallToolResult
|
|
{
|
|
Content =
|
|
[
|
|
new TextContentBlock
|
|
{
|
|
Text = connected
|
|
? "Verbindung zu LehrerApp hergestellt. Die eigentlichen LehrerApp-Werkzeuge " +
|
|
"sind jetzt verfügbar."
|
|
: "LehrerApp läuft nicht oder der MCP-Server ist in den Einstellungen nicht " +
|
|
"aktiviert. Bitte den Nutzer bitten, LehrerApp zu starten und den " +
|
|
"MCP-Server in den Einstellungen zu aktivieren. Dieses Werkzeug NICHT im " +
|
|
"selben Zug erneut aufrufen - die Bridge verbindet im Hintergrund " +
|
|
"automatisch neu, sobald LehrerApp läuft, und meldet das von selbst.",
|
|
},
|
|
],
|
|
};
|
|
}
|
|
}
|