Skip to content

IBX-11536: MCP Servers#3106

Draft
adriendupuis wants to merge 47 commits into5.0from
mcp
Draft

IBX-11536: MCP Servers#3106
adriendupuis wants to merge 47 commits into5.0from
mcp

Conversation

@adriendupuis
Copy link
Copy Markdown
Contributor

@adriendupuis adriendupuis commented Mar 26, 2026

Question Answer
JIRA Ticket IBX-11068 > IBX-11536
Versions (TBC)
Edition All? (TBC)

Document built-in MCP Servers and how to create custom ones.

Checklist

  • Text renders correctly
  • Text has been checked with vale
  • Description metadata is up to date
  • Redirects cover removed/moved pages
  • Code samples are working
  • PHP code samples have been fixed with PHP CS fixer
  • Added link to this PR in relevant JIRA ticket or code PR

Comment thread composer.json Outdated
Comment thread mkdocs.yml Outdated
Apply SonarCloud Code Analysis warning's suggestion
Comment thread docs/ai/mcp/mcp_guide.md Outdated
@adriendupuis adriendupuis changed the title IBX-11068: MCP Servers IBX-11536: MCP Servers Mar 27, 2026
Comment thread docs/ai/mcp/mcp_config.md Outdated
Comment thread code_samples/mcp/config/packages/mcp.yaml Outdated
Comment thread docs/ai/mcp/mcp_config.md Outdated
Comment thread code_samples/mcp/src/Mcp/ExampleTools.php Outdated
Comment thread docs/ai/mcp/mcp_config.md Outdated
@github-actions
Copy link
Copy Markdown

code_samples/ change report

Before (on target branch)After (in current PR)

code_samples/mcp/config/packages/mcp.yaml


code_samples/mcp/config/packages/mcp.yaml

docs/ai/mcp/mcp_config.md@246:``` yaml
docs/ai/mcp/mcp_config.md@247:[[= include_file('code_samples/mcp/config/packages/mcp.yaml') =]]
docs/ai/mcp/mcp_config.md@248:```

001⫶ibexa:
002⫶ repositories:
003⫶ default:
004⫶ mcp:
005⫶ example:
006⫶ path: /mcp/example
007⫶ enabled: true
008⫶ description: 'Example MCP Server'
009⫶ instructions: 'Use this server to greet someone.'
010⫶ discovery_cache: cache.tagaware.filesystem
011⫶ session:
012⫶ type: psr16
013⫶ directory: cache.tagaware.filesystem
014⫶ system:
015⫶ default:
016⫶ mcp:
017⫶ servers:
018⫶ - example


code_samples/mcp/http.mcp.json


code_samples/mcp/http.mcp.json

docs/ai/mcp/mcp_config.md@427:``` json
docs/ai/mcp/mcp_config.md@428:[[= include_file('code_samples/mcp/http.mcp.json') =]]
docs/ai/mcp/mcp_config.md@429:```

001⫶{
002⫶ "mcpServers": {
003⫶ "ibexa-example": {
004⫶ "type": "http",
005⫶ "url": "http://localhost/mcp/example",
006⫶ "headers": {
007⫶ "Authorization": "Bearer <JWT token>"
008⫶ },
009⫶ "tools": ["*"]
010⫶ }
011⫶ }
012⫶}


code_samples/mcp/mcp-ibexa-example-wrapper.sh


code_samples/mcp/mcp-ibexa-example-wrapper.sh

docs/ai/mcp/mcp_config.md@454:``` bash
docs/ai/mcp/mcp_config.md@455:[[= include_file('code_samples/mcp/mcp-ibexa-example-wrapper.sh') =]]
docs/ai/mcp/mcp_config.md@456:```

001⫶#!/bin/bash
002⫶set -e
003⫶
004⫶baseUrl='http://localhost' # Adapt to your test case
005⫶
006⫶jwtToken=$(curl -s -X 'POST' \
007⫶ "$baseUrl/api/ibexa/v2/user/token/jwt" \
008⫶ -H 'Content-Type: application/vnd.ibexa.api.JWTInput+json' \
009⫶ -H 'Accept: application/vnd.ibexa.api.JWT+json' \
010⫶ -d '{
011⫶ "JWTInput": {
012⫶ "_media-type": "application/vnd.ibexa.api.JWTInput+json",
013⫶ "username": "ibexa-example",
014⫶ "password": "Ibexa-3xample"
015⫶ }
016⫶ }' | jq -r .JWT.token)
017⫶
018⫶exec npx -y supergateway \
019⫶ --streamableHttp "$baseUrl/mcp/example" \
020⫶ --oauth2Bearer "$jwtToken" \
021⫶ --logLevel none


