Risotto MCP Server
Risotto exposes a Model Context Protocol server so MCP-compatible clients (Claude Desktop, Cursor, ChatGPT, and custom agents) can call into your Risotto workspace. The server has 124 tools. You can work with tickets, knowledge, users, departments, runbooks, automation tools, access rules, campaigns, and organization settings. See Available tools for the full list. Clients authenticate with OAuth 2.1. Your client runs a standard browser-based authorization flow, and each user signs in with their own Risotto identity, so tool calls are attributed and audited per person. Claude Desktop, Claude Code, Cursor, ChatGPT, the MCP Inspector, and any client that ships a built-in OAuth UI connect this way. Risotto API keys are not an authentication method for the MCP server.Prerequisites
- A Risotto account in the organization. Every organization role can connect. Your role limits the scopes that you can grant (see Scopes and organization roles).
- An MCP-compatible client. OAuth requires a client that supports OAuth 2.1 + Dynamic Client Registration (Claude Desktop, recent Cursor, MCP Inspector, or any spec-compliant client).
Find your MCP server URL
Each Risotto organization has its own MCP server URL of the form:Connect with OAuth
Add the MCP server to your client
- Claude Desktop
- Cursor
- ChatGPT
- MCP Inspector
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
YOUR_MCP_SERVER_URL with the URL from your dashboard. No client ID, client secret, or token URL is needed — Claude Desktop discovers everything from the server.Restart Claude Desktop after saving.Sign in and grant scopes
Use the tools
Available scopes
OAuth clients request scopes at consent time. A scope grants the tools listed under it in Available tools.Scopes and organization roles
Your organization role limits the scopes that a client can hold:- Org Admin and Org Manager can hold every scope.
- Member can hold
tickets:read,tickets:write,knowledge:read,users:read,departments:read,runbooks:read,categories:read,applications:read,tools:read, andtools:execute. A Member can run and test only the tools of the departments that they supervise.
access_denied. Risotto checks the role on every request. When an admin changes your role, your tokens get the scopes of the new role within 5 minutes. A user who leaves the organization gets 403.
A Member also has these limits:
- A Member can act only as themselves. Risotto refuses a
create_ticketfor another requestor (“You can create tickets only for yourself”), anadd_commentas another author (“You can comment only as yourself”), and asearch_knowledgeorcheck_document_index_statuson behalf of another user (“You can search only with your own access”). search_knowledgewith adept_idworks only for a department where the Member can read tickets. Withoutdept_id, it searches only documents shared with the whole organization.list_runbooksandget_runbookreturn the org-wide runbooks and the runbooks of the Member’s departments.
tickets:read scope doesn’t
grant visibility into tickets outside the departments that user belongs to.Manage authorized clients
From Settings → Developers → Risotto MCP server in the dashboard you can:- See every OAuth client that has registered against your organization, including the IP it was registered from and when it last made a request.
- Revoke a client — invalidates all of its tokens immediately. The client will be prompted to sign in again on its next request.
Available tools
The server registers 124 tools. Each tool needs one scope.tools/list returns only the tools whose scope your credential holds, with their input schemas. For example, a Member sees only the tools of the Member scopes, and an API key with narrow scopes sees only the tools of those scopes. Risotto also checks the scope when you call a tool, so a call to a tool outside your granted scopes fails with a missing-scope error.
Tool names below are the values you pass in tools/call. The dashboard Assistant is built on the same tools.
Where a ticket tool takes a ticket_id, you can pass the Risotto key (for example IT-123) or the key of the synced ticket in your ticketing system (for example the Jira key ENG-123). Risotto tries the Risotto key first, then the synced key. If more than one ticket has the same synced key, Risotto uses the newest ticket. Ticket results include external_ticket_id and external_ticket_url. Both are null when the ticket is not synced. list_tickets has no filter for the synced key, but its search argument matches the synced key.
Ticket results also include priority, as { value, is_suggested } or null. value is low, medium, high, or urgent. is_suggested is true when the value is the priority that the AI suggested, and false when a person set it. The ticket tools cannot change the priority. See Ticket priority.
To find tickets about a topic, pass search to list_tickets. The search is not case-sensitive. It matches the ticket title, public comments, the requestor’s email, the assignee’s name, the name of the Slack channel where the ticket started, the synced key, and the ticket number (123 or IT-123). Risotto combines search with the other filters. The dashboard Search tickets box matches the same fields.
Tickets and comments (8 tools)
Tickets and comments (8 tools)
Ticket insights (7 tools)
Ticket insights (7 tools)
Knowledge (4 tools)
Knowledge (4 tools)
Users (3 tools)
Users (3 tools)
Departments and Tier 2 Assistant (11 tools)
Departments and Tier 2 Assistant (11 tools)
Runbooks, templates, and forms (17 tools)
Runbooks, templates, and forms (17 tools)
Automation tools and scripts (17 tools)
Automation tools and scripts (17 tools)
Custom API sources and templates (22 tools)
Custom API sources and templates (22 tools)
External MCP servers (8 tools)
External MCP servers (8 tools)
Access management (8 tools)
Access management (8 tools)
Organization settings, request sources, and identity provider (11 tools)
Organization settings, request sources, and identity provider (11 tools)
Artifacts and audit log (6 tools)
Artifacts and audit log (6 tools)
Campaigns (2 tools)
Campaigns (2 tools)
request_tool_credentials, request_custom_api_credentials,
request_external_mcp_credentials, request_external_mcp_authorization,
request_okta_credentials, and request_vault_credential. From an external
MCP client they only report the current state. Enter the secret in the
dashboard instead. ingest_attached_file reads a file uploaded in the
dashboard Assistant and has no use from an external client.tools/list against your endpoint to see the current list of tools that your scopes allow, with input schemas.
Troubleshooting
403 insufficient_scope or access_denied
403 insufficient_scope or access_denied
- A user who is not in the organization gets
403withinsufficient_scope(“Only org admins, managers, and members can use Risotto MCP.”). - At consent, a Member whose client requests only scopes outside the Member scopes goes back to the client with
access_denied. - A
503withRetry-After: 30means that Risotto could not read your role. Try again.
Consent screen redirects fail or loops
Consent screen redirects fail or loops
localhost loopback redirect URI or a private-use URI scheme (like cursor://). Claude Desktop and the MCP Inspector use loopback; Cursor uses its cursor:// scheme, and a single registration can mix native and web redirect URIs.Hosted clients like ChatGPT are different — they register their own public HTTPS redirect URI, which Risotto’s DCR accepts. If you’re building a custom desktop client, use a loopback or private-use-scheme redirect. If you’re building a custom hosted/web client and registration is failing, double-check the redirect URI is a valid HTTPS URL your service controls.Tool call returns a missing scope error
Tool call returns a missing scope error
result.isError is true, with a message naming the missing scope (for example, tickets:read).Revoke the client in the dashboard and reconnect — the consent screen lets you approve the additional scope. A Member cannot approve a scope outside the Member scopes. Ask an Org Admin for the Admin or Manager role.429 Too Many Requests
429 Too Many Requests
/mcp requests are throttled per credential at 1,000 requests per hour by default, and OAuth token issuance is throttled per client.The response includes Retry-After and X-RateLimit-* headers showing the reset window. Back off until the window resets, or contact support if you consistently need higher limits.Tools don't appear in the client
Tools don't appear in the client
- Restart the client after editing its config file — most clients only read MCP config at startup.
- Run the
curlsnippet above to confirm the endpoint is reachable. tools/listreturns only the tools that the credential’s scopes allow. If a tool you expect is missing, check the scopes you granted, and for OAuth, check your organization role. See Scopes and organization roles.