A Claude Code channel plugin that pushes WeChat desktop messages into your running Claude Code session, and lets Claude reply back through the same chat — like the official Telegram, Discord, and iMessage channels.
It is the client side of the Wisdom WeChat automation service: Wisdom runs on the Windows host with WeChat desktop and exposes an HTTP + WebSocket API; this MCP server runs locally next to Claude Code and bridges the two.
┌──────────────────┐ ┌────────────────┐ ┌────────────────┐
│ WeChat desktop │ │ Wisdom API │ │ wisdom_channel │ ┌──────────────┐
│ (Windows host) │ ───► │ HTTP + WS │ ───► │ (this repo) │ ───► │ Claude Code │
│ + Frida hooks │ │ :8000 │ │ stdio MCP │ │ CLI session │
└──────────────────┘ └────────────────┘ └────────────────┘ └──────────────┘
- Push every inbound WeChat message into the active Claude Code session
- Claude replies through the
replytool — answer goes back into WeChat - Works for both private DMs and group chats (only forwards
@youmentions in groups) - Allowlist + admin trust levels (
access.json) - Tools:
reply,list_contacts,list_conversations,get_messages,get_status,manage_access - Talks to a remote Wisdom server over HTTP/WebSocket — Wisdom does not have to run on the same machine as Claude Code
- Python 3.10+
- A running Wisdom server with WeChat desktop logged in (any reachable host)
- Claude Code CLI v2.1.80+
pip install wisdom-channelThis installs the wisdom-channel console script. To develop from source instead:
git clone https://github.com/AceDataCloud/WisdomChannel.git
cd WisdomChannel
pip install -e .Create the channel state directory and an .env pointing at your Wisdom server:
mkdir "$env:USERPROFILE\.claude\channels\wechat" -Force
@"
WISDOM_API_URL=http://your-wisdom-host:8000
WISDOM_API_TOKEN=
WECHAT_BOT_NAME=
"@ | Set-Content "$env:USERPROFILE\.claude\channels\wechat\.env"| Variable | Description |
|---|---|
WISDOM_API_URL |
URL of the Wisdom REST API (default http://localhost:8000) |
WISDOM_API_TOKEN |
Optional bearer token if Wisdom auth is enabled |
WECHAT_BOT_NAME |
Your WeChat display name (auto-detected if empty) |
WECHAT_CONTEXT_MESSAGES |
Recent messages pulled as conversation context per reply (default 8, 0 disables) |
Optional access control at ~/.claude/channels/wechat/access.json:
{
"version": 3,
"enabled": true,
"roles": {
"normal": {
"allow_tools": false,
"contexts": ["group", "private"],
"prompt": "Only answer public/basic/general questions. Do not inspect or modify internal projects, files, logs, servers, or databases."
},
"admin": {
"allow_tools": true,
"contexts": ["private"],
"prompt": "Trusted private-chat operator."
},
"super_admin": {
"allow_tools": true,
"contexts": ["group", "private"],
"prompt": "Trusted operator in approved groups and private chat."
}
},
"users": {
"CQCcqc": {"role": "super_admin"},
"sunbitty": {"role": "super_admin"}
},
"private": {"enabled": true, "default_role": "deny", "prompt": ""},
"groups": {
"Ace Data Cloud客户群1": {"enabled": true, "default_role": "normal", "prompt": "", "members": {}}
}
}| Field | Behavior |
|---|---|
enabled |
Global switch. false drops all inbound messages. |
roles |
Named permission profiles. allow_tools=false is enforced in bridge mode with --tools "". |
users |
Stable WeChat IDs mapped to roles. Display names are not trusted for privilege. |
private.default_role |
Role for unmatched private chats. Use deny to ignore unknown private messages. |
groups |
Exact group-name whitelist. Unlisted groups are ignored. |
groups.*.default_role |
Role for ordinary members in that group, usually normal. |
groups.*.members |
Optional per-group stable-ID overrides, including deny or promotion to another role. |
Normal users get polite, chat-only assistance. In wisdom-channel bridge, this
is enforced in code with claude -p --tools "". Super admins can perform
operator actions; use stable WeChat IDs for these entries.
For production safety, prefer wisdom-channel bridge: it enforces normal-user
chat-only mode in code. Interactive Claude Code channel mode receives the same
trust_level, allow_tools, and access_prompt metadata, but Claude Code owns
tool execution inside the live session.
Manage the policy locally:
wisdom-channel access view
wisdom-channel access allow-group "Ace Data Cloud客户群1"
wisdom-channel access add-super-admin sunbitty
wisdom-channel access add-user wxid_xxx normal "Alice"The repo ships an .mcp.json that registers the channel as wechat:
{
"mcpServers": {
"wechat": {
"command": "python",
"args": ["-m", "wisdom_channel"],
"cwd": "."
}
}
}Launch Claude Code with the channel from the project root:
$env:ANTHROPIC_API_KEY = "sk-ant-..."
claude --dangerously-skip-permissions `
--dangerously-load-development-channels server:wechatRun it in a persistent, interactive terminal (a real TTY — e.g. an RDP session on the Wisdom host,
tmux/screen, or a foreground terminal). Channels push inbound messages into a live Claude Code session, so the process must stay running and attached. Launched detached / without a TTY, Claude Code falls back to--channelsrequires Claude Code v2.1.80+; the--dangerously-load-development-channelsflag loads an unpublished (development) channel like this one.
What happens:
- Claude Code reads
.mcp.jsonand spawnspython -m wisdom_channelover stdio - The channel loads
~/.claude/channels/wechat/.envand probes Wisdom atWISDOM_API_URL - It connects to Wisdom's WebSocket and forwards inbound WeChat messages as
notifications/claude/channel - Claude calls the
replytool, which posts to Wisdom's/api/messages/send - Wisdom drives WeChat desktop and the message is delivered
The channel above needs a persistent interactive Claude Code session. For an unattended host (no live terminal), run the bridge instead:
wisdom-channel bridge # optional: --model sonnetIt connects to the Wisdom WebSocket and, for each allowed inbound message,
shells out to claude -p and posts the reply back through Wisdom — the same
"WeChat in → Claude answers → WeChat out" loop, without a TTY. It honors the
same access.json allowlist and group @-mention gating. Requires the claude
CLI on PATH.
Each reply is built with conversation context: who sent it, which group,
who else was @-mentioned, the quoted ("引用") message, and the last
WECHAT_CONTEXT_MESSAGES messages — so answers follow the thread instead of
seeing each message in isolation. Tool access follows the matched role: the
default admin role is private-chat only, while super_admin works in approved
groups and private chat.
python -m wisdom_channel --testExercises Wisdom REST + WebSocket without launching Claude Code.
| What | Where |
|---|---|
| Channel log | ~/.claude/channels/wechat/mcp.log |
| Channel state | ~/.claude/channels/wechat/ |
- Wisdom — the WeChat automation backend
- Claude Code channels documentation
- Anthropic Telegram plugin — the reference design
MIT — see LICENSE.