telebiz-mcp
MCP integration for Telegram via telebiz-tt browser client.
Quick Rules (read this first)
- Rate limits are strict: max 20 calls/request, 30 calls/min, 500ms between calls, heavy ops 1s.
- For adding many chats to folders: do NOT use
batchAddToFolderwith multiple chatIds (known bug). LoopaddChatToFoldersequentially. - For CRM linking:
linkEntityToChatis unstable in our tests. We observedcompanyfailing with Validation error, and at one pointorganizationsucceeding β but laterorganizationalso failed. TreatlinkEntityToChatas unreliable until upstream clarifies schema/feature flags. - Prefer reversible operations and clean up test artifacts (folders, groups) immediately.
Architecture
ββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β Clawdbot ββββββΆβ MCP Server ββββββΆβ WebSocket Relay β
β (mcporter) β β (stdio) β β (port 9716) β
ββββββββββββββββ ββββββββββββββββββββ ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Browser β
β (telebiz-tt) β
β [executor] β
βββββββββββββββββββ
Quick Setup
Prerequisites
- Node.js 18+
- Telegram account
1. Install telebiz-mcp
npm install -g @telebiz/telebiz-mcp
2. Open Telebiz in browser
Go to https://telebiz.io and login with your Telegram account.
3. Start the HTTP server
cd ~/clawd/skills/telebiz-mcp
./start-http.sh
This starts a persistent server that:
- Runs telebiz-mcp internally
- Keeps browser connection alive
- Exposes HTTP API on port 9718
4. Enable MCP in Telebiz
In telebiz.io: Settings β Agent β Local MCP
The status should show "Connected" once the server is running.
4. Verify connection
# Quick health check
cd ~/clawd/skills/telebiz-mcp
npm run health
# Should show:
# π± Telebiz MCP Status
# ββββββββββββββββββββ
# Relay: β
Running
# Executor: β
Connected
# Tools: 31 available
5. Test via mcporter
cd ~/clawd
mcporter call telebiz.listChats limit:5
Health Monitoring
Manual Check
# Check status
npm run health
# JSON output for automation
node dist/health.js --json
Monitor Script
The monitor tracks state changes and can be used with cron:
# Check and alert on changes
npm run monitor
# Quiet mode - only output on state change
node dist/monitor.js --quiet
# JSON output
node dist/monitor.js --json
Exit codes:
0= Healthy (relay up, executor connected)1= Degraded (relay up, executor disconnected)2= Down (relay not running)3= State changed (for alerting)
Cron Integration
Add to crontab for periodic monitoring:
# Check every 5 minutes, alert on changes
*/5 * * * * cd ~/clawd/skills/telebiz-mcp && node dist/monitor.js --quiet >> /var/log/telebiz-monitor.log 2>&1
Heartbeat Integration
Add to HEARTBEAT.md for Clawdbot monitoring:
### Telebiz MCP (every 2h)
- [ ] Run: `cd ~/clawd/skills/telebiz-mcp && npm run health`
- [ ] If degraded/down: Alert Albert via Telegram
Available Tools
Chat Tools
| Tool | Description |
|---|---|
listChats |
List chats with filters (type, unread, archived, etc.) |
getChatInfo |
Get detailed chat information |
getCurrentChat |
Get currently open chat |
openChat |
Navigate to a chat |
archiveChat |
Archive a chat |
unarchiveChat |
Unarchive a chat |
pinChat |
Pin a chat |
unpinChat |
Unpin a chat |
muteChat |
Mute notifications |
unmuteChat |
Unmute notifications |
deleteChat |
Delete/leave chat β οΈ |
Message Tools
| Tool | Description |
|---|---|
sendMessage |
Send text message (markdown supported) |
forwardMessages |
Forward messages between chats |
deleteMessages |
Delete messages β οΈ |
searchMessages |
Search globally or in a chat |
getRecentMessages |
Get message history |
markChatAsRead |
Mark all messages as read |
Folder Tools
| Tool | Description |
|---|---|
listFolders |
List all chat folders |
createFolder |
Create a new folder |
addChatToFolder |
Add chat to folders |
removeChatFromFolder |
Remove chat from folders |
deleteFolder |
Delete a folder β οΈ |
Member Tools
| Tool | Description |
|---|---|
getChatMembers |
List group/channel members |
addChatMembers |
Add users to group |
removeChatMember |
Remove user from group |
createGroup |
Create a new group |
User Tools
| Tool | Description |
|---|---|
searchUsers |
Search by name/username |
getUserInfo |
Get user details |
Batch Tools
| Tool | Description |
|---|---|
batchSendMessage |
Send to multiple chats |
batchAddToFolder |
Add multiple chats to folder |
batchArchive |
Archive multiple chats |
Usage Examples
Find chats waiting for my reply
mcporter call telebiz.listChats iAmLastSender=false hasUnread=true limit:20
Find stale conversations I started
mcporter call telebiz.listChats iAmLastSender=true lastMessageOlderThanDays:7 limit:20
Search all messages
mcporter call telebiz.searchMessages query="invoice" limit:20
Search in specific chat
mcporter call telebiz.searchMessages query="meeting" chatId=-1001234567890 limit:10
Send message
mcporter call telebiz.sendMessage chatId=-1001234567890 text="Hello from Clawdbot!"
Get recent messages
mcporter call telebiz.getRecentMessages chatId=-1001234567890 limit:50
Paginate through history
# Page 1 (newest 50)
mcporter call telebiz.getRecentMessages chatId=-1001234567890 limit:50 offset:0
# Page 2 (messages 51-100)
mcporter call telebiz.getRecentMessages chatId=-1001234567890 limit:50 offset:50
Organize chats
# List folders
mcporter call telebiz.listFolders
# Add chats to folder
mcporter call telebiz.batchAddToFolder chatIds='["-1001234","-1001235"]' folderId:5
Rate Limiting
The browser enforces rate limits to prevent Telegram flood protection:
- Max calls per request: 20
- Max calls per minute: 30
- Min delay between calls: 500ms
- Delay for heavy operations (send/forward/delete): 1s
(These values come from the Telebiz UI and are the effective limits we observed in practice.)
Known Issues / Workarounds (Feb 2026)
batchAddToFolder fails for multiple chatIds
Observed behavior:
batchAddToFolder(folderId, chatIds=[one])works (or reportsalreadyIncluded)batchAddToFolder(folderId, chatIds=[two or more])fails with: "Error: Failed to update folder"- Repro confirmed for both:
- Auto + another group
- Auto + a private chat
Workaround: loop sequentially:
addChatToFolder(chatId=A, folderIds=[folderId])addChatToFolder(chatId=B, folderIds=[folderId])
linkEntityToChat is unstable / schema mismatch
Observed behavior (Feb 2026):
linkEntityToChatreturns "Validation error" forentityType=deal,contact, andcompany.- In one run, using
entityType="organization"successfully linked a HubSpot company to a chat β but laterorganizationalso returned "Validation error".
Implication: this tool is either behind a feature flag, has changing server-side validation, or the published schema/enums donβt match what the backend expects.
Workaround:
- Prefer linking via
createContact/createDeal/createCompany(these link to the chat at creation time). - Use
associateEntitiesto connect dealβcompany/contact. - Donβt depend on
linkEntityToChatuntil upstream provides a stable contract + better error messages.
Troubleshooting
Relay not starting
# Check if port is in use
ss -tlnp | grep 9716
# Kill existing process
pkill -f "relay.js"
# Start fresh
./start-relay.sh
Browser not connecting
- Verify relay is running:
npm run health - Check browser console (F12) for WebSocket errors
- Ensure MCP is enabled in Settings β Agent β Enable MCP
- Try refreshing the telebiz-tt page
"Executor not connected" error
The browser tab with telebiz-tt must be:
- Open and visible (not suspended)
- Logged into Telegram
- MCP enabled in settings
Rate limit errors
- Reduce batch sizes
- Add delays between operations
- Be more specific in filters to reduce API calls
Session expired
If Telegram session expires:
- Refresh the telebiz-tt browser page
- Re-login if prompted
- Re-enable MCP in settings
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
TELEBIZ_PORT |
9716 |
Relay WebSocket port |
TELEBIZ_RELAY_URL |
ws://localhost:9716 |
Relay URL for MCP server |
TELEBIZ_STATE_FILE |
~/.telebiz-mcp-state.json |
Monitor state file |
mcporter Config
Located at ~/clawd/config/mcporter.json:
{
"mcpServers": {
"telebiz": {
"url": "http://localhost:9718/mcp"
}
}
}
Note: Use the HTTP URL (not stdio) to avoid spawning conflicts.
Security Notes
- The browser holds your Telegram session - keep it secure
- Don't expose the relay port (9716) to the internet
- Review tool calls before executing destructive operations
- Rate limits help prevent accidental spam