Announcing CIMD support for MCP Client registration
Learn more

Perspective AI MCP vs Perspective AI API for AI Agents

Varun Krishnan
Senior Content Marketer

TL;DR

  • Perspective AI inverts the usual pattern: its hosted Model Context Protocol (MCP) server exposes 35 tools across design, analysis, invites, and automations, while the REST API has two endpoints.
  • MCP accepts OAuth or workspace-scoped MCP keys. OAuth tokens are audience-bound to /mcp, so the REST create endpoint accepts only MCP keys.
  • Webhooks are the API side's real advantage: push events when a conversation completes, goes partial, or is abandoned, retried on 5xx errors but unsigned.
  • In a multi-tenant agent, every customer user holds a Perspective credential. Neither path stores, refreshes, or revokes it for you.
  • Scalekit's Perspective AI MCP connector handles OAuth 2.1, token storage, and refresh per user, and Virtual MCP servers scope tools per agent role and sessions per user.

Why Perspective AI flips the MCP vs API decision

Your agent needs to work with Perspective AI: spin up conversation agents from a brief, read what participants actually said, and push findings into the rest of your stack. You open the developer docs expecting the familiar split, where the REST API is the full surface and MCP is the convenient subset. Perspective is built the other way around. The Perspective AI MCP server is the broadest programmatic interface, the REST API is deliberately narrow, and each has its own auth rules. Here's what each path covers, what each costs in production, and how to run either one for many users at once.

What Perspective AI MCP and Perspective AI API actually are

Perspective's developer docs split the surface four ways: the MCP server for the broadest automation, REST for narrow backend workflows, webhooks for event delivery, and the Embed SDK for the participant-facing experience. In Perspective's vocabulary, a perspective is a single conversation agent, whether in draft or live.

Perspective AI MCP

Perspective hosts and maintains a remote MCP server over streamable HTTP. It lives at a single /mcp endpoint on Perspective's domain, and the URL is the same for every customer. Its tools cover workspaces, the Agent Library, perspective design, deployment, status and insights, results, conversation analysis, transcript import, participants, automations, integrations, and Slack channels: 35 tools in Scalekit's connector reference. Clients authenticate with OAuth, which Perspective recommends, or with a workspace-scoped MCP key sent as a bearer token. The official reference is the "Use the Perspective AI MCP" page in Perspective's developer docs.

Perspective AI API

The REST API lives under /api/v1/ and has two endpoints. POST /api/v1/perspective/create creates a perspective and runs the design agent during the request; it requires an MCP key. GET /api/v1/embed/config/:researchId is public and unauthenticated, and exists so the Embed SDK can load theme and welcome settings. Around those sit outbound webhooks for conversation events and the Embed SDK for rendering conversations in your product. Perspective's "API Overview" page states that listing perspectives, reading conversations, inviting participants, and managing automations belong on MCP. Jigsaw's content-moderation Perspective API is an unrelated product.

Comparing them where it matters for agents

Four dimensions decide this for a production agent: what it can do, how it authenticates, what you operate, and when each path wins. On Perspective, the first dimension is lopsided and the second is where teams get surprised.

What your agent can actually do

Tool names are Perspective's native names; inside Scalekit they carry a perspectiveaimcp_ prefix.

Capability
Perspective AI MCP
Perspective AI API
Create a perspective from a brief
Yes, async (perspective_create)
Yes, synchronous (POST /api/v1/perspective/create)
Answer design follow-ups, revise outlines
Yes (perspective_respond, perspective_update)
No
List workspaces and perspectives
Yes (workspace_list, perspective_list)
No
Read transcripts and summaries
Yes (perspective_get_conversations)
No
Counts, themes, and deep transcript reads
Yes (conversations_data_analysis, conversations_search, conversations_explorer)
No
Read analyst insights
Yes (read_insights, read_insight)
No
Invite participants
Yes (participant_invite)
No
Import outside interview transcripts
Yes (perspective_import_conversation)
No
Create and test automations
Yes (automation_create, automation_test)
No
Push events when a conversation ends
Configures them only
Yes (webhooks)
Participant UI and embeds
Snippets only (perspective_get_embed_options)
Yes (Embed SDK)
Browse the Agent Library
Yes (agent_template_search, agent_template_get)
No

