Added dependencies and basic structures

This commit is contained in:
Jan Böhmer 2026-05-06 22:58:38 +02:00
parent e8af0e9b4f
commit f7b2539ef1
8 changed files with 698 additions and 24 deletions

View file

@ -34,4 +34,5 @@ return [
Jbtronics\TranslationEditorBundle\JbtronicsTranslationEditorBundle::class => ['dev' => true],
ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true],
Symfony\AI\AiBundle\AiBundle::class => ['all' => true],
Symfony\AI\McpBundle\McpBundle::class => ['all' => true],
];

View file

@ -38,3 +38,7 @@ api_platform:
serializer:
# Change this to false later, to remove the hydra prefix on the API
hydra_prefix: true
mcp:
enabled: true # default: true
format: jsonld # default: 'jsonld'

10
config/packages/mcp.yaml Normal file
View file

@ -0,0 +1,10 @@
mcp:
client_transports:
http: true
stdio: false
http:
path: "/mcp"
session:
store: "file"
directory: "%kernel.cache_dir%/mcp"
ttl: 3600

View file

@ -3184,6 +3184,37 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* store?: string|Param, // Service name of store // Default: "Symfony\\AI\\Store\\StoreInterface"
* }>,
* }
* @psalm-type McpConfig = array{
* app?: scalar|Param|null, // Default: "app"
* version?: scalar|Param|null, // Default: "0.0.1"
* description?: scalar|Param|null, // Default: null
* icons?: list<array{ // Default: []
* src?: scalar|Param|null,
* mime_type?: scalar|Param|null, // Default: null
* sizes?: list<scalar|Param|null>,
* }>,
* website_url?: scalar|Param|null, // Default: null
* pagination_limit?: int|Param, // Default: 50
* instructions?: scalar|Param|null, // Default: null
* client_transports?: array{
* stdio?: bool|Param, // Default: false
* http?: bool|Param, // Default: false
* },
* discovery?: array{
* scan_dirs?: list<scalar|Param|null>,
* exclude_dirs?: list<scalar|Param|null>,
* },
* http?: array{
* path?: scalar|Param|null, // Default: "/_mcp"
* session?: array{
* store?: "file"|"memory"|"cache"|"framework"|Param, // Default: "file"
* directory?: scalar|Param|null, // Default: "%kernel.cache_dir%/mcp-sessions"
* cache_pool?: scalar|Param|null, // Default: "cache.mcp.sessions"
* prefix?: scalar|Param|null, // Default: "mcp-"
* ttl?: int|Param, // Default: 3600
* },
* },
* }
* @psalm-type ConfigType = array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
@ -3214,6 +3245,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* jbtronics_settings?: JbtronicsSettingsConfig,
* api_platform?: ApiPlatformConfig,
* ai?: AiConfig,
* mcp?: McpConfig,
* "when@dev"?: array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
@ -3248,6 +3280,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* jbtronics_translation_editor?: JbtronicsTranslationEditorConfig,
* api_platform?: ApiPlatformConfig,
* ai?: AiConfig,
* mcp?: McpConfig,
* },
* "when@docker"?: array{
* imports?: ImportsConfig,
@ -3279,6 +3312,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* jbtronics_settings?: JbtronicsSettingsConfig,
* api_platform?: ApiPlatformConfig,
* ai?: AiConfig,
* mcp?: McpConfig,
* },
* "when@prod"?: array{
* imports?: ImportsConfig,
@ -3310,6 +3344,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* jbtronics_settings?: JbtronicsSettingsConfig,
* api_platform?: ApiPlatformConfig,
* ai?: AiConfig,
* mcp?: McpConfig,
* },
* "when@test"?: array{
* imports?: ImportsConfig,
@ -3344,6 +3379,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* jbtronics_settings?: JbtronicsSettingsConfig,
* api_platform?: ApiPlatformConfig,
* ai?: AiConfig,
* mcp?: McpConfig,
* },
* ...<string, ExtensionType|array{ // extra keys must follow the when@%env% pattern or match an extension alias
* imports?: ImportsConfig,

View file

@ -18,6 +18,11 @@ csp_report:
methods: [POST]
defaults: { _controller: nelmio_security.csp_reporter_controller::indexAction }
mcp:
resource: .
type: mcp
# Must be last as it matches everything
redirector:
path: /{url}
@ -26,3 +31,4 @@ redirector:
controller: App\Controller\RedirectController::addLocalePart
# Dont match localized routes (no redirection loop, if no root with that name exists) or API prefixed routes
condition: "not (request.getPathInfo() matches '/^\\\\/([a-z]{2}(_[A-Z]{2})?|api)\\\\//')"