Content Capabilities
Content Banks Visibility
Content Banks visibility is controlled by the MIC descriptor field bankSurface. It tells MyronCMS whether a MIC type should appear as an owned bank, a picker that links elsewhere, or a toolbar-only insertion type.
This is an advanced current surface because extension resolvers can declare visibility and the Content Banks route reads those descriptors. It is not a generic extension CRUD generator.
Human Path
A developer sets bankSurface in the resolver descriptor. An administrator then sees the registered type in Content Banks according to that descriptor after the extension is loaded.
For picker surfaces, the Content Banks tab links to the parent surface where entries are managed.
AI Path
An AI coding agent can set the descriptor locally while authoring the resolver.
An installed AI client with content.read can inspect registered type descriptors through /api/v1/content/mics/types and through MCP discovery when the action is visible to that caller. The browser Content Banks UI remains a human/admin surface, not a direct MCP operation.
Visibility Values
bankSurface | Current behavior | Use when |
|---|---|---|
editor | Declares that the type is an editor-owned bank surface. Core Tables and Forms have current editor surfaces. Extension authors should not treat this as automatic generic CRUD unless their own UI/actions provide it. | The content type has a real editor surface under the current system. |
picker | Content Banks lists the type and provides a link to parentSurfaceUrl. Entries are managed in the parent surface. | The extension owns authoring elsewhere, such as an extension admin route. |
none | The type is omitted from Content Banks tabs. It may still be discoverable for rich-text insertion where the toolbar allows it. | The type is toolbar-only or not appropriate for a bank tab. |
picker requires parentSurfaceUrl. The registry rejects picker descriptors without it.
Descriptor Example
public function describe(): array
{
return [
'slug' => 'x.my_vendor.catalog',
'label' => 'Catalog Item',
'description' => 'Reusable catalog block.',
'icon' => 'box',
'scopes' => [MyronApiScopes::CONTENT_READ],
'bankSurface' => 'picker',
'parentSurfaceUrl' => $this->sdk->buildAdminUrl('x.my_vendor.catalog'),
];
}
Scopes
The type listing action requires content.read. Descriptor scopes should state what the MIC type needs for safe use. Managing entries in a parent surface may require additional route guards or action scopes; document those on the admin route or action page.
Artifacts
Descriptor source:
MicElementResolverInterface::describe()MicElementRegistry::normalizeDescriptor()
Runtime surfaces:
- Content Banks route
/api/v1/content/mics/types- MCP-visible type listing action for scoped callers
Safety Boundary
Do not use bankSurface: editor to imply that MyronCMS will automatically create extension-owned list, edit, create, duplicate, or delete screens. Current extension-safe behavior is descriptor registration plus rendering/discovery. Extension-owned authoring should be documented as an admin route, action set, or parent surface.
Do not hide a type from Content Banks with none and then claim it is undiscoverable everywhere. none controls the bank tab, not all runtime descriptor listing.
Verification
Run:
php app/tests/verify-content-banks-mic.php
php app/tests/verify-mic-registry.php
Verify:
editor,picker, andnonenormalize as accepted values,- picker without
parentSurfaceUrlis rejected, - Content Banks omits
nonetypes from tabs, - Content Banks renders a picker tab and parent link for picker types,
/api/v1/content/mics/typesreturns registered descriptors for scoped callers.
Failure Modes
| Failure | What it means | Safe response |
|---|---|---|
| Picker registration rejected | parentSurfaceUrl is missing. | Add the parent URL or use none. |
| Type does not appear in Content Banks | bankSurface is none, extension did not load, or the type is core-special-cased. | Check descriptor, load state, and Content Banks rules. |
| Tab appears but cannot manage entries | Picker surfaces intentionally link to parent authoring. | Implement or link the parent surface. |
| AI client expects to operate the UI | Content Banks is browser/admin mediated. | Use documented API/MCP discovery and extension actions instead. |
| Generic CRUD is assumed for extensions | Unsupported current behavior. | Document explicit admin routes or scoped actions for entry management. |