Skip to main content
Connect third-party apps like Slack, Salesforce, and HubSpot via OAuth, then use them from the copilot or your workflow code.

Using Integrations with the Copilot

Once a connection is active, the AI copilot can search and call its tools on your behalf. Just ask:
  • “Send a Slack message to #sales about this lead”
  • “Create a HubSpot contact for this person”
  • “Find matching leads in Salesforce”
The copilot automatically searches your connected integrations for the right tool and executes it.

Connecting an App

  1. Navigate to Integrations in the sidebar
  2. Find the app you want and click Connect
  3. Complete the OAuth flow in the popup window
  4. Once authorized, the connection becomes active and its tools are discovered automatically

Available Apps

AppKeyCategories
Granolagranola_mcpProductivity, Meetings
SalesforcesalesforceCRM, Sales
HubSpothubspotCRM, Marketing
SlackslackCommunication
NotionnotionProductivity
GmailgmailCommunication, Email
Google CalendargooglecalendarProductivity, Calendar
Google SheetsgooglesheetsProductivity, Data
GonggongAnalytics, Sales
CalendlycalendlyProductivity, Scheduling
Cal.comcalProductivity, Scheduling

Calling Tools from Code

You can also call integration tools directly from column code using canvas.mcp.call().
const result = await canvas.mcp.call("slack", "SLACK_SEND_MESSAGE", {
  channel: "#sales",
  text: `New lead: ${row.company_name}`,
});

canvas.mcp.call()

connectionSlug
string
required
Identifies the connection (e.g., "slack", "salesforce"). Must match an active connection from the Integrations page.
toolName
string
required
The tool slug to execute (e.g., "SLACK_SEND_MESSAGE", "SALESFORCE_SEARCH_LEADS"). Use canvas.mcp.tools() to discover available tool names.
args
Record<string, unknown>
Arguments matching the tool’s input schema. Varies by tool.
Returns: Promise<unknown> — the tool’s response data.

Examples

Send a Slack message

const result = await canvas.mcp.call("slack", "SLACK_SEND_MESSAGE", {
  channel: "#sales",
  text: `New lead: ${row.full_name} (${row.company_name})`,
});

Search Salesforce leads

const leads = await canvas.mcp.call("salesforce", "SALESFORCE_SEARCH_LEADS", {
  query: row.company_name,
  limit: 5,
});

Create a HubSpot contact

const contact = await canvas.mcp.call("hubspot", "HUBSPOT_CREATE_CONTACT", {
  email: row.email,
  firstname: row.first_name,
  lastname: row.last_name,
  company: row.company,
  jobtitle: row.title,
});

canvas.mcp.tools()

List available tools on a connection.
connectionSlug
string
Filter to a specific connection. Omit to list tools across all active connections.
Returns: Promise<Array<{ name: string; description: string }>> — list of available tools.
// List all Slack tools
const slackTools = await canvas.mcp.tools("slack");
// [
//   { name: "SLACK_SEND_MESSAGE", description: "Send a message to a channel" },
//   { name: "SLACK_LIST_ALL_CHANNELS", description: "List all channels" },
//   ...
// ]

// List tools across all connections
const allTools = await canvas.mcp.tools();

Error Handling

Error CodeMeaningFix
connection_not_foundNo active connection for this slugConnect the app in Integrations
auth_expiredOAuth token expiredReconnect in Integrations
tool_not_foundTool name doesn’t exist on this connectionUse canvas.mcp.tools() to list valid names
rate_limitedToo many calls to the external APIAdd delays between calls
server_unreachableExternal service is downRetry later
try {
  const result = await canvas.mcp.call("slack", "SLACK_SEND_MESSAGE", {
    channel: "#sales",
    text: "Hello",
  });
  return result;
} catch (error) {
  canvas.log("MCP call failed:", error);
  return { error: "Failed to send Slack message" };
}

Managing Connections

From the Integrations page, you can:
  • Enable/Disable — Toggle a connection without deleting it. Disabled connections won’t appear in code editor autocomplete.
  • Refresh Tools — Re-fetch the tool list if the app adds new capabilities.
  • Reconnect — Re-authorize via OAuth if your token expires.
  • Delete — Permanently remove the connection.
  • View Tools — Browse all discovered tools with their names and descriptions.

Connection Slugs

The slug identifies your connection in canvas.mcp.call("<slug>", ...). Rules:
  • Lowercase letters, digits, and underscores only (regex: ^[a-z][a-z0-9_]*$)
  • Must start with a letter
Reserved slugs (cannot be used): companies, places, people, contacts, ai, linkedin, instagram, log, delay, mcp, call, tools