https://app.sideshift.app/api/mcp and you connect a client to it.
What you get
The MCP server fronts the same OAuth-scoped capabilities as the REST API. Every capability scope maps to tools, so the tool set mirrors the REST surface, plus awhoami
tool for checking which company, scopes, and sub-account access a token is bound to.
- Read scopes expose read-only tools
- Write and sensitive tools carry a confirmation guardrail in their description
- The claim-link capability is available as
create_quickpay_claim_link
Before you start
You need three things.1
An MCP-capable client
Claude Desktop, Claude Code, Cursor, VS Code, or any client that speaks MCP over
Streamable HTTP.
2
A registered OAuth client
The MCP server uses the same OAuth 2.1 flow as the REST API - there is no
MCP-specific auth scheme. Register via Dynamic Client Registration to get a
client_id.
See Platform API.3
An access token
Run the authorization-code flow with PKCE (
S256) to get a bearer token. Tokens minted
for MCP are multi-audience, so one token works for both /api/oauth/v1 and
/api/mcp - you do not need a separate credential.If a request arrives unauthorized, the server replies
401 with a WWW-Authenticate
challenge pointing at the RFC 9728 protected-resource metadata. Compliant clients use this
to discover the authorization server automatically, so many clients can complete setup
from the URL alone.Connect a client
- Claude Code
- Claude Desktop
- Cursor
- VS Code
Two different screens are called Connectors. Claude Desktop’s Settings → Connectors
points an outside AI client at SideShift - that is this page. Inside the SideShift app,
Settings → Sidekick Connectors goes the other direction: Sidekick acts as the MCP
client and connects out to external vendors’ MCP servers. See
Sidekick connectors.
Team members, scoped Platform API keys, OAuth grants, and MCP sessions share the same public
capability names. A saved
permissions.scopes array is the exact grant - an empty array
grants nothing; a membership without a scope array keeps its prior behavior, including the
legacy reporting-only Employee ceiling, until an explicit selection is saved. Every
verification re-intersects the session’s scopes with the subject’s current membership, so a
refresh can narrow access but never exceed the originally consented grant. See
Team role ceiling for human grants.Using the tools
Once connected, confirm which company you’re operating on before doing anything else:Agency sub-account delegation
An agency’s OAuth grant can extend to its sub-accounts. At consent, the user grants access to all sub-accounts (including ones created later) or an explicit current subset. Callwhoami to
see what was granted: its subaccountAccess field is null when no sub-account access exists,
"all" for every sub-account, or an explicit list of sub-account company ids.
Every consolidated business tool accepts an optional act_as_subaccount_id argument
(help_query is the exception — it stays tenant-free). Pass a sub-account’s company id to run
that call against the sub-account instead of the connected parent; resolve ids with
list_companies first rather than guessing. Omit the argument to act on the connected account
itself. The executor maps it to an X-Act-As-Company header on the underlying request.
Each delegated call re-verifies the current parent relationship, the user’s own membership, and
the target sub-account’s scope ceiling - the consented subaccountAccess set is a ceiling, not
a standing grant, so a child removed from the agency or a permission change on either side takes
effect on subsequent verified requests. A narrower direct child membership takes precedence
over inherited parent access. Aggregate reads across sub-accounts filter to that same
live-permitted set. See Agency access for setup and error recovery.
Platform API keys support the same REST delegation; remote MCP connections use OAuth.
Finding the right tool
Some hosts cap how many tools actually reach the model. SideShift registers six discovery tools first and core product tools immediately after, so the important actions survive both insertion-order and alphabetical truncation while uncapped clients still get the full typed surface. When an action is not obviously available, discover it rather than concluding it does not exist:1
Search by intent
Call
find_capability with the user’s ordinary-language request. The older
catalog_search name performs the same read.2
Load the exact schema
Call
catalog_get_schema for the selected capability, especially before a configurable
write.3
Gather and confirm
Collect every required value, present enum choices, and confirm the payload with the user.
4
Invoke at the matching risk level
Call
catalog_invoke_read, catalog_invoke_write, or catalog_invoke_sensitive.whoami reports both the
direct and complete-catalog tool counts.
Product-language names such as
create_job, update_job, and save_discover_offer are
canonical. The older upsert_job and upsert_discover_offer names stay callable for
existing integrations but are suppressed from search results.Working with marketplace jobs
Named skills
The MCP server exposes named skills: curated multi-step procedures. Each skill is available two ways:- As an MCP prompt - one per built-in skill, named exactly as in the table below - so hosts that support prompts can show them in their slash menus. Selecting a prompt injects the skill body as a user message.
- Via the
invoke_skilltool (campaigns:read, read). Pass the skill name (for examplepost-job). The tool description lists every skill and its trigger rules; unknown names return the valid name list. Bundled instructions only - no account data.
Tool catalog
A curated highlight of the tools an agent reaches for most often. The server exposes far more than this: see the capability reference for all of them, generated from the live registry. Risk levels: read makes no writes, write mutates SideShift state reversibly, and sensitive has real money, email, or direct-message side effects, so it is sandbox-rejected and blocked underMCP_SAFE_MODE.
create_invite is deliberately not exposed; use create_campaign_invite, which is the same
capability.
Companies on SideShift messaging
SideShift moved chat from a connected provider to its own messaging, one company at a time. A company moves the first time a person opens the app. For a company that has moved, the messaging tools above are served from native rooms:- Every conversation, channel and message id is a UUID. An older conversation id or
feed_…support-channel id still resolves to its room. - Rows carry
chatType: "native", messages carrysource: "native", and every write answerslane: "native". attachment_idsare provider file ids and are refused on a native room (400 invalid_request, reasonattachments_unsupported_on_native_conversation).- While the move runs, every messaging tool answers
409 conflictwithmeta.reason: "messaging_migrating". Nothing is sent. Retry in a minute.
Safety rules
These are enforced server-side, not by the client.Tool errors
Tool errors are actionable and map from theoauth/v1 error envelope. The full code and
status registry is on the Errors, rate limits, and idempotency page.