Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
afb4317
release notes for 5.0.9 added
julitafalcondusza Jun 25, 2026
1335f22
ibexa_dxp_v5.0.md: MCP changes
adriendupuis Jun 25, 2026
ebfe8f6
From @adriendupuis : simplify
adriendupuis Jun 26, 2026
57d5b81
Revert "From @adriendupuis : simplify"
adriendupuis Jun 26, 2026
7a66f6e
Fix MCP tool list
adriendupuis Jun 26, 2026
4b803dc
Add the capability `title` config
adriendupuis Jun 26, 2026
b3175b1
Apply suggestions from code review
adriendupuis Jun 26, 2026
b2712ec
section about new recommendation blocks added
julitafalcondusza Jun 29, 2026
2265906
latest tags updated
julitafalcondusza Jun 29, 2026
26a923d
Apply suggestion from @adriendupuis
adriendupuis Jun 29, 2026
ed94c25
Apply suggestions from code review
adriendupuis Jun 29, 2026
22502c3
IBX-111154: New recommendation blocks described (#3247)
julitafalcondusza Jun 29, 2026
b354de8
fixes
julitafalcondusza Jun 30, 2026
d990f5f
"new feature" in mpc section removed
julitafalcondusza Jun 30, 2026
9acef17
fix
julitafalcondusza Jun 30, 2026
a8abce8
fix
julitafalcondusza Jun 30, 2026
c5d0ccd
comma added
julitafalcondusza Jun 30, 2026
4222ecd
IBX-11100: Hybrid tracking described in Dev-doc (#3250)
julitafalcondusza Jun 30, 2026
091d1a7
MCP Servers updates (#3248)
adriendupuis Jun 30, 2026
a40e484
update for 4.6 added
julitafalcondusza Jun 30, 2026
1b897a2
PHP API section added in RN
julitafalcondusza Jun 30, 2026
6c77b67
v5.0.9 update section added mentioning mcp servers
julitafalcondusza Jul 1, 2026
3304bb8
fix
julitafalcondusza Jul 1, 2026
0d7eb36
API Refs v5.0.9 (#3262)
ezrobot Jul 1, 2026
740dd6e
RN for 4.6 added
julitafalcondusza Jul 1, 2026
c4df8eb
background_tasks.md month_change: true
adriendupuis Jul 1, 2026
ed6666c
Merge branch '5.0' into release_5.0.9
adriendupuis Jul 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion code_samples/mcp/config/packages/mcp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ ibexa:
discovery_cache: cache.tagaware.filesystem
session:
type: psr16
directory: cache.tagaware.filesystem
service: cache.tagaware.filesystem
allowed_hosts:
- '127.0.0.1'
system:
default:
mcp:
Expand Down
2 changes: 2 additions & 0 deletions code_samples/mcp/mcp.matrix.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ ibexa:
session:
type: <psr16|file>
# Session options…
allowed_hosts:
- '<domain_name>'
mcp_psr16:
discovery_cache: cache.redis.mcp
session:
Expand Down
2 changes: 1 addition & 1 deletion code_samples/mcp/mcp.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ curl -s -i -X 'POST' "$baseUrl/mcp/example" \

sed '$d' response.tmp.txt
tail -n 1 response.tmp.txt | jq
mcpSessionId=$(cat response.tmp.txt | grep 'Mcp-Session-Id:' | sed 's/Mcp-Session-Id: \([0-9a-f-]*\).*/\1/')
mcpSessionId=$(cat response.tmp.txt | grep -i 'Mcp-Session-Id:' | sed 's/Mcp-Session-Id: \([0-9a-f-]*\).*/\1/i')
rm response.tmp.txt

curl -s -i -X 'POST' "$baseUrl/mcp/example" \
Expand Down
2 changes: 2 additions & 0 deletions code_samples/mcp/src/Mcp/ExampleCapabilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#[McpTool(
servers: ['example'],
name: 'greet',
title: 'User greeting',
description: 'Greet a user by name',
annotations: new ToolAnnotations(
readOnlyHint: true,
Expand Down Expand Up @@ -73,6 +74,7 @@ public function greetByName(string $name): array
#[McpPrompt(
servers: ['example'],
name: 'greet',
title: 'Be greeted',
description: 'Prompt to invoke the `greet` tool',
icons: [new Icon(
src: 'https://openmoji.org/data/color/svg/1F91D.svg',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ ibexa:
connector_raptor:
enabled: true
customer_id: ~ # Required
tracking_type: client # One of: "client" or "server"
tracking_type: client # One of: "client", "server", or "hybrid"

# Raptor Recommendations API key
recommendations_api_key: ~ # Required
Expand All @@ -18,3 +18,4 @@ ibexa:
ibexa_connector_raptor:
# When enabled, tracking exceptions are thrown instead of being silently handled
strict_exceptions: true
hybrid_tracking_proxy_path: '/raptor/track'
83 changes: 62 additions & 21 deletions docs/ai/mcp/mcp_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ You define MCP servers within a repository configuration and then assign those s

``` yaml
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 1, 8) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 12, 15) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 29, 33) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 12, 17) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 31, 35) =]]
```

Routes are built automatically from MCP server `path` configs.
Expand All @@ -72,16 +72,17 @@ You can list them by running the following command:

### MCP server options

| Option | Type | Required | Default | Description |
|-----------------------------------------------------------------------------------------------------------------|---------|----------|---------|------------------------------------------------------------------|
| `path` | string | Yes | | MCP server endpoint path (appended to SiteAccess-aware base URL) |
| `enabled` | boolean | No | `false` | Server state: decides whether it is enabled or disabled |
| `version` | string | No | `1.0.0` | MCP server version |
| [`description`](https://modelcontextprotocol.io/specification/2025-11-25/schema#implementation-description) | string | No | `null` | Server implementation description |
| [`instructions`](https://modelcontextprotocol.io/specification/2025-11-25/schema#initializeresult-instructions) | string | No | `null` | Prompt-like instructions provided to the AI agent |
| [`tools`](#tool-configuration) | string | No | `[]` | List of tool classes |
| <nobr>[`discovery_cache`](#discovery-cache)</nobr> | string | Yes | | PSR-6 or PSR-16 cache pool service identifier |
| [`session`](#session-storage) | object | Yes | | Session storage configuration |
| Option | Type | Required | Default | Description |
|-----------------------------------------------------------------------------------------------------------------|---------|----------|--------------------------------------------------------------------------|------------------------------------------------------------------|
| `path` | string | Yes | | MCP server endpoint path (appended to SiteAccess-aware base URL) |
| `enabled` | boolean | No | `false` | Server state: decides whether it is enabled or disabled |
| `version` | string | No | `1.0.0` | MCP server version |
| [`description`](https://modelcontextprotocol.io/specification/2025-11-25/schema#implementation-description) | string | No | `null` | Server implementation description |
| [`instructions`](https://modelcontextprotocol.io/specification/2025-11-25/schema#initializeresult-instructions) | string | No | `null` | Prompt-like instructions provided to the AI agent |
| [`tools`](#tool-configuration) | array | No | `[]` | List of tool classes |
| <nobr>[`discovery_cache`](#discovery-cache)</nobr> | string | Yes | | PSR-6 or PSR-16 cache pool service identifier |
| [`session`](#session-storage) | object | Yes | | Session storage configuration |
| [`allowed_hosts`](#allowed-hosts) | array | No | `[`<br><nobr>`'localhost',`</nobr><br>`'127.0.0.1',`<br>`'[::1]'`<br>`]` | Accepted `Host` headers |

!!! note "New servers are disabled by default"

Expand All @@ -106,20 +107,43 @@ There are two ways to associate tools with a server:

#### Built-in tools

MCP Servers LTS Update comes with the following built-in tools:

MCP Servers LTS Update comes with the following **experimental** built-in tools:

- `Ibexa\Mcp\Tool\ContentType\ContentTypeTools`
- `get_content_type` - gets a content type by its ID.
- `get_content_type_by_identifier` - gets a content type by its identifier.
- `get_content_type_list` - gets content types by their IDs.
- `create_content_type` - creates a content type draft.
- `get_content_type_draft` - gets a content type draft by content type ID.
- `publish_content_type_draft` - publishes a content type draft by content type ID.
- `Ibexa\Mcp\Tool\ContentType\FieldDefinitionTools`
- `add_field_definition` - adds a field definition to a content type draft.
- `update_field_definition` - updates a field definition in a content type draft.
- `remove_field_definition` - removes a field definition from a content type draft.
- `Ibexa\Mcp\Tool\ContentType\ContentTypeGroupTools`
- `get_content_type_groups` - gets all content type groups.
- `Ibexa\Mcp\Tool\TranslationTools`
- `list_languages` - lists all languages in the current SiteAccess
- `list_content_translations` - lists languages in which given content item has translations
- `list_languages` - lists all languages in the current SiteAccess.
- `list_content_languages` - lists languages which have translations for a given content item.
- `list_non_translated_content_ids` - lists IDs of content which have missing translations for a given language code.
- `Ibexa\Mcp\Tool\SeoTools`
- `get_non_seo_content_ids` - returns IDs of content items that are missing SEO optimization (no meta title tag)
- `get_non_seo_content_ids` - returns IDs of content items that are missing SEO optimization (no meta title tag). Useful for identifying content that needs SEO attention.

``` yaml hl_lines="5-7"
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 4, 7) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 9, 11) =]]
# …
```

!!! caution "Experimental tools"

The built-in tools are experimental and may change in future releases.
They are provided as examples of how to implement tools and how to configure them in an MCP server.
As-is, they may not cover all your needs or may not be practical to all AI agents.
If you use them, be prepared to update your MCP server configuration and tool usage when upgrading to a new version of [[= product_name =]].

See how to build your own tools in [Work with MCP servers](mcp_usage.md).

### Discovery cache

Discovery is cached to avoid scanning for capabilities on every request.
Expand All @@ -128,7 +152,7 @@ You must provide a PSR-6 or PSR-16 cache pool for this caching.
For example, you could set up a dedicated Redis/Valkey:

``` yaml
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 17, 17) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 19, 19) =]]
```

For a production cluster, it's recommended to use a Redis/Valkey cache pool so the cache can be shared by all nodes.
Expand Down Expand Up @@ -163,8 +187,8 @@ Optionally, you could use a more specific `prefix` option than the default `mcp_
Such setup is suitable for production environments.

``` yaml
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 18, 21) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 34, 43) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 20, 23) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 36, 45) =]]
```

#### File
Expand All @@ -176,5 +200,22 @@ Such setup is suitable for development environments.
In this example, sessions are stored in the `var/cache/<environment>/mcp/sessions/` directory (for example, `var/cache/dev/mcp/session/` for the `dev` environment, and `var/cache/prod/mcp/sessions/` for the `prod` environment):

``` yaml
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 23, 25) =]]
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 25, 27) =]]
```

### Allowed hosts

This parameter lists the domains, the `Host` headers, accepted by the MCP server.
The port is not part of the matching.
There is no wildcard character, all cases must be listed.
As item, you can use a hostname, an IP, or an IPv6.
IPv6 addresses must be bracketed, for example `[::1]`.

In this example, only requests from `admin.example.com` domain, `my-ddev-project.ddev.site` domain, or from 127.0.0.1 IP are accepted:

``` yaml
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 16, 16) =]]
- 'admin.example.com'
- '127.0.0.1'
- 'my-ddev-project.ddev.site'
```
10 changes: 7 additions & 3 deletions docs/ai/mcp/mcp_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ It accepts the following optional arguments:

- `servers` - array of server identifiers the tool is assigned to
<br>For more information, see [tools configuration](mcp_config.md#tool-configuration).
- `name` - tool name (if not set, function name is used)
- `name` - tool codename - if not set, function name is used
- `title` - tool title for user interfaces - if not set, the `name` is used
- `description` - tool description, used by AI agents to understand the tool's purpose
- `icons` - array of [`Mcp\Schema\Icon`](https://github.com/modelcontextprotocol/php-sdk/blob/main/src/Schema/Icon.php) instances
<br>For more information, see the [`icons` specification](https://modelcontextprotocol.io/specification/latest/basic/index#icons).
Expand All @@ -52,7 +53,8 @@ Methods that return a prompt are marked with the [`Ibexa\Contracts\Mcp\Attribute
It accepts several arguments that describe how the prompt is used:

- `servers` - array of server identifiers exposing this prompt - required for prompts
- `name` (optional) - prompt name - if not set, method name is used
- `name` (optional) - prompt codename - if not set, method name is used
- `title` (optional) - prompt title - if not set, `name` is used
- `description` (optional) - human-readable prompt description
- `icons` (optional) - array of [`Mcp\Schema\Icon`](https://github.com/modelcontextprotocol/php-sdk/blob/main/src/Schema/Icon.php) instances
<br>For more information, see the [`icons` specification](https://modelcontextprotocol.io/specification/latest/basic/index#icons).
Expand Down Expand Up @@ -97,6 +99,8 @@ In a new `config/packages/mcp.yaml` file, define a new MCP server for the `defau
[[= include_code('code_samples/mcp/config/packages/mcp.yaml') =]]
```

Adapt the `allowed_hosts` to your case, for example, if you want to use the DDEV `.ddev.site` domain instead of its `127.0.0.1` address equivalent.

An `ibexa.mcp.example` route is now available:

```bash
Expand Down Expand Up @@ -242,7 +246,7 @@ Get the [list of prompts](https://modelcontextprotocol.io/specification/latest/s
### Perform MCP Inspector test

You can test your server with the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector).
You can even use the inspector as a DDEV add-on with [`craftpulse/ddev-mcp-inspector`](https://github.com/craftpulse/ddev-mcp-inspector).
You can even use the inspector as a DDEV add-on with [`michtio/ddev-mcp-inspector`](https://github.com/michtio/ddev-mcp-inspector).
You still need to ask for a JWT token through REST or GraphQL APIs, and use it in the MCP Inspector configuration to connect to the server.

You can use a Web interface to obtain the JWT token:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/ibexa/admin-ui/blob/main/src/contracts/Autosave/AutosaveServiceInterface.php" title="" class="source-github">
<a href="https://github.com/ibexa/admin-ui/blob/5.0/src/contracts/Autosave/AutosaveServiceInterface.php" title="" class="source-github">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"></path></svg>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/ibexa/admin-ui/blob/main/src/contracts/Component/Renderable.php" title="" class="source-github">
<a href="https://github.com/ibexa/admin-ui/blob/5.0/src/contracts/Component/Renderable.php" title="" class="source-github">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"></path></svg>
</div>
Expand Down
Loading
Loading