{
  "schemaVersion": "1.0",
  "item": {
    "slug": "zoho-cli",
    "name": "Zoho  Mail CLI",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/robsannaa/zoho-cli",
    "canonicalUrl": "https://clawhub.ai/robsannaa/zoho-cli",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/zoho-cli",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=zoho-cli",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.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-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-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/zoho-cli"
    },
    "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/zoho-cli",
    "agentPageUrl": "https://openagent3.xyz/skills/zoho-cli/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-cli/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-cli/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": "zoho — Zoho Mail CLI",
        "body": "Requirements: the zoho binary (install via brew/uv/pipx below), one-time OAuth setup, and local credential storage (config + OS keyring).\n\nzoho is a command-line tool for Zoho Mail. All output is JSON by default — structured, pipe-friendly, and agent-ready. Use --md for markdown tables."
      },
      {
        "title": "Install",
        "body": "Requires Python 3.11+. Works on macOS, Linux, and Windows.\n\n# Homebrew (macOS / Linux)\nbrew install robsannaa/tap/zoho-cli\n\n# uv (all platforms)\nuv tool install git+https://github.com/robsannaa/zoho-cli\n\n# pipx (all platforms)\npipx install git+https://github.com/robsannaa/zoho-cli\n\nAfter install, run the one-time setup:\n\nzoho config init   # save your Zoho OAuth client_id / client_secret\nzoho login         # open browser, region auto-detected\n\nSee the full setup guide in the README."
      },
      {
        "title": "Prerequisites",
        "body": "zoho must be installed and authenticated (zoho login completed).\nCheck: zoho config show — must return a JSON object with default_account and a non-empty accounts map.\nIf not logged in: tell the user to follow the setup in the README."
      },
      {
        "title": "Output",
        "body": "stdout → JSON (default) or Markdown (--md). Always machine-readable.\nstderr → errors (as JSON), debug logs, interactive prompts. Never in stdout.\nExit 0 = success. Exit 1 = error (JSON error object on stderr).\n\n# errors land on stderr, not stdout\nzoho mail list 2>/dev/null          # stdout empty on error\nzoho mail list 2>&1 >/dev/null      # see error JSON"
      },
      {
        "title": "Authentication",
        "body": "Tokens are stored in the OS keyring and refreshed automatically before every command. No manual token management needed.\n\nCredential storage (sensitive): Users must be aware that the CLI stores sensitive data locally:\n\nOAuth client_id and client_secret — saved via zoho config init in the config file (e.g. ~/.config/zoho-cli/config.json).\nAccess and refresh tokens — stored in the OS keyring (or, if ZOHO_TOKEN_PASSWORD is set, in an encrypted file). These are used to access Zoho Mail on the user's behalf.\n\nDo not expose config files or keyring entries to untrusted parties.\n\nIf a command fails with not_logged_in or token_refresh_failed, tell the user to run:\n\nzoho login"
      },
      {
        "title": "Global flags",
        "body": "--account EMAIL    select account (env: ZOHO_ACCOUNT)\n--config PATH      config file path (env: ZOHO_CONFIG)\n--md               markdown table output instead of JSON\n--debug            HTTP + debug logs to stderr"
      },
      {
        "title": "zoho mail list",
        "body": "List messages in a folder.\n\nzoho mail list                               # Inbox, 50 messages\nzoho mail list --folder Sent --limit 20\nzoho mail list -f \"My Project\" -n 100\n\nOutput — array of message summaries:\n\n[\n  {\n    \"messageId\": \"1771333290108014300\",\n    \"folderId\": \"8072279000000002014\",\n    \"subject\": \"Q1 invoice\",\n    \"from\": \"billing@acme.com\",\n    \"to\": [\"you@example.com\"],\n    \"date\": \"1740067200000\",\n    \"unread\": true,\n    \"hasAttachments\": true,\n    \"tags\": []\n  }\n]\n\ndate is a Unix timestamp in milliseconds."
      },
      {
        "title": "zoho mail search",
        "body": "zoho mail search \"invoice 2025\"\nzoho mail search \"from:boss@example.com\" --limit 10\n\nSame output shape as mail list."
      },
      {
        "title": "zoho mail get",
        "body": "Full message content including body.\n\nzoho mail get MESSAGE_ID\nzoho mail get MESSAGE_ID --folder-id FOLDER_ID    # faster: skips auto-scan\nzoho mail get MESSAGE_ID | jq '.textBody'\n\nOutput:\n\n{\n  \"messageId\": \"...\",\n  \"folderId\": \"...\",\n  \"subject\": \"Q1 invoice\",\n  \"from\": \"billing@acme.com\",\n  \"to\": [\"you@example.com\"],\n  \"cc\": [],\n  \"bcc\": [],\n  \"date\": \"1740067200000\",\n  \"unread\": false,\n  \"hasAttachments\": true,\n  \"tags\": [],\n  \"textBody\": \"Please find the invoice attached.\",\n  \"htmlBody\": \"<p>Please find...</p>\"\n}"
      },
      {
        "title": "zoho mail attachments",
        "body": "zoho mail attachments MESSAGE_ID\nzoho mail attachments MESSAGE_ID --folder-id FOLDER_ID\n\nOutput:\n\n[\n  { \"attachmentId\": \"256063600000020001\", \"fileName\": \"invoice.pdf\", \"size\": 123456 }\n]"
      },
      {
        "title": "zoho mail download-attachment",
        "body": "zoho mail download-attachment MESSAGE_ID ATTACHMENT_ID --out /tmp/invoice.pdf\n\nOutput:\n\n{ \"status\": \"ok\", \"path\": \"/tmp/invoice.pdf\", \"size\": 123456 }"
      },
      {
        "title": "zoho mail send",
        "body": "zoho mail send --to alice@example.com --subject \"Hi\" --text \"Hello!\"\n\n# HTML + multiple recipients + attachments\nzoho mail send \\\n  --to alice@example.com --to bob@example.com \\\n  --cc manager@example.com \\\n  --subject \"Report\" \\\n  --html-file report.html \\\n  --attach report.pdf --attach data.csv\n\nOutput:\n\n{ \"status\": \"ok\", \"messageId\": \"...\" }"
      },
      {
        "title": "Flag / move / delete operations",
        "body": "All accept one or more MESSAGE_ID arguments.\n\nzoho mail mark-read   ID [ID …]\nzoho mail mark-unread ID [ID …]\nzoho mail move        ID [ID …] --to \"Archive\"\nzoho mail spam        ID [ID …]\nzoho mail not-spam    ID [ID …]\nzoho mail archive     ID [ID …]\nzoho mail unarchive   ID [ID …]\nzoho mail delete      ID [ID …]              # → Trash\nzoho mail delete      ID [ID …] --permanent  # hard delete\n\nOutput:\n\n{ \"status\": \"ok\", \"updated\": [\"ID1\", \"ID2\"], \"failed\": [] }"
      },
      {
        "title": "zoho folders list",
        "body": "zoho folders list\n\nOutput:\n\n[\n  { \"folderId\": \"8072279000000002014\", \"folderName\": \"Inbox\", \"folderType\": \"Inbox\",\n    \"path\": \"/Inbox\", \"isArchived\": 0, \"unreadCount\": 3, \"messageCount\": 42 }\n]"
      },
      {
        "title": "zoho folders create / rename / delete",
        "body": "zoho folders create \"Project X\" [--parent-id FOLDER_ID]\nzoho folders rename FOLDER_ID \"New Name\"\nzoho folders delete FOLDER_ID"
      },
      {
        "title": "zoho config show / path / init",
        "body": "zoho config show     # JSON config dump (secret redacted)\nzoho config path     # {\"config_path\": \"...\", \"exists\": true}\nzoho config init     # interactive wizard (prompts on stderr)"
      },
      {
        "title": "Common patterns for agents",
        "body": "# All unread message subjects\nzoho mail list | jq -r '.[] | select(.unread) | .subject'\n\n# Get the latest message ID\nzoho mail list -n 1 | jq -r '.[0].messageId'\n\n# Get plain-text body of a specific message\nzoho mail get \"$MSG_ID\" | jq -r '.textBody'\n\n# Download all attachments from a message\nzoho mail attachments \"$MSG_ID\" | jq -r '.[].attachmentId' | while read id; do\n  zoho mail download-attachment \"$MSG_ID\" \"$id\" --out \"/tmp/${id}\"\ndone\n\n# Find unread emails from a sender\nzoho mail search \"from:boss@example.com\" | jq '[.[] | select(.unread)]'\n\n# Mark all results as read\nzoho mail search \"invoice\" | jq -r '.[].messageId' | xargs zoho mail mark-read\n\n# Move search results to a folder\nzoho mail search \"newsletter\" | jq -r '.[].messageId' | xargs zoho mail move --to \"Archive\"\n\n# Send with computed body\nzoho mail send \\\n  --to report-reader@example.com \\\n  --subject \"Daily digest $(date +%F)\" \\\n  --text \"$(zoho mail list | jq -r '.[].subject' | head -10 | nl)\""
      },
      {
        "title": "Error response shape",
        "body": "All errors are JSON on stderr:\n\n{\n  \"status\": \"error\",\n  \"error\": \"not_logged_in\",\n  \"details\": \"No stored token for you@example.com. Run: zoho login --account you@example.com\"\n}\n\nCommon error codes:\n\nCodeMeaningnot_logged_inNo token stored — user must run zoho logintoken_refresh_failedToken revoked — user must run zoho loginno_account_idaccountId not saved — run zoho login againfolder_not_foundFolder name doesn't match any foldermessage_not_foundMessage ID not found in any folderapi_errorUpstream Zoho API error (details in message)"
      }
    ],
    "body": "zoho — Zoho Mail CLI\n\nRequirements: the zoho binary (install via brew/uv/pipx below), one-time OAuth setup, and local credential storage (config + OS keyring).\n\nzoho is a command-line tool for Zoho Mail. All output is JSON by default — structured, pipe-friendly, and agent-ready. Use --md for markdown tables.\n\nInstall\n\nRequires Python 3.11+. Works on macOS, Linux, and Windows.\n\n# Homebrew (macOS / Linux)\nbrew install robsannaa/tap/zoho-cli\n\n# uv (all platforms)\nuv tool install git+https://github.com/robsannaa/zoho-cli\n\n# pipx (all platforms)\npipx install git+https://github.com/robsannaa/zoho-cli\n\n\nAfter install, run the one-time setup:\n\nzoho config init   # save your Zoho OAuth client_id / client_secret\nzoho login         # open browser, region auto-detected\n\n\nSee the full setup guide in the README.\n\nPrerequisites\nzoho must be installed and authenticated (zoho login completed).\nCheck: zoho config show — must return a JSON object with default_account and a non-empty accounts map.\nIf not logged in: tell the user to follow the setup in the README.\nOutput\nstdout → JSON (default) or Markdown (--md). Always machine-readable.\nstderr → errors (as JSON), debug logs, interactive prompts. Never in stdout.\nExit 0 = success. Exit 1 = error (JSON error object on stderr).\n# errors land on stderr, not stdout\nzoho mail list 2>/dev/null          # stdout empty on error\nzoho mail list 2>&1 >/dev/null      # see error JSON\n\nAuthentication\n\nTokens are stored in the OS keyring and refreshed automatically before every command. No manual token management needed.\n\nCredential storage (sensitive): Users must be aware that the CLI stores sensitive data locally:\n\nOAuth client_id and client_secret — saved via zoho config init in the config file (e.g. ~/.config/zoho-cli/config.json).\nAccess and refresh tokens — stored in the OS keyring (or, if ZOHO_TOKEN_PASSWORD is set, in an encrypted file). These are used to access Zoho Mail on the user's behalf.\n\nDo not expose config files or keyring entries to untrusted parties.\n\nIf a command fails with not_logged_in or token_refresh_failed, tell the user to run:\n\nzoho login\n\nGlobal flags\n--account EMAIL    select account (env: ZOHO_ACCOUNT)\n--config PATH      config file path (env: ZOHO_CONFIG)\n--md               markdown table output instead of JSON\n--debug            HTTP + debug logs to stderr\n\nCommands\nzoho mail list\n\nList messages in a folder.\n\nzoho mail list                               # Inbox, 50 messages\nzoho mail list --folder Sent --limit 20\nzoho mail list -f \"My Project\" -n 100\n\n\nOutput — array of message summaries:\n\n[\n  {\n    \"messageId\": \"1771333290108014300\",\n    \"folderId\": \"8072279000000002014\",\n    \"subject\": \"Q1 invoice\",\n    \"from\": \"billing@acme.com\",\n    \"to\": [\"you@example.com\"],\n    \"date\": \"1740067200000\",\n    \"unread\": true,\n    \"hasAttachments\": true,\n    \"tags\": []\n  }\n]\n\n\ndate is a Unix timestamp in milliseconds.\n\nzoho mail search\nzoho mail search \"invoice 2025\"\nzoho mail search \"from:boss@example.com\" --limit 10\n\n\nSame output shape as mail list.\n\nzoho mail get\n\nFull message content including body.\n\nzoho mail get MESSAGE_ID\nzoho mail get MESSAGE_ID --folder-id FOLDER_ID    # faster: skips auto-scan\nzoho mail get MESSAGE_ID | jq '.textBody'\n\n\nOutput:\n\n{\n  \"messageId\": \"...\",\n  \"folderId\": \"...\",\n  \"subject\": \"Q1 invoice\",\n  \"from\": \"billing@acme.com\",\n  \"to\": [\"you@example.com\"],\n  \"cc\": [],\n  \"bcc\": [],\n  \"date\": \"1740067200000\",\n  \"unread\": false,\n  \"hasAttachments\": true,\n  \"tags\": [],\n  \"textBody\": \"Please find the invoice attached.\",\n  \"htmlBody\": \"<p>Please find...</p>\"\n}\n\nzoho mail attachments\nzoho mail attachments MESSAGE_ID\nzoho mail attachments MESSAGE_ID --folder-id FOLDER_ID\n\n\nOutput:\n\n[\n  { \"attachmentId\": \"256063600000020001\", \"fileName\": \"invoice.pdf\", \"size\": 123456 }\n]\n\nzoho mail download-attachment\nzoho mail download-attachment MESSAGE_ID ATTACHMENT_ID --out /tmp/invoice.pdf\n\n\nOutput:\n\n{ \"status\": \"ok\", \"path\": \"/tmp/invoice.pdf\", \"size\": 123456 }\n\nzoho mail send\nzoho mail send --to alice@example.com --subject \"Hi\" --text \"Hello!\"\n\n# HTML + multiple recipients + attachments\nzoho mail send \\\n  --to alice@example.com --to bob@example.com \\\n  --cc manager@example.com \\\n  --subject \"Report\" \\\n  --html-file report.html \\\n  --attach report.pdf --attach data.csv\n\n\nOutput:\n\n{ \"status\": \"ok\", \"messageId\": \"...\" }\n\nFlag / move / delete operations\n\nAll accept one or more MESSAGE_ID arguments.\n\nzoho mail mark-read   ID [ID …]\nzoho mail mark-unread ID [ID …]\nzoho mail move        ID [ID …] --to \"Archive\"\nzoho mail spam        ID [ID …]\nzoho mail not-spam    ID [ID …]\nzoho mail archive     ID [ID …]\nzoho mail unarchive   ID [ID …]\nzoho mail delete      ID [ID …]              # → Trash\nzoho mail delete      ID [ID …] --permanent  # hard delete\n\n\nOutput:\n\n{ \"status\": \"ok\", \"updated\": [\"ID1\", \"ID2\"], \"failed\": [] }\n\nzoho folders list\nzoho folders list\n\n\nOutput:\n\n[\n  { \"folderId\": \"8072279000000002014\", \"folderName\": \"Inbox\", \"folderType\": \"Inbox\",\n    \"path\": \"/Inbox\", \"isArchived\": 0, \"unreadCount\": 3, \"messageCount\": 42 }\n]\n\nzoho folders create / rename / delete\nzoho folders create \"Project X\" [--parent-id FOLDER_ID]\nzoho folders rename FOLDER_ID \"New Name\"\nzoho folders delete FOLDER_ID\n\nzoho config show / path / init\nzoho config show     # JSON config dump (secret redacted)\nzoho config path     # {\"config_path\": \"...\", \"exists\": true}\nzoho config init     # interactive wizard (prompts on stderr)\n\nCommon patterns for agents\n# All unread message subjects\nzoho mail list | jq -r '.[] | select(.unread) | .subject'\n\n# Get the latest message ID\nzoho mail list -n 1 | jq -r '.[0].messageId'\n\n# Get plain-text body of a specific message\nzoho mail get \"$MSG_ID\" | jq -r '.textBody'\n\n# Download all attachments from a message\nzoho mail attachments \"$MSG_ID\" | jq -r '.[].attachmentId' | while read id; do\n  zoho mail download-attachment \"$MSG_ID\" \"$id\" --out \"/tmp/${id}\"\ndone\n\n# Find unread emails from a sender\nzoho mail search \"from:boss@example.com\" | jq '[.[] | select(.unread)]'\n\n# Mark all results as read\nzoho mail search \"invoice\" | jq -r '.[].messageId' | xargs zoho mail mark-read\n\n# Move search results to a folder\nzoho mail search \"newsletter\" | jq -r '.[].messageId' | xargs zoho mail move --to \"Archive\"\n\n# Send with computed body\nzoho mail send \\\n  --to report-reader@example.com \\\n  --subject \"Daily digest $(date +%F)\" \\\n  --text \"$(zoho mail list | jq -r '.[].subject' | head -10 | nl)\"\n\nError response shape\n\nAll errors are JSON on stderr:\n\n{\n  \"status\": \"error\",\n  \"error\": \"not_logged_in\",\n  \"details\": \"No stored token for you@example.com. Run: zoho login --account you@example.com\"\n}\n\n\nCommon error codes:\n\nCode\tMeaning\nnot_logged_in\tNo token stored — user must run zoho login\ntoken_refresh_failed\tToken revoked — user must run zoho login\nno_account_id\taccountId not saved — run zoho login again\nfolder_not_found\tFolder name doesn't match any folder\nmessage_not_found\tMessage ID not found in any folder\napi_error\tUpstream Zoho API error (details in message)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/robsannaa/zoho-cli",
    "publisherUrl": "https://clawhub.ai/robsannaa/zoho-cli",
    "owner": "robsannaa",
    "version": "0.1.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/zoho-cli",
    "downloadUrl": "https://openagent3.xyz/downloads/zoho-cli",
    "agentUrl": "https://openagent3.xyz/skills/zoho-cli/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-cli/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-cli/agent.md"
  }
}