lark-drive

SkillCommunityAudited: no issuesTranslated from Chinese

The lark-drive skill enables AI agents to manage files and folders within Lark Drive. It supports operations such as uploading, downloading, moving, deleting, and renaming files, as well as managing document permissions, comments, and version history.

Install:
npx skills add larksuite/cli/lark-drive

drive (v1)

CRITICAL, Before starting, you MUST use the Read tool to read ../lark-shared/SKILL.md, which contains authentication and permission handling.

Import Routing Rules: If a user wants to import a local Excel / CSV / .base snapshot into a Base / Bitable, you must prioritize using lark-cli drive +import --type bitable. Do not switch to lark-base first; lark-base is only responsible for operations within the table after the import is complete.

Quick Decision Making

  • To search for documents / Wiki / spreadsheets / Bitable / Drive objects, prioritize using lark-cli drive +search. In natural language, requests like "recently edited by me," "created by me," "opened by me in the last week," or "docx created by someone" map directly to flat flags, avoiding manual nested JSON. The old docs +search is in maintenance mode and will be deprecated; do not add new dependencies on it.
  • To import a local .xlsx / .csv / .base into a Base / Bitable, the first step must be lark-cli drive +import --type bitable.
  • To import a local .md / .docx / .doc / .txt / .html into an online document, use lark-cli drive +import --type docx.
  • To upload, create, read, patch, or overwrite native .md files in Drive (not importing as docx), switch to lark-markdown.
  • To view, download, roll back, or delete historical versions of a file, use drive +version-history, drive +version-get, drive +version-revert, and drive +version-delete. This set of commands supports both --as user and --as bot; for automation scenarios, prioritize --as bot.
  • To import a local .xlsx / .xls / .csv into a spreadsheet, use lark-cli drive +import --type sheet.
  • To create a new folder in Drive, prioritize using lark-cli drive +create-folder.
  • To upload a local file to a specific wiki node in a knowledge base, continue to use lark-cli drive +upload --wiki-token <wiki_token>; do not mistakenly switch to wiki domain commands.
  • lark-base is only responsible for internal Base operations (tables, fields, records, views) after the import is complete. Do not switch to lark-base prematurely during the "local file to Base" step.

Modify Title

  • Use the drive files patch command. You can modify the title via the new_title field. This supports docx, sheet, bitable, file, wiki, and folder types.

Core Concepts

Document Types and Tokens

In the Lark Open Platform, different document types have different URL formats and token handling methods. When performing document operations (such as adding comments or downloading files), you must first obtain the correct file_token.

Document URL Formats and Token Handling

URL FormatExampleToken TypeHandling Method
/docx/https://example.larksuite.com/docx/doxcnxxxxxxxxxfile_tokenUse the token in the URL path directly as file_token
/doc/https://example.larksuite.com/doc/doccnxxxxxxxxxfile_tokenUse the token in the URL path directly as file_token
/wiki/https://example.larksuite.com/wiki/wikcnxxxxxxxxxwiki_token⚠️ Cannot be used directly; must query to get the actual obj_token first
/sheets/https://example.larksuite.com/sheets/shtcnxxxxxxxxxfile_tokenUse the token in the URL path directly as file_token
/drive/folder/https://example.larksuite.com/drive/folder/fldcnxxxxfolder_tokenUse the token in the URL path as the folder token

Wiki Link Special Handling (Critical!)

Knowledge base links (/wiki/TOKEN) may point to different types of documents such as cloud documents, spreadsheets, or Bitables. Do not assume the token in the URL is the file_token. You must query the actual type and real token first.

