feishu-mcp
by lichman0405
README.md
# feishu-miqroera-mcp
> π€ **Feishu MCP Server** β Let AI Agents directly control Feishu: send messages, create calendars, manage tasks, and write cloud documents.
[](https://www.python.org/)
[](LICENSE)
[](https://modelcontextprotocol.io/)
---
## Table of Contents
- [Features](#features)
- [Quick Start](#quick-start)
- [Connect an AI Agent](#connect-an-ai-agent)
- [NanoBot (recommended)](#nanobot-recommended)
- [Claude Desktop](#claude-desktop)
- [Cursor](#cursor)
- [Cline / Continue / Other MCP-compatible tools](#cline--continue--other-mcp-compatible-tools)
- [Long-Connection Event Listener](#long-connection-event-listener)
- [Docker Deployment](#docker-deployment)
- [Full Tool List](#full-tool-list)
- [Feishu App Permissions](#feishu-app-permissions)
- [Development & Contributing](#development--contributing)
---
## Features
This project implements an **MCP (Model Context Protocol) Server** that wraps Feishuβs core capabilities as structured AI tools, enabling any MCP-compatible AI Agent / LLM toolchain to:
| Capability | Functions |
|------------|-----------|
| π¬ Messages | Send & reply to group messages, @mention members, Markdown format |
| π
Calendar | Create/query group calendars, create events, invite attendees |
| β
Tasks | Create tasks, assign owners, set due dates |
| π Documents | Create cloud docs, write Markdown content, upload files, one-click share links, set collaborator permissions |
| π₯ Users | Get group member lists, resolve users by name |
| π Events | Receive Feishu push events via long-connection WebSocket in real time (no public IP required) |
---
## Quick Start
### 1. Clone and install
```bash
git clone https://github.com/your-username/feishu-miqroera-mcp.git
cd feishu-miqroera-mcp
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate
pip install -e .
```
### 2. Configure Feishu app credentials
```bash
cp .env.example .env
```
Edit `.env`:
```env
FEISHU_APP_ID=cli_xxxxxxxxxxxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
> How to get credentials: log in to the [Feishu Open Platform](https://open.feishu.cn/) β create an in-house app β go to the "Credentials & Basic Info" page
### 3. Verify the installation
```bash
# Confirm the MCP server starts correctly (Ctrl+C to exit)
.venv\Scripts\python.exe -m feishu_mcp.server
```
You should see `MCP server running on stdio` indicating success.
---
## Connect an AI Agent
### NanoBot (recommended)
[NanoBot](https://github.com/HKUDS/nanobot) is a lightweight multimodal AI Agent framework with native support for MCP Servers and Feishu channels.
**Step 1: Edit the NanoBot config file**
```bash
# Config file location (auto-created)
~/.nanobot/config.json # macOS / Linux
%USERPROFILE%\.nanobot\config.json # Windows
```
**Step 2: Add feishu-mcp to `tools.mcpServers`**
```json
{
"tools": {
"mcpServers": {
"feishu-mcp": {
"command": "C:/path/to/feishu-miqroera-mcp/.venv/Scripts/python.exe",
"args": ["-m", "feishu_mcp.server"],
"env": {
"FEISHU_APP_ID": "cli_xxxxxxxxxxxxxxxxxx",
"FEISHU_APP_SECRET": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
},
"channels": {
"feishu": {
"appId": "cli_xxxxxxxxxxxxxxxxxx",
"appSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
```
> **Windows note**: Use forward slashes `/` or double backslashes `\\` in paths
**Step 3: Start NanoBot**
```bash
nanobot run
```
NanoBot will automatically establish a Feishu long connection; the AI can then drive Feishu operations via natural language.
---
### Claude Desktop
**Step 1: Locate the config file**
| OS | Path |
|----|------|
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
**Step 2: Add the MCP Server config**
```json
{
"mcpServers": {
"feishu-mcp": {
"command": "C:/path/to/feishu-miqroera-mcp/.venv/Scripts/python.exe",
"args": ["-m", "feishu_mcp.server"],
"env": {
"FEISHU_APP_ID": "cli_xxxxxxxxxxxxxxxxxx",
"FEISHU_APP_SECRET": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}
```
> **macOS** example: `"command": "/Users/yourname/feishu-miqroera-mcp/.venv/bin/python"`
**Step 3: Restart Claude Desktop**
After restarting, look for the π§ icon in the chat input area and confirm "feishu-mcp" is loaded.
---
### Cursor
**Step 1: Locate the config file**
```
<project root>/.cursor/mcp.json
```
Or global config:
| OS | Path |
|----|------|
| Windows | `%USERPROFILE%\.cursor\mcp.json` |
| macOS | `~/.cursor/mcp.json` |
**Step 2: Add config**
```json
{
"mcpServers": {
"feishu-mcp": {
"command": "C:/path/to/feishu-miqroera-mcp/.venv/Scripts/python.exe",
"args": ["-m", "feishu_mcp.server"],
"env": {
"FEISHU_APP_ID": "cli_xxxxxxxxxxxxxxxxxx",
"FEISHU_APP_SECRET": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}
```
**Step 3**: Open Cursor β Settings β MCP β Confirm feishu-mcp status is green
---
### Cline / Continue / Other MCP-compatible tools
All tools that support MCP stdio transport can connect using the same config format:
```json
{
"command": "/absolute/path/to/.venv/bin/python",
"args": ["-m", "feishu_mcp.server"],
"env": {
"FEISHU_APP_ID": "cli_xxx",
"FEISHU_APP_SECRET": "xxx"
}
}
```
---
## Long-Connection Event Listener
Feishu's long connection (WebSocket) **requires no public IP** and no ngrok β receive Feishu push events directly from behind NAT.
```bash
# Start the event listener standalone (runs 24/7)
.venv\Scripts\python.exe -m feishu_mcp.webhook.longconn
```
Example log output after startup:
```
INFO Connecting to Feishu WebSocket: wss://msg-frontier.feishu.cn/ws/v2
INFO Feishu long connection established
INFO Received message event: chat_id=oc_xxx, sender=ou_xxx, text=Hello
```
Receiving events in your own application code:
```python
import lark_oapi as lark
client = lark.Client.builder() \
.app_id("cli_xxx") \
.app_secret("xxx") \
.event_callback(lark.EventType.IM_MESSAGE_RECEIVE_V1, your_handler) \
.build()
ws = lark.ws.Client(app_id, app_secret, event_handler=client.event_handler)
ws.start()
```
---
## Docker Deployment
### Using Docker directly
```bash
# Build image
docker build -t feishu-miqroera-mcp .
# Start Feishu event listener (background)
docker run -d \
--name feishu-listener \
--env-file .env \
--restart unless-stopped \
feishu-miqroera-mcp \
feishu_mcp.webhook.longconn
# View logs
docker logs -f feishu-listener
```
### Using Docker Compose
```bash
# Copy and fill in env vars
cp .env.example .env
# Edit .env with APP_ID and APP_SECRET
# Start event listener
docker compose up -d feishu-listener
# Check status
docker compose ps
# View logs
docker compose logs -f feishu-listener
```
> **MCP Server (stdio)** is usually invoked directly as a local process by the AI Agent framework and does not need to be containerized.
> Docker is primarily used for persistently running the **event listener**.
---
## Full Tool List
| Tool | Description |
|------|-------------|
| `get_chat_members` | Get the member list of a group |
| `resolve_users_by_name` | Look up users in a group by name |
| `send_message` | Send a text/rich-text message to a group or user |
| `reply_message` | Reply to a specific message |
| `get_or_create_group_calendar` | Get or create a shared group calendar |
| `create_calendar_event` | Create an event in a calendar |
| `add_event_attendees` | Add attendees to a calendar event |
| `list_calendar_events` | Query the list of calendar events |
| `create_task` | Create a Feishu task (with due time and description) |
| `assign_task` | Assign an owner to a task |
| `add_task_to_list` | Add a task to a tasklist |
| `list_tasks` | Query the task list |
| `create_folder` | Create a folder in Drive |
| `create_document` | Create a Feishu cloud document |
| `write_document_markdown` | Write Markdown content into a document (accepts docx `document_id` or wiki `node_token`) |
| `upload_file` | Upload a file to Feishu Drive |
| `upload_file_and_share` | Upload a file and return a shareable link in one step (upload + set permission + get link) |
| `insert_file_block` | Insert a file attachment block into a document (accepts docx `document_id` or wiki `node_token`) |
| `set_doc_permission` | Add collaborators to a document (supports users or groups) |
| `set_doc_public_access` | Set document public access / link sharing permission |
| `get_share_link` | Get the sharing link for a document |
| `grant_permission_request` | Handle a permission request and authorize the applicant |
See [docs/api.md](docs/api.md) for full parameter details.
---
## Feishu App Permissions
Enable the following permissions in your app's management page on the [Feishu Developer Console](https://open.feishu.cn/):
| Permission | Purpose |
|------------|--------|
| `im:message` | Send/receive messages |
| `im:message.group_at_msg` | Group @mention feature |
| `im:chat.members:read` | Read group members |
| `task:task` | Task read/write |
| `calendar:calendar` | Calendar read/write |
| `drive:drive` | Drive/document read/write |
| `docx:document` | Cloud document content editing |
| `wiki:wiki:readonly` | Resolve wiki node tokens to docx document IDs (required if documents are wiki-mounted) |
Path to enable permissions: App Management β Permission Management β Enable the above permissions β Publish version.
---
## Development & Contributing
```bash
# Run unit tests
pytest tests/ -v
# Run integration tests (requires real Feishu credentials)
pytest tests/integration/ -v
# Format code
ruff format src/ tests/
# Lint check
ruff check src/ tests/
```
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
---
## License
[MIT](LICENSE) Β© 2026 feishu-miqroera-mcp contributors
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues