What is a Plugin?
A Plugin is a curated bundle of tools from one or more MCP servers (“connectors”). It gives you a single MCP endpoint you can add to your AI client, while still enforcing all the underlying Runlayer policies and access controls. Plugins are useful when you want:- A purpose-built toolset for a workflow (e.g. “Release Management”, “Customer Support”, “On-call”)
- One connection in your MCP client instead of many
- A safe, shareable setup (private to you or public within your workspace)
Plugins expose tools and prompts, but no resources. Linked skill files are
also available through the
get_skill and get_skill_file tools described below.Creating or extending a Plugin
From the Plugins page
1
Open Plugins
Navigate to Plugins in the sidebar.
2
Create a new Plugin
Click Create new and provide a name, optional description, and optional namespace.A namespace (e.g.
acme/review) groups related Plugins and ensures a unique (namespace, path) pair. It is optional — leave it blank for one-off Plugins.3
Choose privacy
- Private: only you can access it
- Public: anyone in your workspace can access it
4
Add connectors and pick tools
Select the MCP servers you want, then choose which tools from each server should be included in the Plugin.
From connectors or skills
You can start with the items you want instead of creating an empty Plugin first.1
Select connectors or skills
Open My connectors or Skills and select one or more cards. Only active hosted connectors can be selected; local, draft, and disabled connectors cannot be bundled into a Plugin.
2
Choose Add to Client
Use the selection bar at the bottom of the page and click Add to Client.
3
Choose a Plugin path
Select one of the available actions:
- Use the Runlayer Plugin — connect the organization-wide Plugin that includes your accessible connectors and skills
- Add to plugin — open an existing Plugin you can edit with its missing selected items preselected
- Create new plugin — start a new Plugin with the selected items preselected
- View all plugins — browse existing Plugins before choosing
Using a Plugin in an MCP client
Open the Plugin and click Add to Client. Runlayer will generate the correct connection details for your selected client.Deploy an Agent from a Plugin
From any Plugin detail page, click Deploy as Agent to create a new Agent that automatically inherits the plugin’s connectors and skills. This is the fastest path from a curated toolset to a running agent.Managing connectors and tools
- Add connectors: open a Plugin and click Add Connectors
- Remove connectors: open the connector menu and choose Remove connector
- Review tools: expand a connector to see the tools included in the Plugin
Dynamic tools
Dynamic tools are an optimization for Plugins with many tools.How it works
When Dynamic tools is enabled, the Plugin does not expose every underlying tool definition directly. Instead, it exposes two meta-tools:search_tools: search for the most relevant tools by describing what you want to do (returns tool names + descriptions + input schemas)execute_tool: execute a specific tool by name with arguments (typically chosen fromsearch_toolsresults)
Why it’s useful
Sending hundreds of tool definitions (names, descriptions, and JSON schemas) to the LLM can push requests onto a “context route” that:- Degrades model performance (more noise in the prompt)
- Increases latency (more tokens processed)
- Increases cost (larger prompts and tool schemas)
When to use it
- Enable Dynamic tools for Plugins with many connectors/tools, or when tool schemas are large.
- Disable it for small Plugins where you want the model to see all tools immediately without an extra search step.
Skill tools in Plugins
When a Plugin has linked skills, those skills are automatically exposed through two shared read-only search tools alongside the connector tools:
The legacy
getSkill and getSkillFile names are still accepted on tool calls for clients with cached tool lists, but only the snake_case names are advertised.
This keeps the tool surface small for Plugins with large skill libraries while still giving the model access to every skill through search.
Authoring and syncing with CLI
Runlayer can also publish Claude-format plugins from disk withuvx runlayer plugins push.
Directory structure
Manifest
Runlayer uses.claude-plugin/plugin.json as the plugin manifest and now reads mcpServers from two places: inline in the manifest (preferred) or as a legacy .mcp.json.
How files map to Runlayer
skills/*/become individual Runlayer skills- supported non-skill files are bundled into one generated root skill named after the plugin
.md.txt.sh.py.js.ts.json
.claude-plugin/skills/.mcp.json.lsp.jsonsettings.json- root-level
README.md
agents/README.md are included.
MCP connector extraction
Runlayer first inspectsmcpServers inside .claude-plugin/plugin.json and, if none are present, falls back to .mcp.json. Regardless of where the servers come from, only Runlayer proxy URLs are accepted:
- URLs matching
/api/v1/proxy/<server-uuid>/mcp
- non-Runlayer MCP URLs
- stdio MCP entries
- plugin proxy URLs like
/api/v1/proxy/plugins/<plugin-uuid>/mcpWhen youpusha plugin that still defines non-Runlayer URLs, the CLI warns that those connectors were skipped; only the Runlayer proxies are recorded in the backend.
plugins add, Runlayer regenerates the manifest mcpServers section with the proxy URL for the linked server(s), so the installed .claude-plugin/plugin.json and .mcp.json always point at the Runlayer endpoint even if the original source defined other entries.
Publishing
Examples:
GitHub Actions
A common approach is to sync plugins automatically on every push tomain. This keeps your Runlayer workspace in lockstep with your repo without any manual steps. Here’s a starter workflow you can adapt:
RUNLAYER_HOST and RUNLAYER_API_KEY as repository secrets.
The --prune flag removes plugins from Runlayer when their directory is deleted from the repo.
Declarative sync semantics
Plugin skill membership is replaced from local disk.- If a local plugin stops including one of its linked skills, that linked skill is removed from the remote plugin
- standalone skills in the same namespace are not deleted just because their path shares the plugin prefix
- only skills actually linked to the plugin are considered plugin-managed for deletion
.mcp.json.
- On plugin create, each imported Runlayer connector enables all tools currently visible on that server
- On plugin update, existing connectors keep their current selected tools
- On plugin update, newly added connectors enable all tools currently visible on that server
- If a connector is present locally and resolves to an accessible Runlayer server, it is attached
- if a connector is missing locally, it is removed remotely on update
.mcp.jsoncontrols connector membership, not per-tool curation for connectors that already exist remotely
--dry-run is a remote-aware preview:
- it reads remote plugin and skill state
- it prints
created,updated,unchanged, anddeletedpreviews - it does not write changes
--prune, remote plugins not found locally are deleted, along with their linked skills. It does not delete unrelated standalone skills in the same namespace.
Warnings you may see:
truncated plugin description to 1024 charactersskipped MCP server <name> with non-Runlayer URL <url>missing server <uuid> skippedpush will remove remote connectors not present in local plugin state: <uuid>
Installing
Add published plugins from the Runlayer API to your local project or global config.Supported clients
Native mode writes a plugin manifest and
.mcp.json config file into the project or global directory. Codex uses a marketplace.json registry instead of symlinks. MCP fallback adds a server entry to the client’s MCP configuration file instead.
Examples
plugins add --all installs all accessible remote plugins. It does not affect how plugins list works.
File layout (native mode)
Manifest directories per client:
.claude-plugin/, .cursor-plugin/, .vscode-plugin/, .codex-plugin/. Codex also writes a marketplace.json in the canonical plugins directory.
A lockfile at .runlayer/plugin-lock.yml (or ~/.runlayer/plugin-lock.yml for global) tracks installed plugins, install mode, and versions per client.
Interactive find
Browse and install plugins interactively from the terminal.Managing installed plugins
List
By default,
uvx runlayer plugins list shows installed plugins in the current project’s scope across all clients. Use --global to switch to global scope, or --client to filter the selected scope down to one client.
list is scope-first. update and remove stay client-scoped.
List examples
Update
Pull the latest versions of installed plugins from the API.Do installed plugins auto-update? No. Plugins installed with
plugins add are pinned in the lockfile (.runlayer/plugin-lock.yml) and do not change on their own. Run plugins update to pull the latest versions, or re-run runlayer setup sync (which your MDM can schedule) to refresh managed clients. This is different from the Runlayer Plugin org entrypoint, which is built dynamically per request — policy, tool, and skill changes there take effect automatically without reinstalling.