code_samples/mcp/mcp.sh


code_samples/mcp/mcp.sh

docs/ai/mcp/mcp_config.md@300:``` bash
docs/ai/mcp/mcp_config.md@301:[[= include_file('code_samples/mcp/mcp.sh', 2, 3) =]]
docs/ai/mcp/mcp_config.md@302:```

001⫶baseUrl='http://localhost' # Adapt to your test case

docs/ai/mcp/mcp_config.md@306:``` bash
docs/ai/mcp/mcp_config.md@307:[[= include_file('code_samples/mcp/mcp.sh', 4, 15) =]]
docs/ai/mcp/mcp_config.md@308:```

001⫶jwtToken=$(curl -s -X 'POST' \
002⫶ "$baseUrl/api/ibexa/v2/user/token/jwt" \
003⫶ -H 'Content-Type: application/vnd.ibexa.api.JWTInput+json' \
004⫶ -H 'Accept: application/vnd.ibexa.api.JWT+json' \
005⫶ -d '{
006⫶ "JWTInput": {
007⫶ "_media-type": "application/vnd.ibexa.api.JWTInput+json",
008⫶ "username": "ibexa-example",
009⫶ "password": "Ibexa-3xample"
010⫶ }
011⫶ }' | jq -r .JWT.token)

docs/ai/mcp/mcp_config.md@312:``` bash
docs/ai/mcp/mcp_config.md@313:[[= include_file('code_samples/mcp/mcp.sh', 16, 31) =]]
docs/ai/mcp/mcp_config.md@314:```

001⫶mcpSessionId=$(curl -s -i -X 'POST' "$baseUrl/mcp/example" \
002⫶ -H "Authorization: Bearer $jwtToken" \
003⫶ -d '{
004⫶ "jsonrpc": "2.0",
005⫶ "id": 1,
006⫶ "method": "initialize",
007⫶ "params": {
008⫶ "protocolVersion": "2025-03-26",
009⫶ "capabilities": {},
010⫶ "clientInfo": {
011⫶ "name": "test-curl-client",
012⫶ "version": "1.0.0"
013⫶ }
014⫶ }
015⫶ }' | grep 'Mcp-Session-Id:' | sed 's/Mcp-Session-Id: \([0-9a-f-]*\).*/\1/')

docs/ai/mcp/mcp_config.md@318:``` bash
docs/ai/mcp/mcp_config.md@319:[[= include_file('code_samples/mcp/mcp.sh', 32, 39) =]]
docs/ai/mcp/mcp_config.md@320:```

001⫶curl -s -i -X 'POST' "$baseUrl/mcp/example" \
002⫶ -H "Authorization: Bearer $jwtToken" \
003⫶ -H "Mcp-Session-Id: $mcpSessionId" \
004⫶ -d '{
005⫶ "jsonrpc": "2.0",
006⫶ "method": "notifications/initialized"
007⫶ }'

docs/ai/mcp/mcp_config.md@323:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 0, 5) =]]

001⫶HTTP/1.1 202 Accepted
002⫶Access-Control-Allow-Headers: Content-Type, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID, Authorization, Accept
003⫶Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS
004⫶Access-Control-Allow-Origin: *
005⫶Access-Control-Expose-Headers: Mcp-Session-Id

docs/ai/mcp/mcp_config.md@328:``` bash
docs/ai/mcp/mcp_config.md@329:[[= include_file('code_samples/mcp/mcp.sh', 40, 48) =]]
docs/ai/mcp/mcp_config.md@330:```

001⫶curl -s -X 'POST' "$baseUrl/mcp/example" \
002⫶ -H "Authorization: Bearer $jwtToken" \
003⫶ -H "Mcp-Session-Id: $mcpSessionId" \
004⫶ -d '{
005⫶ "jsonrpc": "2.0",
006⫶ "id": 2,
007⫶ "method": "tools/list"
008⫶ }' | jq

