{"id":392014,"date":"2026-11-01T05:13:02","date_gmt":"2026-11-01T05:13:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/agent-token\/"},"modified":"2026-11-01T05:12:53","modified_gmt":"2026-11-01T05:12:53","slug":"keypaw","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/keypaw\/","author":23591547,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Keypaw","header_author":"","header_description":"Give your AI agent a single, revocable token for the WordPress REST API. The token is sent in a custom header (X-Agent-Token) over HTTPS and acts as a WordPress user you choose. No username and password pairs, no Basic Auth.","assets_banners_color":"0e1e54","last_updated":"2026-11-01 05:12:53","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/aitoken","header_plugin_uri":"https:\/\/github.com\/marsdream\/agent-token","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":140,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"marsdream","date":"2026-11-01 05:12:53","revision":3777555}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3777585,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3777585,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3777585,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3777585,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings \u2192 Keypaw: generate a token, choose the mapped user, revoke in one click.","2":"A freshly generated token with its copy-paste agent setup snippet (shown once).","3":"The public agent discovery manifest, as seen by an agent connecting for the first time."}},"plugin_section":[],"plugin_tags":[2353,1556,710,23853,333],"plugin_category":[38],"plugin_contributors":[289982],"plugin_business_model":[],"class_list":["post-392014","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-api","plugin_tags-authentication","plugin_tags-rest-api","plugin_tags-token","plugin_category-authentication","plugin_contributors-marsdream","plugin_committers-marsdream"],"banners":{"banner":"https:\/\/ps.w.org\/keypaw\/assets\/banner-772x250.png?rev=3777585","banner_2x":"https:\/\/ps.w.org\/keypaw\/assets\/banner-1544x500.png?rev=3777585","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/keypaw\/assets\/icon-128x128.png?rev=3777585","icon_2x":"https:\/\/ps.w.org\/keypaw\/assets\/icon-256x256.png?rev=3777585","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Your AI assistant needs to work in WordPress: draft posts, review content, update pages. To do that through the REST API, it needs credentials.<\/p>\n\n<p>The built-in option, Application Passwords, was designed for humans pasting a username and password pair into an app once. AI agents don't work that way:<\/p>\n\n<ul>\n<li><strong>Agent credential vaults store one secret, not two.<\/strong> Most agent platforms (including Muse's custom connectors) have a single API-key field. An Application Password is a username <em>plus<\/em> a password \u2014 it simply does not fit, and the connection gets refused.<\/li>\n<li><strong>Application Passwords rely on Basic Auth.<\/strong> Many shared and managed hosts strip or block the Authorization header, so perfectly valid credentials fail with no useful error.<\/li>\n<li><strong>One leaked password pair is hard to scope.<\/strong> You end up handing an agent credentials tied to a real user account, and revoking means digging through profile pages.<\/li>\n<\/ul>\n\n<p><strong>Keypaw takes a different approach: one token, built for agents.<\/strong><\/p>\n\n<ul>\n<li>Generate a token in Settings \u2192 Keypaw. It is shown <strong>once<\/strong>; only its SHA-256 hash is stored.<\/li>\n<li>Map the token to a dedicated WordPress user you choose (for example, an Editor account created just for your agent). The token can do exactly what that user can do \u2014 no more.<\/li>\n<li>Your agent sends the token in a simple header (<code>X-Agent-Token<\/code>) over HTTPS. No Basic Auth, no username, nothing else to configure.<\/li>\n<li>Rotate or revoke the token in one click whenever you want \u2014 the old token stops working instantly.<\/li>\n<li><strong>Agent self-discovery:<\/strong> the plugin publishes a small public manifest (<code>\/wp-json\/keypaw\/v1\/manifest<\/code>) describing how to connect \u2014 header name, site URL, and the mapped account's capabilities. Point your agent at your site and it can figure out the rest.<\/li>\n<li><strong>Copy-paste setup:<\/strong> when you generate a token, the plugin gives you a ready-made setup snippet. Paste it to your agent and it is connected.<\/li>\n<\/ul>\n\n<p>Security by design: HTTPS only, hashed storage, constant-time comparison, no telemetry, no external calls, and nothing is authenticated when no token is configured. The plugin adds no public write endpoints of its own \u2014 it only authenticates standard REST API requests as the user you mapped.<\/p>\n\n<p>Born in production: Keypaw was written because an AI assistant reviewing drafts on a real site could not use Application Passwords at all. It has run that workflow daily since.<\/p>\n\n<p>Note: if your tooling can use Application Passwords (local scripts, your own server code), they remain a fine built-in option. Keypaw exists for the growing number of agent platforms that cannot.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>keypaw<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it via the WordPress plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>(Recommended) Create a dedicated user for your agent, with the smallest role it needs (Editor is typical), under Users \u2192 Add New.<\/li>\n<li>Go to Settings \u2192 Keypaw, pick the mapped user, and click \"Generate token\".<\/li>\n<li>Copy the token and the setup snippet immediately \u2014 the token is shown only once \u2014 and paste them into your agent's credential vault \/ connector settings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20secure%3F\"><h3>Is this secure?<\/h3><\/dt>\n<dd><p>The token is a 48-character random string (about 285 bits of entropy). Only its SHA-256 hash is stored in your database, comparison is constant-time, and tokens are only honoured over HTTPS. A database leak does not leak usable tokens. Revocation is instant and per-token.<\/p><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20application%20passwords%3F\"><h3>How is this different from Application Passwords?<\/h3><\/dt>\n<dd><p>Application Passwords are a username + password pair authenticated via Basic Auth. Keypaw is a single secret sent as a header, designed to fit agent platforms' single-key credential stores and to avoid hosts that block Basic Auth. See the Description for the full comparison.<\/p><\/dd>\n<dt id=\"can%27t%20my%20agent%20just%20log%20in%20with%20my%20username%20and%20password%3F\"><h3>Can't my agent just log in with my username and password?<\/h3><\/dt>\n<dd><p>A saved login serves a browser clicking through wp-admin like a human \u2014 it has to pass the full login flow (including two-factor prompts) every session, and it cannot feed anything else. API connectors, cron jobs, and other headless tools never see a browser; what they can store is a single API secret. A token authenticates REST API calls directly, at any hour, with no login ceremony \u2014 and unlike your password, it cannot be used to sign in to wp-admin at all. Use saved logins for clicking; use a token for unattended API work.<\/p><\/dd>\n<dt id=\"which%20agents%20does%20it%20work%20with%3F\"><h3>Which agents does it work with?<\/h3><\/dt>\n<dd><p>Any agent or tool that can call the REST API with a custom header: Muse custom connectors, MCP-based tools, local automation scripts, and similar. The public manifest endpoint lets conforming agents discover the connection details automatically.<\/p><\/dd>\n<dt id=\"what%20can%20an%20agent%20do%20with%20a%20token%3F\"><h3>What can an agent do with a token?<\/h3><\/dt>\n<dd><p>Exactly what the mapped WordPress user can do, via the standard REST API. Map the token to a low-privilege dedicated account to keep the blast radius small. The plugin itself grants no extra permissions.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20or%20uninstall%20the%20plugin%3F\"><h3>What happens if I deactivate or uninstall the plugin?<\/h3><\/dt>\n<dd><p>All tokens stop working immediately. Uninstalling removes the plugin's settings from the database.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Not yet. Version 1.0 targets single-site installs.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20phone%20home%20or%20collect%20data%3F\"><h3>Does the plugin phone home or collect data?<\/h3><\/dt>\n<dd><p>No. There are no external requests, no analytics, and no telemetry of any kind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Single revocable token mapped to a chosen WordPress user.<\/li>\n<li>SHA-256 hashed storage, HTTPS-only header authentication.<\/li>\n<li>Public agent discovery manifest and copy-paste setup snippets.<\/li>\n<\/ul>","raw_excerpt":"Give your AI agent a single, revocable token for the WordPress REST API \u2014 no username and password pairs, no Basic Auth.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/392014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=392014"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/marsdream"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=392014"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=392014"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=392014"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=392014"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=392014"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=392014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}