Before understanding the solution, understand the pain point.
The situation before Agent Plugins:
Think of it like this:
Imagine writing one great song, but every music platform requires a completely different file format. You'd have to re-record it for each one — even though the song itself never changes.
Agent Plugins fixes this by giving extensions ONE standard package format that all compatible clients understand.
Agent Plugins defines a directory structure — a predictable "home" for your components.
my-plugin/
├── plugin.json ← The manifest (required)
├── skills/ ← Agent Skills live here
│ └── summarize/
│ ├── SKILL.md
│ ├── scripts/
│ └── references/
├── mcp.json ← MCP server config lives here
└── com.example.client/ ← Client-specific extras (namespaced)
Breaking this down:
| Item | Purpose |
|---|---|
plugin.json | The minimum required file — identifies the plugin |
skills/ | Where Agent Skills are discovered |
mcp.json | Where MCP server configuration is read |
com.example.client/ | Client-specific data (ignored by other clients) |
The minimal plugin.json looks like this:
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "my-plugin"
}
Just two fields. That's the minimum requirement. The rest of the contract lives in the file structure itself.
Every compatible client follows the same discovery process:
Step 1: Check for plugin.json at the root → validates the plugin exists
Step 2: Look under skills/ → if client supports Skills, load them
Step 3: Read mcp.json → if client supports MCP servers, load them
Step 4: Validate each component independently
Key insight — independent validation:
If one component is broken or invalid, the other components still work. A bad
mcp.jsondoesn't disable your Skills, and vice versa.
A client doesn't need to support both component types. It can support:
Agent Plugins deliberately covers only two component types:
Why not include everything?
Because both of these already had:
Agent Plugins doesn't redefine them — it only defines how clients find them together in one distributable package.
What's left OUT intentionally:
Think of Agent Plugins as defining the shipping container standard, not what goes inside each box or how the truck delivers it.
The benefit of staying small:
Clients need freedom to innovate. Agent Plugins handles this with namespaced extensions.
How it works:
my-plugin/
└── com.example.client/ ← This is a client-specific namespace
com.cursor.client/)Why this matters:
Without namespacing:
Client A adds custom feature → bleeds into the standard → blocks Client B's adoption
With namespacing:
Client A adds custom feature → stays in its own namespace → Client B ignores it → standard stays clean
A client-specific capability stays client-specific until there's consensus to standardize it. This prevents premature standardization.
Agent Plugins isn't owned by one company. This is important for trust and adoption.
Who built it:
Technical Steering Committee includes:
What "open" means here:
This is the same model that made standards like HTML and HTTP successful — no single gatekeeper.
For plugin authors:
Before: Package Skills for Client A → Repackage for Client B → Repackage for Client C
After: Package once → Works across all compatible clients automatically
For client builders:
Before: Define your own discovery format, hope authors support it
After: Follow the conformance checklist → automatically support all Agent Plugins
Clients supporting Agent Plugins at launch:
Agent Plugins = A shipping container standard for AI agent extensions
┌─────────────────────────────────────────┐
│ plugin.json │ ← Manifest (required)
│ (2 fields minimum) │
├──────────────────┬──────────────────────┤
│ skills/ │ mcp.json │ ← Portable components
│ (Agent Skills) │ (MCP servers) │
├──────────────────┴──────────────────────┤
│ com.client.namespace/ │ ← Client-specific (ignored by others)
└─────────────────────────────────────────┘
One package → Many compatible clients
The three-word contract: Package once, run anywhere.