Files
einundzwanzig-app/routes/ai.php
T
HolgerHatGarKeineNode d0544bfac9 Add OAuth functionality, MCP tools, and feature tests
- 🔒 Added migrations for `oauth_access_tokens`, `oauth_refresh_tokens`, `oauth_auth_codes`, `oauth_clients`, and `oauth_device_codes`.
- 🤖 Created MCP tools (Meetups, Cities, Venues, Courses, Lecturers) for managing entities with authentication and validation.
- 🛠️ Implemented Passport-backed OAuth API guard configuration and validation endpoints.
-  Added comprehensive feature tests for MCP tools and OAuth functionality (access control, validation, and token-based authentication).
2026-06-08 09:37:00 +02:00

38 lines
1.7 KiB
PHP

<?php
use App\Http\Middleware\EnsureMcpScope;
use App\Mcp\Servers\EinundzwanzigServer;
use Illuminate\Support\Facades\Route;
use Laravel\Mcp\Facades\Mcp;
/*
* OAuth 2.1 Discovery- und Dynamic-Client-Registration-Routen (RFC 8414 / 9728).
* Notwendig, damit Web-Clients wie der Claude.ai-Connector den Server automatisch
* entdecken und den Authorization-Code-Flow (über Laravel Passport) starten können.
* Gedrosselt, um Client-Registrierungs-Spam zu begrenzen (die Discovery-Endpunkte
* werden von Clients ohnehin gecacht).
*/
Route::middleware('throttle:30,1')->group(function (): void {
Mcp::oauthRoutes();
});
/*
* Authentifizierter MCP-Server. Spiegelt die Sanctum-geschützten API-Schreib-Endpunkte,
* damit AI-Clients Datensätze im Kontext des angemeldeten Nutzers anlegen/aktualisieren
* können (created_by wird automatisch gesetzt).
*
* Zwei Auth-Wege werden unterstützt:
* - auth:sanctum → statisches Sanctum-Token im Authorization: Bearer Header
* (Claude Code / Claude Desktop / Messages-API).
* - auth:api → Passport OAuth-2.1-Access-Token (Claude.ai Web-Connector).
* Reihenfolge ist wichtig: Sanctum lehnt fremde Tokens still ab und fällt zu Passport
* durch, während der Passport-Guard bei einem Sanctum-Token eine Exception werfen würde.
* Der zuerst erfolgreiche Guard wird verwendet; in beiden Fällen liefert auth()->id()
* den angemeldeten Nutzer für die created_by-Zuordnung.
*
* EnsureMcpScope erzwingt anschließend den Scope "mcp:use" (Passport) bzw. die
* Standard-Ability "*" (Sanctum).
*/
Mcp::web('/mcp', EinundzwanzigServer::class)
->middleware(['auth:sanctum,api', EnsureMcpScope::class, 'throttle:60,1']);