Announcing CIMD support for MCP Client registration
Learn more

Should you use Crossbeam MCP or Crossbeam API for building AI Agents?

TL;DR

  • Crossbeam MCP is read only. Twelve tools, all retrieval. Any co-sell agent that logs, notifies, or updates needs a second connector for the write half of the workflow.
  • MCP went generally available on all plans on September 1, 2026. The Partner REST API is Supernode and above; signal webhooks are Enterprise only. If you sell to Crossbeam customers, MCP is the only path that reaches Free and Connector tenants.
  • The meter usually decides. MCP calls draw from an org-wide Crossbeam Credit pool (Enterprise baseline: 5,000 a year, no rollover). REST calls draw from Record Exports, where each unique record counts once per term. High-frequency re-reads are cheap on REST and expensive on MCP.
  • MCP auth is OAuth 2.1 with PKCE and Dynamic Client Registration (DCR), per user, and needs a Full Access or Sales seat. The Partner API uses Authorization Code with offline_access refresh tokens; access tokens live 24 hours.
  • Both paths hand you a credential and nothing else. Scalekit's Crossbeam MCP connector handles the OAuth flow, token vault, refresh, and per-user tool scoping, so the MCP vs API choice does not change your auth infrastructure.

Your agent needs partner ecosystem data. It needs to know which partners already sit inside an open opportunity, who can make a warm introduction, and what moved in the ecosystem overnight. Crossbeam ships a hosted MCP server and a Partner REST API, and they are not two views of the same surface. They cover different capabilities, sit behind different plan gates, and bill against two entirely different meters. Here is how to pick.

What Crossbeam MCP and the Crossbeam Partner API actually are

These are two separate products with separate access models. Reading them as "the AI one" and "the programmatic one" will lead you into the wrong plan tier.

Crossbeam MCP

Crossbeam MCP is a Crossbeam-hosted remote server at https://mcp.crossbeam.com/mcp over Streamable HTTP. Auth is OAuth 2.1 with PKCE and Dynamic Client Registration (DCR). Every tool is read only.

It went generally available on all plans on September 1, 2026, the same day Crossbeam Credit metering began enforcement. Some pages on Crossbeam's marketing site still describe the earlier Supernode and Enterprise early access; the Crossbeam MCP Server documentation carries the current state. Full tool schemas and the changelog live in the official MCP Server technical docs.

Crossbeam Partner API

The Crossbeam Partner API is a REST surface covering partners, populations, partner populations, records, partner records, overlaps, reports, and ecosystem signals. You register a custom integration in Crossbeam to get a client_id and client_secret.

Auth is OAuth 2.0 Authorization Code against https://auth.crossbeam.com/authorize with the audience https://api.getcrossbeam.com. Documented scopes are openid, read:partnerships, read:reports, read:populations, and write:activity-timeline. Access tokens are valid for 24 hours; add offline_access to receive a refresh token. Every request carries an Xbeam-Organization header holding the org UUID, which you resolve from /v0.1/users/me.

The plan gate on each path

This is the constraint most teams discover after they have already written code. REST API access is available on the Supernode plan and above. Signal webhooks are Enterprise only.

MCP has no such gate. Free, Connector, Supernode, and Enterprise all get it, subject to a per-plan credit allocation and a per-user seat requirement.

Comparing them where it matters for agents

Four dimensions decide this: what the agent can call, what auth path you land on, what the call costs you, and what breaks in production. Capability is the least interesting of the four, so start there and get it out of the way.

What your agent can actually do

Capability
Crossbeam MCP
Crossbeam Partner API
Account overlaps with one or more partners
Yes
Yes: raw overlap and partner records
Unified account context with owner, populations, custom fields
Yes
Partial: assemble from records and populations
Partner-shared contacts on an account
Yes
Not documented as an endpoint
Ranked partner recommendations for an open opportunity
Yes
No
Net new accounts from Pipeline Generation
Yes
No
Partner performance rollups: score, win rate, potential revenue
Yes
Partial: derive from reports
Ecosystem activity signals
Yes: deals opened, closed won, and greenfield
Partial: deals opened and closed won only
Real-time signal push
No
Yes: webhooks, Enterprise only
Populations and reports as first-class objects
No
Yes
Bulk record retrieval and search
No
Yes
Writes back into Crossbeam
No: read only
Partial: write:activity-timeline is the only documented write scope
Shareable Crossbeam list link
Yes
No

