# Composio Apps

> Connected app tool recipes for Dench Integrations (Gmail, Slack, GitHub, Notion, Google Calendar, Linear, Stripe)

- Skill: `denchhq/composio-apps` (Agent Skill)
- Install (CLI): `npx skillmds@latest add denchhq/composio-apps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/denchhq/composio-apps/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: denchhq (https://skillmd.com/u/denchhq)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/denchhq/composio-apps

---


# Dench Integrations connected apps

Use the **Dench Integrations tools** only. In DenchClaw, always search first with `composio_search_tools`, inspect the returned full schemas plus plan/pitfall guidance, then execute the chosen tool via `composio_call_tool`. `composio_resolve_tool` still exists as a compatibility wrapper when you want a single best-match result, but ranked search is the default path. Some sessions may still expose direct tool names like `GMAIL_FETCH_EMAILS`, but do not rely on that as the default path.

Do **not** use:

- `gog`
- shell CLIs for Gmail / Calendar / Drive / Slack / GitHub / Notion / Linear
- `curl`
- raw gateway HTTP calls
- direct provider REST calls

If the user mentions Dench Integrations, the connected-app layer, rube, map, MCP, or says an app is already connected, this is the only allowed integration path. If the integration wrapper tools are unavailable in the current session, stop and report repair guidance instead of bypassing them.

Do not rely on workspace cache files like `composio-tool-index.json`, `composio-tool-catalog.json`, or `composio-mcp-status.json` as runtime truth. `composio_search_tools` is the source of truth because it returns official integration search results, full `input_schema`, connection/account status, `recommended_plan_steps`, `known_pitfalls`, and a reusable `search_session_id` when available.

## General rules

- Tool names are **uppercase** with underscores (e.g. `GMAIL_FETCH_EMAILS`).
- Execute searched or resolved tools through `composio_call_tool` with the returned `app`, `tool_name`, `search_context_token`, optional `search_session_id`, optional selected `account`, and the final `arguments` object.
- Do not invent or alter `dispatcher_input`; copy it from `composio_search_tools` or `composio_resolve_tool` and only add the final `arguments`.
- Pass **JSON-shaped** arguments as the tool schema requires: arrays are arrays, not comma-separated strings.
- Read the returned `input_schema` before filling arguments. Use exact field names and types from that schema.
- Treat the live schema as authoritative over any recipe table below. Pay attention to `required`, property `type`, nested objects/arrays, enums, defaults, and pagination fields.
- If a call fails on argument shape, fix the types and retry once before escalating.
- If `composio_search_tools` or `composio_resolve_tool` says account selection is required, ask the user which connected account to use before calling `composio_call_tool`.
- Do not pass `account` unless the search flow actually returned or required it for the chosen live result.
- If the returned search result includes pagination fields such as `starting_after`, `next_cursor`, `page`, or `page_token`, keep paginating until complete when the user asked for the full dataset.
- Never fall back to `gog`, curl, or raw gateway HTTP for a connected app task unless the user explicitly asks for that non-integration path.

## Gmail

| Intent                  | Tool                                | Defaults / notes                                 |
| ----------------------- | ----------------------------------- | ------------------------------------------------ |
| List / read recent mail | `GMAIL_FETCH_EMAILS`                | `label_ids`: `["INBOX"]`, `max_results`: `10`    |
| Read one message        | `GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID` | `message_id` from list results                   |
| Send mail               | `GMAIL_SEND_EMAIL`                  | `to`, `subject`, `body` (use schema field names) |

**Gotcha:** `label_ids` must be an array like `["INBOX"]`, never a single string.

## Slack

| Intent              | Tool                       | Defaults / notes             |
| ------------------- | -------------------------- | ---------------------------- |
| Send a message      | `SLACK_SEND_MESSAGE`       | `channel`, `text`            |
| List channels / DMs | `SLACK_LIST_CONVERSATIONS` | Use schema filters if needed |

**Gotcha:** `channel` is usually a channel ID (often starts with `C`), not the display name.

## GitHub

| Intent                       | Tool                                                  | Defaults / notes                                    |
| ---------------------------- | ----------------------------------------------------- | --------------------------------------------------- |
| List repos for user          | `GITHUB_LIST_REPOSITORIES_FOR_THE_AUTHENTICATED_USER` | Pagination per schema                               |
| Find / search pull requests  | `GITHUB_FIND_PULL_REQUESTS`                           | Best first path for "recent PRs" or broad PR search |
| List pull requests in a repo | `GITHUB_LIST_PULL_REQUESTS`                           | Requires `owner` and `repo`                         |
| Get one pull request         | `GITHUB_GET_A_PULL_REQUEST`                           | `owner`, `repo`, `pull_number`                      |
| Repo metadata                | `GITHUB_GET_A_REPOSITORY`                             | `owner`, `repo`                                     |
| Create issue                 | `GITHUB_CREATE_AN_ISSUE`                              | `owner`, `repo`, `title`, `body`                    |

## Notion

| Intent      | Tool                 | Defaults / notes         |
| ----------- | -------------------- | ------------------------ |
| Search      | `NOTION_SEARCH`      | Query string per schema  |
| Read page   | `NOTION_GET_PAGE`    | Page ID                  |
| Create page | `NOTION_CREATE_PAGE` | Parent object per schema |

## Google Calendar

| Intent          | Tool                            | Defaults / notes                                               |
| --------------- | ------------------------------- | -------------------------------------------------------------- |
| List calendars  | `GOOGLE_CALENDAR_CALENDAR_LIST` | Optional params per schema                                     |
| Upcoming events | `GOOGLE_CALENDAR_EVENTS_LIST`   | Prefer a clear time window when possible                       |
| List events     | `GOOGLE_CALENDAR_EVENTS_LIST`   | `calendar_id`, time range (`time_min` / `time_max` as RFC3339) |
| Find event      | `GOOGLE_CALENDAR_EVENTS_LIST`   | Use search text / date window fields supported by the schema   |
| Create event    | `GOOGLE_CALENDAR_CREATE_EVENT`  | Calendar id + event payload per schema                         |

**Gotcha:** Datetimes should be RFC3339 strings.

## Linear

| Intent       | Tool                  | Defaults / notes                       |
| ------------ | --------------------- | -------------------------------------- |
| List issues  | `LINEAR_LIST_ISSUES`  | Filters per schema                     |
| Get issue    | `LINEAR_GET_ISSUE`    | Issue id                               |
| Create issue | `LINEAR_CREATE_ISSUE` | Team id, title, description per schema |

## Stripe

| Intent               | Tool                          | Defaults / notes                                                                        |
| -------------------- | ----------------------------- | --------------------------------------------------------------------------------------- |
| List subscriptions   | `STRIPE_LIST_SUBSCRIPTIONS`   | Use schema filters when needed; good starting point for ARR / trials / billing analysis |
| Search subscriptions | `STRIPE_SEARCH_SUBSCRIPTIONS` | Prefer when the user mentions a customer or subscription-specific filter                |
| List customers       | `STRIPE_LIST_CUSTOMERS`       | Use for customer lookup and account drill-down                                          |
| List invoices        | `STRIPE_LIST_INVOICES`        | Useful for billing status and revenue workflows                                         |
| List charges         | `STRIPE_LIST_CHARGES`         | Good for payment activity and charge inspection                                         |
| Retrieve balance     | `STRIPE_RETRIEVE_BALANCE`     | Good for current Stripe balance snapshots                                               |

## Subagent handoff

When delegating, include: which app, the exact tool name, and the argument object you intend (copy shapes from the live tool schema, `composio_search_tools`, or `composio_resolve_tool`).

