MCP server

Connect an MCP client

One URL, a browser sign-in, and the exact config for every client.

Read as Markdown

Add one URL to your client. Sign in once in a browser. Your agent gets up to 17 RiffAds tools.

Server URL
https://mcp.riffads.com
  • No API key. MCP is OAuth 2.1 only. Keys (sk_live_...) are for the REST API and the CLI.
  • The workspace needs a paid plan. Without one, tools refuse with required_plan.
  • Want a first video right away? Go to the MCP quickstart.

Add the server

Open this link to get the add dialog prefilled:

Prefilled connector dialog
https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=RiffAds&connectorUrl=https%3A%2F%2Fmcp.riffads.com

By hand: Settings, Connectors, Add custom connector. Paste https://mcp.riffads.com. Save.

Use the URL exactly

https://mcp.riffads.com. No path, no trailing slash. A wrong URL means no sign-in window.

Sign in

  1. The first tool call opens a browser on app.riffads.com.
  2. Sign in with Google, or email and password.
  3. Approve. You only see a consent screen if the client sends prompt=consent (Claude does not). There you pick the workspace and spend or read only.

Check the connection

Call riffads_ping. No arguments. Spends nothing.

riffads_ping result
{
    "ok": true,
    "user_id": "...",
    "organization_id": "org_...",
    "workspace": "Acme",
    "plan": "launch",
    "mode": "spend",
    "can_spend_credits": true,
    "server_time": "2026-09-17T10:28:41.002Z"
}
  • workspace: the workspace this connection uses.
  • can_spend_credits: false: read only. The 5 spend tools are missing.

Which workspace it uses

An MCP token is a person, not a workspace. The connection holds the workspace.

Your accountWhat happens
One workspaceBinds on first use.
More than one, no consent screenNothing binds. Every call refuses with connection_not_configured.
Client showed a consent screenYou picked it there.
No workspaceEvery call refuses with no_workspace.
connection_not_configured
{
    "ok": false,
    "code": "connection_not_configured",
    "message": "This RiffAds account has more than one workspace, so this connection does not know which one to spend from. Choose one at https://app.riffads.com/connections, then try again.",
    "retryable": false,
    "credits_charged": 0,
    "connect_url": "https://app.riffads.com/connections"
}

Retrying changes nothing. Pick the workspace at app.riffads.com/connections, then call again.

Read or spend

ModeToolsCan do
read12Browse, estimate, read generations and runs.
spend17Plus submit_generation, generate_talking_actor, run_workflow, create_upload, finalize_upload.
  • New connections can spend, unless you chose read only.
  • Uploads count as spend tools.
  • Change the mode at app.riffads.com/connections. Anyone can narrow their own. Only owners and admins can widen.
  • After a change, refresh the client's tool list. A stale list calling a spend tool gets read_only_connection.

OAuth discovery (custom clients)

Most clients do this for you. Building your own:

  1. Call with no token. You get 401:
WWW-Authenticate
Bearer error="invalid_token", error_description="Missing Authorization header", resource_metadata="https://mcp.riffads.com/.well-known/oauth-protected-resource"
  1. Fetch resource_metadata:
GET https://mcp.riffads.com/.well-known/oauth-protected-resource
{
    "resource": "https://mcp.riffads.com",
    "authorization_servers": ["https://app.riffads.com"],
    "scopes_supported": ["openid", "profile", "email", "offline_access"],
    "bearer_methods_supported": ["header"],
    "resource_name": "RiffAds"
}
  1. Read authorization_servers[0]. Do not hardcode it. Fetch its /.well-known/oauth-authorization-server for the authorize, token and registration endpoints.
  2. Register (dynamic registration works), authorize in a browser, exchange the code.
  3. Send Authorization: Bearer <access token> on every call.

Scopes gate nothing on MCP. The connection mode decides what a token can call.

Register once, not in a loop

Per address, before any token: 10 registrations per 10 minutes, 120 requests a minute on the MCP endpoint. Over either: 429 with Retry-After and no JSON-RPC body.

Token problems answer 401 with a plain OAuth body:

error_descriptionFix
Missing Authorization headerSend the token.
Invalid Authorization header format, expected 'Bearer TOKEN'Use the Bearer scheme.
Unknown, revoked or expired access tokenAuthorize again.
Token has expiredRefresh, or authorize again.
Access token has no usable expiryAuthorize again.
Access token is not bound to a clientAuthorize again.

Troubleshooting

SymptomCauseFix
No sign-in windowWrong URL, or not a streamable HTTP clientURL exactly https://mcp.riffads.com
Every tool answers connection_not_configuredSeveral workspaces, none pickedPick one at app.riffads.com/connections
Only 12 toolsRead only connectionAllow spending, refresh the tool list
not_authorizedToken revoked or bad, or account blockedReconnect and sign in again
workspace_unavailableWorkspace deleted, or you left itReconnect, pick a workspace you are in
no_workspaceAccount has no workspaceFinish setup at app.riffads.com, reconnect
required_planPlan does not include the agent APIThe message names the plan that does
429 with Retry-After during setupPer-address limitWait, register once
  • Disconnecting deletes the tokens. The agent must reconnect from scratch. Work already running finishes.
  • Switching workspace in the browser does not move a connection.
  • Tool refusals are JSON with code, message, retryable, credits_charged. Branch on code. See errors.

On this page