Guides

Client integrations and intake

Connect a client's Slack, Linear, GitHub or Notion, turn inbound items into tasks, and let agents act in those tools.

One connection per client workspace

Integrations are scoped to a single client, never to the organization as a whole. A client connects its own Slack, Linear, GitHub or Notion from the Integrations tab on its context page, or during the new-client wizard. Long-tail tools — Jira, Asana, Monday and the rest — are reached through Composio or through your organization's own executor gateway.

Credentials are encrypted at rest and write-only in the UI: you can replace a token, you can't read one back. Because the connection belongs to the client, one client's Slack is never reachable from a task in another client.

Intake rules: what becomes a task

Nothing from an external tool reaches the board by accident. An intake rule maps a source to a destination, and only mapped sources produce tasks. Unmapped inbound items are logged and ignored.

  • Source: a Slack channel, a GitHub repository, a Linear team, or a Notion database.
  • Destination: a project, plus an optional role, default assignee and title prefix.
  • Result: a tagged Slack message, a new GitHub issue or pull request, a created Linear issue or a new Notion row becomes a Tango task that links back to where it came from.
  • Every provider is signature-verified (Slack HMAC, GitHub SHA-256), and redeliveries are dropped on the external id so nothing lands twice.
  • Notion has no webhooks, so Tango polls mapped databases on a schedule instead.

Agents acting in a client's tools

Two MCP tools cover the outbound direction. list_integrations reports what a client has connected and which actions it allows. call_integration performs one — but only while the calling worker holds an active lease on a task in that client, and only against endpoints on the provider allowlist.

Every call is written to the client's integration event log, so a comment posted to Linear or a message sent to Slack is attributable to a worker and a task.

list_integrations({ client: "@acme" })
call_integration({
  task_id: "…",
  provider: "linear",
  action: "create_comment",
  payload: { issue_id: "…", body: "Draft is attached to the Tango task." }
})

Keeping connections healthy

The security audit flags three integration problems: tokens past their rotation window, active connections with no signing secret (which means intake is silently off), and connections whose last call failed. Check it after any credential rotation.