Processing Flow

  1. Use wiki.spaces.get_node to query node information

    lark-cli wiki spaces get_node --params '{"token":"wiki_token"}'
    
  2. Extract key information from the result

    • node.obj_type: Document type (docx/doc/sheet/bitable/slides/file/mindnote)
    • node.obj_token: The real document token (used for subsequent operations)
    • node.title: Document title
  3. Use the corresponding API based on obj_type

    obj_typeDescriptionAPI to Use
    docxNew cloud documentdrive file.comments.*, docx.*
    docOld cloud documentdrive file.comments.*
    sheetSpreadsheetsheets.*
    bitableBitablebitable.*
    slidesSlidesdrive.*
    fileFiledrive.*
    mindnoteMindnotedrive.*

Query Example

# Query wiki node
lark-cli wiki spaces get_node --params '{"token":"wiki_token"}'

Example return result:

{
  "node": {
    "obj_type": "docx",
    "obj_token": "xxxx",
    "title": "Title",
    "node_type": "origin",
    "space_id": "12345678910"
  }
}

Resource Relationships

Wiki Space
└── Wiki Node
    ├── obj_type: docx (New doc)
    │   └── obj_token (Real document token)
    ├── obj_type: doc (Old doc)
    │   └── obj_token (Real document token)
    ├── obj_type: sheet (Spreadsheet)
    │   └── obj_token (Real document token)
    ├── obj_type: bitable (Bitable)
    │   └── obj_token (Real document token)
    └── obj_type: file/slides/mindnote
        └── obj_token (Real document token)

Drive Folder
└── File (File/Document)
    └── file_token (Use directly)

Common Token Requirements for Operations

OperationRequired TokenDescription
Read document contentfile_token / Automatically handled via docs +fetch --api-version v2docs +fetch --api-version v2 supports passing the URL directly
Add partial comment (highlight comment)file_tokenWhen passing --block-id, drive +add-comment creates a partial comment; docx supports text selection or block_id, slides only supports block_id, and both support final resolution to the corresponding wiki URL
Add full-text commentfile_tokenWhen --block-id is not passed, drive +add-comment creates a full-text comment by default; supports docx, old doc URLs, and wiki URLs that resolve to doc/docx
Download filefile_tokenExtracted directly from the file URL
Upload filefolder_token / wiki_node_tokenToken of the target location
List document commentsfile_tokenSame as adding comments

Comment Capability Boundaries (Critical!)

  • drive +add-comment supports two modes.

  • Full-text comment: Enabled by default if --block-id is not passed, or can be explicitly passed via --full-comment; supports docx, old doc URLs, and wiki URLs that resolve to doc/docx.

  • Partial comment: Enabled when passing --block-id; only supports docx and wiki URLs that resolve to docx. Block IDs can be obtained via docs +fetch --api-version v2 --detail with-ids.

  • The --content for drive +add-comment requires a reply_elements JSON array string, for example --content '[{"type":"text","text":"Body text"}]'.

  • slides comments require explicitly passing --block-id <slide-block-type>!<xml-id>; the CLI will split this and write it into anchor.block_id and anchor.slide_block_type. The <xml-id> is the element id in the PPT XML protocol; it does not support --selection-with-ellipsis or --full-comment.

  • Text content written in comments (adding comments, replying to comments, editing replies) cannot contain < or > directly; they must be escaped before submission: < -> &lt;, > -> &gt;.

  • When using drive +add-comment, the shortcut automatically performs the above escaping for type=text elements; if calling drive file.comments create_v2, drive file.comment.replys create, or drive file.comment.replys update directly, you must pass the escaped content in the request yourself.

  • If the wiki resolution is not doc/docx/sheet/slides, do not use +add-comment.

  • If you need to call the comment V2 protocol at a lower level, use the native API: first execute lark-cli schema drive.file.comments.create_v2, then execute lark-cli drive file.comments create_v2 .... Omit anchor for full-text comments, and pass anchor.block_id for partial comments.

Comment Query and Statistics (Critical!)

Mandatory Rule: drive file.comments list must pass is_solved:false by default, meaning only query unresolved comments. Even if the user says "all comments" or "list all comments," as long as they do not explicitly mention including resolved comments, continue to query unresolved comments by default. Only omit the is_solved parameter when the user explicitly requests to include resolved comments.