Where each path runs out

The REST gap is structural. The create endpoint can return a needs_input status with a followUpQuestion, and no REST endpoint accepts the answer; perspective_respond exists only on MCP. Transcripts, summaries, and analysis never come back over REST, and webhooks carry each conversation's structured output and metadata, not transcripts. Any agent that reasons over results is an MCP agent. The MCP gaps are narrower and mostly involve a person. Webhook automations are created disabled, with a configure_url where someone enters the endpoint and auth header, because Perspective keeps those secrets out of the chat. integration_manage returns setup links instead of connecting Slack or HubSpot itself. A fully headless provisioning flow stalls at both steps.

The auth path each one puts you on

OAuth is Perspective's recommended MCP path: one browser sign-in, after which the client manages the connection. Scalekit's connector reference lists it as OAuth 2.1 with Dynamic Client Registration (DCR). Since June 2026, users pick which workspaces an assistant can reach when they approve it, and every connected app appears under Connected Apps in Perspective's settings, revocable at any time. The catch is the audience. OAuth access tokens are bound to /mcp, so the REST create endpoint rejects them and accepts only MCP keys, while still checking on every request that the key's user can reach the workspaceSlug in the body. Webhooks run the other direction: Perspective authenticates to you with a static header you configure.

MCP keys and the headless question

MCP keys let a job with no browser call Perspective's MCP server. A key is created in the Perspective UI, scoped to the workspaces you pick, and shown once; rotating it means deleting it and creating a replacement. It also reaches its workspaces only while its creator remains a member. Here's the failure that shows up months in. A nightly digest job calls MCP with a key the product manager created during setup. She moves teams, gets removed from the workspace, and every tool call starts returning access errors. The REST create endpoint would answer 404, workspace not found or no access, rather than 401. The key is still valid. Its owner's membership isn't.

What you own on the MCP path

Perspective owns tool schemas, argument validation, and workspace access checks. Four behaviors from the tool descriptions land on you. Long-running work is async: design, deep exploration, and transcript import return a job_id, and perspective_await_job blocks for at most 45 seconds per call, so your loop re-polls with the returned progress_cursor. Creates aren't idempotent: perspective_create, automation_create, and participant_invite write a new record on every call, so a blind retry duplicates work. automation_test sends real messages and, for insight automations, consumes analysis credits. And the credential, OAuth token or MCP key, is yours to store, refresh, and revoke.

What you own on the API path

Everything the MCP server would have handled. You construct requests, map 400, 401, 404, and 500 responses, and retry 500 errors after a short delay. You run a webhook receiver that verifies the auth header you configured, acknowledges with a 2xx inside the 30-second timeout, and deduplicates on X-Idempotency-Key when Perspective sends one, since retries reuse the key and bodies aren't signed. Perspective treats any 4xx from your endpoint as permanent, so a bad deploy that returns 401 loses those deliveries instead of queueing them for retry.

How fast the tool surface moves

Perspective's MCP surface is unversioned and moving quickly. The changelog shows conversation analysis tools arriving on July 13, 2026, transcript import on August 28, and Agent Library tools on September 4, alongside an August 17 fix after stricter clients rejected an older tool-schema format. That pace is good for capability and bad for determinism: a tool list that changes mid-quarter changes what your model sees. Pin what the agent can call. An explicit allowlist in a Scalekit Virtual MCP server keeps new tools out of context until you add them, and Anthropic's mcp-client-2026-09-15 beta header can pin a server's tool list within a conversation. The REST reference, versioned under /api/v1/, was last updated in May 2026.

Use Perspective AI MCP when

  • You're building an interactive research assistant, in Claude Code, Cursor, or your own product, where a user asks what churned customers said about pricing and the agent answers from conversations_search and read_insights.
  • The agent designs conversation agents end to end, including the follow-up questions Perspective's design agent asks, which only MCP can answer.
  • The agent orchestrates Perspective with other tools, such as turning interview themes into Linear issues, and needs transcripts, analysis, and insights to do it.
  • Each customer connects their own Perspective workspace, and you want per-user OAuth grants limited to the workspaces they chose.
  • You're prototyping and want Perspective-maintained tool schemas from the first day.

