Tool Bundles
A tool bundle is a named, developer-defined capability pack. It groups a combination of skills, SDK tools, Pimcore MCP tool groups, Pimcore MCP meta-groups, and rich-chat widgets under one name, so a person configuring an agent can add the whole known-good combination in one click instead of picking each item separately.
Why bundles exist
An agent's capabilities are six independent multiselects (skills, includeSdkTools, pimcoreMcpServers,
pimcoreMetaGroups, richChatWidgets, allowedFileStagingSets), and some tasks only work when a specific
combination is present. For example, proposing data object updates needs the data-object-proposals skill together
with both the pimcore-data-objects-read and pimcore-data-objects-write MCP tool groups - missing any one of them
leaves the agent unable to complete the task, and which items belong together is not obvious from the multiselects
alone. A tool bundle captures that combination once, under a name, so it can be reused across agents.
Defining a bundle
Bundles are declared under pimcore_agent.tool_bundles, a map keyed by bundle name, directly in Symfony
configuration:
pimcore_agent:
tool_bundles:
document-template-editing:
displayName: 'Document Template Editing'
description: 'Create and update Pimcore document templates.'
skills: [general, document-template-generation]
includeSdkTools: [edit]
pimcoreMcpServers: [pimcore-agent-templates, pimcore-documents-read, pimcore-documents-write]
displayName and description are raw strings, the same as agent and skill descriptions - there is no translation
involved. Every list field defaults to [] when omitted, so a bundle only needs to declare the fields it actually
contributes to.
Bundles are developer/config-defined only. There is no Pimcore Studio editor for creating, editing, or deleting a bundle definition - Pimcore Studio only lets you select existing bundles on an agent (see The Tool Bundles picker in Pimcore Studio below).
Field reference
| Field | Type | Default | Meaning |
|---|---|---|---|
displayName | string | required | Label shown in the Tool Bundles picker and in the "Included via bundles" preview. |
description | string | '' | Short description shown next to the bundle in the picker. |
skills | string[] | [] | Skill names this bundle contributes. See Skills. |
includeSdkTools | string[] | [] | SDK tools this bundle contributes. See Tool Security Reference. |
pimcoreMcpServers | string[] | [] | Direct Pimcore MCP tool group names this bundle contributes. See MCP Servers. |
pimcoreMetaGroups | string[] | [] | Meta-tool Pimcore group names this bundle contributes. See MCP Servers. |
richChatWidgets | string[] | [] | Rich chat widget identifiers this bundle contributes. See Features → Rich Chat Widgets. |
What a bundle does not cover
Two capability fields stay out of bundles by design and remain manual, per-agent settings: third-party mcpServers
(inline external connection objects) and allowedFileStagingSets. Bundles cover the combination that is hardest to
get right by hand - skills, SDK tools, and Pimcore MCP groups/meta-groups - plus rich-chat widgets; external MCP
servers and file staging keep their existing manual configuration.
Referencing bundles from an agent
An agent adds bundles by name in a new toolBundles list, alongside any of its existing manual selections:
name: data-management
displayName: Data Management
description: Search and edit Pimcore data.
toolBundles: # Bundle names. See 04_Configuration/11_Tool_Bundles.md
- data-management
- general-data-search
skills: # Manual picks still work alongside bundles
- general
pimcoreMcpServers:
- pimcore-tags-read # A manual addition on top of what the bundles contribute
Manual selections and bundle selections are independent and additive - an agent can carry both at once, and removing a bundle does not remove a manually picked item that happens to overlap with it.
Expansion at export
The agent-server has no bundle concept: it only ever consumes the flat skills / includeSdkTools /
pimcoreMcpServers / pimcoreMetaGroups / richChatWidgets arrays. The expansion from toolBundles into those flat
arrays happens entirely on the Pimcore PHP side, at export (GET …/configurations/export):
- Every name in an agent's
toolBundleslist is resolved against the tool-bundle registry. - Each resolved bundle's five capability lists are unioned into the agent's own flat arrays, deduplicated. The
effective set for each field is
union(selected bundles' contents) ∪ manual selections. - Unknown bundle names are ignored, the same way an unknown skill name is silently dropped.
- The
toolBundlesfield itself is removed from the exported agent - it never reaches the agent-server. - Expansion runs before file-staging auto-registration, so a bundle that contributes the
pimcore-agent-templatesMCP server still triggers auto-registration of the file-staging tool group correctly.
Because expansion happens at export rather than being merged into the stored form fields, bundles are all-or-nothing: there is no way to subtract a single item a bundle contributes while keeping the rest of that bundle. To exclude one item, configure the agent manually instead of through a bundle for that capability.
The Tool Bundles picker in Pimcore Studio
Open an agent in System → Pimcore Agent → Agent Configuration and switch to the Tools & Skills tab. A
Tool Bundles multiselect sits at the top of the tab, listing every bundle's displayName. Selecting one or more
bundles reveals a read-only Included via bundles preview directly below it: the union of the selected bundles'
skills, SDK tools, MCP groups, meta-groups, and rich-chat widgets, grouped and labelled the same way the manual
multiselects label their own options (skill chips carry a (system) / (custom) source suffix, MCP group chips
show their tool count).
The preview is informational only - it shows what the bundle chips contribute without writing those items into the
manual multiselects below. The existing manual multiselects (SDK Tools, Skills, Pimcore MCP Servers (Direct),
Pimcore Meta Groups, Rich Chat Widgets) remain fully editable and unaffected by bundle selection; both sets union
at export as described above.
Overriding a shipped bundle
A bundle entry is a whole node, not a set of independently mergeable fields. To override a shipped bundle (from the
Pimcore Agent Bundle itself or from another bundle), define a bundle with the same name in your own project
configuration, for example config/packages/pimcore_agent.yaml. The project's definition replaces the shipped one
entirely rather than deep-merging list by list, so the override must repeat every field it wants to keep, not only
the fields it wants to change.
Unlike agents and skills, tool bundles have no Pimcore Studio CRUD layer - there is no administrator-editable copy that sits above container config. The only two sources are bundle-shipped config and project config, and a same-name definition in project config always wins.
Shipping a bundle from your own bundle
A bundle author ships tool bundles the same way the Pimcore Agent Bundle ships its own: declare
pimcore_agent.tool_bundles inside the auto-loaded config/pimcore/config.yaml (or the optional-dependency
prepend() pattern for a bundle that does not require PimcoreAgentBundle) described in
Shipping Presets. There is no separate paths registration key for bundles - the map is
declared inline under pimcore_agent.tool_bundles, directly alongside pimcore_agent.agents.paths and
pimcore_agent.skills.paths in the same file.
Shipped presets
The Pimcore Agent Bundle ships four curated bundles out of the box:
| Bundle | Display name | Contents |
|---|---|---|
data-management | Data Management | skills: pql-search, general, summarize, data-object-proposals, asset-metadata-proposals, tag-proposals; includeSdkTools: ask_user; pimcoreMcpServers: pimcore-data-objects-read, pimcore-data-objects-write, pimcore-assets-read, pimcore-assets-write, pimcore-tags-read, pimcore-tags-write; richChatWidgets: pimcore_open_element, show_data_object_preview, show_asset_preview, show_data_table |
document-editing | Document Editing | skills: document-editing, general, pql-search; includeSdkTools: ask_user; pimcoreMcpServers: pimcore-assets-read, pimcore-data-objects-read, pimcore-documents-read, pimcore-documents-write; richChatWidgets: pimcore_open_element, show_data_object_preview, show_asset_preview |
document-template-editing | Document Template Editing | skills: general, document-template-generation; includeSdkTools: edit; pimcoreMcpServers: pimcore-agent-templates, pimcore-documents-read, pimcore-documents-write |
general-data-search | General Data Search | skills: pql-search, general, summarize; pimcoreMcpServers: pimcore-data-objects-read, pimcore-assets-read, pimcore-documents-read; pimcoreMetaGroups: pimcore-tags-read; richChatWidgets: pimcore_open_element, show_data_object_preview, show_asset_preview, show_data_table |
Related docs
- Agents →
toolBundlesfield - Skills - the
skillsfield a bundle can contribute to. - MCP Servers - the
pimcoreMcpServers/pimcoreMetaGroupsfields a bundle can contribute to. - Tool Security Reference - the
includeSdkToolscatalog a bundle can contribute to. - Shipping Presets - the same auto-loaded
config.yamlmechanism, used to ship a bundle.