Repository navigation
Description
Describe the enhancement you want to request
OpenCode has no support for Agent Plugins, the vendor-neutral packaging spec for bundling Agent Skills and MCP servers into a portable plugin.
Context
This is a broad, multi-vendor effort rather than any one company's format. Agent Plugins 1.0.0 was published by a TSC of Core Maintainers from Amazon, Cursor, Microsoft, OpenAI, and Vercel, and Google has since joined as a Core Maintainer.
Support already spans most major agent clients:
| Vendor | Products supporting Agent Plugins |
|---|---|
| OpenAI | ChatGPT, Codex |
| Microsoft | VS Code, GitHub Copilot |
| Amazon | Kiro |
| Cursor | Cursor |
| Agents CLI, Data Agent Kit |
The first four rows are per the launch announcement; Google's two are per its Core Maintainer announcement above, with more of its products to follow.
OpenCode is a conspicuous omission, and it's the one place a user's skills currently don't follow them.
Both a client implementation and conformant plugins already exist to test against:
- Codex implements it as of 0.147.0 (2026-08-07), via openai/codex#36544. Root
plugin.jsonnow takes precedence, with the legacy.codex-plugin/plugin.jsondemoted to an optional overlay. - AWS's agent-toolkit-for-aws shipped conformant manifests for all four of its plugins in #214 (2026-08-06).
Those AWS plugins install in Codex today. In OpenCode the same directories are only reachable if a user points skills.paths at them by hand, and their bundled MCP servers are not picked up at all.
What the format is
plugin-name/
├── plugin.json # $schema: https://agent-plugins.org/schemas/1.0.0/plugin.schema.json
├── skills/ # Agent Skills (agentskills.io), which OpenCode already understands
├── mcp.json # $schema: .../1.0.0/mcp.schema.json
└── com.example.client/ # reverse-domain namespace for client-specific extensions
Notably, OpenCode already discovers ~/.claude/skills/** and ~/.agents/skills/** and already speaks MCP. The gap is only the manifest layer that binds them into one installable, versioned unit.
Proposal
- Recognize a root
plugin.jsonas a plugin manifest, gated on$schemamatchinghttps://agent-plugins.org/schemas/1.0.0/plugin.schema.json. Codex treats a non-matching or absent$schemaas "not an Agent Plugin" and falls through, which seems like the right behaviour, since it keeps unrelatedplugin.jsonfiles from being misread. - Load
skills/through the existing skill discovery path. - Load
mcp.jsoninto the existing MCP server config, honouring the spec's transport rules (§7.2.1). - Optionally consume
.agents/plugins/marketplace.jsonfor discovery. Both Codex's own curated marketplace and AWS's toolkit already publish at that vendor-neutral path. - Optionally reserve a
com.opencode.*(or similar) extension namespace per §8.2 for anything OpenCode-specific.
Relationship to existing issues
- [FEATURE]: discover skills installed by VS Code agent plugins and Claude Code plugins #40629 asks for discovery of skills sitting inside VS Code agent-plugin and Claude Code plugin directories, by reading each client's own manifests (
installed.json,cache.json,installed_plugins.json). That's a per-client compatibility shim; Agent Plugins is the standard that makes such shims unnecessary for conformant packages. The two are complementary, one covering what's already installed today and the other what gets published going forward. - feat(opencode): add unified marketplace #40085 (closed) proposed a unified OpenCode marketplace. Supporting the spec would let such a marketplace serve portable packages rather than an OpenCode-only format.
Activity
alper-sh24 commentedon Aug 7, 2026
It seems that it did not really take long for this to appear here and become a burden on the maintainers 😄
garysassano commentedon Aug 7, 2026
I think the main issue is that you have to install the plugin separately for every harness, which means it ends up duplicated across multiple places in your system. That's not an approach I really like.
What I do instead is keep a global
.agents/skillsdirectory and a.agents/AGENTS.mdfile, then use symlinks so every harness shares the same source of truth. Ideally, plugins would work the same way: you'd install them once at the system level, and every harness would automatically discover and use them without any additional setup.aagarwal1012 commentedon Aug 8, 2026
A concrete data point from shipping a conformant plugin, in case it helps size this.
We published dodopayments/dodo-agent-plugin as an Agent Plugins 1.0.0 package — root
plugin.json, seventeen skills as immediate children ofskills/, two MCP servers inmcp.json. Verified loading with zero adapter code on:PLUGIN_ROOT/PLUGIN_DATAinjected per specdev.kiroextension namespaceOpenCode is the one target where the same package needs per-user manual configuration. Skills cannot be shipped at all by an npm-distributed plugin today (#20940, #33896, #41234), so our README has to ask every user to hand-write:
{ "plugin": ["@dodopayments/opencode-plugin"], "skills": { "paths": ["node_modules/@dodopayments/opencode-plugin/skills"] } }...plus a local
npm install, becauseskills.pathsresolves against the project directory while OpenCode loads the plugin from its own cache.Worth noting how small the gap actually is: OpenCode already implements both halves of the spec's payload. It reads
SKILL.mdwith the same frontmatter contract, and it already discovers.claude/skills/and.agents/skills/. What is missing is recognising the packaging — a rootplugin.jsonwhose$schemaishttps://agent-plugins.org/schemas/1.0.0/plugin.schema.json, then mapping its siblingskills/andmcp.json. That is closer to a discovery change than a feature.Happy to test against a branch — we have the package, an isolated-
HOMEharness, and verified expected output on three other clients to diff against.Marinski commentedon Aug 14, 2026
There is another similar issue reported about the same thing #41561. I strongly believe this must be implemented so users of OpenCode can benefit of using the skills and agents they are used to with other AI tools.
willem445 commentedon Aug 26, 2026
Throwing it out there that I also would like support for this. It seems copilot, claude code, etc. are converging on standards which opencode explicitly does not support. Many of us live in enterprises where we are forced into a particular harness so that harness's agent artifacts are the default in all repos, for those of us that would rather use opencode, we either have to create a duplicate set of opencode specific variants or make our own bridge plugins, which is what I ended up doing in the interim. Native support for these from opencode would reduce adoption friction considerably.
https://github.com/willem445/opencode-rosetta
#19180 is related along these lines.
megamen32 commentedon Sep 11, 2026
i need that one too. all my harnesses now on my marketplace
zuberek commentedon Sep 26, 2026
would be great to have this 👍
Marinski commentedon Oct 2, 2026
@anomalyco this spreads across many issue reports and requests. Please have a loot at it finally. You're losing pace.
davhdavh commentedon Oct 13, 2026
Will this also support the per-skill mcp config?
sofianbll commentedon Oct 20, 2026
Hi @jlongster — is native support for Agent Plugins 1.0 already underway on your side? If not, I'd like design feedback on a narrow first increment before opening anything.
Idea: an explicitly configured local directory with a root
plugin.json(and no JS entrypoint) becomes a synthetic plugin generation. Itsskills/andmcp.jsonare registered through the existingctx.skill.transform/ctx.mcp.transform(same primitives as the Figma plugin, #55049) — no copy into user config, policy checks kept, realpath containment, invalid manifest → explicit error.Local proof (throwaway patch on
dev6bac3b9, reproducible CI): a real package is configured underplugins, reported active, its skill is served by the skills API, its stdio MCP server (launched with${PLUGIN_ROOT}/${PLUGIN_DATA}) connects, and the model calls its tool; removing the config and reloading withdraws both; an invalid manifest registers nothing. Package files are validated offline against the canonical 1.0.0 schemas.Patches, package, CI and full proposal: https://github.com/sofianbll/opencode-standards-proof (
agent-plugin/,PROOF.md,proposals/opencode-agent-plugins-loader.md).Not claimed: full client conformance, HTTP/SSE servers from
mcp.json(skipped with a diagnostic), marketplace/remote install, hooks, Windows.Questions
No PR without a go-ahead, per CONTRIBUTING.
abn commentedon Oct 27, 2026
@sofianbll's local-only synthetic-plugin proposal above is a good frame for the recognition question, and I'd like to put an alternative shape next to it for the maintainers to consider rather than talk past it.
I've had this on a branch in parallel, a single commit on
dev:abn@b1ee80a
Where it agrees with the narrower proposal
ctx.skill.transform/ctx.mcp.transformprimitives; nothing is copied into user config.Where it differs
~/.agents/plugins, and.agents/pluginsin each ancestor of the working directory) plusagent-plugins/inside every config directory, rather than only an explicitly configured directory.ai.opencode/extension namespace is part of it: the JS entry,agents//commands//modes/markdown, andhooks/hooks.jsonobservers.mcp.jsonmapsstdioandstreamable-http;sseis skipped with a diagnostic.On the two questions
${manifest.name}-${server}, so two packages cannot collide, and user config keys still win.PLUGIN_DATAlives under the client data directory keyed by manifest name, so it survives a package update.I verified it end to end in a container with an isolated
HOME: a package at~/.agents/plugins/democontributes a skill, an agent, a command, a stdio MCP server and a hook, all served by the API.It would be great to get feedback on this. If everyone agrees and the design is approved, I can open a PR for review. Happy to also accommodate changes as required.
opencodejr commentedon Oct 28, 2026
Thanks for the detailed write-up! You're asking for OpenCode to support Agent Plugins 1.0 natively. That means recognising a root
plugin.jsonwith the agent-plugins.org$schema, loading itsskills/andmcp.jsonthrough the existing skill and MCP config, and optionally reading.agents/plugins/marketplace.json. Then a conformant package that already installs in Codex or Cursor would also work in OpenCode.The maintainers will consider it. Related issues:
.agents/directory and manifest-based discovery (open, overlaps with the layout part of this)In the meantime, a v2 plugin could probably bridge this. The plugin API can add skills (
skill.transform) and MCP servers (mcp.transform), so a community plugin could scan for Agent Plugin directories and register what they contain.Hamza-Abili commentedon Nov 6, 2026
Wanted to close the loop on this thread: we shipped a community-side Agent Plugins 1.0 client for OpenCode, on v1 and v2.
opencode-agent-plugins — https://github.com/Hamza-Abili/opencode-agent-plugins · npm
@hamzaabili/opencode-agent-pluginsWhat works today (v1.0.0):
~/.agents/plugins/(global),<project>/.agents/plugins/(walked up to the git worktree root), plus npm packages that bundle an Agent Plugin (packagesoption) and marketplace installs. No config entry per plugin.sseis skipped with a warning.plugin.json,skills/,SKILL.md,mcp.json),./commands are emitted as post-containment absolute paths,cwdis contained to the plugin root orPLUGIN_DATA, remote MCP URLs must be https (http only on loopback) with no credentials/query/fragment. Provenance and staging copies for installs; update swaps with rollback.disabled: trueon v2,enabled: falseon v1) until you explicitly enable them with/ap enable. No silent config edits; user-authored config always wins on collisions./ap status | list | enable | disable | marketplace | install | update | uninstall | packages | reload. No external CLI, no Node requirement..agents/plugins/marketplace.json(the Codex-compatible format), supportslocal,url/git-subdirandnpmsources, refusesNOT_AVAILABLEentries, installs only on explicit command.…/legacyexport) and v2.@garysassano — this is the discovery/manifest layer your proposal described. Feedback welcome, especially on the failure boundaries.
@aagarwal1012 — we'd love you to try it against
dodopayments/dodo-agent-plugin: drop the package innode_modules, add"packages": ["@dodopayments/opencode-plugin"]to the plugin options, restart, and run/ap status. That case (skills shipped inside an npm OpenCode plugin) is exactly whatpackagesexists for. Any spec mismatch, we'll fix.@sofianbll — if a native implementation is still on the table, happy to share what the plugin-side integration required; skill registration and the MCP disabled lifecycle map 1:1 to a native design.
@ameshkov — saw
opencode-agent-plugins; we chose different tradeoffs (filesystem discovery + in-editor commands + disabled-by-default MCP vs config list + git CLI). Aligning on conformance details would be better for users than diverging — issues/PRs welcome.Also worth noting #41561 was closed as not planned, so the community path may be the only path for a while.
abn commentedon Nov 6, 2026
@Hamza-Abili This covers the portable half of the spec carefully. The containment and failure boundaries look right, and the marketplace catalogs are a useful addition beyond the spec. Thanks for shipping it as an interim option.
Both validate
plugin.jsonandmcp.json, contain package paths, providePLUGIN_ROOTandPLUGIN_DATA, and register skills and MCP servers through the native transforms.Yours goes further with marketplace installs, npm
packages,/ap, v1 support, and MCP disabled until enabled. That default makes sense for third-party packages.The branch I linked adds
ai.opencode/support (JS entry, agents, commands, hooks),agent-plugins/inside config directories, and a location-scoped service that owns the scan and the watches. A plugin cannot do those, because the API has no plugin source registration and no watcher surface.#41561 was closed as not planned because it duplicated this issue and had gone quiet, not because native support was ruled out.
Hamza-Abili commentedon Nov 6, 2026
Thanks @abn — that split matches how I read the spec, and thanks for checking the containment and failure boundaries rather than taking the README's word for it.
Confirming the details you called out, from the implementation:
plugin.json/mcp.jsonare validated in-process against 1.0.0 semantics, nothing fetched at runtime: a missing or non-matching$schemais fatal to that package, unknown top-level fields are non-fatal, one bad MCP entry skips only that entry, legacysseis skipped with a diagnostic.plugin.json,skills/, eachSKILL.md,mcp.json— and again at copy time for installs (symlinked parents, dangling leaves).${PLUGIN_ROOT}/${PLUGIN_DATA}expand inargs/env/cwd; both are exported to stdio servers;cwdis contained to the root orPLUGIN_DATA; ifPLUGIN_DATAcan't be provisioned that package's servers are skipped rather than handed a path that won't exist at launch.ctx.skill.transform/ctx.mcp.transform, withdisabled: trueuntil/ap enable.One correction to "a plugin cannot do those", because it matters for where the line sits:
ctx.plugin.list()is the whole surface.AgentEditorhas noadd.agent-plugins/inside config directories: a plugin can scan those itself today.fs.watchand callctx.skill.reload()/ctx.mcp.reload().ai.opencode/commandsandai.opencode/hooksare approximable viactx.command.transform,ctx.tool.hookandctx.session.hook.So the honest version is: plugin sources and new agents need core, while config-directory discovery and watches are reachable from a plugin but belong in core anyway. I deliberately kept them out. Loading a discovered package's JS entry means executing third-party code, and that belongs behind the host's plugin-loading semantics, not inside an npm plugin whose selling point is that MCP stays disabled until you opt in. Same reason I don't want a client inventing its own precedence rules against user config.
#41561: confirmed — actions-bot duplicate pointer, then the 60-day inactivity auto-close. Nothing to read into beyond that.
Is
b1ee80ameant to land? If it does, I'd rather make this plugin defer for packages core claims and keep marketplace/npm//apas the layer core doesn't cover, instead of double-registering. Tell me which signal you'd want the plugin to use for "core owns this package" and I'll implement it.panga commentedon Nov 6, 2026
Can AgentEditor add be included in core please.
Hamza-Abili commentedon Nov 6, 2026
Follow-up, @abn — your review made me look at this twice, and the first version of the fix was wrong.
You were right that the client was silent about the half it does not load, but a blanket warning would have been the wrong answer: it fires for packages that already contribute skills or MCP servers (noise today), and it would keep firing after core loads
ai.opencode/(a false alarm by construction). So it is narrowed to the case that is actually confusing: a package that ships onlyai.opencode/components and therefore loads as an empty plugin.v1.3.0 (https://github.com/Hamza-Abili/opencode-agent-plugins/releases/tag/v1.3.0):
plugin.ts/plugin.js,agents,commands,modes,hooks— pointing at this issue;ai.opencodeis ignored;/ap status.Verified: 192 tests (
bun run cigreen), live smoke re-run on OpenCode 2.2.5 (skill registered, MCP reporteddisabled), release workflow green on the tag6f30428.The README now states the split instead of implying it: shared roots are scanned, extra roots go through
directories, and plugin-source registration is not something a plugin can do at all (ctx.plugin.list()cannot add one).@panga, on
AgentEditor.add: that is a core API addition — a plugin consumesctx.agent.transform, it cannot extend the editor. If it lands, loadingai.opencode/agents/still belongs to core discovery; this client already defers per entry on collisions, so nothing would be registered twice.neriousy commentedon Nov 12, 2026
Thanks for the suggestion. This isn't something we plan to build, so closing to keep the tracker focused.