Fix MCP tools/list schema serialization

This commit is contained in:
gitea_admin committed 2026-09-24 14:51:52 +02:00
1 parent 8c5668bf3d
commit ebb71b4769
2 files changed
+80 -3

No files matched your search

@@ -0,0 +1,77 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../modules/market_management/mcp.php';
function fail_test(string $message): void
{
fwrite(STDERR, $message . PHP_EOL);
exit(1);
}
function assert_test(bool $condition, string $message): void
{
if (!$condition) {
fail_test($message);
}
}
function assert_schema_objects(array $schema, string $path = 'inputSchema'): void
{
assert_test(($schema['type'] ?? null) === 'object', $path . '.type must be object');
assert_test(isset($schema['properties']) && is_object($schema['properties']), $path . '.properties must be an object');
if (isset($schema['required'])) {
assert_test(is_array($schema['required']), $path . '.required must be an array');
foreach ($schema['required'] as $required) {
assert_test(is_string($required), $path . '.required entries must be strings');
}
}
foreach (get_object_vars($schema['properties']) as $propertyName => $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");