Fix MCP tools/list schema serialization
This commit is contained in:
1 parent
8c5668bf3d
commit
ebb71b4769
2 files changed
+80
-3
No files matched your search
@@ -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]]],
|
||||
|
||||
@@ -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");
|
||||
Reference in new issue
Block a user