[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"journal-post-summercms-0-5-0":3},{"author":4,"categories":8,"content":13,"content_html":14,"created_at":15,"excerpt":16,"featured_image_url":13,"featured_images":17,"id":18,"is_pinned":19,"metadata":13,"next_post":20,"previous_post":24,"published":28,"published_at":29,"reading_time":10,"related_posts":30,"slug":31,"sources":13,"tags":32,"title":33,"translations":13,"updated_at":34},{"first_name":5,"id":6,"last_name":5,"login":7},"",1,"jakubzych@gmail.com",[9],{"id":10,"name":11,"slug":12},2,"Framework","framework",null,"\u003Ch2>Highlights\u003C\u002Fh2>\n\u003Cp>The MCP module is complete. With the account link, the OAuth consent and plugin tools, one \u003Ccode>\u002Fmcp\u003C\u002Fcode> 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 \u003Ccode>summercms_mcp\u003C\u002Fcode> build tag and served only with \u003Ccode>mcp.enabled\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Released together:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>sm-user-plugin v0.1.11\u003C\u002Fli>\n\u003Cli>sm-oauthserver-plugin v0.1.3\u003C\u002Fli>\n\u003Cli>sm-journal-plugin v0.2.4\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Added\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Fresh sign-in proof.\u003C\u002Fstrong> \u003Ccode>auth_time\u003C\u002Fcode> is 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.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Member token scopes from plugins.\u003C\u002Fstrong> Plugins declare them through \u003Ccode>pact.HasFrontendTokenScopes\u003C\u002Fcode>. \u003Ccode>ValidTokenScopeName\u003C\u002Fcode> is the shared naming rule, and a padded or malformed name fails at boot.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Write-directing prompts.\u003C\u002Fstrong> \u003Ccode>MCPPrompt.Writes\u003C\u002Fcode> marks a prompt that leads to writes, and it is listed only for read-and-write grants.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Organisation logos\u003C\u002Fstrong> in the user plugin. Revoking access (ban, password reset or change) now also revokes OAuth and MCP grants.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Changed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>A backend MCP grant acts only as the administrator its consent named.\u003C\u002Fli>\n\u003Cli>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.\u003C\u002Fli>\n\u003Cli>A personal token whose scopes no longer resolve gets its own error instead of \"account unknown\".\u003C\u002Fli>\n\u003Cli>The Redis MCP session store needs a standalone Redis. Redis Cluster is not supported.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Fixed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>MCP sessions:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>Session slots are reserved atomically.\u003C\u002Fli>\n\u003Cli>Expired stateful sessions are reaped.\u003C\u002Fli>\n\u003Cli>A request still in flight can't write back an ended session.\u003C\u002Fli>\n\u003Cli>Event fan-out no longer waits on session locks under the router lock.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MCP tool lists:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>A returning client whose grant got wider sees the new tools.\u003C\u002Fli>\n\u003Cli>A temporary guard error no longer narrows a session's tool list.\u003C\u002Fli>\n\u003Cli>A shared stateless server no longer flips its tool set between callers.\u003C\u002Fli>\n\u003Cli>Evicting idle servers spares those with a live listen stream.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MCP dispatch:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>Path values the router would never deliver are refused.\u003C\u002Fli>\n\u003Cli>A \u003Ccode>tools\u002Fcall\u003C\u002Fcode> without arguments is treated as an empty object.\u003C\u002Fli>\n\u003Cli>Prompt rendering errors no longer leak into the client's answer.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Admin:\u003C\u002Fstrong>\n\u003Cul>\n\u003Cli>My account action links refuse \u003Ccode>javascript:\u003C\u002Fcode>, \u003Ccode>data:\u003C\u002Fcode>, protocol-relative and control-character URLs.\u003C\u002Fli>\n\u003Cli>A failing account section no longer breaks the others.\u003C\u002Fli>\n\u003Cli>Save shortcuts commit a draft inside a custom field type's shadow root.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n","2026-10-24T04:34:17+00:00","The MCP module is complete: one \u002Fmcp endpoint serves an administrator's backend tools and the frontend user's tools, with the account link, OAuth consent and plugin tools.",[],40,false,{"id":21,"slug":22,"title":23},39,"summercms-0-4-4","SummerCMS 0.4.4",{"id":25,"slug":26,"title":27},41,"sm-mfa-plugin-0-1-1","sm-mfa-plugin 0.1.1",true,"2026-10-24T04:31:40+00:00",[],"summercms-0-5-0",[],"SummerCMS 0.5.0","2026-10-29T10:18:07+00:00"]