docs/ai/mcp/mcp_config.md@332:``` json
docs/ai/mcp/mcp_config.md@333:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 17, 77) =]]
docs/ai/mcp/mcp_config.md@334:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 2,
004⫶ "result": {
005⫶ "tools": [
006⫶ {
007⫶ "name": "greet",
008⫶ "inputSchema": {
009⫶ "type": "object",
010⫶ "properties": {
011⫶ "name": {
012⫶ "type": "string",
013⫶ "description": "the name of the person to greet"
014⫶ }
015⫶ },
016⫶ "required": [
017⫶ "name"
018⫶ ]
019⫶ },
020⫶ "description": "Greet a user by name",
021⫶ "annotations": {
022⫶ "readOnlyHint": true,
023⫶ "destructiveHint": false,
024⫶ "idempotentHint": true,
025⫶ "openWorldHint": false
026⫶ },
027⫶ "icons": [
028⫶ {
029⫶ "src": "https://openmoji.org/data/color/svg/1F44B.svg"
030⫶ }
031⫶ ],
032⫶ "outputSchema": {
033⫶ "type": "object",
034⫶ "properties": {
035⫶ "general": {
036⫶ "type": "string",
037⫶ "description": "the safe way to greet someone"
038⫶ },
039⫶ "close": {
040⫶ "type": "string",
041⫶ "description": "when you're close to the person, like friends or relatives"
042⫶ },
043⫶ "morning": {
044⫶ "type": "string",
045⫶ "description": "when it's in the morning"
046⫶ },
047⫶ "afternoon": {
048⫶ "type": "string",
049⫶ "description": "when it's the afternoon"
050⫶ },
051⫶ "evening": {
052⫶ "type": "string",
053⫶ "description": "when it's late in the day"
054⫶ }
055⫶ }
056⫶ }
057⫶ }
058⫶ ]
059⫶ }
060⫶}

docs/ai/mcp/mcp_config.md@338:``` bash
docs/ai/mcp/mcp_config.md@339:[[= include_file('code_samples/mcp/mcp.sh', 49, 63) =]]
docs/ai/mcp/mcp_config.md@340:```

001⫶curl -s -X 'POST' "$baseUrl/mcp/example" \
002⫶ -H "Authorization: Bearer $jwtToken" \
003⫶ -H "Mcp-Session-Id: $mcpSessionId" \
004⫶ -d '{
005⫶ "jsonrpc": "2.0",
006⫶ "id": 3,
007⫶ "method": "tools/call",
008⫶ "params": {
009⫶ "name": "greet",
010⫶ "arguments": {
011⫶ "name": "World"
012⫶ }
013⫶ }
014⫶ }' | jq

docs/ai/mcp/mcp_config.md@342:``` json
docs/ai/mcp/mcp_config.md@343:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 77, 97) =]]
docs/ai/mcp/mcp_config.md@344:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 3,
004⫶ "result": {
005⫶ "content": [
006⫶ {
007⫶ "type": "text",
008⫶ "text": "{\n \"general\": \"Hello, World!\",\n \"close\": \"Hey, World!\",\n \"morning\": \"Good morning, World!\",\n \"afternoon\": \"Good afternoon, World!\",\n \"evening\": \"Good evening, World!\"\n}"
009⫶ }
010⫶ ],
011⫶ "isError": false,
012⫶ "structuredContent": {
013⫶ "general": "Hello, World!",
014⫶ "close": "Hey, World!",
015⫶ "morning": "Good morning, World!",
016⫶ "afternoon": "Good afternoon, World!",
017⫶ "evening": "Good evening, World!"
018⫶ }
019⫶ }
020⫶}

docs/ai/mcp/mcp_config.md@348:``` bash
docs/ai/mcp/mcp_config.md@349:[[= include_file('code_samples/mcp/mcp.sh', 64, 72) =]]
docs/ai/mcp/mcp_config.md@350:```

001⫶curl -s -X 'POST' "$baseUrl/mcp/example" \
002⫶ -H "Authorization: Bearer $jwtToken" \
003⫶ -H "Mcp-Session-Id: $mcpSessionId" \
004⫶ -d '{
005⫶ "jsonrpc": "2.0",
006⫶ "id": 4,
007⫶ "method": "prompts/list"
008⫶ }' | jq