Where each surface stops

The MCP server is the only place Crossbeam's derived intelligence is exposed. Partner recommendations run on the same engine as Deal Navigator. Partner suggestions run on Partnerbase data. Net new accounts come from Pipeline Generation. None of these are documented as REST endpoints.

The Partner API is the only place you get raw scale and push. Bulk record search, population objects, report-scoped record pulls, and the signals webhook exist nowhere in the MCP tool list.

The read-only ceiling changes your architecture

Crossbeam states this plainly: the MCP tools read ecosystem intelligence and return it. get_list_link generates a shareable link so a human can jump into the UI, but no documented tool changes data in Crossbeam.

For an agent, this is a design constraint, not a limitation to work around. A co-sell agent that reads overlap and then does nothing is a search box. The action half of that workflow lives in Slack, Salesforce, or HubSpot, which means your Crossbeam agent is a multi-connector agent by construction.

The meter is different, and the meter usually decides

Crossbeam Credits meter MCP access only. Baseline allocations are 50 per year on Free, 500 on Connector, 2,500 on Supernode, and 5,000 on Enterprise. Credits pool across the whole organization, reset annually, and do not roll over.

REST calls and webhooks do not touch credits. They count against Record Exports instead, where each unique record is counted once per term. Supernode includes 25,000; Enterprise starts at 100,000.

Working the numbers on a background agent

Take a stated scenario: one Enterprise tenant, 25 sales reps, an always-on co-sell agent that scans overlaps and refreshes account context on a schedule.

Crossbeam's own Credits FAQ estimates roughly 1,000 credits per month for an always-on automation pattern. At 25 reps that is 25,000 credits a month, which exhausts the 5,000 credit annual baseline in under a week. Annualized at the flat rate of $0.10 per credit, and buying the discounted 100,000 packs, you are looking at roughly $27,000 a year in credits alone.

Now run the same agent on the Partner API. Re-reading the same 20,000 accounts every day consumes 20,000 unique records against the term limit, not 20,000 per day. The Record Export meter is indifferent to frequency. The credit meter is not.

The auth path each one puts you on

MCP gives you Authorization Code with PKCE and DCR, per user, browser-interactive. Every rep authorizes with their own Crossbeam credentials, and the data returned reflects their seat and permissions. SAML SSO is supported. A Full Access or Sales seat is required to connect at all, which is a real onboarding failure mode in a multi-tenant agent: a valid tenant with the wrong seat type simply cannot complete the flow.

The Partner API also uses Authorization Code, but you register one integration and hold a refresh token. Crossbeam even sells a dedicated Integration User seat on Supernode and Enterprise, which is an explicit blessing of the service-account pattern.

The tradeoff nobody states out loud

Per-user MCP identity is the correct security posture. It also means N OAuth grants, N seat allocations, and N revocation events per tenant.

A single Integration User is operationally simpler and centralizes risk. Every call runs under one grant, so you lose per-user attribution and you inherit whatever that one user could see. Crossbeam's own Gong integration surfaces the tradeoff verbatim: choose Shared access and everyone using the connection sees the data the authorizing person is permitted to see, regardless of their own seat or permissions. That is the shared-credential failure mode, documented by the vendor. What the user can't do, the agent can't do, only holds if the agent runs under that user.

What headless execution looks like on each path

MCP requires an interactive browser flow per user before the first call. There is no static credential shortcut. Once the grant exists, a background agent can keep calling, but the initial consent is unavoidable and per person.

The Partner API is friendlier to schedules. One authorization produces a refresh token; access tokens expire every 24 hours and you rotate proactively. Crossbeam does not document a client credentials grant, so "no human ever" is not on the menu either. The difference is how many humans, and how often.

What you own in production

On MCP, Crossbeam owns hosting, scaling, and permission enforcement. You own token storage per user, re-consent when a grant is revoked, credit budget monitoring, and tolerance for tool schema changes you do not control.

