{
  "schemaVersion": "1.0",
  "item": {
    "slug": "composio",
    "name": "Composio",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/wjayesh/composio",
    "canonicalUrl": "https://clawhub.ai/wjayesh/composio",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/composio",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=composio",
    "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-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/composio"
    },
    "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/composio",
    "agentPageUrl": "https://openagent3.xyz/skills/composio/agent",
    "manifestUrl": "https://openagent3.xyz/skills/composio/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/composio/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": "Composio - Tool Execution Platform for AI Agents",
        "body": "Composio connects your AI agent to 500+ apps — Gmail, Slack, GitHub, Notion, Google Workspace, Microsoft (Outlook, Teams), X/Twitter, Figma, Web Search, Browser automation, Meta apps, TikTok, and more — for seamless cross-app automation.\n\nUse this guide to discover tools, manage connections, and execute actions across any supported app.\n\nAPI Base: https://backend.composio.dev/api/v3\nAuth: All requests require x-api-key: YOUR_API_KEY"
      },
      {
        "title": "1. Get Your API Key",
        "body": "Go to platform.composio.dev and sign in with Google or another account. Navigate to your project settings and copy your API key.\n\nexport COMPOSIO_API_KEY=\"your_api_key_here\"\nexport COMPOSIO_BASE=\"https://backend.composio.dev/api/v3\"\n\nThat's it. You can now call any Composio tool."
      },
      {
        "title": "Core Operations",
        "body": "Every tool is called through one endpoint — the tool slug goes in the URL:\n\nPOST /api/v3/tools/execute/{TOOL_SLUG}\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/TOOL_SLUG_HERE\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": { ... }\n  }'\n\nOptional fields on every request:\n\nFieldDescriptionargumentsTool-specific input parameters (see each tool below)user_idYour end-user's identifier (for multi-user connected accounts)connected_account_idOverride which connected account to use"
      },
      {
        "title": "COMPOSIO_SEARCH_TOOLS — Discover Tools",
        "body": "Always call this first. Searches 500+ apps to find the right tools for your task. Returns tool schemas, execution plans, connection status, and pitfalls.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_SEARCH_TOOLS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"queries\": [\n        {\n          \"use_case\": \"send an email to someone\",\n          \"known_fields\": \"recipient_name: John\"\n        },\n        {\n          \"use_case\": \"create a meeting invite\",\n          \"known_fields\": \"meeting_date: tomorrow\"\n        }\n      ],\n      \"session\": {\n        \"generate_id\": true\n      }\n    }\n  }'\n\nParameterRequiredDescriptionqueriesYesArray of search queries (1-7 items)queries[].use_caseYesNormalized English description of the task. Include app name if known. No personal identifiers here.queries[].known_fieldsNoComma-separated key:value pairs of known inputs (e.g., \"channel_name: general, timezone: UTC\")session.generate_idYes (first call)Set true for new workflows to get a session IDsession.idYes (subsequent)Reuse the session ID returned from first callmodelNoYour LLM model name (e.g., \"claude-4.5-sonnet\") for optimized planning\n\nResponse:\n\n{\n  \"data\": {\n    \"results\": [\n      {\n        \"index\": 1,\n        \"use_case\": \"send an email to someone\",\n        \"primary_tool_slugs\": [\"GMAIL_SEND_EMAIL\"],\n        \"related_tool_slugs\": [\"GMAIL_CREATE_EMAIL_DRAFT\"],\n        \"toolkits\": [\"gmail\"],\n        \"recommended_plan_steps\": [\"Step 1: ...\", \"Step 2: ...\"],\n        \"known_pitfalls\": [\"Always set user_id to 'me'\"],\n        \"reference_workbench_snippets\": [...]\n      }\n    ],\n    \"tool_schemas\": {\n      \"GMAIL_SEND_EMAIL\": {\n        \"toolkit\": \"gmail\",\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"description\": \"Send an email\",\n        \"input_schema\": { ... }\n      }\n    },\n    \"toolkit_connection_statuses\": [\n      {\n        \"toolkit\": \"gmail\",\n        \"has_active_connection\": false,\n        \"status_message\": \"No active connection. Initiate via COMPOSIO_MANAGE_CONNECTIONS.\"\n      }\n    ],\n    \"time_info\": {\n      \"current_time_utc\": \"2025-01-15T10:30:00Z\",\n      \"current_time_utc_epoch_seconds\": 1736935800\n    },\n    \"session\": {\n      \"id\": \"abcd\",\n      \"instructions\": \"Pass this session ID in all subsequent calls\"\n    }\n  },\n  \"successful\": true\n}\n\nSplitting guidelines:\n\n1 query = 1 tool action. Include hidden prerequisites (e.g., \"get issue\" before \"update issue\").\nInclude app names in every sub-query if the user specified one.\nTranslate non-English prompts to English while preserving identifiers.\n\nAfter searching:\n\nReview the recommended_plan_steps and known_pitfalls before executing.\nIf a tool has schemaRef instead of input_schema, call COMPOSIO_GET_TOOL_SCHEMAS first.\nIf has_active_connection is false for a toolkit, call COMPOSIO_MANAGE_CONNECTIONS before executing its tools."
      },
      {
        "title": "COMPOSIO_MANAGE_CONNECTIONS — Connect to Apps",
        "body": "Creates or checks OAuth/API connections for toolkits. Returns auth links for user authentication.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MANAGE_CONNECTIONS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"toolkits\": [\"gmail\", \"slack\"],\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameterRequiredDescriptiontoolkitsYesToolkit names from SEARCH_TOOLS response (e.g., [\"gmail\", \"github\"]). Never invent names.reinitiate_allNoForce reconnection even if already active (default: false)session_idNoSession ID from SEARCH_TOOLS\n\nResponse:\n\n{\n  \"data\": {\n    \"message\": \"1 active, 1 initiated\",\n    \"results\": {\n      \"gmail\": {\n        \"toolkit\": \"gmail\",\n        \"status\": \"initiated\",\n        \"redirect_url\": \"https://accounts.google.com/o/oauth2/...\",\n        \"instruction\": \"Click the link to authenticate\"\n      },\n      \"slack\": {\n        \"toolkit\": \"slack\",\n        \"status\": \"active\",\n        \"has_active_connection\": true,\n        \"connected_account_id\": \"ca_xxx\",\n        \"current_user_info\": { \"email\": \"user@example.com\" }\n      }\n    },\n    \"summary\": {\n      \"total_toolkits\": 2,\n      \"active_connections\": 1,\n      \"initiated_connections\": 1,\n      \"failed_connections\": 0\n    }\n  },\n  \"successful\": true\n}\n\nConnection workflow:\n\nCall SEARCH_TOOLS — check toolkit_connection_statuses\nIf has_active_connection is false, call MANAGE_CONNECTIONS\nIf status is \"initiated\", present the redirect_url to the user for authentication\nOnce the user completes auth, the connection becomes active\nOnly execute tools after the connection is confirmed active"
      },
      {
        "title": "COMPOSIO_GET_TOOL_SCHEMAS — Get Full Input Schemas",
        "body": "Retrieves complete input schemas for tools. Call this when SEARCH_TOOLS returns schemaRef instead of a full input_schema.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_GET_TOOL_SCHEMAS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"tool_slugs\": [\"GMAIL_SEND_EMAIL\", \"SLACK_SEND_MESSAGE\"],\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameterRequiredDescriptiontool_slugsYesArray of tool slugs from SEARCH_TOOLSsession_idNoSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"success\": true,\n    \"tool_schemas\": {\n      \"GMAIL_SEND_EMAIL\": {\n        \"toolkit\": \"gmail\",\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"description\": \"Send an email via Gmail\",\n        \"input_schema\": {\n          \"properties\": {\n            \"to\": { \"type\": \"string\", \"description\": \"Recipient email\" },\n            \"subject\": { \"type\": \"string\" },\n            \"body\": { \"type\": \"string\" }\n          },\n          \"required\": [\"to\", \"subject\", \"body\"]\n        }\n      }\n    },\n    \"not_found\": []\n  },\n  \"successful\": true\n}"
      },
      {
        "title": "COMPOSIO_MULTI_EXECUTE_TOOL — Execute Tools",
        "body": "Executes one or more tools in parallel. This is how you run the tools discovered through SEARCH_TOOLS.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MULTI_EXECUTE_TOOL\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"tools\": [\n        {\n          \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n          \"arguments\": {\n            \"to\": \"john@example.com\",\n            \"subject\": \"Hello\",\n            \"body\": \"Welcome to the team!\"\n          }\n        },\n        {\n          \"tool_slug\": \"SLACK_SEND_MESSAGE\",\n          \"arguments\": {\n            \"channel\": \"#general\",\n            \"text\": \"New member joined!\"\n          }\n        }\n      ],\n      \"sync_response_to_workbench\": false,\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameterRequiredDescriptiontoolsYesArray of tool executions (1-50 items)tools[].tool_slugYesValid slug from SEARCH_TOOLStools[].argumentsYesArguments matching the tool's input schema exactlysync_response_to_workbenchYesSet true if response may be large or needed for later scriptingsession_idNoSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"results\": [\n      {\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"index\": 0,\n        \"response\": {\n          \"data\": { \"id\": \"msg_123\", \"threadId\": \"thread_456\" },\n          \"successful\": true\n        },\n        \"error\": null\n      },\n      {\n        \"tool_slug\": \"SLACK_SEND_MESSAGE\",\n        \"index\": 1,\n        \"response\": {\n          \"data\": { \"ok\": true, \"ts\": \"1234567890.123456\" },\n          \"successful\": true\n        },\n        \"error\": null\n      }\n    ],\n    \"total_count\": 2,\n    \"success_count\": 2,\n    \"error_count\": 0,\n    \"remote_file_info\": null\n  },\n  \"successful\": true\n}\n\nRules:\n\nOnly batch tools that are logically independent (no ordering dependencies).\nNever invent tool slugs or argument fields — always use what SEARCH_TOOLS returned.\nEnsure active connections exist before executing.\nIf response is large, it may be saved to a remote file — use remote_file_info.file_path with the Remote Workbench or Bash tools to process it."
      },
      {
        "title": "COMPOSIO_REMOTE_WORKBENCH — Run Python Code",
        "body": "Executes Python code in a persistent remote Jupyter sandbox. Use for processing large tool outputs, bulk operations, and scripting multi-tool chains.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_REMOTE_WORKBENCH\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"code_to_execute\": \"result, error = run_composio_tool(\\\"GMAIL_FETCH_EMAILS\\\", {\\\"max_results\\\": 5, \\\"user_id\\\": \\\"me\\\"})\\nif error:\\n    print(\\\"Error:\\\", error)\\nelse:\\n    emails = result.get(\\\"data\\\", {})\\n    print(\\\"Fetched:\\\", len(emails.get(\\\"messages\\\", [])))\",\n      \"thought\": \"Fetching recent emails for bulk processing\",\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameterRequiredDescriptioncode_to_executeYesPython code to run in the sandboxthoughtNoOne-sentence objective descriptiontimeoutNoExecution timeout in seconds (1-780, default: 600)session_idNoSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"results\": \"Fetched: 5\",\n    \"stdout\": \"Fetched: 5\\n\",\n    \"stderr\": \"\",\n    \"error\": \"\",\n    \"sandbox_id_suffix\": \"a1b2\"\n  },\n  \"successful\": true\n}\n\nIf output exceeds 40,000 characters, it is saved to a file and results_file_path / stdout_file_path is returned instead.\n\nPre-loaded helper functions (do NOT import or redeclare these):\n\nFunctionSignatureDescriptionrun_composio_tool(tool_slug: str, arguments: dict) -> tuple[dict, str]Execute a Composio app tool. Returns (response, error).invoke_llm(query: str) -> tuple[str, str]Call an LLM for analysis, summarization, extraction. Max 200k chars input. Returns (response, error).proxy_execute(method, endpoint, toolkit, query_params?, body?, headers?) -> tuple[any, str]Direct API call to a connected toolkit when no Composio tool exists. Returns (response, error).web_search(query: str) -> tuple[str, str]Search the web via Exa AI. Returns (results, error).upload_local_file(*file_paths) -> tuple[dict, str]Upload sandbox files to cloud storage. Returns ({\"s3_url\": ...}, error).smart_file_extract(sandbox_file_path: str) -> tuple[str, str]Extract text from PDF, images, etc. Returns (text, error).\n\nAll helpers return (result, error) — always check error before using result.\n\nCoding rules:\n\nSplit work into small steps; save intermediate results to /tmp/ files.\nState persists across executions (variables, imports, files).\nHard timeout of 4 minutes — use ThreadPoolExecutor for bulk operations.\nAlways check error from helper functions before using results.\nUse invoke_llm for summarization and analysis — it gives better results than ad-hoc filtering.\nDo NOT call COMPOSIO_* meta tools via run_composio_tool — only use it for app tools (e.g., GMAIL_SEND_EMAIL).\n\nExample — bulk email processing:\n\nimport concurrent.futures\n\ndef process_email(email_id):\n    result, error = run_composio_tool(\"GMAIL_GET_EMAIL\", {\n        \"message_id\": email_id, \"user_id\": \"me\"\n    })\n    if error:\n        return {\"id\": email_id, \"error\": error}\n    subject = result.get(\"data\", {}).get(\"subject\", \"\")\n    return {\"id\": email_id, \"subject\": subject}\n\n# Fetch email list\nemails, err = run_composio_tool(\"GMAIL_FETCH_EMAILS\", {\n    \"max_results\": 50, \"user_id\": \"me\"\n})\nif not err:\n    ids = [m[\"id\"] for m in emails.get(\"data\", {}).get(\"messages\", [])]\n    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as ex:\n        results = list(ex.map(process_email, ids))\n    print(f\"Processed {len(results)} emails\")"
      },
      {
        "title": "COMPOSIO_REMOTE_BASH_TOOL — Run Bash Commands",
        "body": "Executes bash commands in the same persistent sandbox as the workbench.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_REMOTE_BASH_TOOL\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"command\": \"cat /home/user/.code_out/response.json | jq \\\".results[] | .tool_slug\\\"\",\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameterRequiredDescriptioncommandYesBash command to executesession_idNoSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"stdout\": \"\\\"GMAIL_SEND_EMAIL\\\"\\n\\\"SLACK_SEND_MESSAGE\\\"\\n\",\n    \"stdoutLines\": 2,\n    \"stderr\": \"\",\n    \"stderrLines\": 0,\n    \"sandbox_id_suffix\": \"a1b2\"\n  },\n  \"successful\": true\n}\n\nUse cases:\n\nProcess large tool responses saved to remote files (via jq, awk, sed, grep)\nFile system operations in the sandbox\nCommands run from /home/user by default\n5-minute timeout, max 40,000 chars output per stream"
      },
      {
        "title": "Typical Workflow",
        "body": "1. COMPOSIO_SEARCH_TOOLS\n   | Find tools for your task\n   | Check connection statuses\n   | Review execution plan and pitfalls\n\n2. COMPOSIO_GET_TOOL_SCHEMAS (if needed)\n   | Get full input schemas for tools with schemaRef\n\n3. COMPOSIO_MANAGE_CONNECTIONS (if needed)\n   | Initiate connections for toolkits without active connections\n   | Present auth URL to user -> user completes OAuth\n\n4. COMPOSIO_MULTI_EXECUTE_TOOL\n   | Execute tools with schema-compliant arguments\n   | Process inline results or note remote file paths\n\n5. COMPOSIO_REMOTE_WORKBENCH / COMPOSIO_REMOTE_BASH_TOOL (if needed)\n   | Process large outputs saved to remote files\n   | Run bulk operations or multi-tool scripts\n   | Upload artifacts via upload_local_file\n\nExample — complete \"send email\" workflow:\n\n# Step 1: Search for email tools\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_SEARCH_TOOLS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"queries\": [{\"use_case\": \"send an email via gmail\", \"known_fields\": \"recipient: john@example.com\"}],\n      \"session\": {\"generate_id\": true}\n    }\n  }'\n# -> Returns GMAIL_SEND_EMAIL tool with schema\n# -> Check toolkit_connection_statuses for gmail\n# -> Save session.id from response (e.g., \"abcd\")\n\n# Step 2: Connect gmail (if not active)\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MANAGE_CONNECTIONS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"toolkits\": [\"gmail\"],\n      \"session_id\": \"abcd\"\n    }\n  }'\n# -> If status is \"initiated\", present redirect_url to user for OAuth\n\n# Step 3: Execute the tool\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MULTI_EXECUTE_TOOL\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"tools\": [{\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"arguments\": {\n          \"to\": \"john@example.com\",\n          \"subject\": \"Welcome!\",\n          \"body\": \"Welcome to the team, John!\",\n          \"user_id\": \"me\"\n        }\n      }],\n      \"sync_response_to_workbench\": false,\n      \"session_id\": \"abcd\"\n    }\n  }'"
      },
      {
        "title": "Session Management",
        "body": "Pass session: {generate_id: true} on your first SEARCH_TOOLS call to get a session ID.\nPass that session_id into all subsequent tool calls within the same workflow.\nGenerate a new session when the user pivots to a different task."
      },
      {
        "title": "Tool Discovery",
        "body": "Always call SEARCH_TOOLS first — never guess tool slugs or argument fields.\nRe-run SEARCH_TOOLS when you need additional tools due to errors or changed requirements.\nReview recommended_plan_steps and known_pitfalls before executing."
      },
      {
        "title": "Connections",
        "body": "Never execute a toolkit tool without an active connection.\nUse exact toolkit names from SEARCH_TOOLS — never invent names.\nIf a connection fails, present the auth URL to the user."
      },
      {
        "title": "Execution",
        "body": "Use schema-compliant arguments only — check input_schema before every call.\nBatch independent tools into a single MULTI_EXECUTE call.\nFor large responses, set sync_response_to_workbench: true and process in the workbench."
      },
      {
        "title": "Workbench",
        "body": "Only use the workbench for remote file processing or bulk scripting — not for data already visible inline.\nKeep code concise; split long operations into multiple workbench calls.\nUse ThreadPoolExecutor for parallelism within the 4-minute timeout."
      },
      {
        "title": "Quick Reference",
        "body": "ActionTool SlugKey ArgumentsDiscover toolsCOMPOSIO_SEARCH_TOOLSqueries, sessionGet input schemasCOMPOSIO_GET_TOOL_SCHEMAStool_slugsConnect to appsCOMPOSIO_MANAGE_CONNECTIONStoolkits, reinitiate_allExecute toolsCOMPOSIO_MULTI_EXECUTE_TOOLtools, sync_response_to_workbenchRun Python codeCOMPOSIO_REMOTE_WORKBENCHcode_to_execute, thoughtRun bash commandsCOMPOSIO_REMOTE_BASH_TOOLcommand\n\nEndpoint for all tools:\n\nPOST /api/v3/tools/execute/{TOOL_SLUG}\n\nCommon errors:\n\nErrorMeaning401Invalid or missing API key403Forbidden — insufficient permissions404Tool or resource not found422Invalid arguments (check input schema)429Rate limited — back off and retry500Internal server error\n\nRate limits: Respect 429 responses with exponential backoff."
      },
      {
        "title": "Agent Notes",
        "body": "Gotchas and non-obvious behavior discovered during testing.\n\nSome tools return schemaRef instead of input_schema. When you see \"hasFullSchema\": false, you MUST call COMPOSIO_GET_TOOL_SCHEMAS before executing that tool.\nResponse nesting: Tool execution results live at response.data.results[].response.data — two levels of data. Parse carefully.\nWorkbench state persists across calls. Variables, imports, and files in /tmp/ survive between executions within the same sandbox session.\nString formatting in workbench code: Avoid f-strings with nested quotes when sending code via JSON. Use string concatenation instead to prevent quoting issues.\ninvoke_llm works well for classification and analysis of tool output. Request explicit JSON format for structured results."
      }
    ],
    "body": "Composio - Tool Execution Platform for AI Agents\n\nComposio connects your AI agent to 500+ apps — Gmail, Slack, GitHub, Notion, Google Workspace, Microsoft (Outlook, Teams), X/Twitter, Figma, Web Search, Browser automation, Meta apps, TikTok, and more — for seamless cross-app automation.\n\nUse this guide to discover tools, manage connections, and execute actions across any supported app.\n\nAPI Base: https://backend.composio.dev/api/v3 Auth: All requests require x-api-key: YOUR_API_KEY\n\nSetup (One-Time)\n1. Get Your API Key\n\nGo to platform.composio.dev and sign in with Google or another account. Navigate to your project settings and copy your API key.\n\nexport COMPOSIO_API_KEY=\"your_api_key_here\"\nexport COMPOSIO_BASE=\"https://backend.composio.dev/api/v3\"\n\n\nThat's it. You can now call any Composio tool.\n\nCore Operations\n\nEvery tool is called through one endpoint — the tool slug goes in the URL:\n\nPOST /api/v3/tools/execute/{TOOL_SLUG}\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/TOOL_SLUG_HERE\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": { ... }\n  }'\n\n\nOptional fields on every request:\n\nField\tDescription\narguments\tTool-specific input parameters (see each tool below)\nuser_id\tYour end-user's identifier (for multi-user connected accounts)\nconnected_account_id\tOverride which connected account to use\nCOMPOSIO_SEARCH_TOOLS — Discover Tools\n\nAlways call this first. Searches 500+ apps to find the right tools for your task. Returns tool schemas, execution plans, connection status, and pitfalls.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_SEARCH_TOOLS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"queries\": [\n        {\n          \"use_case\": \"send an email to someone\",\n          \"known_fields\": \"recipient_name: John\"\n        },\n        {\n          \"use_case\": \"create a meeting invite\",\n          \"known_fields\": \"meeting_date: tomorrow\"\n        }\n      ],\n      \"session\": {\n        \"generate_id\": true\n      }\n    }\n  }'\n\nParameter\tRequired\tDescription\nqueries\tYes\tArray of search queries (1-7 items)\nqueries[].use_case\tYes\tNormalized English description of the task. Include app name if known. No personal identifiers here.\nqueries[].known_fields\tNo\tComma-separated key:value pairs of known inputs (e.g., \"channel_name: general, timezone: UTC\")\nsession.generate_id\tYes (first call)\tSet true for new workflows to get a session ID\nsession.id\tYes (subsequent)\tReuse the session ID returned from first call\nmodel\tNo\tYour LLM model name (e.g., \"claude-4.5-sonnet\") for optimized planning\n\nResponse:\n\n{\n  \"data\": {\n    \"results\": [\n      {\n        \"index\": 1,\n        \"use_case\": \"send an email to someone\",\n        \"primary_tool_slugs\": [\"GMAIL_SEND_EMAIL\"],\n        \"related_tool_slugs\": [\"GMAIL_CREATE_EMAIL_DRAFT\"],\n        \"toolkits\": [\"gmail\"],\n        \"recommended_plan_steps\": [\"Step 1: ...\", \"Step 2: ...\"],\n        \"known_pitfalls\": [\"Always set user_id to 'me'\"],\n        \"reference_workbench_snippets\": [...]\n      }\n    ],\n    \"tool_schemas\": {\n      \"GMAIL_SEND_EMAIL\": {\n        \"toolkit\": \"gmail\",\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"description\": \"Send an email\",\n        \"input_schema\": { ... }\n      }\n    },\n    \"toolkit_connection_statuses\": [\n      {\n        \"toolkit\": \"gmail\",\n        \"has_active_connection\": false,\n        \"status_message\": \"No active connection. Initiate via COMPOSIO_MANAGE_CONNECTIONS.\"\n      }\n    ],\n    \"time_info\": {\n      \"current_time_utc\": \"2025-01-15T10:30:00Z\",\n      \"current_time_utc_epoch_seconds\": 1736935800\n    },\n    \"session\": {\n      \"id\": \"abcd\",\n      \"instructions\": \"Pass this session ID in all subsequent calls\"\n    }\n  },\n  \"successful\": true\n}\n\n\nSplitting guidelines:\n\n1 query = 1 tool action. Include hidden prerequisites (e.g., \"get issue\" before \"update issue\").\nInclude app names in every sub-query if the user specified one.\nTranslate non-English prompts to English while preserving identifiers.\n\nAfter searching:\n\nReview the recommended_plan_steps and known_pitfalls before executing.\nIf a tool has schemaRef instead of input_schema, call COMPOSIO_GET_TOOL_SCHEMAS first.\nIf has_active_connection is false for a toolkit, call COMPOSIO_MANAGE_CONNECTIONS before executing its tools.\nCOMPOSIO_MANAGE_CONNECTIONS — Connect to Apps\n\nCreates or checks OAuth/API connections for toolkits. Returns auth links for user authentication.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MANAGE_CONNECTIONS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"toolkits\": [\"gmail\", \"slack\"],\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameter\tRequired\tDescription\ntoolkits\tYes\tToolkit names from SEARCH_TOOLS response (e.g., [\"gmail\", \"github\"]). Never invent names.\nreinitiate_all\tNo\tForce reconnection even if already active (default: false)\nsession_id\tNo\tSession ID from SEARCH_TOOLS\n\nResponse:\n\n{\n  \"data\": {\n    \"message\": \"1 active, 1 initiated\",\n    \"results\": {\n      \"gmail\": {\n        \"toolkit\": \"gmail\",\n        \"status\": \"initiated\",\n        \"redirect_url\": \"https://accounts.google.com/o/oauth2/...\",\n        \"instruction\": \"Click the link to authenticate\"\n      },\n      \"slack\": {\n        \"toolkit\": \"slack\",\n        \"status\": \"active\",\n        \"has_active_connection\": true,\n        \"connected_account_id\": \"ca_xxx\",\n        \"current_user_info\": { \"email\": \"user@example.com\" }\n      }\n    },\n    \"summary\": {\n      \"total_toolkits\": 2,\n      \"active_connections\": 1,\n      \"initiated_connections\": 1,\n      \"failed_connections\": 0\n    }\n  },\n  \"successful\": true\n}\n\n\nConnection workflow:\n\nCall SEARCH_TOOLS — check toolkit_connection_statuses\nIf has_active_connection is false, call MANAGE_CONNECTIONS\nIf status is \"initiated\", present the redirect_url to the user for authentication\nOnce the user completes auth, the connection becomes active\nOnly execute tools after the connection is confirmed active\nCOMPOSIO_GET_TOOL_SCHEMAS — Get Full Input Schemas\n\nRetrieves complete input schemas for tools. Call this when SEARCH_TOOLS returns schemaRef instead of a full input_schema.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_GET_TOOL_SCHEMAS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"tool_slugs\": [\"GMAIL_SEND_EMAIL\", \"SLACK_SEND_MESSAGE\"],\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameter\tRequired\tDescription\ntool_slugs\tYes\tArray of tool slugs from SEARCH_TOOLS\nsession_id\tNo\tSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"success\": true,\n    \"tool_schemas\": {\n      \"GMAIL_SEND_EMAIL\": {\n        \"toolkit\": \"gmail\",\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"description\": \"Send an email via Gmail\",\n        \"input_schema\": {\n          \"properties\": {\n            \"to\": { \"type\": \"string\", \"description\": \"Recipient email\" },\n            \"subject\": { \"type\": \"string\" },\n            \"body\": { \"type\": \"string\" }\n          },\n          \"required\": [\"to\", \"subject\", \"body\"]\n        }\n      }\n    },\n    \"not_found\": []\n  },\n  \"successful\": true\n}\n\nCOMPOSIO_MULTI_EXECUTE_TOOL — Execute Tools\n\nExecutes one or more tools in parallel. This is how you run the tools discovered through SEARCH_TOOLS.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MULTI_EXECUTE_TOOL\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"tools\": [\n        {\n          \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n          \"arguments\": {\n            \"to\": \"john@example.com\",\n            \"subject\": \"Hello\",\n            \"body\": \"Welcome to the team!\"\n          }\n        },\n        {\n          \"tool_slug\": \"SLACK_SEND_MESSAGE\",\n          \"arguments\": {\n            \"channel\": \"#general\",\n            \"text\": \"New member joined!\"\n          }\n        }\n      ],\n      \"sync_response_to_workbench\": false,\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameter\tRequired\tDescription\ntools\tYes\tArray of tool executions (1-50 items)\ntools[].tool_slug\tYes\tValid slug from SEARCH_TOOLS\ntools[].arguments\tYes\tArguments matching the tool's input schema exactly\nsync_response_to_workbench\tYes\tSet true if response may be large or needed for later scripting\nsession_id\tNo\tSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"results\": [\n      {\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"index\": 0,\n        \"response\": {\n          \"data\": { \"id\": \"msg_123\", \"threadId\": \"thread_456\" },\n          \"successful\": true\n        },\n        \"error\": null\n      },\n      {\n        \"tool_slug\": \"SLACK_SEND_MESSAGE\",\n        \"index\": 1,\n        \"response\": {\n          \"data\": { \"ok\": true, \"ts\": \"1234567890.123456\" },\n          \"successful\": true\n        },\n        \"error\": null\n      }\n    ],\n    \"total_count\": 2,\n    \"success_count\": 2,\n    \"error_count\": 0,\n    \"remote_file_info\": null\n  },\n  \"successful\": true\n}\n\n\nRules:\n\nOnly batch tools that are logically independent (no ordering dependencies).\nNever invent tool slugs or argument fields — always use what SEARCH_TOOLS returned.\nEnsure active connections exist before executing.\nIf response is large, it may be saved to a remote file — use remote_file_info.file_path with the Remote Workbench or Bash tools to process it.\nCOMPOSIO_REMOTE_WORKBENCH — Run Python Code\n\nExecutes Python code in a persistent remote Jupyter sandbox. Use for processing large tool outputs, bulk operations, and scripting multi-tool chains.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_REMOTE_WORKBENCH\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"code_to_execute\": \"result, error = run_composio_tool(\\\"GMAIL_FETCH_EMAILS\\\", {\\\"max_results\\\": 5, \\\"user_id\\\": \\\"me\\\"})\\nif error:\\n    print(\\\"Error:\\\", error)\\nelse:\\n    emails = result.get(\\\"data\\\", {})\\n    print(\\\"Fetched:\\\", len(emails.get(\\\"messages\\\", [])))\",\n      \"thought\": \"Fetching recent emails for bulk processing\",\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameter\tRequired\tDescription\ncode_to_execute\tYes\tPython code to run in the sandbox\nthought\tNo\tOne-sentence objective description\ntimeout\tNo\tExecution timeout in seconds (1-780, default: 600)\nsession_id\tNo\tSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"results\": \"Fetched: 5\",\n    \"stdout\": \"Fetched: 5\\n\",\n    \"stderr\": \"\",\n    \"error\": \"\",\n    \"sandbox_id_suffix\": \"a1b2\"\n  },\n  \"successful\": true\n}\n\n\nIf output exceeds 40,000 characters, it is saved to a file and results_file_path / stdout_file_path is returned instead.\n\nPre-loaded helper functions (do NOT import or redeclare these):\n\nFunction\tSignature\tDescription\nrun_composio_tool\t(tool_slug: str, arguments: dict) -> tuple[dict, str]\tExecute a Composio app tool. Returns (response, error).\ninvoke_llm\t(query: str) -> tuple[str, str]\tCall an LLM for analysis, summarization, extraction. Max 200k chars input. Returns (response, error).\nproxy_execute\t(method, endpoint, toolkit, query_params?, body?, headers?) -> tuple[any, str]\tDirect API call to a connected toolkit when no Composio tool exists. Returns (response, error).\nweb_search\t(query: str) -> tuple[str, str]\tSearch the web via Exa AI. Returns (results, error).\nupload_local_file\t(*file_paths) -> tuple[dict, str]\tUpload sandbox files to cloud storage. Returns ({\"s3_url\": ...}, error).\nsmart_file_extract\t(sandbox_file_path: str) -> tuple[str, str]\tExtract text from PDF, images, etc. Returns (text, error).\n\nAll helpers return (result, error) — always check error before using result.\n\nCoding rules:\n\nSplit work into small steps; save intermediate results to /tmp/ files.\nState persists across executions (variables, imports, files).\nHard timeout of 4 minutes — use ThreadPoolExecutor for bulk operations.\nAlways check error from helper functions before using results.\nUse invoke_llm for summarization and analysis — it gives better results than ad-hoc filtering.\nDo NOT call COMPOSIO_* meta tools via run_composio_tool — only use it for app tools (e.g., GMAIL_SEND_EMAIL).\n\nExample — bulk email processing:\n\nimport concurrent.futures\n\ndef process_email(email_id):\n    result, error = run_composio_tool(\"GMAIL_GET_EMAIL\", {\n        \"message_id\": email_id, \"user_id\": \"me\"\n    })\n    if error:\n        return {\"id\": email_id, \"error\": error}\n    subject = result.get(\"data\", {}).get(\"subject\", \"\")\n    return {\"id\": email_id, \"subject\": subject}\n\n# Fetch email list\nemails, err = run_composio_tool(\"GMAIL_FETCH_EMAILS\", {\n    \"max_results\": 50, \"user_id\": \"me\"\n})\nif not err:\n    ids = [m[\"id\"] for m in emails.get(\"data\", {}).get(\"messages\", [])]\n    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as ex:\n        results = list(ex.map(process_email, ids))\n    print(f\"Processed {len(results)} emails\")\n\nCOMPOSIO_REMOTE_BASH_TOOL — Run Bash Commands\n\nExecutes bash commands in the same persistent sandbox as the workbench.\n\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_REMOTE_BASH_TOOL\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"command\": \"cat /home/user/.code_out/response.json | jq \\\".results[] | .tool_slug\\\"\",\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nParameter\tRequired\tDescription\ncommand\tYes\tBash command to execute\nsession_id\tNo\tSession ID\n\nResponse:\n\n{\n  \"data\": {\n    \"stdout\": \"\\\"GMAIL_SEND_EMAIL\\\"\\n\\\"SLACK_SEND_MESSAGE\\\"\\n\",\n    \"stdoutLines\": 2,\n    \"stderr\": \"\",\n    \"stderrLines\": 0,\n    \"sandbox_id_suffix\": \"a1b2\"\n  },\n  \"successful\": true\n}\n\n\nUse cases:\n\nProcess large tool responses saved to remote files (via jq, awk, sed, grep)\nFile system operations in the sandbox\nCommands run from /home/user by default\n5-minute timeout, max 40,000 chars output per stream\nTypical Workflow\n1. COMPOSIO_SEARCH_TOOLS\n   | Find tools for your task\n   | Check connection statuses\n   | Review execution plan and pitfalls\n\n2. COMPOSIO_GET_TOOL_SCHEMAS (if needed)\n   | Get full input schemas for tools with schemaRef\n\n3. COMPOSIO_MANAGE_CONNECTIONS (if needed)\n   | Initiate connections for toolkits without active connections\n   | Present auth URL to user -> user completes OAuth\n\n4. COMPOSIO_MULTI_EXECUTE_TOOL\n   | Execute tools with schema-compliant arguments\n   | Process inline results or note remote file paths\n\n5. COMPOSIO_REMOTE_WORKBENCH / COMPOSIO_REMOTE_BASH_TOOL (if needed)\n   | Process large outputs saved to remote files\n   | Run bulk operations or multi-tool scripts\n   | Upload artifacts via upload_local_file\n\n\nExample — complete \"send email\" workflow:\n\n# Step 1: Search for email tools\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_SEARCH_TOOLS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"queries\": [{\"use_case\": \"send an email via gmail\", \"known_fields\": \"recipient: john@example.com\"}],\n      \"session\": {\"generate_id\": true}\n    }\n  }'\n# -> Returns GMAIL_SEND_EMAIL tool with schema\n# -> Check toolkit_connection_statuses for gmail\n# -> Save session.id from response (e.g., \"abcd\")\n\n# Step 2: Connect gmail (if not active)\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MANAGE_CONNECTIONS\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"toolkits\": [\"gmail\"],\n      \"session_id\": \"abcd\"\n    }\n  }'\n# -> If status is \"initiated\", present redirect_url to user for OAuth\n\n# Step 3: Execute the tool\ncurl -X POST \"$COMPOSIO_BASE/tools/execute/COMPOSIO_MULTI_EXECUTE_TOOL\" \\\n  -H \"x-api-key: $COMPOSIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"arguments\": {\n      \"tools\": [{\n        \"tool_slug\": \"GMAIL_SEND_EMAIL\",\n        \"arguments\": {\n          \"to\": \"john@example.com\",\n          \"subject\": \"Welcome!\",\n          \"body\": \"Welcome to the team, John!\",\n          \"user_id\": \"me\"\n        }\n      }],\n      \"sync_response_to_workbench\": false,\n      \"session_id\": \"abcd\"\n    }\n  }'\n\nBest Practices\nSession Management\nPass session: {generate_id: true} on your first SEARCH_TOOLS call to get a session ID.\nPass that session_id into all subsequent tool calls within the same workflow.\nGenerate a new session when the user pivots to a different task.\nTool Discovery\nAlways call SEARCH_TOOLS first — never guess tool slugs or argument fields.\nRe-run SEARCH_TOOLS when you need additional tools due to errors or changed requirements.\nReview recommended_plan_steps and known_pitfalls before executing.\nConnections\nNever execute a toolkit tool without an active connection.\nUse exact toolkit names from SEARCH_TOOLS — never invent names.\nIf a connection fails, present the auth URL to the user.\nExecution\nUse schema-compliant arguments only — check input_schema before every call.\nBatch independent tools into a single MULTI_EXECUTE call.\nFor large responses, set sync_response_to_workbench: true and process in the workbench.\nWorkbench\nOnly use the workbench for remote file processing or bulk scripting — not for data already visible inline.\nKeep code concise; split long operations into multiple workbench calls.\nUse ThreadPoolExecutor for parallelism within the 4-minute timeout.\nQuick Reference\nAction\tTool Slug\tKey Arguments\nDiscover tools\tCOMPOSIO_SEARCH_TOOLS\tqueries, session\nGet input schemas\tCOMPOSIO_GET_TOOL_SCHEMAS\ttool_slugs\nConnect to apps\tCOMPOSIO_MANAGE_CONNECTIONS\ttoolkits, reinitiate_all\nExecute tools\tCOMPOSIO_MULTI_EXECUTE_TOOL\ttools, sync_response_to_workbench\nRun Python code\tCOMPOSIO_REMOTE_WORKBENCH\tcode_to_execute, thought\nRun bash commands\tCOMPOSIO_REMOTE_BASH_TOOL\tcommand\n\nEndpoint for all tools:\n\nPOST /api/v3/tools/execute/{TOOL_SLUG}\n\n\nCommon errors:\n\nError\tMeaning\n401\tInvalid or missing API key\n403\tForbidden — insufficient permissions\n404\tTool or resource not found\n422\tInvalid arguments (check input schema)\n429\tRate limited — back off and retry\n500\tInternal server error\n\nRate limits: Respect 429 responses with exponential backoff.\n\nAgent Notes\n\nGotchas and non-obvious behavior discovered during testing.\n\nSome tools return schemaRef instead of input_schema. When you see \"hasFullSchema\": false, you MUST call COMPOSIO_GET_TOOL_SCHEMAS before executing that tool.\nResponse nesting: Tool execution results live at response.data.results[].response.data — two levels of data. Parse carefully.\nWorkbench state persists across calls. Variables, imports, and files in /tmp/ survive between executions within the same sandbox session.\nString formatting in workbench code: Avoid f-strings with nested quotes when sending code via JSON. Use string concatenation instead to prevent quoting issues.\ninvoke_llm works well for classification and analysis of tool output. Request explicit JSON format for structured results."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/wjayesh/composio",
    "publisherUrl": "https://clawhub.ai/wjayesh/composio",
    "owner": "wjayesh",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/composio",
    "downloadUrl": "https://openagent3.xyz/downloads/composio",
    "agentUrl": "https://openagent3.xyz/skills/composio/agent",
    "manifestUrl": "https://openagent3.xyz/skills/composio/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/composio/agent.md"
  }
}