openclaw-lark: When an AI Agent Gets a Desk Job

OpenClaw’s Lark plugin turns a chat window into a workspace operator, with approvals, streaming cards, and secure token storage.

10 min read • View on GitHub • More from larksuite

A bright office desk shown as a working surface instead of a chat interface. A small mechanical clerk sorts message cards, a calendar page, a document stack, a database ledger, and a task clipboard into separate trays. The image explains that the plugin is meant to move work across the whole workspace, not just answer questions.
The core idea is operational, not conversational. Lark becomes the place where the agent reads, edits, schedules, and reports back.
Key Takeaways

Most assistants live in the corner of a chat window. openclaw-lark tries to live in the workflow itself. It can read a message, decide whether to act, ask for approval when the risk is real, then move across docs, base records, calendar entries, tasks, and rich cards without leaving Lark.

That matters because this is not a hobby bridge. The repository is the official Lark/Feishu plugin for OpenClaw, built by the Lark/Feishu Open Platform team. The goal is simple and ambitious at the same time: let an agent operate inside the collaboration stack that teams already use every day.

This is the official Lark/Feishu plugin for OpenClaw, developed and maintained by the Lark/Feishu Open Platform team. It seamlessly connects your OpenClaw Agent to your Lark/Feishu workspace, enabling it to directly read from and write to messages, docs, bases, calendars, tasks, and more.

Lark/Feishu Open Platform team, Official maintainer · OpenClaw Lark GitHub

A modern TypeScript base

The codebase reads like a system, not a bundle of adapters. It is almost entirely TypeScript, built for modern Node.js, and validated with strict schema tools so the agent does not wander into unsafe input shapes. The project uses `tsdown` for bundling, `pnpm` for package management, and a mix of `zod` and `@sinclair/typebox` to keep inputs and outputs tight.

From message to action

A single conversation passes through queueing, conversion, tools, and card rendering, with abort and approval loops folded into the same thread.

The interesting part is the sequence. `event-handlers.ts` can short-circuit an abort request, so a stop command does not have to wait behind normal work. `enqueueFeishuChatTask` serializes messages inside a thread, which keeps one conversation from trampling another. Then `streaming-card-controller.ts` keeps the user updated while the model works, and `reasoning-utils.ts` strips sensitive details before traces land in the UI.

At the core, `src/core/lark-client.ts` manages multiple accounts and wraps the official SDK’s HTTP client so requests carry a versioned identity. That is a small detail with outsized value. In a production plugin, debugging and telemetry start to matter the moment the first workspace has more than one app credential.

Safety is part of the workflow

The safest-looking feature in the repo is also one of the most practical. `token-store.ts` moves credentials into the operating system’s native vault on macOS, and into encrypted files on Linux and Windows. That is the right default when the agent can touch company data. Secrets should not feel like developer convenience.

A tight close-up of an approval button, a vault key, and a stream of text leaving a chat card. The image explains that the system pairs human sign-off with secure credential handling. It shows safety as part of the workflow, not an afterthought.
Human approval and credential hygiene sit on the same path as the model’s action, which is exactly where they belong.

`ask-user-question.ts` pushes that discipline one step further. When the agent needs permission or is unsure about a high-risk action, it does not guess and hope for the best. It pauses, sends an interactive card, and waits for a human to approve or deny the move. That is a better pattern than silent confidence.

the plugin registers a large number of Feishu capabilities as first-class tools, and the tool schemas themselves consume a lot of context on every session turn.

Sioxas, Issue author · Issue #17

Breadth has a cost

The same design choice that makes the plugin impressive also makes it heavy. If you expose a wide Feishu surface as first-class tools, every turn carries more schema baggage. That is a fair price when the goal is to let one agent move across the whole workspace. It is a worse deal when a team only needs one narrow action.

DimensionSimple chat botopenclaw-larkWhy it matters
DeploymentUsually a webhook or narrow botWebSocket-driven plugin with no public URL requiredWorks behind firewalls and inside private networks.
Action surfaceReplies in chatReads and writes messages, docs, base records, calendar events, and tasksIt can finish work, not just discuss it.
SafetyModel output goes straight to the userApproval cards and OS-native token storageHuman confirmation and credential hygiene are built in.
CostSmaller surface, lower overheadBroader surface, more tool schema pressureBreadth increases capability, but it also increases context load.

That table is the real trade-off in one glance. The plugin optimizes for being the official, enterprise-grade entry point, not the lightest possible wrapper. If you need a workspace operator, that is a good bargain. If you need a single-purpose bot, it may feel like a lot.

Why the MCP path matters

The docs path uses MCP while other capabilities stay on the Lark open API stack. That hybrid is not a footnote. It signals that the project is betting on interoperability, not just platform loyalty. Enterprise agents will likely need both stable vendor APIs and a broader protocol layer if they are going to scale across tools and teams.

In that sense, openclaw-lark is less about one chat integration and more about a pattern. The model is only one piece of the product. The UI, the approval loop, the credential store, the message normalizer, and the action surface are the thing users actually trust.