Correct Example:

# Default query: only unresolved comments (recommended)
lark-cli drive file.comments list --params '{"file_token": "xxx", "file_type": "docx", "is_solved": false}'

# Query all comments (user did not explicitly request resolved comments)
lark-cli drive file.comments list --params '{"file_token": "xxx", "file_type": "docx", "is_solved": false}'

# Include resolved comments (requires explicit user request)
lark-cli drive file.comments list --params '{"file_token": "xxx", "file_type": "docx"}'

Incorrect Example:

# Not recommended: querying all comments when the user did not explicitly request it
lark-cli drive file.comments list --params '{"file_token": "xxx", "file_type": "docx"}'
  • When querying document comments, use drive file.comments list.
  • The items returned by drive file.comments list should be understood as a list of "comment cards." Each item corresponds to one comment card seen in the user interface, not a flattened list of interactive messages.
  • In server semantics, creating the first comment also creates the first reply in that card; therefore, the actual body text is contained in each item.reply_list.replies, where the first reply is the "comment itself" from the user's perspective.
  • When the user wants to count "number of comments" or "number of comment cards," count the length of items; for a full count, accumulate the lengths of items across all paginated results.
  • When the user wants to count "number of replies," from the user's perspective, exclude the first comment in each comment card. The counting logic is the sum of the lengths of all item.reply_list.replies minus the number of items.
  • When the user wants to count "total interactions," count the sum of the lengths of all item.reply_list.replies; this count includes the first comment in each comment card.
  • If an item.has_more=true, it means there are more replies under that comment card not included in the current return; in this case, you need to continue calling drive file.comment.replys list to fetch the full list before performing the full reply count / total interaction count.

Comment Business Characteristics and Guidance (Critical!)

Comment Sorting Guidance

  • A document usually has multiple comments, sorted by create_time.
  • Important: Only sort by create_time when the user explicitly mentions "latest comment," "last comment," or "earliest comment":
    • Must fetch all comments first (process pagination to get all data); do not sort after fetching only one page.
    • "Latest comment" / "Last comment": Sort by create_time in descending order and take the first one.
    • "Earliest comment": Sort by create_time in ascending order and take the first one.
  • If the user just says "first comment," use the first one returned by drive file.comments list directly without extra sorting.

Comment Reply Restrictions

  • Check for the following restrictions before adding a comment reply.
  • Full-text comments do not support replies: Comments with is_whole=true cannot be replied to. If you encounter such comments, inform the user that "Full-text comments do not support replies."
  • Resolved comments do not support replies: Comments with is_solved=true cannot be replied to. If you encounter such comments, inform the user that "This comment has been resolved and cannot be replied to."
  • Note: When a user wants to reply to a comment that cannot be replied to due to the above restrictions, only inform them that it cannot be replied to. Do not automatically help the user find other comments to reply to, to avoid violating user expectations.

Batch Query vs. List Query

  • Use drive file.comments batch_query for batch queries after the comment IDs are known; it requires passing a specific list of comment IDs.
  • Use drive file.comments list for paginated retrieval of comment lists, suitable for counting total comments, traversing all comments, or scenarios like getting the "latest/last N comments."

Reaction / Emoji Scenarios

  • When encountering questions related to reactions on comments/replies (emojis, counts, who clicked what, adding/deleting emojis), read lark-drive-reactions.md first to understand how to use them.

Typical Errors and Solutions

Error MessageReasonSolution
not existUsed the wrong tokenCheck the token type; wiki links must be queried first to get the obj_token
permission deniedNo relevant operation permissionGuide the user to check if the current identity has the corresponding operation permission for the document/file; grant permission if necessary
invalid file_typeIncorrect file_type parameterPass the correct file_type (docx/doc/sheet/slides) based on obj_type

permission.public.patch Error Code Guidance

