A Claude Code plugin that sends messages to your phone via Feishu/Lark when Claude needs your attention. Inspired by call-me, but uses text messages instead of phone calls.
Why? When Claude Code is running long tasks (builds, deployments, refactoring), you don't want to stare at the screen waiting. This plugin lets Claude notify you via Feishu when it's done or needs your input - so you can grab a coffee and come back when needed.
| Tool | Description |
|---|---|
send_message |
Send simple text notifications to your phone |
send_rich_message |
Send formatted card messages with title and status colors (success/warning/info) |
ask_user |
Send a message and wait for your reply - true bidirectional communication |
You: "Refactor all the API endpoints to use async/await, and text me when you're done"
Claude: [works for 10 minutes...]
๐ฑ Your phone buzzes with a Feishu message:
"โ
Refactoring Complete - Updated 15 files, all tests passing"
- Bun - Install Bun (
curl -fsSL https://bun.sh/install | bash) - Claude Code - Installation Guide
- Feishu Account - Personal or enterprise account
-
Go to Feishu Open Platform and create a new Enterprise Self-built App
-
Navigate to Credentials & Basic Info and copy your App ID and App Secret
-
Go to Permissions & Scopes and add the following permissions:
im:message- Send messagesim:message.receive_v1- Receive messages (for bidirectional communication)
Important: After adding each permission, click "Edit Scope" (็ผ่พๆ้่ๅด) and add your account to the available scope.
-
Go to Events & Callbacks โ Event Subscription:
- Enable Long Connection Mode (้ฟ่ฟๆฅๆจกๅผ)
- Add subscription:
im.message.receive_v1
-
Go to App Release and publish the app to make it available
You need your Feishu User ID to receive messages. Here's how to get it:
Option A: Via Feishu Admin Console
- Go to Admin Console โ Organization โ Members โ Find yourself โ Copy User ID
Option B: Via API
# First get tenant access token
curl -X POST 'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal' \
-H 'Content-Type: application/json' \
-d '{"app_id":"YOUR_APP_ID","app_secret":"YOUR_APP_SECRET"}'
# Then get your user info by email or mobile
curl 'https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=user_id' \
-H 'Authorization: Bearer YOUR_TENANT_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"emails":["your-email@company.com"]}'# Add the marketplace
/plugin marketplace add pcliupc/claude-text-me
# Install the plugin (Bun auto-installs dependencies)
/plugin install claude-text-me@claude-text-meAlternative: Manual Installation
# Clone the repository
git clone https://github.com/pcliupc/claude-text-me.git
cd claude-text-me
# Install dependencies
bun install
# Install as Claude Code plugin
/plugin install /path/to/claude-text-meAdd to your ~/.zshrc, ~/.bashrc, or ~/.claude/settings.json:
Shell Profile:
export TEXTME_FEISHU_APP_ID="cli_xxxxxxxxxxxx"
export TEXTME_FEISHU_APP_SECRET="xxxxxxxxxxxxxxxxxxxxxxxx"
export TEXTME_FEISHU_USER_ID="ou_xxxxxxxxxxxxxxxxxxxxxxxx"Or in ~/.claude/settings.json:
{
"env": {
"TEXTME_FEISHU_APP_ID": "cli_xxxxxxxxxxxx",
"TEXTME_FEISHU_APP_SECRET": "xxxxxxxxxxxxxxxxxxxxxxxx",
"TEXTME_FEISHU_USER_ID": "ou_xxxxxxxxxxxxxxxxxxxxxxxx"
}
}Restart Claude Code and try these prompts:
"Run the test suite and text me the results"
"Deploy to staging, but ask me for confirmation first via Feishu"
"Refactor this module and send me a summary when done"
| Tool | Purpose | Example |
|---|---|---|
send_message |
Send a simple text notification | "Text me when the build is done" |
send_rich_message |
Send a formatted card with title/status | "Send me a success notification when deployment completes" |
ask_user |
Ask for user input via Feishu (waits for reply) | "Ask me which branch to deploy to" |
get_messages |
Check for user's spontaneous messages | "Check if I sent any messages while you were working" |
When you're away from your desk, you have two ways to interact with Claude:
Use this when Claude needs to ask you something:
"Deploy to production, but confirm with me first"
"Ask me which branch to deploy via Feishu"
Claude will send a Feishu message and wait up to 3 minutes for your reply.
Use this when you want to initiate communication or when you might have questions:
"Deploy the application. I'll send you a message if I have any questions - check periodically using get_messages"
This pattern allows you to:
- Receive notifications via
send_message - Reply to those messages in Feishu
- Have Claude check for your replies using
get_messages
Here are some prompt patterns that work well:
"I'll be away from my desk. Run the deployment and use Feishu for any confirmations."
"I'm leaving my computer. Monitor the build and text me if there are issues. Check for my messages every few minutes."
"Start the long-running task. Send me progress updates, and use ask_user if you need my input."
Simply tell Claude to notify you:
"Run the full test suite and send me a message with the results"
"Deploy to production and text me when it's done"
Task Completion Notification:
You: Run all tests and send me the results
Claude: [runs tests...] Sending message via Feishu...
๐ฑ Your phone: "All tests passed (127/127)"
Confirmation Before Deployment:
You: Deploy to production, but confirm with me via Feishu first
Claude: [sends Feishu message] "Ready to deploy to production. Proceed?"
๐ฑ You reply: "Yes"
Claude: Deploying...
Interactive Decision Making:
You: Check which branches are available and ask me via Feishu which one to deploy
Claude: [sends Feishu message] "Available branches: main, staging, dev-v2. Which one should I deploy?"
๐ฑ You reply: "staging"
Claude: Deploying staging...
Spontaneous Communication with get_messages:
You: I'll be away from my desk. Deploy to staging and check if I send any messages
Claude: [sends Feishu message] "Starting deployment to staging..."
๐ฑ You reply: "Wait, deploy to dev-v2 instead"
[After some time...]
Claude: [calls get_messages] "Received 1 message from user via Feishu:
- Wait, deploy to dev-v2 instead"
Claude: Got it! Changing target to dev-v2. Deploying...
Long-Running Task with Check-ins:
You: Start the production deployment. I'll be away, so send me updates and check for my messages every 5 minutes
Claude: Starting deployment... [sends progress update via send_message]
[5 minutes later...]
Claude: [calls get_messages] "No pending messages from user."
[deployment continues]
๐ฑ You reply to earlier message: "How's the deployment going?"
Claude: [calls get_messages] "Received 1 message:
- How's the deployment going?"
Claude: Deployment is 60% complete. All containers are healthy...
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Claude Code โ MCP โ claude-text-me โ API โ Feishu API โ
โ โโโโโโโถโ MCP Server โโโโโโโถโ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโค
โ WebSocket (้ฟ่ฟๆฅ) โ
โ + Message Queue โผ
โ โโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโถโ Your Phone โ
โโโโโโโโโโโโโโโโโโโ
- Claude Code connects to the plugin via MCP (Model Context Protocol)
- When Claude needs to notify you, it calls
send_messageorsend_rich_message - The plugin uses Feishu's API to send a message to your account
- If you reply to a notification, the message is saved to an internal queue
- When Claude calls
get_messages, it retrieves your queued replies - For confirmations, use
ask_user- it waits synchronously for your reply via Feishu
Message Queue Behavior:
- Messages you send in Feishu are saved when there's no pending
ask_userwaiting - Queue holds up to 50 messages, with 1-hour expiration
get_messagesretrieves and clears the queue
| Variable | Required | Description |
|---|---|---|
TEXTME_FEISHU_APP_ID |
Yes | Your Feishu app's App ID |
TEXTME_FEISHU_APP_SECRET |
Yes | Your Feishu app's App Secret |
TEXTME_FEISHU_USER_ID |
Yes | Your Feishu User ID (receiver) |
Once a Claude Code task completes and becomes idle, the plugin cannot proactively wake it up when you send a Feishu message.
What happens:
- You send a message via Feishu โ Message is received and saved to queue
- But Claude Code is idle โ It won't check the queue until a new task starts
Workarounds:
- Use "listening mode" prompts: "Enter listening mode and wait for my Feishu messages for 30 minutes"
- Set up
ask_userbefore the task ends if you expect to need further interaction - Send a new message from desktop to trigger Claude, then check for queued messages
Root cause: MCP servers are passive responders and cannot initiate actions on their own.
Claude Code has a built-in desktop confirmation feature (AskUserQuestion). Sometimes Claude chooses this over the ask_user tool.
What happens:
- You say "deploy and confirm with me"
- Claude uses desktop popup instead of Feishu
- If you're away from your computer, the task hangs
Workarounds:
- Be explicit in your prompt: "Use the Feishu ask_user tool for confirmation, not desktop popup"
- Use trigger phrases: "I'll be away from my desk", "Use Feishu for all confirmations"
- Phrase as a long-running task: "I'm leaving my computer. Deploy and use Feishu if you need anything"
Why this happens: Claude chooses tools based on context. The built-in confirmation tool is always available and may be prioritized.
Messages in the queue are only kept in memory and will be lost if:
- Claude Code is restarted
- The plugin is reloaded
- System restarts
There is no persistent storage for queued messages.
Contributions are welcome! Here's how to get started:
# Clone and install
git clone https://github.com/pcliupc/claude-text-me.git
cd claude-text-me
npm install
# Run type checking
npm run typecheck
# Run in development mode (with auto-reload)
npm run devclaude-text-me/
โโโ .claude-plugin/
โ โโโ plugin.json # Plugin manifest for Claude Code
โ โโโ marketplace.json # Marketplace configuration
โโโ .mcp.json # MCP server configuration
โโโ src/
โ โโโ index.ts # MCP server entry point & tool definitions
โ โโโ providers/
โ โโโ feishu.ts # Feishu API implementation
โ โโโ types.ts # TypeScript type definitions
โโโ package.json
โโโ tsconfig.json
โโโ README.md
- Create
src/providers/wecom.tsimplementing theMessageProviderinterface - Add configuration options in
src/index.ts - Update
.mcp.jsonwith new environment variables - Update README with setup instructions
- Submit a PR!
- WeChat Work (ไผไธๅพฎไฟก) support
- DingTalk (้้) support
- Slack support
- Telegram support
- Message templates / customization
- Rate limiting / message batching
- call-me - The original inspiration, uses phone calls instead of messages
- Claude Code - Anthropic's official CLI for Claude
MIT License - see LICENSE for details.
Made with Claude Code