Розширення бандла

Розширення бандла

Усе нижче — звичайне перевизначення сервісу 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.