When calling lark-cli drive permission.public patch to update document public permissions fails, if the following error codes are returned, provide clear next steps to the user based on the table. Do not simply categorize these errors as missing scopes; they usually indicate interception by tenant, external sharing, or document security classification policies.

Error CodeMeaningGuidance for User
91009External sharing is controlled by tenant security policy; current user cannot enableInform the user: External sharing capability is centrally controlled by tenant security policy and cannot be enabled directly via API or by the current user; contact the tenant administrator to adjust organization-level external sharing policies.
91010Document external sharing is not enabledInform the user: External sharing is not enabled for the current document. Please enable external sharing in the document permission settings first, then retry permission.public.patch.
91011External sharing is controlled by document security classificationInform the user: External sharing is blocked by security classification policy. You need to open the target document and initiate a security classification exemption or downgrade the classification within the document before retrying; the response must include the target document URL.
91012Permission settings are controlled by document security classificationInform the user: This permission setting is blocked by security classification policy. You need to open the target document and initiate a security classification exemption or downgrade the classification within the document before retrying; the response must include the target document URL.

When the user initially provides a document URL and encounters 91011 or 91012, return that URL to the user as the operation entry point. If the context only has a token, try to restore the target document URL using existing context, search results, or metadata before providing the clickable document URL.

Authorizing the Current Application to Access Documents

When you need to grant document permissions to the current application (bot) itself, first obtain the application's open_id via the bot info interface, then call the permission interface to authorize:

# 1. Get the current application's open_id
lark-cli api GET /open-apis/bot/v3/info --as bot
# Get bot.open_id from the return value

# 2. Authorize the current application to access the document
lark-cli drive permission.members create \
  --params '{"token":"<doc_token>","type":"<resource_type>"}' \
  --data '{"member_type":"openid","member_id":"<bot_open_id>","perm":"view","type":"user"}'

Note: This method is only applicable to scenarios where you need to authorize the current application. When authorizing other users, use their open_id directly; there is no need to call the bot info interface.

<resource_type> optional values: doc, docx, sheet, bitable, file, folder, wiki, slides.

Shortcuts (Recommended)

Shortcuts are high-level wrappers for common operations (lark-cli drive +<verb> [flags]). Prioritize using shortcuts when available.

