AI Agent Architecture

Agent Plugins: One Portable Format for Skills and MCP Servers

Direct Answer

Agent Plugins is an open, vendor-neutral packaging standard for putting reusable Agent Skills and supported MCP server configurations into one directory that multiple agent products can discover. Version 1.0.0 defines a small portable core: a root plugin.json, optional skills under skills/, and optional MCP configuration in root mcp.json.

The important word is packaging. The standard does not make every agent runtime identical. It does not standardize marketplaces, installation, permissions, authentication, UI, billing, or process isolation. A conforming client can support skills, MCP servers, or both, and it can add its own capabilities without changing the portable core.

JQ AI SYSTEMS verdict: Agent Plugins can remove a meaningful layer of platform-specific glue, but portability must be tested component by component. Build the shared core once, keep client-specific behavior explicit, and treat permissions and runtime security as separate engineering work.

Watch the Official Announcement

Official launch: the announcement says contributors from AWS, Cursor, GitHub, Microsoft, OpenAI, and Vercel collaborated on the format. Read the official project site, the v1.0.0 specification, and the open specification repository. This article is an independent implementation guide based on those primary sources.

The Problem: Every Agent Expected Different Packaging

Skills and MCP servers were already becoming reusable building blocks, but the surrounding package was fragmented. Authors had to maintain different manifests, directories, path conventions, and setup instructions for each host. The capability might be the same while the integration code around it kept multiplying.

Agent Plugins creates an interoperability floor. Authors get one predictable place for portable identity, skills, and MCP configuration. Clients get one predictable discovery contract. The project does not attempt to freeze every product into the same feature set, which is why the initial specification is intentionally narrow.

BeforeWith Agent Plugins v1Still client-specific
Different package entry pointsRoot plugin.jsonMarketplace listing and installation flow
Different skill discovery pathsImmediate children of skills/How skills appear, activate, or are approved
Different MCP configuration shapesRoot mcp.jsonAuthentication, policy, runtime, and supported transports
Ad hoc custom metadataReverse-domain extension namespacesThe meaning and behavior of each extension

What Version 1 Actually Standardizes

The normative page calls this Agent Plugins Specification v1.0.0 and currently labels its status Working Draft. Its portable component surface contains exactly two types:

  1. Agent Skills. Reusable instructions and workflows that follow the separate Agent Skills specification.
  2. MCP servers. Local or remote tool and data connections described by a portable mcp.json, while wire behavior follows the Model Context Protocol.

Commands, hooks, custom agents, rules, language servers, and UI are not portable v1 components because their formats have not converged. They can still exist as client extensions. That is a healthier boundary than pretending partially compatible features are universal.

The Portable Package Anatomy

my-plugin/
|-- plugin.json
|-- skills/
|   `-- summarize/
|       |-- SKILL.md
|       |-- scripts/
|       `-- references/
|-- mcp.json
|-- com.example.client/
|   `-- hooks/
|-- LICENSE
`-- CHANGELOG.md
PathRolePortable?
plugin.jsonIdentity, version target, metadata, and extension namespacesYes, required
skills/<name>/SKILL.mdReusable workflow instructions and supporting filesYes, optional
mcp.jsonPortable stdio, Streamable HTTP, or optional legacy SSE server configurationYes, optional
com.example.client/Files understood by one client-owned namespaceNo, explicitly isolated

Discovery uses fixed locations. The root manifest does not point to a custom skill directory or inline MCP configuration. Skills are discovered only from immediate child directories under skills/; clients do not recursively hunt for deeper SKILL.md files.

Build the Smallest Conforming Plugin

The official author guide starts with one manifest and one skill:

hello-plugin/
|-- plugin.json
`-- skills/
    `-- greet/
        `-- SKILL.md

plugin.json:

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "hello-plugin",
  "version": "1.0.0",
  "description": "A portable greeting workflow",
  "license": "MIT"
}

skills/greet/SKILL.md:

---
name: greet
description: Greet the user and offer help.
---

Greet the user and offer help.

Only $schema and name are required in the v1 manifest. The schema is closed: permitted root fields are $schema, name, version, description, author, homepage, repository, license, keywords, and extensions. Component paths do not belong in this file because discovery locations are fixed.

Add a Portable MCP Server

Add mcp.json only when the plugin needs tools or live data. This example shows one bundled local server and one remote Streamable HTTP endpoint:

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
  "mcpServers": {
    "local-validator": {
      "type": "stdio",
      "command": "./bin/validator",
      "args": ["--data", "${PLUGIN_DATA}/validator"],
      "env": {
        "CONFIG": "${PLUGIN_ROOT}/config.json"
      },
      "cwd": "${PLUGIN_ROOT}"
    },
    "deployment-api": {
      "type": "streamable-http",
      "url": "https://deploy.example.com/mcp",
      "headers": {
        "X-Tenant": "public-tenant"
      }
    }
  }
}

A stdio command is one executable token, not a shell command string. A bundled executable uses a ./ path inside the package. ${PLUGIN_ROOT} points at installed package files; ${PLUGIN_DATA} points at client-managed persistent writable storage. Placeholder expansion is supported in args, env values, and cwd, not in command, URLs, or HTTP headers.

Never put credentials in the package. The specification treats literal headers and env values as visible package data. Version 1 defines no portable OAuth or secret-reference format; authentication and credential storage belong to the client.

Portable Does Not Mean Identical

The official compatibility page currently lists ChatGPT and Codex, Cursor, GitHub Copilot, Kiro, and VS Code. All list Agent Skills support. The MCP transport matrix differs:

ClientAgent SkillsstdioStreamable HTTPLegacy SSE
ChatGPT and CodexListedListedListedNot listed
CursorListedListedListedListed
GitHub CopilotListedListedListedListed
KiroListedListedListedListed
VS CodeListedListedListedListed

This matrix is a point-in-time implementation claim, not a guarantee that every workflow behaves the same. Validate installation, skill discovery, tool exposure, authentication, approvals, failure reporting, and uninstall behavior in every client you promise to support.

Do Not Confuse the Portable and Client Package Layers

OpenAI's current plugin authoring documentation describes a richer ChatGPT and Codex package whose required entry point is .codex-plugin/plugin.json. That manifest can point to skills, bundled MCP configuration, registered MCP mappings, hooks, assets, and install-surface metadata. The Agent Plugins specification, by contrast, requires a portable plugin.json at the package root and discovers skills/ and mcp.json from fixed locations.

File or layerPurposeWho defines it?
/plugin.jsonPortable Agent Plugins identity and extension namespacesAgent Plugins v1
/mcp.jsonPortable MCP server configurationAgent Plugins v1
/.codex-plugin/plugin.jsonRicher ChatGPT and Codex packaging, metadata, and component pointersOpenAI
Reverse-domain extension directoryClient-only hooks, UI, commands, or other behaviorThat extension's owning client

These layers can coexist during migration. The shared root expresses the portable minimum; client-specific files preserve richer features and distribution metadata. Do not delete a working client manifest merely because you added the new root manifest. The canonical Agent Plugins example repository recommends an additive migration and compatibility testing before legacy files are removed.

What the Standard Secures, and What It Does Not

Control in the specificationUseful protectionRemaining responsibility
Resolved package paths stay inside the plugin rootBlocks traversal through declared package paths, symlinks, or junctionsDoes not sandbox the launched process
Closed JSON schemasRejects malformed portable configuration and prevents accidental field inventionDoes not prove the package is trustworthy
Non-loopback remote MCP endpoints require HTTPSProtects transport outside the local machineDoes not authorize the server or validate its business behavior
Headers cannot cross origins on redirects without explicit authorizationReduces credential or metadata leakage across originsClients still own credential storage and consent UX
Narrow failure boundariesOne invalid skill or server need not break the rest of the pluginOperators still need visible errors and health checks

A safe client should still display provenance, inspect executables and scripts, request least-privilege permissions, isolate processes where appropriate, control network access, protect secrets, log tool calls, and require confirmation before consequential actions. A portable plugin is easier to load; that makes review and policy more important, not less.

A Low-Risk Migration Plan

  1. Inventory the existing package. Separate skills, MCP servers, hooks, commands, UI, marketplace metadata, credentials, and setup scripts.
  2. Add root plugin.json. Use the v1 schema and a stable lowercase name. Keep the first manifest minimal.
  3. Normalize reusable skills. Place each valid skill at skills/<skill-name>/SKILL.md. Move scripts and references inside that skill directory.
  4. Translate only portable MCP settings. Create root mcp.json, choose an explicit transport, keep command and arguments separate, and remove embedded secrets.
  5. Preserve client-only behavior. Keep existing manifests while needed, or move custom behavior into the correct reverse-domain extension namespace.
  6. Test one capability at a time. Confirm the manifest loads, then each skill, then each MCP server, then client extensions.
  7. Publish a support matrix. State which clients, versions, transports, operating systems, and capabilities you actually tested.
  8. Remove legacy glue last. Delete old packaging only when no supported client or distribution route depends on it.

The Release Checklist

  • Manifest: root plugin.json validates against the declared 1.0.0 schema and contains no invented top-level fields.
  • Name: 1-64 characters, lowercase letters, numbers, hyphens, or periods; alphanumeric at both ends; no doubled hyphens or periods.
  • Skills: every skill is an immediate child of skills/, contains exactly named SKILL.md, and passes the Agent Skills rules.
  • MCP: mcp.json uses the same specification version, declares one valid transport per server, and has no credentials.
  • Paths: declared package-relative paths begin with ./, resolve inside the plugin root, and work on supported operating systems.
  • Remote endpoints: non-loopback URLs use HTTPS; redirect behavior and authentication are tested.
  • Failure isolation: disable one server and corrupt one skill in a test copy; verify the client reports the problem while loading healthy components.
  • Permissions: document tools, data touched, network destinations, write operations, and human approval points per client.
  • Portability: run the same three representative tasks in every claimed client and save evidence, not just screenshots of successful installation.
  • Versioning: pin a release, publish a changelog, define update behavior, and keep a rollback package.

Official Video Chapters

TimeTopicPractical takeaway
00:00Why packaging needs a standardCapabilities were reusable, but manifests and setup were fragmented.
00:20Introducing Agent PluginsOne vendor-neutral package gives authors and clients a shared contract.
00:39Structure, skills, and MCPRoot manifest plus fixed locations form the v1 portable core.
01:03Portable across productsClients can adopt skills, MCP, or both while extending the core.
01:19Scope and getting startedPackaging and discovery are standardized; marketplaces, permissions, and runtimes are not.

Bottom Line

Agent Plugins solves a real but bounded problem: how to package agent capabilities so multiple products can find the same reusable skills and MCP configurations. Its restraint is a strength. The format creates a stable core without pretending that permission systems, marketplaces, user interfaces, authentication, and runtimes have already converged.

For plugin authors, the sensible move is additive adoption. Put portable identity at root plugin.json, reusable workflows in skills/, and safe connection metadata in mcp.json. Keep richer client behavior in explicit extension layers, publish an honest support matrix, and test the package in every product you name. One package can travel farther now, but trustworthy execution still has to be earned in each host.

Sources and Further Reading

Common questions

What is an Agent Plugin?
An Agent Plugin is a self-contained directory with a root plugin.json manifest and optional portable components. Agent Plugins v1 standardizes two component types: Agent Skills under skills/ and MCP server configuration in root mcp.json.
Does one Agent Plugin work identically in every supported client?
No. The standard creates a shared packaging and discovery floor. Clients can support skills, MCP servers, or both, and may differ in transports, installation, permissions, authentication, user interface, and runtime behavior.
Which products support Agent Plugins?
The official compatibility page currently lists VS Code, Cursor, GitHub Copilot, ChatGPT and Codex, and Kiro. Support is component-specific, so check the current matrix before relying on a particular MCP transport.
What fields are required in plugin.json?
Agent Plugins v1 requires $schema and name. The root manifest uses a closed schema, so portable metadata and client-specific extension data must follow the fields defined by the specification.
Can an Agent Plugin include hooks, commands, agents, or UI?
Those capabilities are not portable core components in v1. A client can support them through a reverse-domain extension namespace or its own package metadata, but another client is not required to understand them.
Does the standard manage OAuth, credentials, or permissions?
No. Agent Plugins v1 deliberately leaves authorization, credential storage, permission prompts, installation, and runtime policy to each client. Secrets must not be embedded in mcp.json headers or environment values.
Is plugin path containment a security sandbox?
No. The specification requires package paths to remain inside the plugin root and gives clients persistent PLUGIN_DATA storage, but it explicitly says this does not sandbox an MCP subprocess. Runtime isolation and approvals remain client responsibilities.
How should I migrate an existing Codex, Cursor, or Claude plugin?
Migrate additively. Add the portable root plugin.json, move reusable skills into skills/, translate portable MCP entries into root mcp.json, keep client-only behavior in its existing manifest or extension namespace, test each target client, and remove legacy files only after compatibility is proven.
Share
X LinkedIn Reddit
Build Yours

Want a system
like this one?

Book a free 30-minute call. We map your situation, identify the highest-impact automation, and figure out if we are a fit.

Book Free 30-min Call