Skip to main content

Open Plugins: The Plugin Standard for AI Coding Tools

· 18 min read
Booker Zhao
AI Full-Stack Engineer / CloudBase AI ToolKit Author

One plugin standard, shared across seven tools.

Fig: Open Plugins — install once, works across seven tools

AI coding tools are multiplying: Cursor, Claude Code, Codex, Grok Build — each with its own plugin format. Then came Open Plugins.

It's an open standard maintained by Vercel Labs. Install one plugin, it runs across seven tools.


The Problem: AI Coding Tools in a "Plugin Warring States" Era

Let's start with the problem.

Fig: Every tool speaks its own language — they don't integrate

Imagine you have a great set of AI coding assistants:

  • A code review skill that automatically reviews changes before each commit
  • An MCP server connecting to your company's API documentation
  • A hook script that auto-formats files on save

You configure it once in Claude Code. Then you switch to Cursor and have to reconfigure everything. Switch to Codex and the format is different. It's like JavaScript before npm — every library had its own module format, and reusing anything meant manual work.

Open Plugins aims to end this fragmentation: define one standard, share across all tools.


npx plugins: How to Install

One command:

# Install a plugin from GitHub (short format)
npx plugins add vercel/vercel-plugin

# Full HTTPS URL
npx plugins add https://github.com/vercel/vercel-plugin

# Install from local directory
npx plugins add ./my-plugin

# Preview components without installing
npx plugins discover owner/repo

# List locally detected tools
npx plugins targets

The plugins package (v1.3.4) is the Open Plugins ecosystem's "installer". Everything goes into .agents/plugins/ after installation.

Its workflow can be thought of as an assembly line:

Three installation scopes:

npx plugins add repo --scope user # User-level (~/.agents/plugins/)
npx plugins add repo --scope project # Project-level (./.agents/plugins/)
npx plugins add repo --scope local # Local dev testing only

You can also target a specific tool:

npx plugins add owner/repo -t grok # Install to Grok Build only
npx plugins add owner/repo -t vscode # Install to VS Code only

Seven Supported AI Coding Tools

npx plugins targets detects which tools you have installed and installs to all of them automatically.

Here are the supported tools and their component type compatibility:

Fig: Seven AI coding tools, one plugin standard

Full compatibility matrix:

ToolSkillsAgentsRulesHooksMCPLSP
Claude Code
Cursor
Codex
Grok Build
Kimi Code
GitHub Copilot CLI
VS Code

Key differences:

  • Cursor doesn't support Agents but supports LSP — ideal for deep in-editor usage
  • Claude Code and Codex support Agents but not LSP — they follow the agent-oriented path
  • Grok Build is provided through xAI's CLI, compatible with Claude Code's Skills and Agents formats
  • GitHub Copilot CLI is the most versatile, supporting all component types
  • VS Code currently has Agent Plugins in Preview — requires chat.plugins.enabled

Protocol Breakdown

A plugin is essentially a directory with files organized by convention.

Standard Directory Structure

Storage paths after installation:

~/.agents/plugins/ # User-level
<project>/.agents/plugins/ # Project-level

plugin.json Manifest

The manifest is optional. If omitted, the plugin name is derived from the directory name and components are discovered in default locations only.

If provided, name is the only required field:

{
"name": "my-plugin",
"version": "1.2.0",
"description": "Plugin description",
"author": {
"name": "Author",
"email": "author@example.com"
},
"homepage": "https://example.com",
"repository": "https://github.com/author/plugin",
"license": "MIT",
"keywords": ["code-review", "automation"]
}

name constraints: 1-64 characters, lowercase alphanumeric/hyphens/dots, must start and end with alphanumeric, no -- or ... ✅ deployment-tools, code-reviewer, prompts.chatMy-Plugin, -tools, my--plugin

Component Discovery Algorithm

This is the core of the protocol. The full process a tool uses to scan a plugin:

The plugin's four-stage lifecycle — from installation to activation:

Fig: Plugin installation, discovery, namespacing, and activation flow

${PLUGIN_ROOT} Path Expansion

Any configuration file within a plugin can use ${PLUGIN_ROOT}, which the tool automatically replaces with the plugin root directory's absolute path. This makes plugins self-contained — all path references are relative to itself, working from any installation location.

{
"mcpServers": {
"db-server": {
"command": "${PLUGIN_ROOT}/servers/db-server",
"args": ["--config", "${PLUGIN_ROOT}/config.json"],
"env": {
"DB_PATH": "${PLUGIN_ROOT}/data"
}
}
}
}

Expansion rules: recursive expansion (nested references are replaced); escape checking ensures paths don't leave the plugin directory.


