Connectors in Team Apps
How a team app reads from and acts in your connected tools — Jira, ClickUp, Gmail, Slack and the rest.
A team app can use your connected integrations directly. A bid tracker can list the Jira tickets linked to each bid, or a support board can post an update to Slack, without anyone copying data between tools.
Whose account an app uses
An app always uses your own connection, never the app author's. When a teammate opens the same app, it shows their data through their connections. If you have not connected an integration the app needs, that part of the app tells you to connect it in Customize → Integrations; the rest of the app keeps working.
What an app is allowed to do
- Only what it declares. An app's authors list the exact integrations and actions it uses. Anything else is refused, whatever the app's own code tries.
- Reading runs directly. Looking things up — searching tickets, listing tasks, reading an email — happens without a prompt.
- Changes ask you first. Before an app creates, updates or sends anything, a card over the app shows the integration, the account and what will be sent. Choose Allow once, Always allow for this app, or Deny.
- Deletes ask every time. "Always allow" is never offered for a delete.
A request you leave unanswered is denied after ten minutes, and closing the app denies anything still waiting. "Always allow" choices are kept per app and per action, for your account in this organization only.
For app authors
Ask the chat beside the open app to wire it up, for example "show the open Jira tickets for each bid". The chat looks up the integrations you have connected, adds the ones the app needs to its definition, and writes the screens that use them. As with any change, members see it once you publish.
Inside the app's code, integrations are reached through the cosmo object:
await cosmo.ready
const status = await cosmo.connectors.list()
const result = await cosmo.connectors.call('jira', 'searchJiraIssuesUsingJql', {
jql: 'project = BID AND statusCategory != Done',
})
// result: { isError, text, data, truncated } — data is the parsed result when there is oneA failed call rejects with an error carrying a code:
| Code | Meaning |
|---|---|
CONNECTOR_NOT_CONNECTED | The viewer has not connected this integration. |
CONNECTOR_AUTH_EXPIRED | The viewer's sign-in to it has lapsed; they need to reconnect it. |
DENIED | The viewer declined the action. |
CONNECTOR_NOT_DECLARED / TOOL_NOT_DECLARED | The app's definition does not list it. |
Connectors in apps work in the Cosmo desktop app.