Use the Perspective AI API when

  • A backend provisioning step must create a perspective synchronously from a complete brief and get share, preview, and direct URLs in one response, and you can hold an MCP key for it.
  • The workflow is event-driven: a CRM sync or lead-scoring job that should fire on interview.completed rather than poll MCP.
  • The pipeline must be deterministic, with no model in the loop: webhook payloads carry structured_output and participant_metadata, and idempotency keys make retries safe.
  • Your product renders the participant conversation itself through the Embed SDK.

The credential problem that exists on both paths

Both paths require per-user credential isolation in a multi-tenant B2B agent. MCP's OAuth flow gives you a token per user; the REST endpoint gives you a key per user. In neither case does the path solve storage, rotation, or revocation. The numbers compound fast: 200 customer organizations with three connected users each is 600 credentials, each with its own lifecycle. An OAuth grant can be revoked from Perspective's Connected Apps screen at any moment, and your agent finds out from a failed tool call. An MCP key is long-lived, rotates only when someone deletes and recreates it in the UI, and works for whoever holds it across every workspace in its scope.

What neither path gives you

Neither path gives you encrypted, tenant-isolated storage, refresh before expiry, a revocation signal, or an audit trail that ties each tool call to the user who authorized it. For Perspective, the MCP path is the one worth scaling, because it carries the whole surface. Scalekit's Perspective AI MCP connector runs the OAuth 2.1 flow with DCR, stores each user's tokens, and refreshes them, so Perspective credentials never touch your agent runtime. The one REST call that needs an MCP key stays yours to manage, and perspective_create covers the same job over MCP. Scope stays a function of identity: what the user can't do in Perspective, the agent can't do.

Recommended reading: When an Employee Leaves, Who Revokes Their AI Agent's Access?

Building Perspective AI agents with Scalekit

Scalekit ships one Perspective connector, perspectiveaimcp, which routes tool calls to Perspective's own MCP server. There's no separate REST connector; the REST surface is one keyed endpoint that the MCP tools already cover. The examples use Python and the Anthropic SDK, because Scalekit's Node SDK can't mint Virtual MCP session tokens yet, and one language keeps both integration modes comparable.

Prerequisites

Create a Perspective AI MCP connection in the Scalekit dashboard under AgentKit, then Connections. Copy SCALEKIT_ENVIRONMENT_URL, SCALEKIT_CLIENT_ID, and SCALEKIT_CLIENT_SECRET from Developers, then API Credentials, into your .env file, along with ANTHROPIC_API_KEY. Every connection_name in code must match the connection name in the dashboard exactly; a mismatch is the most common integration error. The Perspective AI MCP connector docs list all 35 tools with their parameters.

pip install scalekit-sdk-python anthropic python-dotenv

Step 1: Authorize each user once

Scalekit keys every credential to your own user identifier. The first time a user connects, send them the authorization link: they sign in to Perspective once and approve the workspaces your agent may reach. The connected account then stays ACTIVE until the grant stops working, for example when the user revokes it in Perspective.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions CONNECTION_NAME = "perspectiveaimcp" # must match AgentKit > Connections exactly USER_ID = "user_123" # your app's opaque user ID, not an email address account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=USER_ID, ).connected_account if account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=USER_ID, ) print("Connect Perspective AI:", link.link) input("Press Enter after authorizing...") account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=USER_ID, ).connected_account if account.status != "ACTIVE": raise RuntimeError(f"Perspective AI is {account.status}, not ACTIVE")

Step 2: Retrieve the tools this user is authorized to call

This call doesn't load a connector catalog. list_scoped_tools returns tools bound to this user's connected account, filtered here to seven read-only research tools. On Perspective the difference is large. Scalekit's reference describes the 35 tools in about 9,200 words, roughly 260 per tool, because each description carries behavior notes and when-not-to-use guidance. Sending all 35 costs well over 10,000 tokens on every request before the agent does any work. The seven below account for about 1,400 words, a cut of roughly 85%. The fix is not better prompting. It is surface reduction.

