Highlights
The MCP module is complete. With the account link, the OAuth consent and plugin tools, one /mcp endpoint serves an MCP client both an administrator's backend tools and the frontend user's own tools, filtered per grant and per permission. The module stays opt-in: it is compiled only with the summercms_mcp build tag and served only with mcp.enabled.
Released together:
- sm-user-plugin v0.1.11
- sm-oauthserver-plugin v0.1.3
- sm-journal-plugin v0.2.4
Added
- Fresh sign-in proof.
auth_timeis stamped at sign-in and kept unchanged through every refresh. Flows such as linking a frontend account to an administrator can require a sign-in made after the request. - Member token scopes from plugins. Plugins declare them through
pact.HasFrontendTokenScopes.ValidTokenScopeNameis the shared naming rule, and a padded or malformed name fails at boot. - Write-directing prompts.
MCPPrompt.Writesmarks a prompt that leads to writes, and it is listed only for read-and-write grants. - Organisation logos in the user plugin. Revoking access (ban, password reset or change) now also revokes OAuth and MCP grants.
Changed
- A backend MCP grant acts only as the administrator its consent named.
- Revoking a token or an OAuth client ends only that token's or that client's MCP sessions. Guard checks see the client address, including when a long-lived stream re-checks its bearer.
- A personal token whose scopes no longer resolve gets its own error instead of "account unknown".
- The Redis MCP session store needs a standalone Redis. Redis Cluster is not supported.
Fixed
- MCP sessions:
- Session slots are reserved atomically.
- Expired stateful sessions are reaped.
- A request still in flight can't write back an ended session.
- Event fan-out no longer waits on session locks under the router lock.
- MCP tool lists:
- A returning client whose grant got wider sees the new tools.
- A temporary guard error no longer narrows a session's tool list.
- A shared stateless server no longer flips its tool set between callers.
- Evicting idle servers spares those with a live listen stream.
- MCP dispatch:
- Path values the router would never deliver are refused.
- A
tools/callwithout arguments is treated as an empty object. - Prompt rendering errors no longer leak into the client's answer.
- Admin:
- My account action links refuse
javascript:,data:, protocol-relative and control-character URLs. - A failing account section no longer breaks the others.
- Save shortcuts commit a draft inside a custom field type's shadow root.
- My account action links refuse