feishu-user-plugin — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited feishu-user-plugin (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
All-in-one Feishu plugin for Claude Code with three auth layers:
This plugin replaces and extends the official Feishu MCP. No need to install two packages.
Activate when the user mentions:
Parse "recipient: message" format, auto-detect user vs group, confirm before sending.
Search chat → read recent messages → show summary → user picks a message → reply.
Search chat → read N days of messages → filter valuable content → summarize key insights.
Search users and groups by name, display results grouped by type.
Search (search_docs), read (read_doc), create (create_doc) — three in one.
Query (manage_bitable_table(action=list) → manage_bitable_field(action=list) → manage_bitable_record(action=search)), create / update / delete records via manage_bitable_record(action=create|update|delete).
List spaces (list_wiki_spaces), search content (search_wiki), browse nodes (list_wiki_nodes).
List files in folders, create new folders in Feishu Drive.
Check cookie / app credentials / UAT — all three auth layers at once.
| Env Variable | Who Provides | Purpose | Required |
|---|---|---|---|
| LARK_COOKIE | You | Send messages as yourself | Yes (for messaging) |
| LARK_APP_ID | You (create a Feishu app) | Official API access | Yes |
| LARK_APP_SECRET | You (from your Feishu app) | Official API access | Yes |
| LARK_USER_ACCESS_TOKEN | You (OAuth flow) | Read P2P chat history | Yes (for P2P reading) |
| LARK_USER_REFRESH_TOKEN | You (OAuth flow) | UAT auto-refresh | Yes (for P2P reading) |
Prerequisite: Playwright MCP must be installed. If not, run:
npx @anthropic-ai/claude-code mcp add playwright -- npx @anthropic-ai/mcp-server-playwrightThen restart Claude Code.
Automated flow (recommended, zero manual cookie copying):
Just tell Claude Code: "Help me set up my Feishu cookie"
>
Claude Code will automatically: 1. Open feishu.cn in a browser via Playwright 2. Show you the QR code — scan it with Feishu mobile app 3. Extract the full cookie (including HttpOnly) viacontext.cookies()4. Write it to your.mcp.jsonLARK_COOKIE field 5. Prompt you to restart Claude Code
Manual fallback (if Playwright is unavailable):
.mcp.json env LARK_COOKIE fieldDo NOT use document.cookie or Application → Cookies — they miss HttpOnly cookies required for auth.im:message, im:message:readonly, im:chat:readonly, contact:user.base:readonly.mcp.jsonThe plugin supports multiple Feishu organization accounts via named profiles in ~/.feishu-user-plugin/credentials.json. Each profile has its own COOKIE / APP_ID / APP_SECRET / UAT.
Drive this end-to-end via the Bash tool — DO NOT just print commands and ask the user to type them. Specifically:
1. Confirm what's needed, then collect:
work2, personal, etc.; let user pick)on https://open.feishu.cn/app for that account's tenant — the existing app from the default profile WON'T work for a different tenant)
"Getting Your Cookie" above; note the clear cookies first caveat to avoid stale-account contamination)
2. Run setup (no `--activate` — keep current account active so user isn't yanked off mid-session):
npx feishu-user-plugin setup --profile <name> --app-id <X2> --app-secret <S2> --cookie <C2>3. Run OAuth for the new profile (this opens a browser tab; user must click "授权" in the consent page — that part is unavoidable):
npx feishu-user-plugin oauth --profile <name>After consent, UAT is written to credentials.json::profiles[<name>].
4. Confirm via list_profiles MCP tool — should now see both default and <name>, with default still active.
5. Tell the user how to switch later — call switch_profile(name="<name>") MCP tool from Claude Code; cross-process MCP processes auto-sync within ms via dispatcher mtime hook.
Just call switch_profile(name="<profile>") MCP tool. Don't run any CLI command. Cached clients reset; next tool call uses the new account.
If the named profile doesn't exist, list_profiles first to show the user their actual profile names, then ask which they meant.
Call list_profiles MCP tool. Show the active marker.
If the user has multiple profiles with UAT, suggest:
crontab -e # add this line:
0 */4 * * * npx feishu-user-plugin keepalive --all >> /tmp/feishu-keepalive.log 2>&1The --all flag iterates every profile in credentials.json (without it, only the active profile gets refreshed — sufficient for single-account users but multi-account users will see other profiles' UATs expire).
(upload_image → send_image_as_user(image_key=...)).
send_card_as_user always routes through bot identity. User-identity(cookie protobuf) card sending was confirmed server-side disabled in v1.3.9 (exhaustive brute-force).
(4h interval). UAT valid 2h, refresh_token valid 7 days; run keepalive cron weekly to prevent refresh_token expiration.
is not yet implemented (designed for v1.3.10; see ROADMAP). For now, call switch_profile MCP tool when you want to flip.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.