enhancement
major
minor
defect
critical
major
minor
major
#30252
tl-ai-mcp-server: „tools/list“ wird nicht anhand der Zugriffsrechte des Aufrufers gefiltert, und „/mcp/“ mit einem abschließenden Schrägstrich liefert den Status 404.
tl-ai-mcp-server 8.0.0-alpha12.819, Anwendung E-Home (haumacher/ehome #129).
1. Tool-Liste pro Aufrufer
Die Abfrage „tools/list“ wird aus dem globalen Werkzeugsatz des MCP-Java-SDK beantwortet, der für jeden authentifizierten Aufrufer identisch ist (der Artikel ai/security/mcp-endpoint nennt dies unter „Was es nicht tut“). In E-Home verfügt ein „ehome.Viewer“ lediglich über die Berechtigungen „model.read“ und „data.read“, doch der MCP-Client des Viewers listet die Schreibwerkzeuge von „data.write“ (updateObject, createObject, deleteObject, editText) auf und wird erst abgelehnt, wenn er eines davon aufruft. Ein Agent plant mit Werkzeugen, die er nicht nutzen kann, und lernt dies erst durch Fehlschläge; die Liste gibt zudem Aufschluss darüber, was andere Rollen tun dürfen.
Erwartet: „tools/list“ enthält die Werkzeuge, deren Zugriff der Aufrufer zulässt (da der Chat nur die erlaubten Werkzeuge anbietet, „ToolPermissionFilter“), oder der Endpunkt filtert die Liste pro Sitzung.
2. Abschließender Schrägstrich
<context>/mcp/ liefert einen 404-Fehler, <context>/mcp funktioniert: Der Transport (HttpServletStreamableServerTransportProvider) gleicht das Ende des Pfads mit /mcp ab. MCP-Clients werden manuell mit einer URL konfiguriert; ein Schrägstrich ist eine gängige Schreibweise.
Erwartet: Beide Formen erreichen den Endpunkt (oder die Form mit Schrägstrich leitet weiter).
Workaround in E-Home
Keiner für die Liste (der Test überprüft die Ablehnung eines Aufrufs); doc/ai.md nennt die Adresse ohne Schrägstrich.
Lösung
- MCP Java SDK 2.1.0: Die SDK-Version (mcp.sdk.version in tl-bom) wird für mcp-core und mcp-json-jackson3 von 1.1.5 auf 2.1.0 erhöht. Ab Version 2.1.0 akzeptiert der Server-Builder Filter pro Anfrage für die Tool-Liste (addToolFilter); in Version 1.x wird „tools/list“ aus dem globalen Tool-Set ohne Hook beantwortet. Der MCP-Client von tl-ai-core und die Ressourcen von tl-ai-mcp-server verwenden die Builder der 2.x-Schemaklassen.
- Tool-Liste pro Aufrufer: MCPServerService registriert einen Tool-Filter (McpToolAdapter.visibilityFilter), der ein veröffentlichtes Tool nur dann anzeigt, wenn es den ToolPermissionFilter für den Hintergrundlauf des Aufrufers (ToolContext.forBackgroundRun) passiert – dieselbe Überprüfung, die einen „tools/call“-Aufruf autorisiert, einschließlich der Hintergrund-Whitelist, sodass die Liste und der Aufruf übereinstimmen müssen. Der Filter läuft auf dem Anfragethread (der Server ist mit `immediateExecution(true)` konfiguriert), auf dem der Aufrufer bereits vom `McpAuthenticationFilter` identifiziert wurde. Eine Anfrage ohne Konto oder eine fehlgeschlagene Überprüfung führt dazu, dass das Tool ausgeblendet wird, anstatt die gesamte Auflistung fehlschlagen zu lassen.
- Abschließender Schrägstrich: MCPTransportServlet bedient <context>/mcp/ wie <context>/mcp (die Anfrage erreicht den Transport ohne abschließenden Schrägstrich); andere Pfade unterhalb des Endpunkts werden nicht bedient. Keine Weiterleitung: Nicht jeder Client wiederholt nach einer Anfrage den POST-Body und seinen Authorization-Header.
- Sitzungen: Die von SDK 2.x standardmäßig durchgeführte Sitzungsbereinigung ist deaktiviert: Sie entfernt eine Sitzung ohne Vorwarnung aus dem Transport, sodass der Besitzer der Sitzung weiterhin registriert bleibt (McpSessionPrincipals). McpSessionKeeper führt weiterhin Pings durch, entfernt inaktive Sitzungen und gibt deren Besitzer frei.
- MCP-Client: Das Eingabeschema eines Tools eines externen MCP-Servers gelangt mit all seinen Schlüsselwörtern (z. B. $defs) in das Modell; zuvor wurden nur „type“, „properties“, „required“ und „additionalProperties: false“ beibehalten. Ein fehlender Typ ist weiterhin „object“, fehlende Eigenschaften ein leeres Objekt.
- Ressourcenvorlagen: Ein konfigurierter Titel einer „ConfigurableResourceTemplate“ wird als Titel der Vorlage veröffentlicht; zuvor überschrieb er den Namen der Vorlage.
- Der Artikel „ai/security/mcp-endpoint“, das Boot-Protokoll des „MCPServerService“ sowie die Dokumentation zu „McpToolAdapter“ und zu „exposed-tools“ beschreiben die gefilterte Liste; der Artikel nennt beide Formen der Endpunkt-URL.
Tests
- TestMcpServerProtocol (über den realen Transport): <context>/mcp/ öffnet und bedient eine Sitzung, <context>/mcp/other wird nicht bedient, eine Anfrage ohne Konto führt zu keinem Tool.
- SecDemoMcpEndpointTest (echte Konten der Sicherheits-Testumgebung): Ein durch die Hintergrund-Allowlist gesperrtes Tool und ein externes Tool werden nicht aufgelistet, ein aufrufbares Tool hingegen schon; bei drei Konten und fünf Tools wird ein Tool genau dann aufgelistet, wenn sein Aufruf die Gate-Prüfung besteht, und der Aufruf eines nicht aufgelisteten Tools wird mit der Begründung des Gates abgelehnt.