Розширення бандла
Усе нижче — звичайне перевизначення сервісу Symfony або тегований сервіс; змінювати бандл не потрібно.
| Що | Як | Для чого |
|---|---|---|
Availability\McpAvailabilityCheckerInterface |
аліас сервісу | Чи відповідає група взагалі (інакше 404) |
Security\McpAccessPolicyInterface |
аліас сервісу | CORS origins і allowlist хостів для захисту від DNS rebinding |
ClientManifest\McpClientManifestGeneratorInterface |
тег ufo_mcp.client_manifest_generator з ключем key |
Маніфест для іншого клієнта |
translations/rpc/<group>.<locale>.yaml |
переклади ядра | Тексти для агента без змін у коді |
#[McpTool] |
атрибут на методі | Підказки ToolAnnotations |
Доступність групи
McpAvailabilityCheckerInterface::isEnabled(string $group): bool вирішує, чи група взагалі відповідає (інакше 404). Типовий DefaultMcpAvailabilityChecker читає enabled (ufo_mcp.groups.<group>.enabled з fallback на ufo_mcp.enabled). Замініть його для feature flag, перемикача для тенанта чи вікна обслуговування:
use Ufo\McpBundle\Availability\McpAvailabilityCheckerInterface;
final readonly class FeatureFlagAvailability implements McpAvailabilityCheckerInterface
{
public function __construct(private FeatureFlags $flags) {}
public function isEnabled(string $group): bool
{
return $this->flags->isOn('mcp.'.$group);
}
}
# config/services.yaml
services:
Ufo\McpBundle\Availability\McpAvailabilityCheckerInterface: '@App\Mcp\FeatureFlagAvailability'
Ваша реалізація повністю замінює перевірку з конфігурації; якщо потрібні обидві, викличте типову самостійно.
Хости та origins
McpAccessPolicyInterface — див. CORS і DNS rebinding.
Маніфест для іншого клієнта
use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag;
use Ufo\McpBundle\ClientManifest\McpClientManifestGeneratorHolder;
use Ufo\McpBundle\ClientManifest\McpClientManifestGeneratorInterface;
use Ufo\McpBundle\ConfigService\McpGroupConfig;
#[AutoconfigureTag(McpClientManifestGeneratorHolder::TAG, ['key' => 'acme'])]
final class AcmeAgentManifestGenerator implements McpClientManifestGeneratorInterface
{
public function generate(McpGroupConfig $group, string $endpointUrl, string $tokenHeaderName): array
{
return [
'servers' => [
$group->name => ['url' => $endpointUrl, 'headers' => [$tokenHeaderName => '<UFO_MCP_TOKEN>']],
],
];
}
}
Маніфест віддається за адресою <prefix>/manifest/acme.json у форматі, якого очікує конфігураційний файл цього клієнта. Ключ має відповідати [\w-]+ і не збігатися з вбудованими (claude, cursor, gemini, openai). $endpointUrl — абсолютний URL ендпоінта з запиту, $tokenHeaderName — ufo_json_rpc.security.token_name. Не вставляйте в маніфест справжній токен.
Тексти для агента
Переклади групи (translations/rpc/<group>.<locale>.yaml) описують метод для AI-агента інакше, ніж у документації OpenRPC, без змін у коді — див. Заголовок і опис. Бандл-розширення може постачати власні переклади через ufo_json_rpc.translations.paths ядра.
Усе, що пропонує ядро
Виклик інструмента — RPC-запит ядра, тож точки розширення JsonRpcBundle діють без змін: слухачі подій (rpc.request, rpc.pre_execute, rpc.post_execute, rpc.pre_response, rpc.post_response, rpc.error), конвертери параметрів, валідатори токенів і провайдери токенів для груп, пул кешу відповідей.
Інші пакети екосистеми — на сторінці Розширення JsonRpcBundle.