from google.protobuf.json_format import MessageToDict READ_ONLY_TOOLS = [ "perspectiveaimcp_workspace_get_default", "perspectiveaimcp_perspective_list", "perspectiveaimcp_read_perspective_status", "perspectiveaimcp_read_insights", "perspectiveaimcp_read_insight", "perspectiveaimcp_conversations_search", "perspectiveaimcp_conversations_data_analysis", ] scoped_response, _ = actions.tools.list_scoped_tools( identifier=USER_ID, filter={"tool_names": READ_ONLY_TOOLS}, page_size=50, ) llm_tools = [] for scoped_tool in scoped_response.tools: definition = MessageToDict(scoped_tool.tool).get("definition", {}) llm_tools.append({ "name": definition.get("name"), "description": definition.get("description", ""), "input_schema": definition.get("input_schema", {}), })

Step 3: Run the agent loop with execute_tool

Claude chooses from the scoped list, and execute_tool runs each call against Perspective with the user's stored credential. Upstream failures raise ScalekitToolException; returning them to the model as is_error results lets it recover, for example by listing perspectives when a name doesn't match. A ScalekitToolUnauthorizedException means the grant itself failed, so the loop stops and sends the user back to Step 1. The pattern follows Scalekit's Anthropic framework guide.

import json import anthropic from scalekit.common.exceptions import ( ScalekitToolException, ScalekitToolUnauthorizedException, ) client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY messages = [{ "role": "user", "content": ( "In my default Perspective workspace, find the churn interview " "perspective and summarize the top three reasons customers gave " "for leaving." ), }] while True: response = client.messages.create( model="claude-sonnet-5-5", max_tokens=4096, tools=llm_tools, messages=messages, ) if response.stop_reason != "tool_use": print("".join(b.text for b in response.content if b.type == "text")) break tool_results = [] for block in response.content: if block.type != "tool_use": continue try: result = actions.execute_tool( tool_input=block.input, tool_name=block.name, connection_name=CONNECTION_NAME, identifier=USER_ID, ) content, is_error = json.dumps(result.data, default=str), False except ScalekitToolUnauthorizedException: raise # grant revoked or expired: send the user back to Step 1 except ScalekitToolException as exc: content = f"{exc.tool_error_code}: {exc.tool_error_message}" is_error = True tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": content, "is_error": is_error, }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

Multi-tool and multi-tenant agents with a Virtual MCP server

The SDK loop suits agents where your code owns orchestration. MCP-native frameworks want an endpoint instead, and connecting one straight to Perspective's server exposes all 35 tools and leaves per-user token handling to you. A Scalekit Virtual MCP server fixes both halves. You declare once, per agent role, which connections and which tools it exposes. Before each run, you mint a short-lived session token bound to one user's connected accounts. One server definition serves every tenant, no credentials are shared between users, and there is no MCP server to deploy or host. The endpoint is static; the identity is not.

Define the server once per agent role

This research-to-roadmap agent reads Perspective insights and files Linear issues for themes that have none. Linear isn't among Perspective's workspace integrations, which currently cover Slack, HubSpot, Gmail, Google Docs, Notion, Confluence, Salesforce, and Prodege. Perspective contributes five read-only tools and Linear contributes three, with linear_issue_create as the only write. The Linear connector docs list its other tools.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping # Run once per agent role, then store config_id and mcp_server_url vmcp = actions.mcp.create_config( name="research-to-roadmap-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="perspectiveaimcp", # must match the dashboard tools=[ "perspectiveaimcp_workspace_get_default", "perspectiveaimcp_perspective_list", "perspectiveaimcp_read_insights", "perspectiveaimcp_read_insight", "perspectiveaimcp_conversations_search", ], ), McpConfigConnectionToolMapping( connection_name="linear", # must match the dashboard tools=[ "linear_teams_list", "linear_issue_search", "linear_issue_create", ], ), ], ) config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url

Mint a per-user session token before each run

Confirm the user's Perspective and Linear accounts are both active, then mint a token for this run only. The default lifetime is about an hour and the ceiling is 24 hours, so set expiry just above the expected run time. There's no refresh call; you mint again. The Virtual MCP setup guide covers updating and deleting servers.