docs/ai/mcp/mcp_config.md@352:``` json
docs/ai/mcp/mcp_config.md@353:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 97, 121) =]]
docs/ai/mcp/mcp_config.md@354:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 4,
004⫶ "result": {
005⫶ "prompts": [
006⫶ {
007⫶ "name": "greet",
008⫶ "description": "Prompt to be greeted by the `greet` tool",
009⫶ "arguments": [
010⫶ {
011⫶ "name": "name",
012⫶ "description": "The name you want to be greeted by",
013⫶ "required": true
014⫶ }
015⫶ ],
016⫶ "icons": [
017⫶ {
018⫶ "src": "https://openmoji.org/data/color/svg/1F91D.svg"
019⫶ }
020⫶ ]
021⫶ }
022⫶ ]
023⫶ }
024⫶}

docs/ai/mcp/mcp_config.md@358:``` bash
docs/ai/mcp/mcp_config.md@359:[[= include_file('code_samples/mcp/mcp.sh', 73, 87) =]]
docs/ai/mcp/mcp_config.md@360:```

001⫶curl -s -X 'POST' "$baseUrl/mcp/example" \
002⫶ -H "Authorization: Bearer $jwtToken" \
003⫶ -H "Mcp-Session-Id: $mcpSessionId" \
004⫶ -d '{
005⫶ "jsonrpc": "2.0",
006⫶ "id": 5,
007⫶ "method": "prompts/get",
008⫶ "params": {
009⫶ "name": "greet",
010⫶ "arguments": {
011⫶ "name": "Firstname Lastname"
012⫶ }
013⫶ }
014⫶ }' | jq

docs/ai/mcp/mcp_config.md@362:``` json
docs/ai/mcp/mcp_config.md@363:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 121, 136) =]]
docs/ai/mcp/mcp_config.md@364:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 5,
004⫶ "result": {
005⫶ "messages": [
006⫶ {
007⫶ "role": "user",
008⫶ "content": {
009⫶ "type": "text",
010⫶ "text": "Hi. Please, greet me. My name is Firstname Lastname."
011⫶ }
012⫶ }
013⫶ ]
014⫶ }
015⫶}


code_samples/mcp/mcp.sh.output.txt


code_samples/mcp/mcp.sh.output.txt

docs/ai/mcp/mcp_config.md@323:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 0, 5) =]]

001⫶HTTP/1.1 202 Accepted
002⫶Access-Control-Allow-Headers: Content-Type, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID, Authorization, Accept
003⫶Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS
004⫶Access-Control-Allow-Origin: *
005⫶Access-Control-Expose-Headers: Mcp-Session-Id

docs/ai/mcp/mcp_config.md@332:``` json
docs/ai/mcp/mcp_config.md@333:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 17, 77) =]]
docs/ai/mcp/mcp_config.md@334:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 2,
004⫶ "result": {
005⫶ "tools": [
006⫶ {
007⫶ "name": "greet",
008⫶ "inputSchema": {
009⫶ "type": "object",
010⫶ "properties": {
011⫶ "name": {
012⫶ "type": "string",
013⫶ "description": "the name of the person to greet"
014⫶ }
015⫶ },
016⫶ "required": [
017⫶ "name"
018⫶ ]
019⫶ },
020⫶ "description": "Greet a user by name",
021⫶ "annotations": {
022⫶ "readOnlyHint": true,
023⫶ "destructiveHint": false,
024⫶ "idempotentHint": true,
025⫶ "openWorldHint": false
026⫶ },
027⫶ "icons": [
028⫶ {
029⫶ "src": "https://openmoji.org/data/color/svg/1F44B.svg"
030⫶ }
031⫶ ],
032⫶ "outputSchema": {
033⫶ "type": "object",
034⫶ "properties": {
035⫶ "general": {
036⫶ "type": "string",
037⫶ "description": "the safe way to greet someone"
038⫶ },
039⫶ "close": {
040⫶ "type": "string",
041⫶ "description": "when you're close to the person, like friends or relatives"
042⫶ },
043⫶ "morning": {
044⫶ "type": "string",
045⫶ "description": "when it's in the morning"
046⫶ },
047⫶ "afternoon": {
048⫶ "type": "string",
049⫶ "description": "when it's the afternoon"
050⫶ },
051⫶ "evening": {
052⫶ "type": "string",
053⫶ "description": "when it's late in the day"
054⫶ }
055⫶ }
056⫶ }
057⫶ }
058⫶ ]
059⫶ }
060⫶}

docs/ai/mcp/mcp_config.md@342:``` json
docs/ai/mcp/mcp_config.md@343:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 77, 97) =]]
docs/ai/mcp/mcp_config.md@344:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 3,
004⫶ "result": {
005⫶ "content": [
006⫶ {
007⫶ "type": "text",
008⫶ "text": "{\n \"general\": \"Hello, World!\",\n \"close\": \"Hey, World!\",\n \"morning\": \"Good morning, World!\",\n \"afternoon\": \"Good afternoon, World!\",\n \"evening\": \"Good evening, World!\"\n}"
009⫶ }
010⫶ ],
011⫶ "isError": false,
012⫶ "structuredContent": {
013⫶ "general": "Hello, World!",
014⫶ "close": "Hey, World!",
015⫶ "morning": "Good morning, World!",
016⫶ "afternoon": "Good afternoon, World!",
017⫶ "evening": "Good evening, World!"
018⫶ }
019⫶ }
020⫶}

