diff --git a/modules/market_management/mcp.php b/modules/market_management/mcp.php index 8048a0b..8073f41 100644 --- a/modules/market_management/mcp.php +++ b/modules/market_management/mcp.php @@ -78,10 +78,10 @@ function market_management_mcp_tools(): array ['name' => 'market_management.update_market', 'description' => 'Markt inklusive Veranstalter und Website-URL ändern', 'inputSchema' => ['type' => 'object', 'required' => ['market_id'], 'properties' => ['market_id' => ['type' => 'integer'], 'name' => ['type' => 'string'], 'category_id' => ['type' => 'integer'], 'organizer_id' => ['type' => 'integer'], 'website_url' => ['type' => ['string', 'null'], 'format' => 'uri']]]], ['name' => 'market_management.archive_market', 'description' => 'Markt archivieren', 'inputSchema' => ['type' => 'object', 'required' => ['market_id'], 'properties' => ['market_id' => ['type' => 'integer']]]], ['name' => 'market_management.reactivate_market', 'description' => 'Markt reaktivieren', 'inputSchema' => ['type' => 'object', 'required' => ['market_id'], 'properties' => ['market_id' => ['type' => 'integer']]]], - ['name' => 'market_management.list_categories', 'description' => 'Bestehende Kategorien lesen', 'inputSchema' => ['type' => 'object', 'properties' => []]], - ['name' => 'market_management.list_market_organizers', 'description' => 'Aktive Veranstalter lesen', 'inputSchema' => ['type' => 'object', 'properties' => []]], + ['name' => 'market_management.list_categories', 'description' => 'Bestehende Kategorien lesen', 'inputSchema' => ['type' => 'object', 'properties' => (object) []]], + ['name' => 'market_management.list_market_organizers', 'description' => 'Aktive Veranstalter lesen', 'inputSchema' => ['type' => 'object', 'properties' => (object) []]], ['name' => 'market_management.create_market_organizer', 'description' => 'Veranstalter mit optionalen Kontaktdaten anlegen', 'inputSchema' => ['type' => 'object', 'required' => ['name'], 'properties' => ['name' => ['type' => 'string'], 'email' => ['type' => ['string', 'null'], 'format' => 'email'], 'phone' => ['type' => ['string', 'null']]]]], - ['name' => 'market_management.list_reference_data', 'description' => 'Kategorien, Kantone und Gemeinden lesen', 'inputSchema' => ['type' => 'object', 'properties' => []]], + ['name' => 'market_management.list_reference_data', 'description' => 'Kategorien, Kantone und Gemeinden lesen', 'inputSchema' => ['type' => 'object', 'properties' => (object) []]], ['name' => 'market_management.create_municipality', 'description' => 'Lokale Gemeinde im Markt-Gemeinderegister anlegen', 'inputSchema' => ['type' => 'object', 'required' => ['name'], 'properties' => ['name' => ['type' => 'string']]]], ['name' => 'market_management.get_overview', 'description' => 'Marktübersicht mit serverseitigen Filtern lesen', 'inputSchema' => ['type' => 'object', 'properties' => $searchProperties]], ['name' => 'market_management.create_occurrence', 'description' => 'Marktdurchführung mit mindestens einem Markttag anlegen', 'inputSchema' => ['type' => 'object', 'required' => ['market_definition_id', 'days'], 'properties' => ['market_definition_id' => ['type' => 'integer'], 'status' => ['type' => 'string'], 'days' => ['type' => 'array', 'minItems' => 1, 'items' => ['type' => 'object', 'required' => ['date'], 'properties' => $dayProperties]] + $occurrenceProperties]]], diff --git a/scripts/tests/market_management_mcp_tools_list_test.php b/scripts/tests/market_management_mcp_tools_list_test.php new file mode 100644 index 0000000..4f30674 --- /dev/null +++ b/scripts/tests/market_management_mcp_tools_list_test.php @@ -0,0 +1,77 @@ + $propertySchema) { + assert_test(is_array($propertySchema), $path . '.properties.' . $propertyName . ' must be an object schema'); + if (($propertySchema['type'] ?? null) === 'array' && isset($propertySchema['items'])) { + assert_test(is_array($propertySchema['items']), $path . '.properties.' . $propertyName . '.items must be an object schema'); + if (($propertySchema['items']['type'] ?? null) === 'object') { + assert_schema_objects($propertySchema['items'], $path . '.properties.' . $propertyName . '.items'); + } + } + } +} + +$expected = [ + 'market_management.search_markets' => 'Märkte suchen', + 'market_management.search_occurrences' => 'Marktdurchführungen suchen und auflisten', + 'market_management.get_market' => 'Markt mit Marktdurchführungen lesen', + 'market_management.create_market' => 'Markt mit verpflichtendem Veranstalter, Kategorie und optionaler Website-URL anlegen', + 'market_management.update_market' => 'Markt inklusive Veranstalter und Website-URL ändern', + 'market_management.archive_market' => 'Markt archivieren', + 'market_management.reactivate_market' => 'Markt reaktivieren', + 'market_management.list_categories' => 'Bestehende Kategorien lesen', + 'market_management.list_market_organizers' => 'Aktive Veranstalter lesen', + 'market_management.create_market_organizer' => 'Veranstalter mit optionalen Kontaktdaten anlegen', + 'market_management.list_reference_data' => 'Kategorien, Kantone und Gemeinden lesen', + 'market_management.create_municipality' => 'Lokale Gemeinde im Markt-Gemeinderegister anlegen', + 'market_management.get_overview' => 'Marktübersicht mit serverseitigen Filtern lesen', + 'market_management.create_occurrence' => 'Marktdurchführung mit mindestens einem Markttag anlegen', + 'market_management.get_occurrence' => 'Marktdurchführung mit Markt, Markttagen und berechneten Verkaufsdaten lesen', + 'market_management.update_occurrence' => 'Marktdurchführung ändern', + 'market_management.archive_occurrence' => 'Marktdurchführung archivieren', + 'market_management.reactivate_occurrence' => 'Marktdurchführung reaktivieren', + 'market_management.create_day' => 'Markttag anlegen', + 'market_management.update_day' => 'Markttag ändern', + 'market_management.delete_day' => 'Markttag entfernen', +]; + +$tools = market_management_mcp_tools(); +assert_test(count($tools) === 21, 'Expected 21 MCP tools, got ' . count($tools)); + +$actual = []; +foreach ($tools as $tool) { + assert_test(isset($tool['name'], $tool['description'], $tool['inputSchema']), 'Tool must contain name, description and inputSchema'); + assert_schema_objects($tool['inputSchema'], $tool['name'] . '.inputSchema'); + $actual[$tool['name']] = $tool['description']; +} + +assert_test($actual === $expected, 'MCP tool names or descriptions changed unexpectedly'); +fwrite(STDOUT, "market_management_mcp_tools_list_test: OK\n");