from datetime import timedelta status = actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=USER_ID, include_auth_link=True, ) inactive = [ acct for acct in status.connected_accounts if (acct.connected_account_status or "").upper() != "ACTIVE" ] if inactive: for acct in inactive: print(f"Reconnect {acct.connection_name}: {acct.authentication_link}") raise SystemExit("Authorize the connections above, then rerun.") session_token = actions.mcp.create_session_token( mcp_config_id=config_id, identifier=USER_ID, expiry=timedelta(minutes=30), ).token

Connect Claude through the MCP connector

Anthropic's MCP connector calls the Virtual MCP server from Anthropic's side, so there's no tool loop in your code. It's a beta feature and isn't eligible for Zero Data Retention. Weigh one tradeoff: tool calls run with no checkpoint in your code, so linear_issue_create executes the moment the model decides. If a person must approve writes, use the Step 3 loop, where your code sees every tool_use block before execute_tool runs. CrewAI, Mastra, and Claude Code can connect to the same URL with the session token as an Authorization: Bearer header.

response = client.beta.messages.create( model="claude-sonnet-5-5", max_tokens=4096, messages=[{ "role": "user", "content": ( "Read this week's insights from the onboarding research perspective, " "search Linear for existing issues on each theme, and create an issue " "on the Product team for any theme that has none." ), }], mcp_servers=[{ "type": "url", "url": mcp_server_url, "name": "scalekit", "authorization_token": session_token, }], tools=[{"type": "mcp_toolset", "mcp_server_name": "scalekit"}], betas=["mcp-client-2025-11-20"], ) print("".join(b.text for b in response.content if b.type == "text"))

Recommended reading: What Is a Virtual MCP Server? Scoped Tools and Per-User Auth

Where Scalekit's agent templates fit

The same multi-connector shape runs through Scalekit's agent templates. The CSAT agent template emails surveys from Gmail and logs responses to Freshdesk tickets, and the performance review collector template gathers feedback from Airtable and Google Forms into Notion. Both are collection pipelines where a Perspective Evaluator or Concierge agent could replace the static survey or form. The CRM AI agent template shows the downstream half: conversation output becoming HubSpot record updates.

Observability: auth and tool execution logs for every Perspective call

Once agents act for many users, the question stops being whether a call worked and becomes whose credential made it. Every execute_tool call returns an execution_id, and tool failures raise ScalekitToolException with tool_error_code, tool_error_message, and the same execution_id for correlation. In the Scalekit dashboard, AgentKit, then Connected Accounts, shows each user's account status, refresh history, and tool execution logs. When a Perspective grant is revoked or a refresh fails, the account leaves ACTIVE, and the connected_account.status_updated and connected_account.token_refresh_failed webhooks push that change to your system without polling.

What the logs let you answer

Three questions that come up in security reviews become answerable: which user's credential performed a given Perspective write, when that credential last refreshed, and what status the account held when the agent acted. That's also the revocation signal neither native path provides. A user who removes your app under Perspective's Connected Apps otherwise surfaces only as tool errors; here it arrives as a status transition you can route to a re-authorization prompt.

Recommended reading: Audit Trails for Agent Auth in B2B SaaS

Which one to build against

If your agent reads Perspective data, designs conversation agents, or works across tools, build on MCP; on Perspective there's no REST alternative for any of that. If your workflow reacts to finished conversations, add webhooks for the events and keep the model out of that path. Reserve the REST create endpoint for a synchronous provisioning step that can live with an MCP key. A production Perspective agent usually needs both: MCP for reasoning over research and webhooks for event-driven sync. Either way, every user brings a Perspective credential, and the tool surface keeps growing. Scoped tools, per-user tokens, and a log of every call are what make that safe for more than one customer.

Start building your Perspective AI agent

Building a Perspective AI agent and want help with the auth model, tool scoping, or a multi-tenant rollout? Talk to us for immediate help. To start on your own, the Perspective AI MCP connector docs cover setup and every tool, the Scalekit connector catalog covers the other apps your agent will touch, and AgentKit pricing starts with a free tier of 5,000 tool calls a month and unlimited connected accounts.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.