mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-app.git
synced 2026-06-11 02:50:29 +00:00
b6f05bca41
- 🤖 Introduced `ResolvesEntities` trait to simplify entity resolution by name or ID across MCP tools. - 📚 Updated tools (Meetups, Cities, Venues, Courses, Lecturers) to use the concern for resolving related entities (e.g., courses, venues, lecturers). - 🎯 Enhanced tool descriptions and schemas for better name-based parameter handling with fallback support for IDs. - ✅ Added dedicated feature tests for name resolution logic, partial matches, and error handling scenarios.
123 lines
4.7 KiB
PHP
123 lines
4.7 KiB
PHP
<?php
|
||
|
||
namespace App\Mcp\Servers;
|
||
|
||
use App\Mcp\Tools\City\CreateCityTool;
|
||
use App\Mcp\Tools\City\ListMyCitiesTool;
|
||
use App\Mcp\Tools\City\ShowMyCityTool;
|
||
use App\Mcp\Tools\City\UpdateCityTool;
|
||
use App\Mcp\Tools\Course\CreateCourseTool;
|
||
use App\Mcp\Tools\Course\UpdateCourseTool;
|
||
use App\Mcp\Tools\CourseEvent\CreateCourseEventTool;
|
||
use App\Mcp\Tools\CourseEvent\ListMyCourseEventsTool;
|
||
use App\Mcp\Tools\CourseEvent\UpdateCourseEventTool;
|
||
use App\Mcp\Tools\Lecturer\CreateLecturerTool;
|
||
use App\Mcp\Tools\Lecturer\ListMyLecturersTool;
|
||
use App\Mcp\Tools\Lecturer\ShowMyLecturerTool;
|
||
use App\Mcp\Tools\Lecturer\UpdateLecturerTool;
|
||
use App\Mcp\Tools\Meetup\CreateMeetupTool;
|
||
use App\Mcp\Tools\Meetup\ListMyMeetupsTool;
|
||
use App\Mcp\Tools\Meetup\ShowMyMeetupTool;
|
||
use App\Mcp\Tools\Meetup\UpdateMeetupTool;
|
||
use App\Mcp\Tools\MeetupEvent\CreateMeetupEventTool;
|
||
use App\Mcp\Tools\MeetupEvent\ListMyMeetupEventsTool;
|
||
use App\Mcp\Tools\MeetupEvent\ShowMyMeetupEventTool;
|
||
use App\Mcp\Tools\MeetupEvent\UpdateMeetupEventTool;
|
||
use App\Mcp\Tools\Search\ListCountriesTool;
|
||
use App\Mcp\Tools\Search\SearchCitiesTool;
|
||
use App\Mcp\Tools\Search\SearchCoursesTool;
|
||
use App\Mcp\Tools\Search\SearchLecturersTool;
|
||
use App\Mcp\Tools\Search\SearchVenuesTool;
|
||
use App\Mcp\Tools\Venue\CreateVenueTool;
|
||
use App\Mcp\Tools\Venue\ListMyVenuesTool;
|
||
use App\Mcp\Tools\Venue\ShowMyVenueTool;
|
||
use App\Mcp\Tools\Venue\UpdateVenueTool;
|
||
use Laravel\Mcp\Server;
|
||
use Laravel\Mcp\Server\Attributes\Instructions;
|
||
use Laravel\Mcp\Server\Attributes\Name;
|
||
use Laravel\Mcp\Server\Attributes\Version;
|
||
use Laravel\Mcp\Server\Tool;
|
||
|
||
#[Name('Einundzwanzig API')]
|
||
#[Version('1.0.0')]
|
||
#[Instructions(<<<'TXT'
|
||
Dieser Server spiegelt die authentifizierte Einundzwanzig-API. Jeder Aufruf läuft im Kontext
|
||
des angemeldeten Nutzers; beim Anlegen wird der Ersteller (created_by) automatisch gesetzt.
|
||
Schreib- und Eigentums-Operationen (update, show-my-*) sind nur für den Ersteller oder einen
|
||
Super-Admin erlaubt.
|
||
|
||
WICHTIG – niemals nach numerischen IDs fragen: Nutzer kennen keine internen IDs. Referenziere
|
||
Entitäten immer über ihren NAMEN:
|
||
- Eigene Datensätze ändern/anzeigen: zuerst das passende list-my-* Tool aufrufen
|
||
(list-my-meetups, list-my-cities, list-my-venues, list-my-lecturers, list-my-course-events),
|
||
dem Nutzer die Namen als Auswahlliste präsentieren und ihn wählen lassen. Dann das update-/
|
||
show-my-* Tool mit dem gewählten Namen aufrufen (Parameter z. B. "meetup", "city", "venue",
|
||
"lecturer", "course").
|
||
- Fremdschlüssel beim Anlegen (Stadt, Land, Referent, Kurs, Veranstaltungsort): den Namen
|
||
übergeben (Parameter z. B. "city", "country", "lecturer", "course", "venue"); bei Unsicherheit
|
||
vorher mit search-cities / search-venues / search-lecturers / search-courses / list-countries
|
||
den genauen Namen ermitteln.
|
||
Termine/Events (Meetup-Termine, Kurs-Events) haben keinen Namen. Hier zuerst list-my-meetup-
|
||
events bzw. list-my-course-events aufrufen, dem Nutzer die Einträge zur Auswahl anbieten und
|
||
die ID des gewählten Eintrags übergeben – ebenfalls ohne den Nutzer nach der ID zu fragen.
|
||
|
||
Die Tools lösen Namen serverseitig auf. Bei Mehrdeutigkeit oder fehlendem Treffer liefern sie
|
||
eine Liste der passenden Einträge zurück – diese dem Nutzer zur Auswahl anbieten. Die *_id-
|
||
Parameter sind nur ein optionaler Fallback, falls die ID bereits bekannt ist.
|
||
TXT)]
|
||
class EinundzwanzigServer extends Server
|
||
{
|
||
/**
|
||
* The tools registered with this MCP server.
|
||
*
|
||
* @var array<int, class-string<Tool>>
|
||
*/
|
||
protected array $tools = [
|
||
// Meetups
|
||
CreateMeetupTool::class,
|
||
UpdateMeetupTool::class,
|
||
ListMyMeetupsTool::class,
|
||
ShowMyMeetupTool::class,
|
||
|
||
// Meetup-Events
|
||
CreateMeetupEventTool::class,
|
||
UpdateMeetupEventTool::class,
|
||
ListMyMeetupEventsTool::class,
|
||
ShowMyMeetupEventTool::class,
|
||
|
||
// Städte
|
||
CreateCityTool::class,
|
||
UpdateCityTool::class,
|
||
ListMyCitiesTool::class,
|
||
ShowMyCityTool::class,
|
||
|
||
// Veranstaltungsorte
|
||
CreateVenueTool::class,
|
||
UpdateVenueTool::class,
|
||
ListMyVenuesTool::class,
|
||
ShowMyVenueTool::class,
|
||
|
||
// Referenten
|
||
CreateLecturerTool::class,
|
||
UpdateLecturerTool::class,
|
||
ListMyLecturersTool::class,
|
||
ShowMyLecturerTool::class,
|
||
|
||
// Kurse
|
||
CreateCourseTool::class,
|
||
UpdateCourseTool::class,
|
||
|
||
// Kurs-Events
|
||
ListMyCourseEventsTool::class,
|
||
CreateCourseEventTool::class,
|
||
UpdateCourseEventTool::class,
|
||
|
||
// Suche / Stammdaten-Lookups
|
||
SearchCitiesTool::class,
|
||
SearchVenuesTool::class,
|
||
SearchLecturersTool::class,
|
||
SearchCoursesTool::class,
|
||
ListCountriesTool::class,
|
||
];
|
||
}
|