On the Partner API, you own all of that plus request construction, pagination, retries, and webhook verification. Webhook security is HMAC: validate X-Crossbeam-Signature-256 against the body plus X-Crossbeam-Timestamp, reject timestamps outside a 300 second window, and expect retries on 408, 429, 500, 502, 503, and 504.

Rate limits are an unpublished variable

Crossbeam states that Partner API rate limits are defined in its security policy and subject to change at its discretion. No numeric limit is published.

Plan for backoff you cannot size in advance. For a deterministic nightly pipeline that is manageable. For a latency-sensitive interactive agent it is a reason to keep the call count per user turn low.

Tool names moved on September 1

The MCP tool surface is a managed contract, and it changed. find_overlaps became find_overlapping_accounts_and_leads. find_overlap_partners became find_overlapping_partners. Three tools were added: find_partner_shared_contacts, find_new_accounts, and get_partner_overlaps_shared_context.

Agents that hard-coded tool names against the earlier surface break silently, because a missing tool looks like a model that chose not to call anything. The fix is structural: enumerate the authorized surface at runtime instead of pinning names in source. Every code sample below does exactly that.

When to use Crossbeam MCP

  • Your agent serves reps interactively, and per-user seat permissions should constrain what it can see
  • You need Crossbeam's derived intelligence: ranked partner recommendations, partner suggestions, Pipeline Generation net new accounts, or partner performance rollups
  • Your tenants span plan tiers and some of them are on Free or Connector, where the REST API does not exist
  • Call volume is bounded by human interaction, so credit consumption tracks conversations rather than cron

When to use the Crossbeam Partner API

  • Your agent runs on a schedule against a stable account set, where per-unique-record billing beats per-call credits
  • You need populations, reports, or bulk record search, none of which the MCP server exposes
  • You need real-time push, and your tenants are on Enterprise where signal webhooks are available
  • You are writing anything back, in which case write:activity-timeline is the only documented write path in either direction

The credential problem that exists on both paths

Crossbeam does the identity part well. It does not do the lifecycle part at all, and neither does the protocol you picked.

What Crossbeam gives you

Per-user MCP grants inherit the authorizing user's seat and sharing rules. Partner data a partner has not shared does not appear, no matter how the agent phrases the request. That is the right enforcement point and it is genuinely enforced.

What Crossbeam gives you is an access decision at call time. What it does not give you is a place to keep the resulting credential.

What you still have to build

In a multi-tenant agent serving 25 reps across 8 customer orgs, the MCP path produces 200 OAuth grants to store encrypted, isolate per tenant, refresh, and revoke when a rep leaves. The Partner API path produces 8 integration credentials with 24-hour access tokens and refresh tokens that also need proactive rotation.

The token type differs. The infrastructure does not. Both need a vault, tenant isolation, proactive refresh rather than reactive 401 handling, and a revocation path tied to your own offboarding events. Scalekit's Crossbeam MCP connector handles the OAuth flow, token storage, and refresh for the MCP path, so the choice between paths does not change your auth infrastructure.

Building a Crossbeam agent with Scalekit

Scalekit's catalog entry for Crossbeam is the MCP connector, exposed under the connection name crossbeammcp. For the Partner REST API you register a custom connector and call it through the Tool Proxy. Both end up in the same connected-account model.

Set up the connection and credentials

Create the connection once in the Scalekit dashboard under AgentKit > Connections, then install the SDK.

pip install scalekit-sdk-python langchain-openai
# .env SCALEKIT_ENVIRONMENT_URL=<your-environment-url> SCALEKIT_CLIENT_ID=<your-client-id> SCALEKIT_CLIENT_SECRET=<your-client-secret>

The connection_name used in every call below must match the connection name configured in your Scalekit dashboard exactly. Mismatched connection names are the single most common integration error.

Authorize the user

The rep authorizes Crossbeam once. Scalekit runs the OAuth 2.1 flow with PKCE and DCR against mcp.crossbeam.com, then vaults the resulting credential against your identifier for that user.

