All notable changes to the AgentStack Cursor plugin are documented here. Format: Keep a Changelog.
- Plugin MCP in the panel:
plugin.jsonmcpServers: "./mcp.json"(Figma-style path string) plus URL-onlyplugins/agentstack/mcp.json(noAuthorization). Click Connect — G-A174 login on prod. Device Code still writes~/.cursor/mcp.jsonfor hooks. /agentstack-status+ sessionStart card: every chat shows who is signed in, pin, caps, JWT expiry (GET /api/auth/mefor name/email; MCPauth.get_profileis user_id-only). No extra login questions.
- MCP absent from the plugin package (0.4.17 over-corrected G-A162). Empty
${AGENTSTACK_ACCESS_TOKEN}remains forbidden. - Init/diagnose used dead
/api/auth/whoami. Everyday smoke isauth.get_profile, notsystem.ping. - Old Configure API-key form: removed
plugin.jsonvariables.AGENTSTACK_ACCESS_TOKEN. Sign-in is Connect + Device Code; status is the sessionStart card //agentstack-status.
- Validators / diagnose / refresh require OAuth-safe plugin MCP;
--fixsyncsmcp.jsoninstead of deleting it.
/agentstack-authorize: one-shot Device Code sign-in (no API key, default full scopes). Cursor plugins have no webview Connect button; this slash command is the auth control.sessionStartadditional_context: when unsigned, placeholder token, orservice_caps=null, inject/agentstack-authorizeinto the conversation. Hook stdout is now a single JSON object (logs on stderr) so Cursor can apply the context.- sessionStart auto Device Code: Cursor hook (
--from-hook) spawnsdevice-code.mjswhen the auth gate needs login. Single-flight lock~/.cursor/agentstack-device.lock. Tests/diagnose do not pass--from-hook. Opt out:AGENTSTACK_DISABLE_AUTO_LOGIN=1. - Tenant pin file is live:
~/.cursor/agentstack-projectis read by Device Code and sessionStart (readPinnedTenantProjectId). Ecosystem1is ignored. - Normalize scrubs ecosystem
X-Project-ID=1(same helper as Device Code Bearer apply).agentstackAuthHeadersno longer forwards pid1. refresh-cursor-runtime --fixsyncs the auth slice (hooks + Device Code + kernel) into Cursor marketplace cache so auto-login is not stuck on 0.4.16.- Capability snapshot SoT: Device Code, sessionStart, capability-refresh, and diagnose
--seed-snapshotsharewriteTenantCapabilitySnapshotin plugin-kernel (no per-hook JSON shape).
- Diagnose was green while execute was dead (G-A171):
tools/listis public-shaped; prod still rejects JWTservice_caps=nullontools/call. Diagnose now peeks JWT caps (no secret), probessystem.ping, and prints the MCP error text. Device Code no longer overwrites a tenantX-Project-IDwith ecosystem1. - Scope-map test pointed at the pre-2.6
hooks/scripts/device-code.mjspath (file gone). Atlas generepo.plugins.oauth_device_code.gen1now runstest_device_code_scope_map.py. test-device-code.ps1used the same stale plugin-roothooks/path; Device Code e2e script now runsplugins/agentstack/hooks/scripts/device-code.mjs. Token grant is a long-lived PAT (norefresh_token) — FLOW.md matches.
- Plugin MCP shadowed user key (G-A162): Cursor auto-registers
plugins/agentstack/mcp.jsonasplugin-agentstack-*with empty${AGENTSTACK_ACCESS_TOKEN}.discovery.listworked;projects.get_projectsreturned unauthorized even when~/.cursor/mcp.jsonhad a valid Bearer/PAT. Removed shippedmcp.json; example lives atmcp.example.json. Reload Window after update — keep one AgentStack MCP from~/.cursor/mcp.json. - OAuth refresh skipped
client_secret(G-A163):session-start.mjsposted refresh with onlyclient_id; prod requires the confidential secret from env or~/.cursor/agentstack-oauth-client.json. SharedloadConfidentialClientin plugin-kernel; Device Code and session-start both send it. - Public plugin Device Code (G-A164):
cursor-plugin(and sibling IDE clients) are RFC 8628 public clients —device/authorize+ token poll/refresh work withoutclient_secret. Default client is builtin public (DCR json only ifAGENTSTACK_OAUTH_USE_DCR=1).diagnose-local/refresh-cursor-runtime --fixtreat cached pluginmcp.jsonas a fail (G-A162).
- Validate gate: fail if the plugin package ships
mcp.json(auto-register trap).
- Duplicate MCP tools in Cursor: stop registering a plugin-level MCP server (
mcpServersinplugin.json). Auth + MCP config stay in~/.cursor/mcp.jsonfrom Device Code only — avoidsplugin-agentstack-*+user-agentstackdouble registration. - Backend
tools/list: return one tool (agentstack.execute) instead of dot + underscore aliases. Cursor normalizes both toagentstack_execute, which looked like two identical tools.tools/callstill acceptsagentstack_execute.
- README / maintainer docs: Cursor 2.6+ layout (
plugins/agentstack/), accurate layer counts, MCP dedupe contract, docs map.
Fix Cursor plugin load failure ("Unsupported plugin manifest $schema version") and align with current Cursor manifest contract.
- Plugin load blocker: remove
$schemafromplugin.json,marketplace.json, andhooks.json. Current Cursor builds whitelist only internal schema IDs; raw GitHub schema URLs cause hard load failures. agentstack-guidanceskill: inline frontmatterdescription(folded YAML broke validator word count); removedocs/operations/tenant-forbidden path; add liveGET /mcp/actionscatalog pointer.- Backend router: add
agentstack-openapirow.
variablesJSON Schema inplugin.jsonfor${AGENTSTACK_ACCESS_TOKEN}(Cursor Plugins → Configure contract).- Shared
extractMcpActionfor hook event shapes (arguments.params.stepsforagentstack.execute). - Monorepo validators aligned: no
$schemain shipped manifests;variablesrequired. - Runtime:
scripts/refresh-cursor-runtime.mjsdetects/fixes stale Cursor marketplace cache still serving 0.4.14 with$schema(local link alone was not enough).
Marketplace ship wave — self-contained Device Code, schema-valid manifest, listing SoT, hooks lifecycle.
- OAuth Device Code poll: treat HTTP 400
authorization_pending/slow_downas continue (RFC 8628). - Capability snapshot: flatten
GET /mcp/actions{domains}→actions[]forbeforeMCPExecutioncap hints. device-code.mjs --helpexits 0 without starting OAuth (safe smoke).- Lean MCP write path shared via
mcpConfig.mjs(notoolsextras). - Standalone CI: vendor
scripts/lib/stale-actions.mjs+docs/CAPABILITY_MATRIX.md(validate no longer imports monorepo-only paths). - Cursor 2.6+ install: restore schema-valid
.cursor-plugin/marketplace.json+ nest package underplugins/agentstack/(baresource,pluginRoot: plugins). Keeplisting.jsonas AgentStack publisher SoT. - Lean MCP config: strip
toolsextras; sessionStart seeds capability snapshot with Bearer orX-API-Key;scripts/diagnose-local.mjs(--fix,--seed-snapshot). - Layer audit:
scripts/audit-layers.mjs(skills/rules/commands/agents/hooks) wired into smoke + CI.
scripts/install-local.mjs/uninstall-local.mjs— Windows junction / Unix symlink into~/.cursor/plugins/local/agentstack.LOCAL_INSTALL.md,FLOW.md, cross-platformscripts/smoke-local.mjs.smoke-local.ps1 -InstallLayer 0.
- Vendored
lib/plugin-kernel/(self-contained publish artifact;sync-plugin-kernel.mjs --check). .cursor-plugin/listing.jsonAgentStack publisher SoT (replaces false Cursormarketplace.jsonschema).- Hooks:
beforeMCPExecution,sessionEnd,postToolUseFailure. - OSS:
CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md; publish-repo.github/workflows/validate.yml. - Marketplace screenshots at 1920×1200 + alts;
generate-marketplace-screenshots.mjs. - Intent-eval collisions (wallet / Stripe webhook vs SDK); expanded CRM/AgentNet/storefront/guidance coverage.
plugin.jsonsanitized to Cursor schema (additionalProperties: false);$schemapin to rawplugin.schema.json.- Telemetry: local buffer only when
agentstack.sendTelemetryis true; version read fromplugin.json. - T0
agentstack-prefertenant-safe (monorepo/founder language stays in T3agentstack-platform-monorepo). - Version line 0.4.14; validators / checklists / diagnose aligned.
- Documented token storage threat model (Bearer in mcp.json; Windows ACL note).
- Opt-in telemetry honesty for marketplace security review.
gen3 — catalog plane, skill split, publication CI, platform 0.4.13 alignment.
- Skills:
agentstack-hosting,agentstack-support,agentstack-storage(split from support-storage). - Skills:
agentstack-messenger,agentstack-integrations,agentstack-discovery,agentstack-commerce-assets,agentstack-capability-tasks,agentstack-sdk. - Rules: platform-monorepo, messenger-tenant, ui-surfaces, agentnet-naming.
- Commands:
/agentstack-host-site,/agentstack-support-setup,/agentstack-integrations-wizard,/agentstack-sdk-surface,/agentstack-discover. - Agents:
@agentstack-oncall,@agentstack-fleet-operator,@agentstack-tenant-builder. - Hooks: capability snapshot refresh on sessionStart;
pre-mcp-cap-check.mjs(optional wire); contract tests. - CI:
audit-cursor-plugin.mjs,.github/workflows/plugin-audit.yml. - Docs:
CANONICAL_COPY.md,PLUGIN_VERSION_POLICY.md,CURSOR_PLUGIN_AUDIT_2026-05.md, ADR gen3.
- Version aligned to platform 0.4.13.
- Marketing copy uses live catalog wording (no hard-coded action counts in plugin tree).
agentstack-initstep 3 title: persist tokens (OAuth primary).- Telemetry batch fields:
plugin_version,layer,gene_tag.
skills/agentstack-support-storage/(decomposed).
Clean break from 0.4.x. OAuth 2.1 Device Code; five-layer architecture. See prior entry in git history.
- Version aligned to global AgentStack 0.4.0.
- Initial release.