Add SearchMeetupsTool for duplication prevention

- 🔍 Introduced `SearchMeetupsTool` to find existing meetups by name or city before creating new ones.
- ☑️ Updated `CreateMeetupTool` description and logic to enforce pre-checks for existing meetups.
- 🛠️ Adjusted `EinundzwanzigServer` to include `SearchMeetupsTool` in tools list.
-  Added feature tests to verify meetup search functionality and ensure duplication avoidance.
This commit is contained in:
HolgerHatGarKeineNode
2026-06-08 11:10:29 +02:00
parent ab8b91a0af
commit dc2b828777
5 changed files with 104 additions and 2 deletions
@@ -17,7 +17,7 @@ it('registers every domain tool on the server', function () {
$property = (new ReflectionClass(EinundzwanzigServer::class))->getProperty('tools');
$tools = $property->getDefaultValue();
expect($tools)->toHaveCount(30)
expect($tools)->toHaveCount(31)
->and($tools)->toContain(CreateMeetupTool::class)
->and($tools)->toContain(UpdateCourseEventTool::class)
->and($tools)->toContain(SearchCitiesTool::class);
@@ -0,0 +1,35 @@
<?php
use App\Mcp\Servers\EinundzwanzigServer;
use App\Mcp\Tools\Search\SearchMeetupsTool;
use App\Models\City;
use App\Models\Meetup;
use App\Models\User;
it('finds an existing meetup by its name', function () {
Meetup::factory()->create(['name' => 'Einundzwanzig München']);
EinundzwanzigServer::actingAs(User::factory()->create())
->tool(SearchMeetupsTool::class, ['search' => 'münchen'])
->assertOk()
->assertSee('Einundzwanzig München');
});
it('finds an existing meetup by its city name', function () {
$city = City::factory()->create(['name' => 'Nürnberg']);
Meetup::factory()->create(['name' => 'Bitcoin Treff', 'city_id' => $city->id]);
EinundzwanzigServer::actingAs(User::factory()->create())
->tool(SearchMeetupsTool::class, ['search' => 'Nürnberg'])
->assertOk()
->assertSee('Bitcoin Treff');
});
it('returns no match for an unknown city so a new meetup can be proposed', function () {
Meetup::factory()->create(['name' => 'Einundzwanzig München']);
$response = EinundzwanzigServer::actingAs(User::factory()->create())
->tool(SearchMeetupsTool::class, ['search' => 'Gibtsnichtstadt']);
$response->assertOk()->assertDontSee('Einundzwanzig München');
});