Skip to main content
SideShift exposes a remote Model Context Protocol server, so an AI agent can operate a SideShift company directly - listing campaigns, reading posts, creating contracts, running payouts - instead of you writing HTTP calls. There is nothing to download. The server is hosted at 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 a whoami 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 will walk you through the OAuth flow on first use.
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.
Setup snippets follow each client’s documented format for remote HTTP MCP servers. Client configuration changes often - if one is rejected, check that client’s current docs. The server URL and the OAuth flow are the parts that come from the SideShift specification.
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:
Then work in plain language:
Every request is bound to the tenant and the token’s effective scopes, so an agent can only do what it was authorized to do. Requesting a capability outside those scopes fails rather than silently doing something else. For a human grant, that effective scope set can be narrower than what was requested at consent. The ceiling is checked live, while the grant retains the consented set: a later authorized role or permission change can take effect on refresh, but cannot add access that was never consented to. See the note above. Changing the dashboard company does not retarget an existing MCP connection. To switch the connected company, disconnect and authorize again, selecting the intended company. Disconnecting revokes the old grant; reconnecting does not revive old tokens. For the manager and teammate flows, see Team and integration permissions.

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. Call whoami 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.
Search results report whether the current grant holds the required scope, so a missing scope leads to reauthorization rather than a false “unsupported” answer. 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_skill tool (campaigns:read, read). Pass the skill name (for example post-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 under MCP_SAFE_MODE. create_invite is deliberately not exposed; use create_campaign_invite, which is the same capability.
Confirm intent before any sensitive call, and prefer execute_payouts with dry_run: true before moving money. update_contract counts as sensitive because a real edit sends the creator a review link, though an already-current no-op sends nothing.

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 carry source: "native", and every write answers lane: "native".
  • attachment_ids are provider file ids and are refused on a native room (400 invalid_request, reason attachments_unsupported_on_native_conversation).
  • While the move runs, every messaging tool answers 409 conflict with meta.reason: "messaging_migrating". Nothing is sent. Retry in a minute.
The messaging recipe shows the response shapes.

Safety rules

These are enforced server-side, not by the client.
payouts:write and settings:write are flagged sensitive in the specification because they move money and change company configuration. Grant them only when an integration genuinely needs them.

Tool errors

Tool errors are actionable and map from the oauth/v1 error envelope. The full code and status registry is on the Errors, rate limits, and idempotency page.

Docs server

Separately from the product API above, this documentation site publishes its own MCP server so an agent can read these pages:
That one needs no authentication and grants no access to your SideShift data - it only reads documentation. You can also add it from the Copy page menu at the top of any page, which has one-click setup for Cursor and VS Code.