A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API
Feishu User Plugin is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
All-in-one Feishu MCP server + CLI tool for Claude Code / Codex / Cursor / scripts — 85 tools across 3 auth layers (cookie / app / OAuth). Send as you, read groups, manage docs / bitable / wiki / drive / calendar / tasks / OKR.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --env 'LARK_COOKIE=${LARK_COOKIE}' --env 'LARK_APP_ID=${LARK_APP_ID}' --env 'LARK_APP_SECRET=${LARK_APP_SECRET}' --env 'LARK_USER_ACCESS_TOKEN=${LARK_USER_ACCESS_TOKEN}' --env 'LARK_USER_REFRESH_TOKEN=${LARK_USER_REFRESH_TOKEN}' --transport stdio feishu-user-plugin-mcp '--' npx -y feishu-user-plugin
# 2 — ask your agent for something these tools do
# manage_bitable_app, manage_bitable_table, manage_bitable_field and 82 more
It needs LARK_COOKIE, LARK_APP_ID, LARK_APP_SECRET, LARK_USER_ACCESS_TOKEN, LARK_USER_REFRESH_TOKEN: this reads them from your environment, so export them first.
Feishu User Plugin costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Feishu User Plugin as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. Claude Code reads LARK_COOKIE (Feishu web login cookie string (required for user identity messaging)), LARK_APP_ID (Feishu Open Platform App ID (required for official API)), LARK_APP_SECRET (Feishu Open Platform App Secret (required for official API)), LARK_USER_ACCESS_TOKEN (OAuth user_access_token for P2P chat reading (run: node src/oauth.js)), LARK_USER_REFRESH_TOKEN (OAuth refresh_token for automatic UAT renewal (obtained via OAuth flow)) from your environment each time it starts the server, so the value stays out of its config: export them in your shell profile (macOS, Linux), or run setx LARK_COOKIE …, setx LARK_APP_ID …, setx LARK_APP_SECRET …, setx LARK_USER_ACCESS_TOKEN …, setx LARK_USER_REFRESH_TOKEN … and open a new terminal (Windows). The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user --env 'LARK_COOKIE=${LARK_COOKIE}' --env 'LARK_APP_ID=${LARK_APP_ID}' --env 'LARK_APP_SECRET=${LARK_APP_SECRET}' --env 'LARK_USER_ACCESS_TOKEN=${LARK_USER_ACCESS_TOKEN}' --env 'LARK_USER_REFRESH_TOKEN=${LARK_USER_REFRESH_TOKEN}' --transport stdio feishu-user-plugin-mcp '--' npx -y feishu-user-pluginReconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs your own credential rather than the publisher’s: LARK_COOKIE — Feishu web login cookie string (required for user identity messaging); LARK_APP_ID — Feishu Open Platform App ID (required for official API); LARK_APP_SECRET — Feishu Open Platform App Secret (required for official API); LARK_USER_ACCESS_TOKEN — OAuth user_access_token for P2P chat reading (run: node src/oauth.js); LARK_USER_REFRESH_TOKEN — OAuth refresh_token for automatic UAT renewal (obtained via OAuth flow). You set them in your own client’s config, on your machine — this marketplace never holds it.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
85 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Manage a Bitable app. action=create (new app, optional wiki_space_id to attach), copy (duplicate an existing app), get_meta (read app metadata).
No parameter schema on file.
Manage a table inside a Bitable app. action=list, create (with optional initial fields), update (rename), delete.
No parameter schema on file.
Manage fields (columns) inside a Bitable table. action=list, create, update (Feishu requires type even when only renaming), delete.
No parameter schema on file.
Manage views inside a Bitable table. action=list, create, delete. (Feishu open API does not expose view update — recreate with a new name to change.)
No parameter schema on file.
Manage records (rows) inside a Bitable table. action=search, get, create, update, delete. create/update/delete accept arrays — single record or up to 500.
No parameter schema on file.
List the current user's calendars (primary + shared + subscribed). Requires UAT — app identity only sees calendars it was explicitly invited to. Requires calendar:calendar:readonly scope on the…
No parameter schema on file.
List events in a calendar within an optional time range. Typical usage: first list_calendars to find calendar_id (primary calendar has type="primary"), then list events in e.g. [now, now+7d] (Unix…
No parameter schema on file.
Get full details of a single calendar event (summary, description, start/end, attendees, location, attachments, meeting link).
No parameter schema on file.
Create a new calendar event. Requires calendar:calendar.event:create scope (re-run npx feishu-user-plugin oauth after enabling). The current identity (UAT-first) must have writer or owner…
No parameter schema on file.
Patch fields on an existing calendar event. Pass only the fields you want to change. Requires calendar:calendar.event:update scope.
No parameter schema on file.
Delete a calendar event. Requires calendar:calendar.event:delete scope.
No parameter schema on file.
Respond to an event invitation. The current identity must be in the event's attendee list. Requires calendar:calendar.event:reply scope.
No parameter schema on file.
Query freebusy windows for one or more users in a time range. Use to find a meeting slot. Requires calendar:calendar:readonly (already in default scope set).
No parameter schema on file.
Search Feishu users, bots, or group chats by name. Returns IDs.
No parameter schema on file.
Create or get a P2P (direct message) chat. Returns numeric chat_id.
No parameter schema on file.
Look up a user's display name by user ID.
No parameter schema on file.
Check cookie session validity and app credentials status. Also refreshes session.
No parameter schema on file.
Download an image or file attached to a message so the model can see / store it. v1.3.7 (C2.4) consolidates the v1.3.6 download_image (mode 1) + download_file. UAT-first, falls back to app.
No parameter schema on file.
Download an image embedded in a docx document so the model can see it. Pass the image_token from get_doc_blocks (block.image.token), and optionally the doc/wiki/URL token to scope the lookup…
No parameter schema on file.
Search Feishu documents by keyword. UAT-first with app fallback: with user identity (UAT) the search covers docs visible to YOU, including your personal space; via bot it only covers docs shared…
No parameter schema on file.
Read the raw text content of a Feishu document.
No parameter schema on file.
Get structured block tree of a document. Returns block types, content, and hierarchy for precise document analysis. Follows pagination internally and returns ALL blocks by default — hasMore:false in…
No parameter schema on file.
Create a new Feishu document. Can place directly under a Wiki space by passing wiki_space_id (optionally wiki_parent_node_token for nested placement) — the plugin creates the doc in drive then…
No parameter schema on file.
Manage content blocks in a document. Single tool replaces v1.3.6 create_doc_block / update_doc_block / delete_doc_blocks.
No parameter schema on file.
Read a Feishu doc as Markdown (vs get_doc_blocks JSON). Saves ~60% tokens for RAG / digest / summarisation use cases. Accepts native docx token, wiki node token, or full Feishu URL. Embedded images…
No parameter schema on file.
List files in a Drive folder. UAT-first with app fallback: with user identity (UAT), empty folder_token lists YOUR personal-space ("我的空间") root; via bot it can only see folders shared with the bot…
No parameter schema on file.
Create a new folder in Drive.
No parameter schema on file.
Upload a file from disk to a Feishu Drive folder (drive/v1/files/upload_all, parent_type=explorer). Returns file_token + url. If wiki_space_id is provided, the uploaded file is then attached to that…
No parameter schema on file.
Manage a Drive file/doc/folder. action=copy (duplicate to a new name + folder), move (relocate, returns task_id), delete (remove, returns task_id). type is always required (Feishu rejects with…
No parameter schema on file.
Drain real-time events from the machine-level shared event log. v1.3.8 used per-process in-memory buffers (with duplicate-event problem); v1.3.9 uses ~/.feishu-user-plugin/events.jsonl with a single…
No parameter schema on file.
Inspect or control the machine-level WS owner. Actions: info (status dump), reconnect (owner-only; restart WS), claim (try become owner; force=true to steal active lock), rotate (owner-only; force…
No parameter schema on file.
Create a new group chat (as bot). Can add initial members.
No parameter schema on file.
Update group chat name or description.
No parameter schema on file.
List all members in a group chat.
No parameter schema on file.
Add or remove members from a group chat. The Feishu API rejects with code 9499 when the IDs in member_ids do not match member_id_type — pass member_id_type explicitly when using union_id or…
No parameter schema on file.
Get chat details: name, description, member count, owner. Supports both oc_xxx and numeric chat_id.
No parameter schema on file.
Read P2P (direct message) chat history using user_access_token. Works for chats the bot cannot access. Returns newest messages first by default. Auto-expands merge_forward messages into their child…
No parameter schema on file.
List group chats the user is in. Note: only returns groups, not P2P. For P2P chats, use search_contacts → create_p2p_chat → read_p2p_messages. Requires OAuth setup.
No parameter schema on file.
List all chats the bot has joined. Returns chat_id, name, type.
No parameter schema on file.
Read message history from any group. Accepts oc_xxx ID, numeric ID, or chat name (auto-searched). Auto-falls back to UAT for external groups the bot cannot access. Returns newest messages first by…
No parameter schema on file.
Search the user's IM history by keyword. Wraps Feishu POST /open-apis/search/v2/message. Requires UAT with the search:message scope (re-run npx feishu-user-plugin oauth after v1.3.12 SCOPES…
No parameter schema on file.
Send a message as the bot to any chat. Supports text, post, interactive, etc. This is the reliable path for @-mentions: include <at user_id="ou_xxx">Name</at> inline in text content and Feishu…
No parameter schema on file.
Reply to a specific message by message_id (as bot). Only works for text messages; other types return error 230054.
No parameter schema on file.
Forward a message to another chat or user. receive_id may be a group chat_id (oc_xxx), an open_id (ou_xxx), a union_id, a user_id, or an email — set receive_id_type to match (default: chat_id).
No parameter schema on file.
Recall/delete a message (bot can only delete its own messages).
No parameter schema on file.
Edit a sent message (bot can only edit its own messages). Feishu supports edit only for text and interactive (card) messages — other types (post, image, file, etc.) are rejected by the API.
No parameter schema on file.
Pin or unpin a message in a chat.
No parameter schema on file.
Add an emoji reaction to a message.
No parameter schema on file.
Remove an emoji reaction from a message.
No parameter schema on file.
Send a text message as the logged-in Feishu user. Supports reply threading and real @-mentions (triggers push notifications).
No parameter schema on file.
Search user by name → create P2P chat → send text message. All in one step.
No parameter schema on file.
Search group by name → send text message. All in one step.
No parameter schema on file.
Send the same or different content to multiple targets in one call. Each target dispatches sequentially with a small delay (anti-rate-limit) and reports per-target success/error. Identity is the…
No parameter schema on file.
Send an image as the logged-in user (NOT bot). Requires image_key from a prior upload_image call. Cookie-protobuf wire format requires both imageKey + thumbnailKey — when no separate thumbnail is…
No parameter schema on file.
Send a file as the logged-in user. Requires file_key (upload via Official API first).
No parameter schema on file.
Send a rich text (POST) message with title and formatted paragraphs. Supports real @-mentions that trigger notifications.
No parameter schema on file.
Send an interactive Feishu card to a chat via bot identity (Official API). User-identity cookie protobuf path is server-side disabled at the auth tier — confirmed by exhaustive brute-force in…
No parameter schema on file.
List a user's OKRs. Requires the user's open_id (get yours via get_login_status or search_contacts). Filter by period_ids to narrow to a specific quarter.
No parameter schema on file.
Batch-fetch full OKR details (objectives, key results, progress, alignments) by OKR IDs.
No parameter schema on file.
List OKR periods (quarters / years) defined in the tenant. Use period_ids from this to filter list_user_okrs.
No parameter schema on file.
Add a progress note to an OKR objective or key result. Feishu requires source_title, source_url, and a block-structured content; this tool exposes a simple content_text and auto-wraps it…
No parameter schema on file.
List progress records for an OKR. Feishu has no native list endpoint — this tool calls get_okrs internally and walks the objective_list / kr_list to extract progress_record IDs (with their target_id…
No parameter schema on file.
Delete an OKR progress record by its progress_id (from list_okr_progress_records).
No parameter schema on file.
List all available identity profiles (each profile has its own LARK_COOKIE / APP_ID / APP_SECRET / UAT). v1.3.9 SSOT: profiles live in ~/.feishu-user-plugin/credentials.json::profiles. Legacy…
No parameter schema on file.
Switch the active identity profile. Atomically writes credentials.json::active; cached clients in this process are invalidated; cross-process MCPs (Codex / another Claude Code) auto-sync via…
No parameter schema on file.
Inspect / set / clear profileHints — the resourceKey → profileName cache the auto-switch middleware uses to remember which profile owns each Feishu resource. Useful when a hint goes stale (e.g., a…
No parameter schema on file.
List the current user's tasks. Filter by completion or type.
No parameter schema on file.
Get full details of a single task by GUID.
No parameter schema on file.
Create a new task. summary is required; due / members / etc. are optional.
No parameter schema on file.
Patch a task. update_fields is required by Feishu — list which fields to update (e.g. ["summary","due","completed_at"]).
No parameter schema on file.
Mark a task complete (or uncomplete it). Convenience wrapper around update_task with completed_at.
No parameter schema on file.
Permanently delete a task.
No parameter schema on file.
Add or remove members on a task. Members are objects {id:"<open_id>", role:"assignee"|"follower", type?:"user", name?:""}.
No parameter schema on file.
Upload an image file to Feishu. Returns image_key for use with send_image_as_user.
No parameter schema on file.
Upload a file to Feishu. Returns file_key for use with send_file_as_user.
No parameter schema on file.
Upload a file as a Bitable attachment (drive/v1/medias/upload_all with parent_type=bitable_image or bitable_file). Returns file_token suitable for writing into a Bitable Attachment-type field via…
No parameter schema on file.
List all accessible Wiki spaces. Follows pagination internally and returns ALL spaces (pre-v1.3.17 silently capped at 50). If the upstream cursor stalls, the response carries truncated:true +…
No parameter schema on file.
Search Wiki nodes by keyword. UAT-first with app fallback: with user identity (UAT) the search covers wiki spaces visible to YOU; via bot it only covers spaces the bot was invited to. Response…
No parameter schema on file.
List nodes in a Wiki space (50 per page). When hasMore is true, pass the returned pageToken back as page_token to fetch the next page. A page may be EMPTY while hasMore is still true (Feishu…
No parameter schema on file.
Resolve a Wiki node token to its underlying object (docx / bitable / sheet / mindnote / file). Returns obj_type + obj_token + space_id so you can read/write the real resource via the usual docx /…
No parameter schema on file.
Create a new Wiki node inside a space. obj_type picks the underlying resource (doc/sheet/bitable/mindnote/file/docx/slides). UAT-first so the resource is owned by the user.
No parameter schema on file.
Rename a Wiki node (only title is updatable via the wiki API; the underlying resource content is edited via docx/bitable/sheet tools).
No parameter schema on file.
Move a Wiki node to a different parent (within the same space) or to a different space. Pass at least one of target_parent_token / target_space_id.
No parameter schema on file.
Deep-copy a Wiki node into a different location (and optionally a different space). Underlying resource is duplicated.
No parameter schema on file.
Delete a Wiki node. Calls DELETE /open-apis/wiki/v2/spaces/{space_id}/nodes/{node_token}. The Feishu SDK does not type this endpoint, so the call goes through raw REST (UAT-first; bot fallback…
No parameter schema on file.
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Feishu User Plugin or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
No tools were enumerated, so prompt-injection, capability and toxic-flow analysis had no tool surface to inspect. To grade a package’s real runtime tools, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| No per-tool rows for this release — see the note below. | ||
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 1.4.1. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Feishu User Plugin can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.