Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the ChiliPiper MCP server

Vendor MCP
Open markdown

The ChiliPiper MCP connector routes your AI agent's tool calls to ChiliPiper's own MCP server through Scalekit. Each user connects their own ChiliPiper access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 156 tools.

Tools
156
What they doRead · write · destructive
67 · 62 · 2767 read62 write27 destructive
Users sign in with

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the ChiliPiper MCP connection

    In AgentKit > Connections, create a ChiliPiper MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Console steps with screenshots

    Register your Chili Piper API token with Scalekit so it stores it securely and injects it into every request. Chili Piper uses bearer token authentication.

    1. Get your Chili Piper API token

      • Sign in to Chili Piper and go to Integrations in the left sidebar.
      • Click the API & Credentials tab, then select API Access Tokens.
      • Click Generate Token, give it a name (e.g., Agent Auth), and copy the token value immediately — it is only shown once.

      Chili Piper Integrations → API & Credentials → API Access Tokens page showing the Generate Token button and a list of existing tokens

    2. Create a connection in Scalekit

      • In Scalekit dashboard, go to AgentKit → Connections → Create Connection. Find ChiliPiper MCP and click Create.
      • Note the Connection name — you will use this as connection_name in your code (e.g., chilipipermcp).
      • Click Save.
    3. Add a connected account

      Connected accounts link a specific user identifier in your system to their Chili Piper API token. Add one in the dashboard to test. In production, each user adds their own through the authorization link: they enter their credentials on the page it opens.

      In the dashboard, to test

      • Open the connection you created and click the Connected Accounts tab → Add account.
      • Fill in:
        • Your User’s ID — a unique identifier for this user in your system (e.g., user_123)
        • Token — the Chili Piper API token from step 1
      • Click Create Account.

      From your backend, if your app already has the credentials

      For example, when users enter them on a settings page in your app:

      import { Scalekit, ConnectorStatus } from '@scalekit-sdk/node';
      const scalekit = new Scalekit(
      process.env.SCALEKIT_ENVIRONMENT_URL,
      process.env.SCALEKIT_CLIENT_ID,
      process.env.SCALEKIT_CLIENT_SECRET,
      );
      // Never hard-code credentials — read from secure storage or user input
      const chilipiperToken = getUserChilipiperToken(); // retrieve from your secure store
      const authorizationDetails = {
      details: {
      case: 'staticAuth',
      value: {
      details: {
      token: chilipiperToken,
      },
      },
      },
      };
      let { connectedAccount } = await scalekit.actions.upsertConnectedAccount({
      connectionName: 'chilipipermcp',
      identifier: 'user_123',
      authorizationDetails,
      });
      // Make sure the account is ACTIVE before the first tool call.
      if (connectedAccount?.status !== ConnectorStatus.ACTIVE) {
      ({ connectedAccount } = await scalekit.actions.upsertConnectedAccount({
      connectionName: 'chilipipermcp',
      identifier: 'user_123',
      authorizationDetails,
      }));
      }
  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'chilipipermcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize ChiliPiper MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'chilipipermcp_availability_configured',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user opens the link once and enters their ChiliPiper MCP server credentials there. If your app already has a user's credentials, add the account from your backend instead, as the console steps above show. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • chilipipermcp_assignment_table_definition_getFetches one assignment-table definition (column schema) by its assignmentTableId.Read-only

    Get assignment table definition

    Fetches one assignment-table definition (column schema) by its assignmentTableId. Use this to read the current column layout and a fresh revision before replacing the definition or patching a column. Use assignment-table-definition-list to browse. - workspaceId (req): the workspace that owns the table. - assignmentTableId (req): the table's id. → {id, name, inputs: [{key, name, required, typeHint?}], outputs: [{key, name, context, required}], allKeys, metadata: {revision, ...}} see: assignment-table-definition-list (browse), assignment-table-definition-replace (replace schema), assignment-table-get (read the rows)

    Inputs

    assignmentTableIdstringrequired
    No description.
    workspaceIdstringrequired
    No description.
  • chilipipermcp_assignment_table_definition_listBrowses the assignment-table definitions (column schemas) in a workspace so you can discover assignmentTableIds, revisions, and column keys before reading/writing rows.Read-only

    List assignment table definitions

    Browses the assignment-table definitions (column schemas) in a workspace so you can discover assignmentTableIds, revisions, and column keys before reading/writing rows. An assignment-table definition describes the table's input columns (the variables a rule matches on) and output columns (each pinned to a Record/Meeting/Conversation context). Paging defaults to page 0 / pageSize 10; optionally filter by name. - workspaceId (req): the workspace whose definitions to list. - name (opt): case-sensitive filter on the definition name. → {results: [{id, name, inputs: [{key, name, required, typeHint?}], outputs: [{key, name, context, required}], allKeys, metadata: {revision, ...}}], total, page, pageSize} see: assignment-table-definition-get (fetch one), assignment-table-definition-create (add a definition)

    Inputs

    workspaceIdstringrequired
    No description.
    namestring
    No description.
    paginationobject
    No description.
  • chilipipermcp_assignment_table_getFetches the rows (data) of a single assignment table by its id.Read-only

    Get assignment table

    Fetches the rows (data) of a single assignment table by its id. Each row maps input-column keys to values and output-column keys to a resolved assignment (a user or a distribution). Read the table's DEFINITION first (assignment-table-definition-get) to learn the column keys. - workspaceId (req): the workspace that owns the table. - assignmentTableId (req): the table's id. → {id, rows: [{inputs: {<columnKey>: <value>}, outputs: {<columnKey>: {tableOutType, value, humanReadableName?, context?}}}], metadata: {revision, ...}} see: assignment-table-get-by-ids (fetch several at once), assignment-table-upsert (write rows), assignment-table-definition-get (read the schema)

    Inputs

    assignmentTableIdstringrequired
    No description.
    workspaceIdstringrequired
    No description.
  • chilipipermcp_assignment_table_get_by_idsFetches the rows of several assignment tables in one call.Read-only

    Get assignment tables by ids

    Fetches the rows of several assignment tables in one call. Ids without a stored table are omitted from the response (no error). Useful to hydrate the tables referenced by a set of assignment rules. - workspaceId (req): the workspace that owns the tables. - ids (req): one or more assignmentTableIds. → {<assignmentTableId>: {id, rows, metadata}} Note: ids with no stored table are omitted from the map. see: assignment-table-get (fetch a single table)

    Inputs

    workspaceIdstringrequired
    No description.
    idsarray
    No description.
  • chilipipermcp_availability_configuredBatch, side-effect-free check of whether each user has configured their availability.Read-only

    Check whether users have configured their availability

    Batch, side-effect-free check of whether each user has configured their availability. A user is "configured" when they have at least one custom schedule, or their default schedule's working hours / timezone differ from the bootstrap default (9-5, timezone synced from calendar). Users with no persisted schedule (and users not present in the request) are returned as false; reading does not create a default schedule for users that lack one. - userIds: the users to check. → [{userId, availabilityConfigured}] see: user-find (resolve userIds), availability-slots-v2

    Inputs

    userIdsarray
    Users to check; each is returned with whether they have configured their availability.
  • chilipipermcp_availability_slots_v2Returns bookable start times for a meeting type over a time window, one page at a time, so a wide window never produces a single oversized response.Read-only

    List available meeting time slots (paginated)

    Returns bookable start times for a meeting type over a time window, one page at a time, so a wide window never produces a single oversized response. Prefer this over the deprecated availability-slots (which had the same attendee model but no paging); page through wide windows rather than narrowing the interval. - attendees: non-empty list of who joins the meeting, discriminated by `type`: {type: "ManuallyAssigned", userId, required: true|false} {type: "DistributionAssignee", distributionId, required: true|false, userIds (opt): ranked shortlist} {type: "AssignedViaTeam", userId, teamId, required: true|false} {type: "AdditionalAttendee", userId, required: true|false} Note: each attendee's `required` flag is mandatory (omitting it returns 400) and gates the slot — `true` hides slots where that attendee is busy. - expectedHost: {type: "User", userId} or {type: "AssigneeFromDistribution", distributionId}. - meetingTypeOverride (opt): inline duration/buffer overrides; omit or pass null to use meeting-type defaults. - interval: {startsAt: ISO-8601, duration: "7 days"/"P7D"/etc.}. - pagination (opt): {page (0-indexed, default 0), pageSize (default 100, max 500)}. → {results: [{startTime, attendees}], total, page, pageSize} Note: slots are ordered by startTime; keep requesting page+1 until you have collected `total` slots. see: distribution-list, user-find

    Inputs

    attendeesarrayrequired
    Attendees to schedule; availability is the intersection of the required ones.
    expectedHoststringrequired
    No description.
    intervalobjectrequired
    No description.
    meetingTypeRefobjectrequired
    No description.
    meetingTypeOverrideobject
    No description.
    paginationobject
    No description.
  • chilipipermcp_availability-slotsReturns available meeting slots for any attendee mix (round-robin, manual, team-assigned, additional).Read-only

    Availability Slots

    Returns available meeting slots for any attendee mix (round-robin, manual, team-assigned, additional).

    Inputs

    attendeesarrayrequired
    No description.
    expectedHoststringrequired
    No description.
    intervalstringrequired
    No description.
    meetingTypeRefstringrequired
    No description.
    meetingTypeOverridestring
    No description.
  • chilipipermcp_campaign_listLists Salesforce campaigns for the tenant's connected org so you can find the `campaignId` used by a router's "Add to Campaign" CRM action.Read-only

    List Salesforce campaigns

    Lists Salesforce campaigns for the tenant's connected org so you can find the `campaignId` used by a router's "Add to Campaign" CRM action. Salesforce-only. Use this to browse/paginate the full set; for large orgs prefer campaign-search. - isActive (opt): filter to active (true) or inactive (false) campaigns; omit for all - page (opt, default 0), pageSize (opt, default 10) → {results: [{id, name, status, startDate, endDate, active}], total, page, pageSize} Note: `id` is the Salesforce campaign id to drop into the Add-to-Campaign action's campaignId ⚠ Salesforce paginates via SOQL OFFSET, capped at 2000 rows — beyond that use campaign-search ⚠ 4xx if Salesforce is not connected for the tenant see: campaign-search (full-text search, preferred for large orgs)

    Inputs

    isActiveboolean
    No description.
    paginationobject
    No description.