import os from scalekit import ScalekitClient scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions CONNECTION = "crossbeammcp" # must match the Connection name in the dashboard IDENTIFIER = "rep_2841" # your app's stable identifier for this user response = actions.get_or_create_connected_account( connection_name=CONNECTION, identifier=IDENTIFIER, ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION, identifier=IDENTIFIER, ) print("Authorize Crossbeam:", link.link)

Remember the seat requirement. If this rep does not hold a Full Access or Sales seat in Crossbeam, the flow will not complete, and that is worth surfacing as a distinct onboarding error rather than a generic auth failure.

Retrieve the authorized tool surface

Before the agent calls anything, retrieve the tools this rep's connected account is authorized to call. This is not a catalog lookup. It is the scoped, deterministic surface derived from one user's grant, and it is also your defence against the September tool renames.

from scalekit.v1.tools.tools_pb2 import ScopedToolFilter scoped = scalekit_client.tools.list_scoped_tools( IDENTIFIER, filter=ScopedToolFilter(connection_names=[CONNECTION]), page_size=100, ) for entry in scoped.tools: print(entry.tool.definition.name)

Execute a single tool

For a deterministic step where you already know what you want, call execute_tool directly rather than routing through the model.

result = actions.execute_tool( tool_name="crossbeammcp_get_account_context", tool_input={"account": "northlightai.com"}, connection_name=CONNECTION, identifier=IDENTIFIER, ) print(result)

Verify tool names against the Crossbeam MCP connector reference rather than copying them from an older integration. get_account_context, get_partner_context, find_partner_recommendations, and get_ecosystem_activity survived the September release unchanged; the two overlap tools did not.

Run the agent loop with LangChain

actions.langchain.get_tools() returns native StructuredTool objects scoped to this rep, so there is no schema reshaping and no Scalekit-specific logic inside the loop. This is the same pattern described in our LangChain tool calling deep dive.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier=IDENTIFIER, connection_names=[CONNECTION], page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ HumanMessage( "I have a call with Northlight Analytics tomorrow. " "Which partners are already in that account, and who should I ask for an intro?" ) ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = tool_map[tc["name"]].invoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Calling the Partner REST API through the same model

If your agent needs populations, reports, or bulk records, the Partner API is the only path. Register it as a custom connector, then call upstream endpoints through the Tool Proxy with actions.request().

// Node: proxied Partner API call under the user's connected account const response = await scalekit.actions.request({ connectionName: 'crossbeam-partner-api', // your custom connector's connection identifier: 'rep_2841', path: '/v0.1/users/me', method: 'GET', }); console.log(response.status, response.data);

The credential is resolved server side at request time. It never enters your agent runtime, your logs, or the model context. See Add your own connector for the connector definition.

Multi-tool GTM agents and the Virtual MCP server

Because Crossbeam MCP is read only, any useful co-sell agent spans at least two connectors: Crossbeam for the intelligence and something else for the action. That is exactly the shape Virtual MCP servers exist for.

One server definition, per-user identity

A standard MCP server exposes every tool it has. Point an agent at Crossbeam MCP and Slack and it sees the union of both surfaces, most of which it will never need.

Virtual MCP servers invert that. You declare which connections and which specific tools an agent role can see, once. Each run then gets a short-lived token scoped to one user's connected accounts. The endpoint is static; the identity is not.

Define the server once per agent role

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = scalekit_client.actions.mcp.create_config( name="cosell-alert-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="crossbeammcp", tools=[ "crossbeammcp_get_account_context", "crossbeammcp_get_partner_context", "crossbeammcp_find_partner_recommendations", ], ), McpConfigConnectionToolMapping( connection_name="slack", tools=["slack_send_message"], ), ], ) config_id = vmcp.config.id

Four tools total: three reads from Crossbeam and one write to Slack. The agent cannot generate list links, cannot query the knowledge base, and cannot touch any Slack tool other than sending a message.

Confirm connections, then mint a per-run token

OAuth grants expire and users revoke them. Check before every run rather than discovering it mid-task.

accounts = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier="rep_2841", include_auth_link=True, ) for account in accounts.connected_accounts: if account.connected_account_status != "ACTIVE": print(f"{account.connection_name} needs auth: {account.authentication_link}") from datetime import timedelta instance = scalekit_client.actions.mcp.ensure_instance( config_name="cosell-alert-agent", user_identifier="rep_2841", ) mcp_url = instance.instance.url # return this to the agent for this user only

Run it from TypeScript with Mastra

Mastra's MCP client reads the tool list and Zod schemas straight off the URL, so there is no schema conversion step.

npm install @mastra/core @mastra/mcp @ai-sdk/openai
import { Agent } from '@mastra/core/agent'; import { MCPClient } from '@mastra/mcp'; import { openai } from '@ai-sdk/openai'; // Fetch from your backend for the authenticated user. Never a shared process-wide URL: // each URL is pre-authenticated for one user, and sharing it runs every request as that user. const mcpUrl = await getMcpUrlForUser(currentUserId); const mcp = new MCPClient({ servers: { scalekit: { url: new URL(mcpUrl) }, }, }); const tools = await mcp.getTools(); const agent = new Agent({ name: 'cosell_alert_agent', instructions: 'Check partner coverage on the named account. If a partner has a strong relationship, ' + 'post a short co-sell suggestion to the account owner in Slack.', model: openai('gpt-4o'), tools, }); const result = await agent.generate( 'Northlight Analytics went to stage 3 today. Anything in the ecosystem I should act on?' ); console.log(result.text); await mcp.disconnect();

Why scoping is economic here, not just architectural

Tool bloat is normally an accuracy and token-cost argument: 40 tools at roughly 200 tokens each burns 8,000 tokens before the agent does any work, and models select badly from a decision space that large. Scoping to five or ten tools cuts that overhead by around 80%.

With Crossbeam, there is a third cost. Every speculative MCP tool call the model makes because it had too many options draws real credits from a pooled annual balance that does not roll over. Surface reduction stops being a quality optimization and becomes a line item. Model upgrades help. They are not the lever.

What the auth logs give you that neither path does

Crossbeam's Plan and Billing page shows credit consumption broken down by MCP tool call and active user, and only admins can see it. That tells your customer's admin how much was spent. It does not tell you which agent run spent it or why.

Attribution on the downstream call

Every tool call Scalekit executes is logged with full attribution: who authorized the call, which agent ran it, what came back, and whether it failed on your side or upstream. executeTool returns an executionId you can correlate against your own traces.

For a credit-metered upstream, this is the difference between "our Crossbeam bill tripled" and "the retry loop in the nightly scan is calling get_partner_context four times per account." More on the pattern in agent tool observability and audit trails for agent auth.

Failure separation across tenants

In a multi-tenant deployment, a Crossbeam credit exhaustion in one tenant looks identical to a revoked grant in another if all you have is a stack trace. Logs keyed to the connected account separate them.

That separation is also what a security reviewer asks for. See access control for multi-tenant AI agents for how the isolation model holds up under that questioning.

Which one to build against

Two clean cases, then the messy one most teams actually land in.

The two clean cases

If your agent is rep-facing and its value is Crossbeam's derived intelligence, build against MCP. Partner recommendations, partner suggestions, and Pipeline Generation net new accounts exist nowhere else, per-user seat enforcement is doing real work for you, and credit consumption stays tied to human conversation volume.

If your agent runs on a schedule over a stable account set, or needs populations, reports, bulk records, or push, build against the Partner API and accept the Supernode floor. Per-unique-record billing is structurally kinder to frequency than per-call credits.

The question that actually decides it

Most production Crossbeam agents end up on both, plus a third connector for the write. So the deciding question is not which surface is richer.

It is which meter your call pattern runs into first, and whether your credential infrastructure can carry N per-user grants and a service credential at once without you building it twice.

Build with Crossbeam and Scalekit

Browse the Crossbeam MCP connector on Scalekit or read the connector reference. Pair it with the Salesforce, HubSpot, Gong, and Slack connectors for the write half of a co-sell workflow, or browse all connectors.

Starting from a template is faster than starting from a blank file. The CRM AI agent, sales call prep agent, deal intelligence agent, and outbound prospecting agent all follow the pattern above, and the full set lives under GTM and RevOps. Usage-based details are on the pricing page.

Building a Crossbeam agent and hitting something specific? Join the Scalekit Slack community, or talk to us for immediate help.

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.