In Practice: Migrating CloudBase MCP to Open Plugins

Enough theory — let's get real.

We've been maintaining an open-source project called CloudBase MCP that provides cloud access for AI coding tools — AI model invocation, NoSQL/PostgreSQL databases, cloud functions, CloudRun, cloud storage, WeChat Mini Program integration, and more. Previously we manually configured .claude-plugin/, .codex-plugin/, .mcp.json — one config per tool, a maintenance headache. Open Plugins came at the perfect time for a migration.

Full migration PR: TencentCloudBase/CloudBase-MCP#808 (+818 / -34)

Fig: PR #808 before/after — from vendor-specific formats to a universal plugin standard

Before vs After

plugin.json

Following the Open Plugins spec v1.0.0 closed schema, only retaining permitted metadata fields:

{
"$schema": "https://open-plugins.com/schemas/1.0.0/plugin.schema.json",
"name": "cloudbase",
"version": "0.2.0",
"description": "Tencent CloudBase — AI models, authentication, NoSQL/PostgreSQL databases, cloud functions, cloud storage, CloudRun backend services, and WeChat Mini Program integration.",
"author": {
"name": "Tencent CloudBase",
"url": "https://cloudbase.net"
},
"homepage": "https://github.com/TencentCloudBase/cloudbase-mcp",
"license": "MIT",
"keywords": [
"cloudbase", "tencent-cloud", "baas",
"ai-model", "database", "cloud-function",
"authentication", "storage", "cloudrun"
]
}

mcp.json

MCP server config moved from .mcp.json to the spec path mcp.json:

{
"mcpServers": {
"cloudbase-mcp": {
"command": "npx",
"args": ["-y", "@cloudbase/cloudbase-mcp@latest"],
"env": {}
}
}
}

Automated Build

Wrote a build-open-plugin-spec.mjs build script that auto-generates artifacts from .claude-plugin/plugin.json. Added a --check mode for CI — every PR auto-validates to prevent source updates without regenerating artifacts.

# Generate artifacts
node scripts/build-open-plugin-spec.mjs

# CI mode: check only, no writes
node scripts/build-open-plugin-spec.mjs --check

GitHub Actions workflow (.github/workflows/open-plugin-spec-check.yml) runs checks on every PR automatically.

Validation Results

The biggest win: installing to every tool with one command:

npx plugins add TencentCloudBase/cloudbase-plugin

And because we already had 4 Skills under skills/, npx plugins discover automatically registered them as namespaced commands:

ComponentUser Invocation
skills/ai-model//cloudbase:ai-model
skills/cloudbase-data//cloudbase:cloudbase-data
skills/cloud-functions//cloudbase:cloud-functions
skills/mini-program//cloudbase:mini-program

No extra config needed — just place directories by convention.

First Pitfall: marketplace.json Conflict

After PR #808 was merged, I excitedly ran npx plugins add TencentCloudBase/CloudBase-MCP and got:

No plugins found. 2 remote plugin(s) not shown.

The plugin was in the repo, but the CLI couldn't find it.

After digging: the main repo root has a marketplace.json — an index file for Claude Code and Codex marketplace add. The npx plugins CLI detected it and identified the entire repo as a marketplace (multi-plugin collection), refusing to install subdirectory plugins.

Solution: Create dedicated plugin repos

Following Vercel (vercel/vercel-plugin) and Supabase (supabase-community/supabase-plugin) — create dedicated plugin repos whose root contains only .plugin/plugin.json, no marketplace.json, so the CLI identifies them as single plugins.

Created two repos:

RepositoryInstall CommandContents
TencentCloudBase/cloudbase-pluginnpx plugins add TencentCloudBase/cloudbase-plugin28 skills + MCP + 5 commands + 2 agents + hooks
TencentCloudBase/cloudbase-sites-pluginnpx plugins add TencentCloudBase/cloudbase-sites-plugin1 skill + MCP + hooks

Content auto-synced from the main repo's plugin/cloudbase/ and plugin/cloudbase-sites/, excluding marketplace.json during sync — that's the key.

Automated sync mechanism

New files added:

FilePurpose
scripts/push-plugin-repos.mjsBuild plugin repo artifacts to .plugin-repo-output/
.github/workflows/push-plugin-repos.yamlCI auto-sync workflow
scripts/build-open-plugin-spec.mjs (extended)Handle both cloudbase + cloudbase-sites
plugin/cloudbase-sites/.plugin/plugin.jsoncloudbase-sites Open Plugin Spec manifest
plugin/cloudbase-sites/mcp.jsoncloudbase-sites MCP config

All validations passed:

npx plugins discover TencentCloudBase/cloudbase-plugin --remote
# → ✅ Found 1 local plugin(s), 28 skills, 5 cmds, 2 agents, hooks

