Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Metaview MCP server

Vendor MCP
Open markdown

The Metaview MCP connector routes your AI agent's tool calls to Metaview's own MCP server through Scalekit. Each user signs in to Metaview once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 54 tools.

Tools
54
What they doRead · write · destructive
35 · 14 · 535 read14 write5 destructive
Users sign in with
OAuth app
Scalekit's or your own

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

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

    Scalekit credentials are available for Metaview MCP server, so you don't need to register an OAuth app.

  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 = 'metaviewmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Metaview 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: 'metaviewmcp_find_candidate_in_sequences',
    toolInput: { rationale: 'YOUR_RATIONALE' },
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • metaviewmcp_fetch_candidatesALWAYS use this tool to look up one or more people or candidates.Read-only

    Fetch candidates

    ALWAYS use this tool to look up one or more people or candidates. This is the ONLY way to retrieve candidate scorecards, ATS feedback, resume files, application history, and professional profile data. Do NOT try to scrape LinkedIn or other websites directly — this tool fetches richer data than any public page and includes internal ATS records. Look up candidates by LinkedIn URL, email, phone number, or participant ID. Returns per-candidate results with two sections each: profile (professional background) and ats (internal ATS data including scorecards, applications, feedback, files). ATS data access requires you are a Metaview admin, ATS admin, or the candidate appeared in a conversation you have access to. Accepts 1-10 candidates per call.

    Inputs

    candidatesarrayrequired
    1-10 candidate lookups. Each is a dict with at least one identifier key — these exact keys and no others: - candidate_id: Metaview candidate UUID (as returned by the application review, screening, and sourcing candidate tools). - linkedin_url: LinkedIn profile URL ("https://www.linkedin.com/in/john-doe") or bare shorthand ("john-doe"). - email: candidate email address. - phone_number: candidate phone number. - participant_id: Metaview participant ID (e.g. from the default:candidate field in conversation data). Optional scoped-access keys (each requires candidate_id and an accessible entity whose roster includes the candidate): - application_review_id: Application Review UUID authorizing ATS access. - screen_id: screen UUID authorizing ATS access.
    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
  • metaviewmcp_find_candidate_in_sequencesCheck if a candidate is enrolled in any sequences.Read-only

    Find candidate's sequences

    Check if a candidate is enrolled in any sequences. Look up a candidate by ID, LinkedIn URL, email address, or phone number and return all sequences they are (or were) enrolled in, including sequences created by other users. Useful before adding someone to a new sequence to avoid duplicate outreach.

    Inputs

    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
    candidate_idstring
    Candidate UUID for direct lookup (preferred when known). At least one of candidate_id/linkedin_url/email/phone_number is required.
    emailstring
    Email address, matched against any of the candidate's emails or the to_email used in a sequence. At least one of candidate_id/linkedin_url/email/phone_number is required.
    linkedin_urlstring
    LinkedIn profile URL (normalized automatically). At least one of candidate_id/linkedin_url/email/phone_number is required.
    phone_numberstring
    Phone number, matched against the candidate's phone numbers. At least one of candidate_id/linkedin_url/email/phone_number is required.
  • metaviewmcp_get_application_review_detailsGet the full state of one Application Review: the ACTIVE ICP, any pending DRAFT edit, the RANKING version if a rerank is in progress, the version history, rerank status, a decision/calibration summary, and the fit-band distribution of the current ranking.Read-only

    Get application review details

    Get the full state of one Application Review: the ACTIVE ICP, any pending DRAFT edit, the RANKING version if a rerank is in progress, the version history, rerank status, a decision/calibration summary, and the fit-band distribution of the current ranking. Read this before refining an ICP with update_application_review_icp, or to poll a rerank's progress.

    Inputs

    application_review_idstringrequired
    The review to inspect (UUID from list_application_reviews).
    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
    detail_levelstring
    'full' (default): the ICP text, version history, rerank status, decisions, and fit distribution. 'concise': run and rerank state, display versions, pending counts, and next-step guidance — use for cheap polling after an ICP update or restore.one of concisefulldefault full
    icp_versionstring
    Return the full ICP text of a specific historical version — a display number (1, 2, 3, ...) as shown in version_history and the web app, not a raw internal id. Omit for the ACTIVE / DRAFT / RANKING texts. Only available at detail_level='full'.
  • metaviewmcp_get_application_review_rules<usecase> Read the workspace-wide Application Review evaluation rules — a single standing instruction the review agent applies when constructing and refining the ICP for every review in the workspace (e.g.Read-only

    Get Application Review Rules

    <usecase> Read the workspace-wide Application Review evaluation rules — a single standing instruction the review agent applies when constructing and refining the ICP for every review in the workspace (e.g. company-wide disqualifiers, visa policies, location constraints). Per-review criteria live on the review's ICP instead — see get_application_review_details. </usecase> <instructions>rules is null when the workspace has not set any. To change the rules use update_application_review_rules.</instructions> <response_format>{"rules": "text or null"}</response_format> <data_model>See list_application_reviews for the Application Review data model.</data_model>

    Inputs

    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
  • metaviewmcp_get_chart_dataGet chart data for aggregate time-series or scatter plots.Read-only

    Build chart

    Get chart data for aggregate time-series or scatter plots. Each chart_input is processed independently. Aggregate chart: include function AND interval. Scatter chart: omit function and interval. Use list_fields to discover valid metric_id values and their supported chart types.

    Inputs

    chart_inputsarrayrequired
    Chart specifications, each a dict with: metric_id (str, required) — 'aggregation:...' or 'AI:<uuid>' from list_fields. function (str) — one of Average, Median, Count, Sum, Max, Min, Cumulative, Rolling Average; must be in the metric's chart_functions. interval (str) — one of day, week, month, quarter. function and interval MUST be provided together (aggregate chart) or both omitted (scatter chart; the metric must have 'scatter' in chart_types). metric_arguments (dict, optional) — check required_arguments from list_fields. For contact-scoped metrics (question_count, talk_time, minutes_late) you MUST pass {"scope": "internal"} or {"scope": "external"}. "internal" = interviewers/hiring team, "external" = non-team participants (candidates, clients, etc.). function_arguments (dict, optional) — for Rolling Average pass {"windowIntervalCount": <int>}.
    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
    filtersstring
    Filter objects, each {field_id, operation, value}, scoping which conversations are charted. Filter value formats are data, not prose: list_fields returns a filter_formats map (operations + value_format per field type; a field's type key selects its entry). IMPORTANT: date filter values are a dict, not a bare date string. Example: {"field_id": "default:start_time", "operation": "after", "value": {"scope": "relative", "value": -2592000}}
    groupstring
    Field ID (e.g. 'OSPT:<uuid>', 'default:interviewer') to scope the chart to conversations that have a value for this field. This is a filter, NOT a breakdown — it does not split the chart per group member; for per-group metrics use group_conversations. Must be a field ID, never a metric ('aggregation:...') ID.
    min_countinteger
    Minimum conversations per group when group is set (default 0).default 0
    only_show_recorded_conversationsboolean
    True (default): chart only recorded conversations. False: also include unrecorded ones (calls that were not captured, or upcoming).default true
    report_idstring
    UUID of a saved report (from search_reports) to use as the base filter set. Filters passed alongside apply on top.
    timezone_offset_minutesinteger
    Timezone offset in minutes for date bucketing (default 0 = UTC). Aggregate charts only.default 0
  • metaviewmcp_get_enrichment_statusGet the workspace's enrichment credit status, usage breakdown, and optionally list individual enrichment attempts.Read-only

    Check enrichment status

    Get the workspace's enrichment credit status, usage breakdown, and optionally list individual enrichment attempts. Always returns monthly credit allowance and remaining balance, usage breakdown by enrichment type, and active top-up credit purchases. Optionally returns per-user usage breakdown and individual enrichment attempts.

    Inputs

    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
    enrichment_typestring
    Filter attempts by type (email or phone). Only used when include_enrichment_attempts=true.
    include_enrichment_attemptsboolean
    True: append the list of individual enrichment attempts. Default false.default false
    include_usage_by_userboolean
    True: include the per-user usage breakdown (admin only). Default false.default false
    limitinteger
    Attempts per page (default 50; values above 100 are clamped to 100).default 50
    monthstring
    Month to report on as YYYY-MM (e.g. "2026-01"). Scopes usage, usage_by_user, and enrichment_attempts to that calendar month; omit for the current month to date. Does NOT affect 'credits', which is always the live balance. Usage comes from the workspace's current credit system, so months before a switch to shared credits show 0.
    offsetinteger
    Pagination offset for attempts (default 0).default 0
    person_idstring
    Filter usage and attempts to this person (admin only). Non-admins always see only their own data regardless of this parameter.
  • metaviewmcp_get_note_templateFetch a single AI Notes custom template with its full section configuration.Read-only

    Get note template

    Fetch a single AI Notes custom template with its full section configuration. Use list_note_templates first if you don't have a template ID.

    Inputs

    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
    template_idstringrequired
    Template UUID (from list_note_templates). INTERNAL ONLY — never show this id to the user; refer to templates by name.
  • metaviewmcp_get_platform_credits<usecase>Get the workspace's credit position: balance, allowance, spend by product and person, runway, and per-person user limits.Read-only

    Get Platform Credits

    <usecase>Get the workspace's credit position: balance, allowance, spend by product and person, runway, and per-person user limits. Read from the credit ledger, so it is what was actually charged.</usecase> <instructions>basis decides the usage window: PLAN reports the current plan cycle, USAGE_BASED the billing period, and POOLS all time since the first grant or charge (a member with a user limit gets their limit's period). Admins see the whole workspace, allowance, runway, and usage_by_cycle; members see only their own spend and limit, plus the balance when they have no limit. Set include_people for spend per person. usage_by_cycle covers up to 12 completed cycles plus the current one: plan cycles while a plan runs, calendar months otherwise. Runway fields another basis lacks are null.</instructions> <response_format> {"basis", "user_limits_reset_at", "usage_billing_until", "allowance": {"total_credits", "used_credits", "remaining_credits", "other_credits_available"} | null, "balance": {"credits", "is_unlimited", "next_expiry_at"} | null, "usage": {"starts_at", "ends_at", "credits", "actions", "by_product": [{"product", "credits", ...}]}, "by_person"?: [{"person_id", "name", "credits", "actions", "by_product", ...}], "runway": {"daily_credits", "runs_out_at", "plan_runs_out_at", "resets_at", "usage_billing_until", "warning"} | null, "user_limits": [{"person_id", "name", "monthly_credits", "spent_credits", "headroom_credits", "at_limit"}], "usage_by_cycle": [{"starts_on", "credits", "actions", "by_product"}]} </response_format>

    Inputs

    rationalestringrequired
    Always provide a brief explanation of why you are calling this tool
    include_peopleboolean
    Include spend per person, highest first. Members only ever see their own row.default false