Auto-discovered marketplace from linq-team/claude-code-imessage-channel
npx claudepluginhub linq-team/claude-code-imessage-channeliMessage messaging bridge powered by Linq with built-in access control. Manage pairing, allowlists, and policy via /imessage:access.
Connect iMessage to your Claude Code session with an MCP server.
The MCP server connects to the Linq API and provides tools to Claude to reply, react, or edit messages. When you text the Linq number, the server forwards the message to your Claude Code session.
Default pairing flow for a single-user setup. See Access Control for multi-user and policy options.
You need a Linq API token and phone number. Two options:
Option A: Free sandbox (recommended for trying it out)
Install the Linq CLI and sign up for a sandbox number (3hr expiry, authenticates via GitHub):
# Install the CLI
curl -fsSL https://raw.githubusercontent.com/linq-team/linq-cli/main/install.sh | sh
# Sign up — opens browser for GitHub auth, provisions a sandbox number
linq signup
# See your token and phone number
linq profile
Option B: Existing Linq account
Get your token from the Linq dashboard. Your phone number is listed under your account.
These are Claude Code commands — run claude to start a session first.
/plugin marketplace add linq-team/claude-code-imessage-channel
/plugin install imessage@linq
/imessage:configure <your-linq-token>
/imessage:configure <your-linq-phone-number>
Writes LINQ_TOKEN=... and LINQ_FROM_PHONE=... to ~/.claude/channels/imessage/.env. You can also write that file by hand, or set the variables in your shell environment — shell takes precedence.
The server won't connect without this — exit your session and start a new one:
claude --dangerously-load-development-channels plugin:imessage@linq
Note: Don't launch from the plugin repo directory — the local
.mcp.jsonwill conflict. Launch from any other directory (e.g.~/Desktop, your project folder, etc.).
With Claude Code running from the previous step, text your Linq number from iMessage — you'll get a 6-character pairing code back. In your Claude Code session:
/imessage:access pair <code>
Your next text reaches the assistant.
Pairing is for capturing phone numbers. Once you're in, switch to allowlist so strangers don't get pairing-code replies:
/imessage:access policy allowlist
So Claude texts you automatically when it starts:
/imessage:access recipient +1XXXXXXXXXX
Restart Claude Code with the channel flag. Claude texts you on startup.
A Linq number is publicly addressable via iMessage. Anyone who knows the number can text it, and without a gate those messages flow straight into your assistant session. The access model decides who gets through.
By default, a text from an unknown sender triggers pairing: the server replies with a 6-character code and drops the message. You run /imessage:access pair <code> from your assistant session to approve them. Once approved, their messages pass through.
All state lives in ~/.claude/channels/imessage/access.json. The /imessage:access skill commands edit this file; the server re-reads it on every inbound message, so changes take effect without a restart.
| Default policy | pairing |
| Sender ID | Phone number in E.164 format (e.g. +1XXXXXXXXXX) |
| Config file | ~/.claude/channels/imessage/access.json |
dmPolicy controls how messages from senders not on the allowlist are handled.
| Policy | Behavior |
|---|---|
pairing (default) | Reply with a pairing code, drop the message. Approve with /imessage:access pair <code>. |
allowlist | Drop silently. No reply. Useful if your number is shared and pairing replies would attract spam. |
open | Anyone can message. No filtering. |
disabled | Drop everything, including allowlisted senders. |
/imessage:access policy allowlist
iMessage uses phone numbers as identifiers. The allowlist stores E.164 format numbers (e.g. +1XXXXXXXXXX). Pairing captures the number automatically.
/imessage:access allow +1XXXXXXXXXX
/imessage:access remove +1XXXXXXXXXX
Configure inbound behavior with /imessage:access set <key> <value>.
ackReaction — tapback sent on message receipt. iMessage supports: like, love, laugh, dislike, emphasize, question. Empty string disables.
/imessage:access set ackReaction love
/imessage:access set ackReaction ""
pollInterval — how often the server checks for new messages, in milliseconds. Default 3000.
/imessage:access set pollInterval 5000