npx plugins add TencentCloudBase/cloudbase-plugin --target cursor --scope local
# → ✅ Installed

npx plugins discover TencentCloudBase/cloudbase-sites-plugin --remote
# → ✅ Found 1 local plugin(s), 1 skill, hooks

Install commands now point to the dedicated repos:

# Main plugin
npx plugins add TencentCloudBase/cloudbase-plugin

# Sites plugin
npx plugins add TencentCloudBase/cloudbase-sites-plugin

The core lesson: Open Plugins treats a repo with marketplace.json at its root as a plugin collection, not a single plugin. If your repo has multiple artifacts (like CloudBase-MCP with both an MCP server and plugins), you need dedicated plugin repos. Vercel and Supabase do the same.


The Hook System

When I read the spec, the Hook system was the most striking part — it can hook into every lifecycle point of an agent workflow. But heads up: Hooks aren't in Spec v1, support is entirely up to the host tool. Claude Code and Copilot CLI have the fullest support, VS Code and Kimi Code don't recognize them (silently ignored, no error).

Fig: The Hook system — complete event chain from SessionStart to SessionEnd

Event Overview

EventWhen It FiresMatcher Scope
PreToolUseBefore agent calls a toolTool name
PostToolUseAfter successful tool callTool name
PostToolUseFailureOn tool call errorTool name
BeforeReadFileBefore reading a fileFile path
AfterFileEditAfter writing a fileFile path
BeforeShellExecutionBefore executing a shell commandCommand string
AfterShellExecutionAfter shell command completesCommand string
SessionStartWhen session begins
SessionEndWhen session ends
UserPromptSubmitWhen user submits a prompt
StopWhen agent attempts to stop
SubagentStartWhen subagent starts
SubagentStopWhen subagent ends

Three Action Types

command — Execute an external script, event context passed via stdin JSON:

{ "type": "command", "command": "${PLUGIN_ROOT}/scripts/lint.sh" }

prompt — Send a prompt to the LLM, $ARGUMENTS replaced with event context:

{ "type": "prompt", "prompt": "Review the change: $ARGUMENTS" }

agent — Similar to prompt but with tool access, enabling multi-step verification:

{ "type": "agent", "prompt": "Verify style guide compliance: $ARGUMENTS" }

Execution Model

  • Multiple rules can match the same event — all execute
  • Hooks within the same rule run sequentially in array order
  • Implementations should set timeouts
  • Failures must not crash the host tool

Adding Open Plugins Support to Your Tool

If you're building an AI coding tool and want plugin ecosystem compatibility, five things to implement:

Five Core Capabilities

Integration by Tool

Each tool has a different existing plugin mechanism. npx plugins does a translation layer during installation — converting the universal .plugin/ format into each tool's native format:

ToolInstall TargetIntegration Mechanism
Claude Code.claude/plugins/Skills and config directly compatible
Cursor.cursor/plugins/Registered via Rules + MCP mechanism
CodexMarketplace entry vercel@openai-curatedBuilt-in Vercel integration
Grok Buildgrok plugin installNative plugin commands + Claude Code compatibility layer
Kimi CodeKimi plugin storeVisible after /plugins TUI reload
GitHub Copilot CLIcopilot plugin marketplace addplugin add plugin@marketplace after registering source
VS Codechat.pluginLocations settingRequires enabling chat.plugins.enabled (Preview)

Security Protection Model


Closing Thoughts

Open Plugins reminds me of when npm was just gaining traction ten years ago. JavaScript package management was a mess: AMD, CommonJS, UMD, IIFE… every project had its own system. Then npm + ES Modules unified the standard, and the entire ecosystem took off. The AI coding tool plugin ecosystem is in that "pre-npm" era right now.

Migrating CloudBase MCP was a fascinating process. From npx plugins discover identifying the plugin, to installing it across every tool with one command — that feeling of "write once, use everywhere" is exactly what this standard aims to deliver.

Fig: npx plugins add TencentCloudBase/cloudbase-plugin — one command to install everywhere

If you build extensions for AI coding tools, I recommend checking out the Open Plugins spec. The good news is you don't need anything complex — just add a .plugin/plugin.json to your project and it becomes discoverable by 7 tools. Our migration was about 400 lines of code, finished in under two days.

The CloudBase-MCP plugins are at these repos, for reference:

npx plugins add TencentCloudBase/cloudbase-plugin
npx plugins add TencentCloudBase/cloudbase-sites-plugin

Open Plugins isn't "mature" yet, but the direction is right. Getting the same plugin to work across different tools is a problem worth solving. The rest depends on how the community grows.


References