Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Airops MCP server

Vendor MCP
Open markdown

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

Tools
91
What they doRead · write · destructive
37 · 25 · 2937 read25 write29 destructive
Users sign in with

What you can do

  • Track AI search visibility: query analytics, AI answers, citations, and cited domains to see how AI engines mention a brand
  • Manage AEO prompts: create, tag, and delete tracked prompts, and group them by topic and persona
  • Manage Brand Kits: update brand voice, audiences, competitors, writing rules, palettes, and fonts, then publish the draft
  • Work with grids: create grids and sheets, read and write rows, and run workflow columns on selected rows
  • Manage knowledge bases: create knowledge bases, add web pages and files, and search their content by meaning
  • Review campaign opportunities: list, create, accept, or reject improvement opportunities for a campaign

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 Airops MCP connection

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

    Console steps with screenshots

    Register your Scalekit environment with the AirOps connector so Scalekit can proxy API requests and inject your API key automatically. There is no redirect URI or OAuth flow — authentication uses your AirOps API key.

    1. Get your AirOps API key

      • Sign in to AirOps and click Settings in the bottom-left sidebar.
      • Select Workspace from the settings menu.
      • Under API Key, click the copy icon to copy your key. To rotate the key, click Regenerate.

      AirOps workspace settings page showing the Workspace ID and API Key section with a masked key and Regenerate button

    2. Create a connection in Scalekit

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

      Connected accounts link a user identifier in your system to an AirOps API key.

      In the dashboard, to test

      • Open the connection 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)
        • API Key — the AirOps API key you copied in step 1
      • Click Save.

      In production

      Each user adds their own account through the authorization link: they enter their credentials on the page it opens.

      From your backend, if your app already has the credentials

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

      import { ConnectorStatus } from '@scalekit-sdk/node'
      // Never hard-code API keys — read from secure storage or user input
      const airopsApiKey = getUserAiropsKey(); // retrieve from your secure store
      const authorizationDetails = {
      details: {
      case: 'staticAuth',
      value: { details: { api_key: airopsApiKey } },
      },
      };
      let { connectedAccount } = await scalekit.actions.upsertConnectedAccount({
      connectionName: 'airopsmcp',
      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: 'airopsmcp',
      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 = 'airopsmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Airops 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: 'airopsmcp_list_aeo_page_content_updates',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user opens the link once and enters their Airops 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
  • airopsmcp_analytics_chartQuery analytics data and display it as an interactive chart.Read-only

    Analytics Chart

    Query analytics data and display it as an interactive chart. Returns data with a UI reference for visualization.

    Inputs

    brand_kit_idintegerrequired
    The Brand Kit ID to query analytics for
    metricsarrayrequired
    Metrics to calculate and display (e.g., citation_rate, mention_rate, share_of_voice).
    chart_typestring
    Type of chart to render. Line for time series, bar for comparisons, pie for proportions, area for comparison and visualizing totals with filled area under the curve. Default: line.one of linebarpiearea
    countriesarray
    Filter by country codes (ISO 3166-1 alpha-2)
    dimensionsarray
    Dimensions to group by (max 3).
    end_datestring
    End date (YYYY-MM-DD). Defaults to yesterday. Must be before today because today's data may still be processing and is incomplete — yesterday is used to ensure robust, complete data. Leave blank unless a specific date is requested.
    grainstring
    Time granularity for aggregation. Default: totalone of dailyweeklymonthlytotal
    personasarray
    Filter by persona IDs
    providersarray
    Filter by AI providers
    start_datestring
    Start date (YYYY-MM-DD). Default: 7 days ago
    tagsarray
    Filter by tag IDs. Returns data only for prompts tagged with any of the given tags.
    themesarray
    Filter sentiment data by theme IDs. Only applies to sentiment_score metric.
    titlestring
    Optional chart title. If not provided, a title will be auto-generated.
    topicsarray
    Filter by topic IDs
  • airopsmcp_get_aeo_citationGet prompts citing a specific URL.Read-only

    Get Aeo Citation

    Get prompts citing a specific URL. The 'id' parameter is the URL to look up.

    Inputs

    brand_kit_idintegerrequired
    The ID of the Brand Kit
    idstringrequired
    Resource ID
    countriesarray
    Filter metrics by country codes
    end_datestring
    End date for metrics (ISO 8601). Defaults to today.
    fieldsarray
    Specify which fields to return in the response, as a list of field names.
    filtersarray
    Filter results by column values. Each filter requires column_id, operator, and value.
    personasarray
    Filter metrics by persona IDs
    providersarray
    Filter metrics by AI providers
    start_datestring
    Start date for metrics (ISO 8601). Defaults to 1 month ago.
  • airopsmcp_get_aeo_page_content_updateGet a specific page content update by ID.Read-only

    Get Aeo Page Content Update

    Get a specific page content update by ID. Track content updates.

    Inputs

    idintegerrequired
    Resource ID
    brand_kit_idinteger
    Optional Brand Kit ID to filter content updates by
    fieldsarray
    Specify which fields to return in the response, as a list of field names.
    filtersarray
    Filter results by column values. Each filter requires column_id, operator, and value.
    includesarray
    Related resources to include in the response, as a list of relationship names.
    workspace_idinteger
    ID of the workspace to retrieve results from. If not provided, returns results from all workspaces the user belongs to.
  • airopsmcp_get_aeo_prompt_assignments_statusInspect the current prompt-assignment draft state for a Brand Kit without modifying anything.Read-only

    Get Aeo Prompt Assignments Status

    Inspect the current prompt-assignment draft state for a Brand Kit without modifying anything. Read-only. This is the authoritative source for workspace estimated-answers numbers (live and draft). Call it whenever you need them — never compute or guess them yourself. In particular: - At the start of a session, to detect a pre-existing draft from unsaved UI edits. - Immediately after `commit_aeo_prompt_assignments`, to read the new live `estimated_answers` — the commit tool does not return them. - Before staging more changes via `update_aeo_prompt_assignments`, to compare against `max_answers`. Returns: - `has_draft`: whether a draft session exists for this brand kit. - `has_changes`: whether the draft has uncommitted edits relative to live (null if no draft). - `draft_id`: the draft's ID (null if no draft). - `live_estimated_answers`: current workspace estimated answers/month based on live assignments. - `draft_estimated_answers`: what the workspace estimated answers/month would be if the draft were committed now (null if no draft). - `max_answers`: the workspace's effective answers limit. - `limit_exceeded`: whether committing the draft now would exceed the limit (false if no draft).

    Inputs

    brand_kit_idintegerrequired
    The Brand Kit ID to inspect.
  • airopsmcp_get_answerGet a specific AI answer by ID with full text content.Read-only

    Get Answer

    Get a specific AI answer by ID with full text content.

    Inputs

    idintegerrequired
    Resource ID
    fieldsarray
    Specify which fields to return in the response, as a list of field names.
    includesarray
    Related resources to include in the response, as a list of relationship names.
  • airopsmcp_get_brand_kitFetch a Brand Kit's brand identity (writing_tone, writing_persona) and associated entities (product lines, audiences, content types, regions, writing rules, cus...Read-only

    Get Brand Kit

    Fetch a Brand Kit's brand identity (writing_tone, writing_persona) and associated entities (product lines, audiences, content types, regions, writing rules, cus...

    Inputs

    idintegerrequired
    Resource ID
    fieldsarray
    Specify which fields to return in the response, as a list of field names.
    filtersarray
    Filter results by column values. Each filter requires column_id, operator, and value.
    includesarray
    Related resources to include in the response, as a list of relationship names.
    versionstring
    Brand Kit version to read from (`active` or `draft`). Defaults to `active`.one of activedraft
    workspace_idinteger
    ID of the workspace to retrieve brand kits from. If not provided, returns brand kits from all workspaces the user belongs to.
  • airopsmcp_get_campaignGet a campaign by ID, including action grid IDs needed to inspect or update its grid.Read-only

    Get Campaign

    Get a campaign by ID, including action grid IDs needed to inspect or update its grid. Campaigns are Plays that coordinate strategy playbooks, action grids, and related opportunities for improving AEO performance.

    Inputs

    idintegerrequired
    Resource ID
    fieldsarray
    Select specific fields to return. **Available fields:** - **id**: Campaign ID - **name**: Campaign name - **status**: Campaign status - **resource_type**: Resource type this campaign works on - **brand_kit_id**: Brand Kit this campaign belongs to - **workspace_id**: Workspace this campaign belongs to - **strategy_playbook_id**: Strategy playbook generated for this campaign - **opportunity_schema_version**: Persisted Opportunity schema version - **created_at**: When the campaign was created - **updated_at**: When the campaign was last updated - **action_grid_id**: Action grid ID to use with grid tools - **action_grid_table_id**: Action grid table ID to use with grid tools - **custom_instructions**: Campaign-specific guidance for working related opportunities
    filtersarray
    Filter results. Nested fields (e.g. `writing_rules.text`) filter within an included association and require that association in `includes`. **Available fields:** - **name** (EQUALS, CONTAINS): Filter by campaign name - **status** (EQUALS, IN): Filter by campaign status - **workspace_id** (EQ, IN): Filter by workspace ID - **brand_kit_id** (EQ, IN): Filter by Brand Kit ID - **resource_type** (EQUALS, IN): Filter by campaign resource type
  • airopsmcp_get_grid_row_execution_statusCheck the status of grid row executions.Read-only

    Get Grid Row Execution Status

    Check the status of grid row executions. Returns the overall status and per-column detail for each execution.

    Inputs

    grid_idintegerrequired
    The ID of the grid containing the executions.
    row_execution_idsarrayrequired
    IDs of the row executions to check (max 50).