ShortcutDescription
+searchSearch Lark docs, Wiki, and spreadsheet files with flat filter flags (preferred over docs +search). Natural-language-friendly: --edited-since, --mine, --doc-types, etc.
+uploadUpload a local file to a Drive folder or wiki node
+create-folderCreate a Drive folder, optionally under a parent folder, with bot auto-grant support
+downloadDownload a file from Drive to local
+statusCompare a local directory with a Drive folder by exact SHA-256 hash by default, or use --quick for a best-effort modified-time diff that skips remote downloads; reports new_local / new_remote / modified / unchanged plus detection=exact or detection=quick. Duplicate remote rel_path conflicts fail fast with error.type=duplicate_remote_path and list every conflicting entry; do not proceed as if one was chosen. --local-dir must be a relative path within cwd; the CLI will reject out-of-bounds paths. If the target is outside cwd, guide the user to switch the agent working directory; do not cd to bypass.
+pullFile-level Drive → local mirror. Duplicate remote rel_path conflicts fail by default; for duplicate files, rename downloads all copies with stable hashed suffixes, while newest / oldest pick one. --if-exists supports overwrite / smart / skip (smart is a best-effort modified-time incremental mode for repeat syncs). --delete-local requires --yes, only removes regular files, and is skipped after item failures. --local-dir must stay inside cwd.
+syncTwo-way local ↔ Drive sync. Reuses +status diff buckets, pulls new_remote, pushes new_local, and resolves modified via `--on-conflict=remote-wins
+create-shortcutCreate a shortcut to an existing Drive file in another folder
+add-commentAdd a comment to doc/docx/sheet/slides, also supports wiki URL resolving to doc/docx/sheet/slides
+exportExport a doc/docx/sheet/bitable to a local file with limited polling; supports --file-name for local naming
+export-downloadDownload an exported file by file_token
+importImport a local file to Drive as a cloud document (docx, sheet, bitable)
+version-historyList historical versions of a file with only_tag=true and cursor-based pagination
+version-getDownload a specific historical version of a file
+version-revertRevert a file to a specific historical version
+version-deleteDelete a specific historical version of a file
+moveMove a file or folder to another location in Drive
+deleteDelete a Drive file or folder with limited polling for folder deletes
+pushFile-level local → Drive mirror. Duplicate remote rel_path conflicts fail by default; newest / oldest only apply to duplicate files when you explicitly want to target one remote file. --if-exists supports skip / smart / overwrite (smart skips files whose remote modified_time is already up to date, but falls through to the same overwrite path when the remote is older, so it inherits overwrite's rollout caveat). --delete-remote requires --yes. --local-dir must stay inside cwd.
+task_resultPoll async task result for import, export, move, or delete operations
+apply-permissionApply to the document owner for view/edit access (user-only; 5/day per document)

API Resources

lark-cli schema drive.<resource>.<method>   # Must view parameter structure before calling API
lark-cli drive <resource> <method> [flags] # Call API

Important: When using native APIs, you must run schema first to view the --data / --params parameter structure; do not guess field formats.

files

  • copy, Copy file
  • create_folder, Create new folder
  • list, Get list under folder
  • patch, Modify file title

file.comments

  • batch_query, Batch get comments
  • create_v2, Add full-text/partial (highlight) comment
  • list, Paginated retrieval of document comments
  • patch, Resolve/restore comment

file.comment.replys

  • create, Add reply
  • delete, Delete reply
  • list, Get replies
  • update, Update reply

permission.members

  • auth, - create, Add collaborator permission

  • transfer_owner, ### metas

  • batch_query, Get document metadata

user

  • remove_subscription, Unsubscribe from user/application dimension events
  • subscription, Subscribe to user/application dimension events (comment addition event enabled this time)
  • subscription_status, Query subscription status of user/application for specified events

file.statistics

  • get, Get file statistics

file.view_records

  • list, Get document visitor records

file.comment.reply.reactions

  • update_reaction, Add/delete reaction

Permission Table

MethodRequired Scope
files.copydocs:document:copy
files.create_folderspace:folder:create
files.listspace:document:retrieve
files.patchdocx:document:write_only
file.comments.batch_querydocs:document.comment:read
file.comments.create_v2docs:document.comment:create
file.comments.listdocs:document.comment:read
file.comments.patchdocs:document.comment:update
file.comment.replys.createdocs:document.comment:create
file.comment.replys.deletedocs:document.comment:delete
file.comment.replys.listdocs:document.comment:read
file.comment.replys.updatedocs:document.comment:update
permission.members.authdocs:permission.member:auth
permission.members.createdocs:permission.member:create
permission.members.transfer_ownerdocs:permission.member:transfer
permission.public.getdocs:permission.setting:read
permission.public.patchdocs:permission.setting:write_only
metas.batch_querydrive:drive.metadata:readonly
user.remove_subscriptiondocs:event:subscribe
user.subscriptiondocs:event:subscribe
user.subscription_statusdocs:event:subscribe
file.statistics.getdrive:drive.metadata:readonly
file.view_records.listdrive:file:view_record:readonly
file.comment.reply.reactions.update_reactiondocs:document.comment:create
Share:
Details:
  • Installs


    218,298
  • First seen


    Jun 10, 2026
Security audits
Gen Agent Trust HubPASS
SocketPASS
SnykPASS (low risk)
ZeroLeaksPASS
View Repository

Auto-fetched from GitHub .

Stats via skills.sh.

Skills similar to lark-drive:

 

 
 
  • Installs


 

 
 
  • Installs


 

 
 
  • Installs