[{"data":1,"prerenderedAt":24},["ShallowReactive",2],{"doc:en:plugins\u002Fstore-mcp":3},{"title":4,"lede":5,"html":6,"headings":7},"Manage your plugins from an agent","The store has an MCP server, https:\u002F\u002Fstore.escouade.dev\u002Fmcp: an agent (Claude Code, or any MCP client) submits your versions there, follows their checks, publishes them and manages your plugins, connected to your account by OAuth. Signing and revocation are not there.","\u003Ch2 id=\"connect-it\">Connect it\u003C\u002Fh2>\n\u003Cp>In Claude Code:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sh\">claude mcp add --transport http escouade-store https:\u002F\u002Fstore.escouade.dev\u002Fmcp\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Then \u003Ccode class=\"key\">\u002Fmcp\u003C\u002Fcode> in Claude Code, and “Authenticate” on \u003Ccode class=\"key\">escouade-store\u003C\u002Fcode>. Another MCP client takes the same address, over Streamable HTTP: it finds the authorization server on its own (RFC 9728, RFC 8414), registers (RFC 7591) and connects with PKCE.\u003C\u002Fp>\n\u003Ch2 id=\"the-first-connection\">The first connection\u003C\u002Fh2>\n\u003Col>\n\u003Cli>The browser opens on the store, then on GitHub: the same sign-in as on the site, through the “Escouade Store” App.\u003C\u002Fli>\n\u003Cli>A consent page, in French or English after your browser, says the client (the name it gives itself, which the store does not check), your account and what it will be able to do. You allow or refuse.\u003C\u002Fli>\n\u003Cli>The client gets a token of one hour, good for \u003Ccode>https:\u002F\u002Fstore.escouade.dev\u002Fmcp\u003C\u002Fcode> alone, and a refresh token of 30 days that changes at each use. The store keeps their hash only.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"what-it-allows\">What it allows\u003C\u002Fh2>\n\u003Cp>With the \u003Ccode class=\"key\">author\u003C\u002Fcode> scope, every account’s:\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">list_repositories\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>your repositories where the App is installed, and your last submissions\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">list_folders\u003C\u002Fcode>, \u003Ccode class=\"key\">list_tags\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the folders of a repository that hold a manifest, the tags of a folder\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">submit_version\u003C\u002Fcode>, \u003Ccode class=\"key\">get_version\u003C\u002Fcode>, \u003Ccode class=\"key\">retry_checks\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>submit a tag of a folder, follow its eleven checks, run them again when the store or GitHub failed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">publish_version\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>publish: the categories of a first version, “Ask for the review” (yes by default), new tags published on their own\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">list_plugins\u003C\u002Fcode>, \u003Ccode class=\"key\">get_plugin\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>your plugins, their versions and their state, the versions waiting for a click\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">yank_version\u003C\u002Fcode>, \u003Ccode class=\"key\">dismiss_version\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>yank a published version, set aside a waiting one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">set_listed\u003C\u002Fcode>, \u003Ccode class=\"key\">set_auto_publish\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>unlist a plugin (or list it again), publish its new tags on their own\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">change_source\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>move a plugin to another repository of yours or another folder, by submitting its next version there\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Each tool goes through the same code as the site: the same checks, the same limits, the same refusals. A refusal comes back as an error of the tool, with its code (\u003Ccode class=\"key\">not-yours\u003C\u002Fcode>, \u003Ccode class=\"key\">path-parent\u003C\u002Fcode>, \u003Ccode class=\"key\">categories\u003C\u002Fcode>, \u003Ccode class=\"key\">id-differs\u003C\u002Fcode>…).\u003C\u002Fp>\n\u003Cp>The \u003Ccode class=\"key\">review\u003C\u002Fcode> scope (read the review queue, a version and its report, post a report) is given only to the store’s administrators, asked apart on the consent page. Another account that asks for it gets \u003Ccode class=\"key\">author\u003C\u002Fcode> alone.\u003C\u002Fp>\n\u003Ch2 id=\"what-it-never-does\">What it never does\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Sign, revoke, touch a key.\u003C\u002Fstrong> A version’s signature and the revocation list are made on the administrator’s machine, with the key that never leaves it (\u003Ccode>npm run plugin-review -- sign\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>Give a GitHub token, a secret or an internal address; write to a repository; act for another account than the one that consented.\u003C\u002Fli>\n\u003Cli>Pass off what a plugin wrote as an instruction. A README, a manifest, a folder’s name or a report a tool returns comes between \u003Ccode class=\"key\">&lt;third_party_data&gt;\u003C\u002Fcode> and \u003Ccode class=\"key\">&lt;\u002Fthird_party_data&gt;\u003C\u002Fcode>, announced as data to read: the agent does not follow an instruction found there.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"disconnect-a-client\">Disconnect a client\u003C\u002Fh2>\n\u003Cp>In your account on the store, “Connected apps” shows each client you allowed, its scopes, the date of its last use and its last actions. “Disconnect” stops its tokens at once. Each action of a tool is noted in your journal, “by an MCP client”, with the client’s name. Deleting your account erases all its authorizations.\u003C\u002Fp>\n\u003Cp>See also \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpublishing\u002F\">Publishing on the store\u003C\u002Fa> for the eleven checks and their refusals.\u003C\u002Fp>\n",[8,12,15,18,21],{"id":9,"text":10,"depth":11},"connect-it","Connect it",2,{"id":13,"text":14,"depth":11},"the-first-connection","The first connection",{"id":16,"text":17,"depth":11},"what-it-allows","What it allows",{"id":19,"text":20,"depth":11},"what-it-never-does","What it never does",{"id":22,"text":23,"depth":11},"disconnect-a-client","Disconnect a client",1793889382521]