A remote MCP (Model Context Protocol) server that connects Claude.ai users to 2600net IRC (irc.scuttled.net). Each user gets a persistent, NickServ-registered IRC nick. Built on Anthropic's FastMCP framework with Streamable HTTP transport.
Written by Claude (Anthropic) & Andrew Strutt (r0d3nt) for 2600net Repo: https://github.com/astrutt/claude-mcp-2600net
Add https://wpm.2600.chat/mcp as a connector in Claude.ai and Claude can:
- Connect to 2600net with a personal persistent IRC nick (
[ai]yourname) - Send and read messages in any channel
- Register and manage their nick with Anope NickServ
- Manage channels via Anope ChanServ
- Send and receive memos via MemoServ
- Manage virtual hosts via HostServ
- Send and receive CTCP requests (VERSION, PING, TIME, FINGER)
- Query ircd-hybrid server information (STATS, MOTD, ADMIN, LINKS, etc.)
- Set away status, change nick, manage user modes
- Monitor nicks for online/offline status (MONITOR)
- Server-side ignore via SILENCE list
- WHO, ISON, USERHOST queries
Claude.ai user
↓ HTTPS
wpm.2600.chat/mcp (Apache reverse proxy, Let's Encrypt TLS)
↓ HTTP localhost:8765
IRC MCP Server (FastMCP, Streamable HTTP, Python)
↓ TLS port 6697
irc.scuttled.net (2600net IRC, ircd-hybrid + Anope services)
The MCP server is completely independent of the Claude IRC Bot — separate install directory, separate Python venv, separate system user.
- Ubuntu 22.04+ or Debian 11+ with Python 3.10+
- Apache with
mod_proxy,mod_proxy_http,mod_headers,mod_rewrite - Let's Encrypt SSL certificate for your domain
- An IRC network running ircd-hybrid with Anope services
git clone https://github.com/astrutt/claude-mcp-2600net.git
cd claude-mcp-2600net
sudo bash install_mcp.sh
The installer:
- Creates a dedicated system user (
claudemcp) - Installs to
/opt/claude-irc-mcp/with its own Python venv - Installs Python packages (
mcp[cli],cryptography) - Writes config to
/etc/claude-irc-mcp/mcp_server.ini - Generates session encryption key at
/etc/claude-irc-mcp/session.key - Creates session storage at
/var/lib/claude-irc-mcp/ - Installs and enables a systemd service
Add the contents of mcp_apache.conf inside your existing HTTPS VirtualHost, then:
sudo a2enmod proxy proxy_http headers rewrite
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo systemctl start claude-irc-mcp
sudo journalctl -u claude-irc-mcp -f
/opt/claude-irc-mcp/venv/bin/python3 /opt/claude-irc-mcp/irc_mcp_server.py
- Go to Settings → Connectors → Add custom connector
- Enter:
https://wpm.2600.chat/mcp - Save — Claude now has access to all 39 IRC tools
Ask Claude to connect:
"Connect me to 2600net IRC with the name 'yourname' and email 'you@example.com'"
Claude will call irc_connect and return a session_id. Save this in your custom instructions — it reconnects you to the same nick every time:
My 2600net IRC session_id is abc123def456...
Providing an email triggers Anope NickServ registration. Anope will email you a verification code. Confirm it with:
"Confirm my NickServ registration with code ABC123"
Claude will call irc_nickserv('CONFIRM ABC123').
You can also connect without an email — your nick will be unregistered but fully functional.
You: Connect me to 2600net IRC as 'alice' with email alice@example.com
Claude: Connected! Your nick is [ai]alice on 2600net (irc.scuttled.net).
NickServ registration email sent to alice@example.com —
check your inbox and tell me the confirmation code.
session_id: a1b2c3d4e5f6...
Save this in your custom instructions to reconnect automatically.
You: The confirmation code is 847291
Claude: [calls irc_nickserv('CONFIRM 847291')]
Nick [ai]alice is now registered and identified with NickServ!
You: Join #ClaudeBot and say hello
Claude: [calls irc_join_channel('#ClaudeBot')]
[calls irc_send_message('#ClaudeBot', 'Hello #ClaudeBot! [ai]alice here.')]
Done — message sent to #ClaudeBot.
You: What are people saying in there?
Claude: [calls irc_read_channel('#ClaudeBot', limit=10)]
Here are the last 10 messages in #ClaudeBot: ...
You: Who is r0d3nt on 2600net?
Claude: [calls irc_nickserv_info('r0d3nt')]
r0d3nt is registered. Last seen: recently.
Channels: #2600net, #ClaudeBot (founder)
You: What channels are active right now?
Claude: [calls irc_list_channels(limit=20)]
Here are the 20 most active channels on 2600net: ...
You: Who's in #2600net?
Claude: [calls irc_list_users('#2600net')]
#2600net has 14 users:
Ops: r0d3nt, ClaudeBot
Regular: spacebison, RDNt, ...
You: WHOIS spacebison
Claude: [calls irc_whois('spacebison')]
spacebison is connected via TLS from *.2600.chat
Channels: #2600net #ClaudeBot
Idle: 2 minutes
You: What IRC client is r0d3nt using?
Claude: [calls irc_ctcp_send('r0d3nt', 'VERSION')]
r0d3nt replied: HexChat 2.16.2 [Linux]
You: How long has the 2600net server been running?
Claude: [calls irc_server_stats('u')]
Server uptime: 47 days, 3 hours, 22 minutes, 14 seconds
You: Send r0d3nt a memo saying thanks
Claude: [calls irc_memoserv('SEND r0d3nt Thanks for building this IRC connector!')]
Memo sent to r0d3nt.
39 tools across 7 categories.
| Tool | Description |
|---|---|
irc_connect |
Connect to 2600net IRC and get a persistent IRC nick. |
irc_disconnect |
Cleanly disconnect from IRC. Nick stays registered. |
irc_get_my_info |
Get current session info — nick, status, channels, connection state. |
| Tool | Description |
|---|---|
irc_send_message |
Send a message to an IRC channel. |
irc_send_private_message |
Send a private message (PM) to another IRC user. |
irc_read_channel |
Read the most recent messages from an IRC channel. |
irc_read_private_messages |
Read buffered private messages received this session. |
irc_send_notice |
Send a NOTICE to a nick or channel. |
| Tool | Description |
|---|---|
irc_join_channel |
Join an IRC channel. |
irc_part_channel |
Leave an IRC channel. |
irc_list_channels |
List public channels on 2600net. |
irc_list_users |
List users in a channel (ops, voiced, regular). |
irc_get_topic |
Get the current topic of a channel. |
irc_set_topic |
Set the topic for a channel. |
irc_get_mode |
Get current modes for a channel or user. |
irc_set_mode |
Set modes on a channel or user. |
irc_invite |
Invite a nick to a channel. |
irc_knock |
Knock on an invite-only (+i) channel. |
irc_whois |
Get WHOIS information about an IRC user. |
| Tool | Description |
|---|---|
irc_set_away |
Set or clear an away message. |
irc_change_nick |
Change your IRC nick. |
irc_setname |
Change your realname/gecos field shown in /whois. |
irc_who |
WHO query — extended user info (username, host, realname, idle). |
irc_ison |
Check which nicks from a list are currently online. |
irc_userhost |
Get userhost info for up to 5 nicks simultaneously. |
irc_monitor |
Add nicks to your MONITOR list for online/offline notifications. |
irc_monitor_status |
Check online/offline status of your MONITOR list. |
irc_silence |
Add a nick or hostmask to your server-side SILENCE list. |
irc_unsilence |
Remove a nick or hostmask from your SILENCE list. |
| Tool | Description |
|---|---|
irc_ctcp_send |
Send a CTCP request (VERSION, PING, TIME, FINGER, custom) and get the reply. |
irc_ctcp_read_replies |
Read buffered CTCP replies from a nick. |
| Tool | Description |
|---|---|
irc_nickserv |
Send any NickServ command (IDENTIFY, REGISTER, GHOST, SET, GROUP, ...). |
irc_nickserv_info |
Query NickServ registration info about a nick. |
irc_chanserv |
Send any ChanServ command (OP, TOPIC, AOP/SOP/VOP/HOP, KICK, BAN, ...). |
irc_chanserv_info |
Query ChanServ registration info about a channel. |
irc_memoserv |
Send and receive memos via MemoServ (SEND, LIST, READ, DEL). |
irc_hostserv |
Manage virtual hosts via HostServ (ON, OFF, REQUEST). |
| Tool | Description |
|---|---|
irc_server_stats |
STATS query (u=uptime, l=links, c=connections, m=commands, o=opers, p=ports, t=traffic). |
irc_server_info |
Server info commands: ADMIN, MOTD, TIME, VERSION, LINKS, LUSERS, MAP. |
- Each Claude.ai user gets a unique
session_idand IRC nick ([ai]yourname) - Sessions persist across MCP server restarts (stored encrypted in
mcp_sessions.json) - Idle sessions disconnect after 4 hours; nick stays registered
- Reconnecting with the same
session_idreclaims the same nick - NickServ passwords are auto-generated per session — users never see them
- Session file is written atomically (temp file + rename) — safe against corruption on crash
- The MCP server listens on
127.0.0.1only — Apache handles all public TLS - No authentication required — any Claude.ai user can connect (open by design)
- Each session is isolated — users can only act as their own nick
- Session data (passwords, email) is encrypted at rest with Fernet symmetric encryption
- All outbound IRC lines are CRLF-stripped to prevent IRC command injection
- ircd-hybrid server commands are whitelisted to read-only queries (STATS, MOTD, etc.)
- CTCP unknown types are silently ignored to prevent flood amplification
- Rate limiting: 1 second minimum between IRC sends per session
- Per-user session cap enforced against active sessions only (not historical)
| File | Purpose |
|---|---|
irc_mcp_server.py |
MCP server (39 tools) |
install_mcp.sh |
Interactive installer |
mcp_server.ini |
Configuration template |
mcp_apache.conf |
Apache reverse proxy snippet |
claude-irc-mcp.service |
systemd unit file |
README.md |
This file |
CHANGELOG_MCP.md |
Version history |
- Server:
irc.scuttled.net:6697(TLS) - Services: Anope (NickServ, ChanServ, MemoServ, HostServ, OperServ)
- IRCd: ircd-hybrid
To use with a different IRC network, edit /etc/claude-irc-mcp/mcp_server.ini.
Messages sent via this connector are processed by the MCP server running on wpm.2600.chat and relayed to 2600net IRC (irc.scuttled.net). Session data (nick, generated password, email if provided) is stored encrypted locally in mcp_sessions.json on the server. No message content is logged beyond what appears in the IRC server's own logs.
MIT — see LICENSE.
Contributions welcome via pull request.