molecule-mcp-claude-channel
Claude Code channel plugin for Molecule AI. Bridges Molecule A2A traffic into a Claude Code session: peer messages from your watched workspaces surface as conversation turns, and your replies route back through Molecule's A2A.
What it does
When you launch Claude Code with this plugin enabled and configure it to watch one or more Molecule workspaces, every A2A message your watched workspaces receive shows up in the session as a user-turn. You reply normally; the plugin's MCP reply_to_workspace tool sends the response back through Molecule.
Molecule peer ──A2A──> [your workspace] ──poll──> [this plugin] ──MCP notification──> Claude Code session
^ │
└────────── POST /workspaces/:id/a2a ◄── reply_to_workspace tool ──┘
No tunnel. No public endpoint. The plugin self-registers each watched workspace as delivery_mode=poll on startup and then long-polls /workspaces/:id/activity?since_id=<cursor> for new A2A traffic. Replies POST back to /workspaces/:peer_id/a2a via the same bearer token.
Install
This plugin distributes through the Claude Code marketplace flow. From any shell:
# 1. Add the marketplace (one-time per machine)
claude plugin marketplace add https://git.moleculesai.app/molecule-ai/molecule-mcp-claude-channel.git
# 2. Install the plugin
claude plugin install molecule@molecule-channel
molecule is the plugin name (from .claude-plugin/plugin.json); molecule-channel is the marketplace name (from .claude-plugin/marketplace.json). Both live in the same repo — installing the marketplace makes the plugin available; installing the plugin enables it for your sessions.
To pin a specific version, append #<tag> to the marketplace URL — for example …/molecule-mcp-claude-channel.git#v0.4.0-gitea.3. Without a ref, you track main.
Alternatively, to load the channel for a single session without a persistent
marketplace install (useful for a quick try, or in CI), pass the channel spec
as the value of --dangerously-load-development-channels:
claude --dangerously-load-development-channels plugin:molecule@molecule-channel
The channel spec (plugin:molecule@molecule-channel) is the value of
--dangerously-load-development-channels — it is not a separate --channels
flag. There is no --channels flag in current Claude Code. Passing the spec
under a --channels flag fails with the misleading error
entries must be tagged: --channels.
Note for users coming from the GitHub install path: the GitHub Molecule-AI org was suspended on 2026-05-06 and is permanently gone. The earlier claude --channels plugin:molecule@Molecule-AI/... invocation no longer resolves (and --channels is not a real flag — see above). The new path (above) is the canonical replacement; behavior is unchanged.
Don't use the claude --channels plugin:… one-liner. It silently no-ops on Claude Code 2.1.129 (and likely 2.1.x in general), and on newer builds (2.1.143) errors with entries must be tagged: --channels. Use either the marketplace flow or the --dangerously-load-development-channels plugin:molecule@molecule-channel form above. If a previous setup guide pointed you at claude --channels plugin:molecule@…, ignore it.
Installing bun (macOS)
The MCP server runs under bun. On macOS, brew install bun
fails — there is no bun formula in the main Homebrew tap. Use the tap or the
official installer instead:
# Option A: Homebrew tap
brew tap oven-sh/bun && brew install bun
# Option B: official installer
curl -fsSL https://bun.sh/install | bash
Allowing the channel via allowedChannelPlugins
The Claude Code host gates channel-plugin notifications behind an explicit allow-list. The plugin won't deliver notifications/claude/channel events to your session unless this list contains an entry that matches.
Schema. allowedChannelPlugins is an array of objects, not strings. The shape is { "plugin": "<plugin-name>", "marketplace": "<marketplace-name>" }. The host's Zod validator silently ignores entries that aren't objects in this shape — so a bare-string entry like "molecule" or "molecule@molecule-channel" will load without error and contribute nothing to the allow-list. The symptom: poll loop runs cleanly, cursor advances, stderr says "delivered", and the message never reaches the conversation.
For this plugin, the entry is:
{ "plugin": "molecule", "marketplace": "molecule-channel" }
Location. allowedChannelPlugins (and channelsEnabled, below) only takes
effect from the managed-settings file. This is a local on-disk policy
file, not a setting in the claude.ai web admin UI — there is no web toggle for
this. The path is OS-specific: