{
  "schemaVersion": "1.0",
  "item": {
    "slug": "lark-toolkit",
    "name": "Lark Toolkit",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Pengxiao-Wang/lark-toolkit",
    "canonicalUrl": "https://clawhub.ai/Pengxiao-Wang/lark-toolkit",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/lark-toolkit",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=lark-toolkit",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/api-reference.md",
      "references/bot-setup.md",
      "references/mcp-tools.md",
      "references/permissions.md",
      "references/troubleshooting.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/lark-toolkit"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/lark-toolkit",
    "agentPageUrl": "https://openagent3.xyz/skills/lark-toolkit/agent",
    "manifestUrl": "https://openagent3.xyz/skills/lark-toolkit/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/lark-toolkit/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Prerequisites & Security",
        "body": "This skill is a documentation-only reference guide. It contains no executable code that accesses credentials automatically.\n\nRequired credentials (user-provided, never bundled):\n\nLark App ID (app_id) — from Lark Developer Console\nLark App Secret (app_secret) — from the same console\n\nHow credentials are used:\n\nAll API examples in SKILL.md use placeholders (<APP_ID>, <APP_SECRET>, CHAT_ID, etc.) — no real secrets\nThe scripts/get_token.sh helper obtains a temporary tenant_access_token from Lark's auth API. It reads credentials from (in order):\n\nCommand-line arguments\nLARK_APP_ID / LARK_APP_SECRET environment variables\n~/.openclaw/openclaw.json (standard OpenClaw config, path channels.lark.accounts.default.appId/appSecret)\n\n\nThe script prints the config source to stderr when falling back to the config file\nNo credentials are hardcoded, cached to disk, logged, or transmitted beyond the single Lark auth API call\nThe token is exported as LARK_TOKEN env var for subsequent commands in the same shell session"
      },
      {
        "title": "Three Access Paths",
        "body": "NeedPathWhenSend/receive messagesclaw-lark plugin (message tool)Basic text, media, reactions — simplestStructured CRUD opsMCP tools via mcporterBitable, calendar, docs, tasks, OKR — 38 toolsEverything elseDirect API (curl)Contacts, member mgmt, anything MCP doesn't cover\n\nRule: claw-lark first → MCP second → direct API as fallback."
      },
      {
        "title": "Authentication (Direct API)",
        "body": "TOKEN=$(curl -s -X POST 'https://open.larksuite.com/open-apis/auth/v3/tenant_access_token/internal' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"app_id\":\"<APP_ID>\",\"app_secret\":\"<APP_SECRET>\"}' \\\n  | python3 -c \"import sys,json; print(json.load(sys.stdin)['tenant_access_token'])\")\n\nOr use the helper: bash scripts/get_token.sh\n\nToken validity: ~2 hours. Cache it."
      },
      {
        "title": "API Base URLs",
        "body": "PlatformAPI BaseDev ConsoleLark Internationalhttps://open.larksuite.com/open-apis/https://open.larksuite.com/appFeishu (China)https://open.feishu.cn/open-apis/https://open.feishu.cn/app\n\n⚠️ Lark ≠ Feishu. Always confirm which platform the tenant uses."
      },
      {
        "title": "Send a Message",
        "body": "curl -X POST \"https://open.larksuite.com/open-apis/im/v1/messages?receive_id_type=chat_id\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"receive_id\":\"CHAT_ID\",\"msg_type\":\"text\",\"content\":\"{\\\"text\\\":\\\"hello\\\"}\"}'"
      },
      {
        "title": "Reply in Thread",
        "body": "curl -X POST \"https://open.larksuite.com/open-apis/im/v1/messages/MSG_ID/reply\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"msg_type\":\"text\",\"content\":\"{\\\"text\\\":\\\"reply\\\"}\",\"reply_in_thread\":true}'"
      },
      {
        "title": "Add Reaction",
        "body": "curl -X POST \"https://open.larksuite.com/open-apis/im/v1/messages/MSG_ID/reactions\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"reaction_type\":{\"emoji_type\":\"THUMBSUP\"}}'\n\nEmoji types: THUMBSUP HEART LAUGH OK COOL FINGERHEART SMILE JIAYOU"
      },
      {
        "title": "List Department Users (MCP gap — direct API only)",
        "body": "# List root departments\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'https://open.larksuite.com/open-apis/contact/v3/departments?parent_department_id=0&page_size=50&fetch_child=true'\n\n# List users in a department\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'https://open.larksuite.com/open-apis/contact/v3/users?department_id=<DEPT_ID>&page_size=50'\n\nKey fields: name, open_id, employee_type (1=regular, 2=intern), department_ids"
      },
      {
        "title": "Read Chat History",
        "body": "curl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'https://open.larksuite.com/open-apis/im/v1/messages?container_id_type=chat&container_id=<CHAT_ID>&page_size=20&sort_type=ByCreateTimeDesc'"
      },
      {
        "title": "Add Bot to Group",
        "body": "curl -X POST \"https://open.larksuite.com/open-apis/im/v1/chats/<CHAT_ID>/members?member_id_type=app_id\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"id_list\":[\"<BOT_APP_ID>\"]}'"
      },
      {
        "title": "MCP Tools (38 available)",
        "body": "mcporter call lark-mcp.<tool_name> key=value\n\nFull catalog with parameters: references/mcp-tools.md"
      },
      {
        "title": "MCP Coverage",
        "body": "ModuleKey ToolsBitablecreate apps/tables, CRUD records, list fieldsCalendarcreate/get/patch events, free/busy, primary calendarDocsread content, search, import, set permissionsIMcreate/list groups, get members, send messages, list historyOKRbatch get, list periods, CRUD progress, query reviewsReportquery rules/tasks, manage viewsTaskcreate/patch tasks, add members/remindersWikisearch nodes, get node detailsContactsbatch get user IDs by email/phone"
      },
      {
        "title": "MCP Gaps (use direct API)",
        "body": "List users by department — GET /contact/v3/users?department_id=\nList departments — GET /contact/v3/departments\nAdd/remove group members — POST /im/v1/chats/{chat_id}/members\nSend reactions — POST /im/v1/messages/{msg_id}/reactions\nUpload images/files — POST /im/v1/images / POST /im/v1/files"
      },
      {
        "title": "Pagination",
        "body": "Most list APIs use cursor-based pagination:\n\n?page_size=50&page_token=<token_from_previous_response>\n\nCheck has_more in response."
      },
      {
        "title": "Error Handling",
        "body": "CodeMeaning0Success99991663Token expired — refresh99991664Token invalid99991400Bad request99991403No permission — check app permissions"
      },
      {
        "title": "Critical Pitfalls",
        "body": "Lark ≠ Feishu — International uses open.larksuite.com, China uses open.feishu.cn\nopen_id is per-app — Same user has different open_id across different Lark apps\nWebhook 5s timeout — Return 200 immediately, process async\nEvent dedup — Use event_id (Lark retries up to 3x)\nBot-to-bot blind spot — Lark does NOT push Bot A's messages to Bot B's webhook\nPublishing required — Permission/event changes only take effect after publishing a new app version\nngrok IPv6 trap — Use 127.0.0.1:PORT not localhost:PORT in ngrok config\nngrok free domain — Returns interstitial HTML that Lark rejects. Use paid domain."
      },
      {
        "title": "Detailed References",
        "body": "Bot setup playbook: references/bot-setup.md\nAPI reference: references/api-reference.md\nMCP tools catalog: references/mcp-tools.md\nWebhook & tunnel: references/webhook-setup.md\nTroubleshooting: references/troubleshooting.md\nPermissions: references/permissions.md"
      }
    ],
    "body": "Lark Toolkit\nPrerequisites & Security\n\nThis skill is a documentation-only reference guide. It contains no executable code that accesses credentials automatically.\n\nRequired credentials (user-provided, never bundled):\n\nLark App ID (app_id) — from Lark Developer Console\nLark App Secret (app_secret) — from the same console\n\nHow credentials are used:\n\nAll API examples in SKILL.md use placeholders (<APP_ID>, <APP_SECRET>, CHAT_ID, etc.) — no real secrets\nThe scripts/get_token.sh helper obtains a temporary tenant_access_token from Lark's auth API. It reads credentials from (in order):\nCommand-line arguments\nLARK_APP_ID / LARK_APP_SECRET environment variables\n~/.openclaw/openclaw.json (standard OpenClaw config, path channels.lark.accounts.default.appId/appSecret)\nThe script prints the config source to stderr when falling back to the config file\nNo credentials are hardcoded, cached to disk, logged, or transmitted beyond the single Lark auth API call\nThe token is exported as LARK_TOKEN env var for subsequent commands in the same shell session\nThree Access Paths\nNeed\tPath\tWhen\nSend/receive messages\tclaw-lark plugin (message tool)\tBasic text, media, reactions — simplest\nStructured CRUD ops\tMCP tools via mcporter\tBitable, calendar, docs, tasks, OKR — 38 tools\nEverything else\tDirect API (curl)\tContacts, member mgmt, anything MCP doesn't cover\n\nRule: claw-lark first → MCP second → direct API as fallback.\n\nAuthentication (Direct API)\nTOKEN=$(curl -s -X POST 'https://open.larksuite.com/open-apis/auth/v3/tenant_access_token/internal' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"app_id\":\"<APP_ID>\",\"app_secret\":\"<APP_SECRET>\"}' \\\n  | python3 -c \"import sys,json; print(json.load(sys.stdin)['tenant_access_token'])\")\n\n\nOr use the helper: bash scripts/get_token.sh\n\nToken validity: ~2 hours. Cache it.\n\nAPI Base URLs\nPlatform\tAPI Base\tDev Console\nLark International\thttps://open.larksuite.com/open-apis/\thttps://open.larksuite.com/app\nFeishu (China)\thttps://open.feishu.cn/open-apis/\thttps://open.feishu.cn/app\n\n⚠️ Lark ≠ Feishu. Always confirm which platform the tenant uses.\n\nCommon API Patterns\nSend a Message\ncurl -X POST \"https://open.larksuite.com/open-apis/im/v1/messages?receive_id_type=chat_id\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"receive_id\":\"CHAT_ID\",\"msg_type\":\"text\",\"content\":\"{\\\"text\\\":\\\"hello\\\"}\"}'\n\nReply in Thread\ncurl -X POST \"https://open.larksuite.com/open-apis/im/v1/messages/MSG_ID/reply\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"msg_type\":\"text\",\"content\":\"{\\\"text\\\":\\\"reply\\\"}\",\"reply_in_thread\":true}'\n\nAdd Reaction\ncurl -X POST \"https://open.larksuite.com/open-apis/im/v1/messages/MSG_ID/reactions\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"reaction_type\":{\"emoji_type\":\"THUMBSUP\"}}'\n\n\nEmoji types: THUMBSUP HEART LAUGH OK COOL FINGERHEART SMILE JIAYOU\n\nList Department Users (MCP gap — direct API only)\n# List root departments\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'https://open.larksuite.com/open-apis/contact/v3/departments?parent_department_id=0&page_size=50&fetch_child=true'\n\n# List users in a department\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'https://open.larksuite.com/open-apis/contact/v3/users?department_id=<DEPT_ID>&page_size=50'\n\n\nKey fields: name, open_id, employee_type (1=regular, 2=intern), department_ids\n\nRead Chat History\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'https://open.larksuite.com/open-apis/im/v1/messages?container_id_type=chat&container_id=<CHAT_ID>&page_size=20&sort_type=ByCreateTimeDesc'\n\nAdd Bot to Group\ncurl -X POST \"https://open.larksuite.com/open-apis/im/v1/chats/<CHAT_ID>/members?member_id_type=app_id\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"id_list\":[\"<BOT_APP_ID>\"]}'\n\nMCP Tools (38 available)\nmcporter call lark-mcp.<tool_name> key=value\n\n\nFull catalog with parameters: references/mcp-tools.md\n\nMCP Coverage\nModule\tKey Tools\nBitable\tcreate apps/tables, CRUD records, list fields\nCalendar\tcreate/get/patch events, free/busy, primary calendar\nDocs\tread content, search, import, set permissions\nIM\tcreate/list groups, get members, send messages, list history\nOKR\tbatch get, list periods, CRUD progress, query reviews\nReport\tquery rules/tasks, manage views\nTask\tcreate/patch tasks, add members/reminders\nWiki\tsearch nodes, get node details\nContacts\tbatch get user IDs by email/phone\nMCP Gaps (use direct API)\nList users by department — GET /contact/v3/users?department_id=\nList departments — GET /contact/v3/departments\nAdd/remove group members — POST /im/v1/chats/{chat_id}/members\nSend reactions — POST /im/v1/messages/{msg_id}/reactions\nUpload images/files — POST /im/v1/images / POST /im/v1/files\nPagination\n\nMost list APIs use cursor-based pagination:\n\n?page_size=50&page_token=<token_from_previous_response>\n\n\nCheck has_more in response.\n\nError Handling\nCode\tMeaning\n0\tSuccess\n99991663\tToken expired — refresh\n99991664\tToken invalid\n99991400\tBad request\n99991403\tNo permission — check app permissions\nCritical Pitfalls\nLark ≠ Feishu — International uses open.larksuite.com, China uses open.feishu.cn\nopen_id is per-app — Same user has different open_id across different Lark apps\nWebhook 5s timeout — Return 200 immediately, process async\nEvent dedup — Use event_id (Lark retries up to 3x)\nBot-to-bot blind spot — Lark does NOT push Bot A's messages to Bot B's webhook\nPublishing required — Permission/event changes only take effect after publishing a new app version\nngrok IPv6 trap — Use 127.0.0.1:PORT not localhost:PORT in ngrok config\nngrok free domain — Returns interstitial HTML that Lark rejects. Use paid domain.\nDetailed References\nBot setup playbook: references/bot-setup.md\nAPI reference: references/api-reference.md\nMCP tools catalog: references/mcp-tools.md\nWebhook & tunnel: references/webhook-setup.md\nTroubleshooting: references/troubleshooting.md\nPermissions: references/permissions.md"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Pengxiao-Wang/lark-toolkit",
    "publisherUrl": "https://clawhub.ai/Pengxiao-Wang/lark-toolkit",
    "owner": "Pengxiao-Wang",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/lark-toolkit",
    "downloadUrl": "https://openagent3.xyz/downloads/lark-toolkit",
    "agentUrl": "https://openagent3.xyz/skills/lark-toolkit/agent",
    "manifestUrl": "https://openagent3.xyz/skills/lark-toolkit/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/lark-toolkit/agent.md"
  }
}