docs/ai/mcp/mcp_config.md@352:``` json
docs/ai/mcp/mcp_config.md@353:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 97, 121) =]]
docs/ai/mcp/mcp_config.md@354:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 4,
004⫶ "result": {
005⫶ "prompts": [
006⫶ {
007⫶ "name": "greet",
008⫶ "description": "Prompt to be greeted by the `greet` tool",
009⫶ "arguments": [
010⫶ {
011⫶ "name": "name",
012⫶ "description": "The name you want to be greeted by",
013⫶ "required": true
014⫶ }
015⫶ ],
016⫶ "icons": [
017⫶ {
018⫶ "src": "https://openmoji.org/data/color/svg/1F91D.svg"
019⫶ }
020⫶ ]
021⫶ }
022⫶ ]
023⫶ }
024⫶}

docs/ai/mcp/mcp_config.md@362:``` json
docs/ai/mcp/mcp_config.md@363:[[= include_file('code_samples/mcp/mcp.sh.output.txt', 121, 136) =]]
docs/ai/mcp/mcp_config.md@364:```

001⫶{
002⫶ "jsonrpc": "2.0",
003⫶ "id": 5,
004⫶ "result": {
005⫶ "messages": [
006⫶ {
007⫶ "role": "user",
008⫶ "content": {
009⫶ "type": "text",
010⫶ "text": "Hi. Please, greet me. My name is Firstname Lastname."
011⫶ }
012⫶ }
013⫶ ]
014⫶ }
015⫶}


code_samples/mcp/src/Command/McpServerListCommand.php


code_samples/mcp/src/Command/McpServerListCommand.php

docs/ai/mcp/mcp_config.md@282:``` php
docs/ai/mcp/mcp_config.md@283:[[= include_file('code_samples/mcp/src/Command/McpServerListCommand.php') =]]
docs/ai/mcp/mcp_config.md@284:```

001⫶<?php declare(strict_types=1);
002⫶
003⫶namespace App\mcp\src\Command;
004⫶
005⫶use Ibexa\Contracts\Mcp\McpServerConfigurationRegistryInterface;
006⫶use Symfony\Component\Console\Attribute\AsCommand;
007⫶use Symfony\Component\Console\Command\Command;
008⫶use Symfony\Component\Console\Style\SymfonyStyle;
009⫶
010⫶#[AsCommand(name: 'app:mcp:server_list', description: 'List MCP servers')]
011⫶class McpServerListCommand
012⫶{
013⫶ public function __construct(private readonly McpServerConfigurationRegistryInterface $configRegistry)
014⫶ {
015⫶ }
016⫶
017⫶ public function __invoke(SymfonyStyle $io): int
018⫶ {
019⫶ foreach($this->configRegistry->getServerConfigurations() as $serverConfiguration) {
020⫶ $io->title($serverConfiguration->identifier);
021⫶ dump($serverConfiguration);
022⫶ }
023⫶
024⫶ return Command::SUCCESS;
025⫶ }
026⫶}


code_samples/mcp/src/Mcp/ExampleCapabilities.php


code_samples/mcp/src/Mcp/ExampleCapabilities.php

docs/ai/mcp/mcp_config.md@263:``` php
docs/ai/mcp/mcp_config.md@264:[[= include_file('code_samples/mcp/src/Mcp/ExampleCapabilities.php') =]]
docs/ai/mcp/mcp_config.md@265:```

001⫶<?php declare(strict_types=1);
002⫶
003⫶namespace App\Mcp;
004⫶
005⫶use Ibexa\Contracts\Mcp\Attribute\McpPrompt;
006⫶use Ibexa\Contracts\Mcp\Attribute\McpTool;
007⫶use Ibexa\Contracts\Mcp\McpCapabilityInterface;
008⫶use Mcp\Capability\Attribute\Schema;
009⫶use Mcp\Schema\Icon;
010⫶use Mcp\Schema\ToolAnnotations;
011⫶
012⫶final readonly class ExampleCapabilities implements McpCapabilityInterface
013⫶{
014⫶ /** @return array<string, string> */
015⫶ #[McpTool(
016⫶ servers: ['example'],
017⫶ name: 'greet',
018⫶ description: 'Greet a user by name',
019⫶ annotations: new ToolAnnotations(
020⫶ readOnlyHint: true,
021⫶ destructiveHint: false,
022⫶ idempotentHint: true,
023⫶ openWorldHint: false,
024⫶ ),
025⫶ icons: [new Icon(
026⫶ src: 'https://openmoji.org/data/color/svg/1F44B.svg',
027⫶ )],
028⫶ outputSchema: [
029⫶ 'type' => 'object',
030⫶ 'properties' => [
031⫶ 'general' => [
032⫶ 'type' => 'string',
033⫶ 'description' => 'the safe way to greet someone',
034⫶ ],
035⫶ 'close' => [
036⫶ 'type' => 'string',
037⫶ 'description' => 'when you\'re close to the person, like friends or relatives',
038⫶ ],
039⫶ 'morning' => [
040⫶ 'type' => 'string',
041⫶ 'description' => 'when it\'s in the morning',
042⫶ ],
043⫶ 'afternoon' => [
044⫶ 'type' => 'string',
045⫶ 'description' => 'when it\'s the afternoon',
046⫶ ],
047⫶ 'evening' => [
048⫶ 'type' => 'string',
049⫶ 'description' => 'when it\'s late in the day',
050⫶ ],
051⫶ ],
052⫶ ],
053⫶ )]
054⫶ public function greetByName(
055⫶ #[Schema(
056⫶ description: 'the name of the person to greet'
057⫶ )]
058⫶ string $name
059⫶ ): array {
060⫶ return [
061⫶ 'general' => sprintf('Hello, %s!', $name),
062⫶ 'close' => sprintf('Hey, %s!', $name),
063⫶ 'morning' => sprintf('Good morning, %s!', $name),
064⫶ 'afternoon' => sprintf('Good afternoon, %s!', $name),
065⫶ 'evening' => sprintf('Good evening, %s!', $name),
066⫶ ];
067⫶ }
068⫶
069⫶ /**
070⫶ * @param string $name The name you want to be greeted by
071⫶ *
072⫶ * @return array<string, mixed>
073⫶ */
074⫶ #[McpPrompt(
075⫶ servers: ['example'],
076⫶ name: 'greet',
077⫶ description: 'Prompt to be greeted by the `greet` tool',
078⫶ icons: [new Icon(
079⫶ src: 'https://openmoji.org/data/color/svg/1F91D.svg',
080⫶ )],
081⫶ )]
082⫶ public function getGreetPrompt(string $name): array
083⫶ {
084⫶ return [
085⫶ 'role' => 'user',
086⫶ 'content' => [
087⫶ 'type' => 'text',
088⫶ 'text' => "Hi. My name is $name. Please, greet me.",
089⫶ ],
090⫶ ];
091⫶ }
092⫶}


code_samples/mcp/stdio.mcp.json


code_samples/mcp/stdio.mcp.json

docs/ai/mcp/mcp_config.md@446:``` json
docs/ai/mcp/mcp_config.md@447:[[= include_file('code_samples/mcp/stdio.mcp.json') =]]
docs/ai/mcp/mcp_config.md@448:```

001⫶{
002⫶ "mcpServers": {
003⫶ "ibexa-example": {
004⫶ "type": "stdio",
005⫶ "command": "bash",
006⫶ "args": ["mcp-ibexa-example-wrapper.sh"],
007⫶ "tools": ["*"]
008⫶ }
009⫶ }
010⫶}

Download colorized diff

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
18 Security Hotspots
43.7% Duplication on New Code (required ≤ 3%)
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant