Guides by client
OpenCode
Claude Code
Codex
Claude Desktop
ChatGPT
Cursor
VS Code
Windsurf
Zed
Gemini CLI
How it works
The gateway exposes two tools, so your client’s tool list stays small:search_capabilitiesfinds the skills, plugins, workflows, and connections shared with you.execute_capabilityruns an exact capability name that search returned.
Reference
Client support status
Client support status
Reconnect or switch organizations
Reconnect or switch organizations
The organization you pick in the browser is pinned into the token. To use another one, log out and sign in again.OpenCode:Codex (first setup, then reconnect):Other clients: remove the stored
openwork token, then connect again. For a remote machine, see Connect OpenWork MCP from a remote machine.Troubleshooting
Troubleshooting
- 401 missing or invalid token: run the client’s auth/login command again and confirm the URL is
https://api.openworklabs.com/mcp/agent. - 403 membership or scope error: check you picked the right organization and still have access there.
invalid_grant: the refresh grant expired, was revoked, or was replayed after the rotation overlap. Log out, then sign in again.- 429 rate limit: wait for the
Retry-Aftervalue. - Support requests: include the
X-Request-Idresponse header and any MCPreferenceIdor OAuthreference_idfrom the JSON body. - Wrong URL:
app.openworklabs.com/api/denis an internal same-origin desktop proxy used by OpenWork first-party flows. Do not paste it into external MCP clients.
OAuth and tokens
OAuth and tokens
OpenWork Connect is a remote Streamable HTTP MCP server with OAuth.
- The protected resource is exactly
https://api.openworklabs.com/mcp/agent, discovered through RFC9728 protected-resource metadata. - The authorization server and sign-in origin is
https://app.openworklabs.com/api/auth. - OAuth authorize and token requests must include exactly one
resourcevalue:https://api.openworklabs.com/mcp/agent. - Clients can identify with a Client ID Metadata Document (
client_id_metadata_document_supported: true) whoseclient_idequals its HTTPS URL, withclient_name,redirect_uris, andtoken_endpoint_auth_method: "none". Listed loopback redirects are accepted on any port (RFC 8252). Other clients fall back to dynamic client registration. - PKCE is required for public clients; only
S256is supported. - Redirect URIs must be HTTPS or HTTP loopback callbacks. Private-use schemes are rejected, except exact allowlisted native callbacks such as Cursor Desktop’s, with PKCE S256 enforced.
- Access tokens are JWTs signed and validated with EdDSA. The issuer is exactly
https://app.openworklabs.com/api/auth, the audience is exactlyhttps://api.openworklabs.com/mcp/agent, and they expire after 45 minutes. - Refresh tokens are opaque rotating grants with a 30-day inactivity window and a 30-second rotation overlap. OpenWork stores only token hashes, so a replay during the overlap can issue another successor. A replay after the overlap returns
invalid_grantand revokes the token family. - Access is rechecked against your session and membership, so removing a member or revoking the session cuts off MCP access.
Token scopes
Token scopes
mcp:read allows discovery, connection-status probes, and read-only native API operations. Every external MCP provider tool call requires mcp:write, including tools that advertise readOnlyHint: true, because provider hints are not trusted authorization.This applies to generic execution, direct connections, Code Mode, and MCP App helper calls. The desktop app requests both scopes. Existing read-only tokens are not upgraded: reauthorize the client for mcp:write to call provider tools.The gateway never exposes authentication internals, admin-only system routes, webhooks, API-key management, or credential-returning endpoints.MCP Apps
MCP Apps
Some results return as MCP Apps: interactive
ui:// views such as a connection sign-in request or a workflow result. Clients without App support get readable fallback content.OpenWork supports a documented subset of the host protocol. Provider structuredContent is preserved; OpenWork additions live in namespaced _meta keys. To render a third-party App in another client, use the connection’s own URL from Your Connections → Use in another app (details). To pin one to a dashboard, see Dashboards.Apps you build are their own MCP servers
Apps you build are their own MCP servers
Ask the agent for an app, dashboard, or interactive view and it calls
create_app with React source, a text fallback, and the tools the App needs. No Workflow is required. Each App is saved in a Plugin and served as its own standard MCP server at /mcp/agent/connections/<appId> on your OpenWork API. That server exposes only:open_app, bound to the App’s current immutableui://revision;- the tools the App declared;
- the App’s revision resources.
search_capabilities. For example, an order calculator can declare:The App calls them by those names with
app.callServerTool. They run as the person using the App, with that person’s own access and connections, so sharing an App never shares credentials. Read-only tools are OpenWork actions that read, live Workflows, which run read-only, and tools on a connected MCP server that their provider marks read-only (readOnlyHint: true and not destructive). OpenWork checks that label again on every call, in the caller’s own tool list, and blocks the call once the provider stops marking the tool read-only; an editor then needs to update the App’s tools. Calling a connection tool still needs the mcp:write scope. OpenWork actions that change data can’t be App tools; to change something, bind a saved Workflow that makes the change. In the OpenWork app, read-only tools can run as soon as the App opens, and one click in the App allows exactly one other tool call, so give each other connection tool or Workflow run its own button. create_app refuses a tool whose capability you can’t use, and publishes nothing.Share an App by sharing its Plugin. create_app adds the Workflows the App’s tools run to that Plugin, so they are shared with it; you need to manage each of those Workflows. People with access can open the App in the OpenWork app, which opens new revisions right after create_app or update_app. They can also copy the App’s MCP URL from its Plugin page into Cursor, Claude, or another MCP client and sign in with OpenWork. Admins can put an App on an organization dashboard from Add app → Apps built in OpenWork; its tile keeps opening the App’s latest revision. In a chat, the agent opens an existing App by executing its search_capabilities match; an optional body object becomes the App’s launch input. The OpenWork app lists at most 100 connections and Apps for each person; an App past that limit can’t open inside OpenWork, but its MCP URL still works in other MCP clients.read_app returns source to editors, and update_app publishes a new revision at the same MCP URL, which the App’s earlier chat cards open too; omit cssSource, description, or tools to keep the current ones. Building your own Apps is off by default: an OpenWork platform admin turns it on for an organization in /admin, and it also needs member-facing MCP connections, which are on by default. Once it is on, Apps made earlier from a Workflow with save_artifact_view are read-only: they still open and refresh, but they can’t be created, edited, or re-activated. MCP Apps from connected MCP servers work either way. Self-hosted deployments can set DEN_APP_MCP_SERVERS_ENABLED=false to turn it off for every organization.