Model Context Protocol (MCP) integration for CRX3 Chrome extension tooling
This document explains how to configure crx3 mcp with AI assistants like Opencode, Crush, Claude Desktop, and other MCP-compatible clients.
crx3 mcp exposes CRX3 extension management capabilities through the Model Context Protocol (MCP), enabling AI assistants to:
- 📦 Pack/unpack Chrome extensions
- ⬇️ Download extensions from the Chrome Web Store
- 🔑 Generate extension IDs from public keys
- 🔍 Analyze extension structure and metadata
- 🗜️ Handle ZIP/archive operations
The MCP server runs in two modes:
| Mode | Command | Use Case |
|---|---|---|
| stdio | crx3 mcp |
Local AI clients (Opencode, Crush) |
| HTTP/SSE | crx3 mcp --listen=:3000 |
Remote clients, custom integrations (WIP) |
| Tool | Purpose |
|---|---|
crx3_search |
Search Chrome Web Store by name/keywords using DuckDuckGo |
crx3_download |
Download .crx extension by ID or URL |
crx3_workspace |
Get absolute path to workspace root |
crx3_unpack |
Extract .crx file contents to directory |
crx3_pack |
Pack directory/zip into signed .crx |
crx3_scan |
List/filter downloaded extensions in workspace |
crx3_unzip |
Extract .zip archive contents |
crx3_zip |
Create .zip archive from directory |
crx3_base64 |
Encode file to Base64 string |
crx3_getid |
Extract Chrome Extension ID from .crx or directory |
crx3_version |
Show CRX3 tool version |
💡 Use
crx3 mcp --tools.showto see the full tool schema in JSON format.
-
Install
crx3 mcp: Guide -
Verify installation:
crx3 mcp --help crx3 mcp --tools.show | jq .tools # requires jq
-
Ensure your AI client supports MCP:
- Opencode: 1.1.36+ with MCP enabled
- Crush: v0.41.0+ with MCP enabled
- Cursor: v0.40+ with MCP enabled
- Claude Desktop: MCP plugin installed
- Windsurf: MCP support in settings
Opencode uses a configuration file (typically .opencode/config.json or opencode.json) to define MCP servers.
- Locate or create the config file: Project-local: .opencode/config.json Global: ~/.opencode/config.json
- Add the crx3 MCP server:
{
"mcp": {
"crx3": {
"type": "stdio",
"command": "crx3",
"args": [
"mcp"
],
"env": {},
"tools": {
"autoApprove": [
"crx3_pack",
"crx3_unpack",
"crx3_download"
]
}
}
}
}- Optional: Disable tools for safety:
{
"mcp": {
"crx3": {
"type": "local",
"command": "crx3",
"args": [
"mcp",
"--tools.disabled=crx3_download",
"--workdir=/safe/path"
],
"env": {}
}
}
}- Restart Opencode or reload the workspace.
- Verify connection:
- Open the Opencode chat panel
- Type: @crx3 list available tools
- You should see the list of CRX3 tools
Crush supports MCP via its ~/.crush/config.yaml configuration file (or project-local .crush/config.yaml).
- Edit the Crush config:
"mcp": {
"crx3": {
"type": "stdio",
"command": "crx3",
"args": ["mcp", "--workdir=some/dir"]
}
}- Project-specific override (optional):
"mcp": {
"crx3": {
"type": "stdio",
"command": "crx3",
"args": ["mcp", "--workdir=some/dir"]
}
}- Restart Crush or run crush reload if supported.
- @crx3 list available tools
- Open Cursor Settings → MCP Servers
- Add a new server configuration:
{
"mcpServers": {
"crx3": {
"command": "crx3",
"args": ["mcp", "--workdir=/path/to/extensions"],
"env": {},
"disabled": false,
"autoApprove": ["crx3_pack", "crx3_unpack", "crx3_download"],
"description": "CRX3 Chrome extension management tools"
}
}
}-
Restart Cursor. You should see
crx3tools available in the AI chat. -
Test in chat:
Can you pack my extension from ./my-extension into ./output.crx3?
-
Locate Claude Desktop config:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
- macOS:
-
Add the MCP server entry:
{
"mcpServers": {
"crx3": {
"command": "crx3",
"args": ["mcp", "--workdir=/path/to/extensions"],
"env": {
}
}
}
}-
Restart Claude Desktop.
-
Test in chat:
Can you pack my extension from ./my-extension into ./output.crx3?
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--listen |
-l |
string | "" |
Run server over HTTP/SSE at given address (e.g., :3000). If unset, uses stdio. |
--logfile |
-f |
string | "" |
Path to log file. If unset, logs to stderr. |
--tools.show |
-s |
bool | false |
Print available tools + instruction JSON and exit. |
--tools.disabled |
-d |
string[] | [] |
Comma-separated list of tool names to disable. |
--tools.disabledMarkdownOutput |
-m |
bool | false |
Return only JSON (no Markdown) in tool responses. |
--workdir |
-w |
string | . |
Working directory for all file operations. |
crx3 mcp --tools.disabled=crx3_download,crx3_unpack --workdir=/safe/dircrx3 mcp --tools.disabledMarkdownOutput --logfile=/var/log/crx3-mcp.jsonDownload and unpack:
@crx3 Download extension ID "nmmhkkegccagdldgiimedpiccmgmieda" and unpack it to ./extensions/google-pay
crx3 mcp --tools.show | jq .Output:
{
"instruction": "You are a CRX3 extension management assistant. Use the provided tools to pack, unpack, analyze, and manage Chrome extensions.",
"tools": [
{
"name": "pack_extension",
"description": "Pack a directory into a CRX3 package",
"inputSchema": { ... }
},
...
]
}