When asked what can be connected or to browse quick adds, call search_capabilities with type connectors and any descriptive query. This returns the legacy version 1 connectorCatalog envelope, including Google Workspace and Microsoft 365. Released clients may render their existing browse catalog; new clients intentionally ignore it. No new setup card is introduced. Setup options are not executable capabilities or proof of connection. Organization administrators manage setup in the organization Connections dashboard. Named-service searches include legacy setup suggestions only with explicit intent connect, type omitted, all, or mcp, and no matching mcp connection; modern clients ignore these catalogs. Never invent credentials or claim setup is finished. Existing connection actions take priority.
This OpenWork Cloud MCP server uses standard MCP tools, resources, structured results, and list-changed notifications.
For connection actions and saved Workflows, call search_capabilities with 2-4 keyword variants before concluding something is unavailable. Use execute_capability only with exact names returned by search_capabilities. A successful search_capabilities call proves this connection is authorized: Never tell the user to reconnect OpenWork Cloud because a downstream connector failed.
Capabilities include native Google Workspace operations (Gmail read/search, Calendar list/create, Drive search/read, and Gmail draft creation) executed with the signed-in member's organization credentials, plus any MCP connections the organization has added. Allowlisted platform admins also discover namespaced OpenWork Admin capabilities here; other members cannot.
A remote session offloads work to a native chat on OpenWork Cloud, an OpenWork desktop, or an opted-in OpenCode client. The default target is the member's OpenWork Web instance, running in the cloud and visible in the browser. When asked to do something "on the remote session", "in the web", or "in the cloud" (e.g. "run a Slac
Protocol
Pass100/10016 / 16 pts
Connection, authentication, and protocol compatibility.
App resources, metadata, and rendering requirements.
Tool invocation metadata present
3 tool(s) missing openai/toolInvocation metadata
How to fix: For tools that render a UI resource, add openai/toolInvocation with string fields invoking and invoked (present-tense labels shown while the tool runs and after it finishes, e.g. "Searching…" / "Searched").
How to fix: Use a ui:// URI and text/html;profile=mcp-app. For mcp-use v1, use widgetMetadata.metadata.widgetDescription; for v2, use the bound tool's view.description. The current description check reads _meta.ui.widgetDescription or _meta["openai/widgetDescription"] on resource contents or linked tools, not resource.description. Consequently, v2 view.description alone may leave this warning: report the checker compatibility gap instead of adding unsupported v1 fields or claiming the warning is fixed.
How to fix: For ChatGPT submission, set one exact HTTPS origin such as "https://app.example.com" on every view via _meta.ui.domain (or openai/widgetDomain). Paths are not valid and all views in one app must share the origin.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Prepare an App before writing its source: a title that names its outcome, one sentence on what the person sees and does, and the exact tools from search_capabilities (none for a self-contained App). Verifies the tools and returns their input schemas, a preparationId for create_app, and a React/CSS starter already wired to them: lookup when every tool reads, action when one changes data, standalone with no tools. Does not run tools, create a Plugin, or publish an App. Requires mcp:write.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
title
Not provided
Missing description. Explain what this value means and how to supply it.
description
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › name
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › description
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › capability
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › mode
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Create an App, which is its own MCP server, from complete React/CSS source, a readable textFallback, and the tools it needs. It needs no Workflow, output schema, or Automation. Pass prepare_app's preparationId so OpenWork shows this build as the App it prepared; this call still checks bindings, compiles the source, and saves the App itself. Older clients may omit it. Each tool has a snake_case name, a description, and one exact capability from search_capabilities: a saved Workflow, a connection tool, or an OpenWork action that reads (GET). OpenWork actions are read-only here: to change OpenWork data, bind a saved Workflow that makes the change. Use mode live for a Workflow that reads input.runtime. Tools run as the person using the App. reactSource default-exports a component receiving { app, input, result, hostContext }: input is the launch input, and result is the launch CallToolResult (read result?.structuredContent), undefined until delivered. hostContext carries theme ("light" or "dark"), styles.variables (CSS variables such as --color-text-primary, --color-background-primary, --color-border-primary and --font-sans) and containerDimensions { maxHeight, width }; the component re-renders when the host sends them again after a change. React is injected: use React.useState and other React APIs without imports. Do not use fetch, browser or host globals, timers, dynamic code, external resources, URL-bearing elements, or <form>, <svg>, <style>, or <math> elements; use labeled inputs and type=button controls. Call only declared tools, with app.callServerTool({ name, arguments }): a Workflow or connection tool takes the capability's arguments, an OpenWork action { path, query, body }, and a live Workflow only an optional { timeZone }. Show a blocked state if app.getHostCapabilities()?.serverTools is absent. Opening the App is enough intent to load its data: once the launch result arrives (result is no longer undefined), call the read-only tools its focal view needs with the launch input, with no click, and show the data. OpenWork runs a call without a click only for a tool that needs no approval, once per open and once the App is on screen. A tool that changes something (send, create, update, delete) or needs approval runs only from its own button: OpenWork allows one such call per click. Never call a tool on every keystroke; load again on Enter or a button. If the host refuses a call because it needs approval (its error mentions approval), keep that button so the person can approve and try again. To show data instantly, pass _meta { "openwork/cache": "store" } on a call so OpenWork keeps its result when the tool is read-only, and, when app.getHostContext()?.experimental?.["openwork/result-cache"] is true, call the same tool and arguments with _meta { "openwork/cache": "read" } as the App opens, then load it live. That read runs no tool: OpenWork answers from this person's own storage with the last result (_meta "openwork/cached": true and "openwork/cachedAt"), or isError when none is kept. If the live load fails, keep showing what the App already has, marked stale with its time; OpenWork drops the kept result, so the next open starts without it. It goes in a new private Plugin named after it unless the user names an existing pluginId; the Workflows its tools run join that Plugin, and sharing the Plugin shares the App.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 11 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
reactSource
Not provided
Missing description. Explain what this value means and how to supply it.
cssSource
Not provided
Missing description. Explain what this value means and how to supply it.
title
Not provided
Missing description. Explain what this value means and how to supply it.
description
Not provided
Missing description. Explain what this value means and how to supply it.
textFallback
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › name
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › description
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › capability
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › mode
Not provided
Missing description. Explain what this value means and how to supply it.
pluginId
Not provided
Missing description. Explain what this value means and how to supply it.
preparationId
Not provided
Missing description. Explain what this value means and how to supply it.
{
"name": "create_app",
"title": "Create an App",
"description": "Create an App, which is its own MCP server, from complete React/CSS source, a readable textFallback, and the tools it needs. It needs no Workflow, output schema, or Automation. Pass prepare_app's preparationId so OpenWork shows this build as the App it prepared; this call still checks bindings, compiles the source, and saves the App itself. Older clients may omit it. Each tool has a snake_case name, a description, and one exact capability from search_capabilities: a saved Workflow, a connection tool, or an OpenWork action that reads (GET). OpenWork actions are read-only here: to change OpenWork data, bind a saved Workflow that makes the change. Use mode live for a Workflow that reads input.runtime. Tools run as the person using the App. reactSource default-exports a component receiving { app, input, result, hostContext }: input is the launch input, and result is the launch CallToolResult (read result?.structuredContent), undefined until delivered. hostContext carries theme (\"light\" or \"dark\"), styles.variables (CSS variables such as --color-text-primary, --color-background-primary, --color-border-primary and --font-sans) and containerDimensions { maxHeight, width }; the component re-renders when the host sends them again after a change. React is injected: use React.useState and other React APIs without imports. Do not use fetch, browser or host globals, timers, dynamic code, external resources, URL-bearing elements, or <form>, <svg>, <style>, or <math> elements; use labeled inputs and type=button controls. Call only declared tools, with app.callServerTool({ name, arguments }): a Workflow or connection tool takes the capability's arguments, an OpenWork action { path, query, body }, and a live Workflow only an optional { timeZone }. Show a blocked state if app.getHostCapabilities()?.serverTools is absent. Opening the App is enough intent to load its data: once the launch result arrives (result is no longer undefined), call the read-only tools its focal view needs with the launch input, with no click, and show the data. OpenWork runs a call without a click only for a tool that needs no approval, once per open and once the App is on screen. A tool that changes something (send, create, update, delete) or needs approval runs only from its own button: OpenWork allows one such call per click. Never call a tool on every keystroke; load again on Enter or a button. If the host refuses a call because it needs approval (its error mentions approval), keep that button so the person can approve and try again. To show data instantly, pass _meta { \"openwork/cache\": \"store\" } on a call so OpenWork keeps its result when the tool is read-only, and, when app.getHostContext()?.experimental?.[\"openwork/result-cache\"] is true, call the same tool and arguments with _meta { \"openwork/cache\": \"read\" } as the App opens, then load it live. That read runs no tool: OpenWork answers from this person's own storage with the last result (_meta \"openwork/cached\": true and \"openwork/cachedAt\"), or isError when none is kept. If the live load fails, keep showing what the App already has, marked stale with its time; OpenWork drops the kept result, so the next open starts without it. It goes in a new private Plugin named after it unless the user names an existing pluginId; the Workflows its tools run join that Plugin, and sharing the Plugin shares the App.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reactSource",
"title",
"textFallback"
],
"properties": {
"title": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"tools": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"description",
"capability"
],
"properties": {
"mode": {
"enum": [
"input",
"live"
],
"type": "string"
},
"name": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,63}$"
},
"capability": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"description": {
"type": "string",
"maxLength": 1000,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 20
},
"pluginId": {
"type": "string",
"pattern": "^plg_[0-7][0-9a-hjkmnp-tv-z]{25}$",
"maxLength": 30,
"minLength": 30
},
"cssSource": {
"type": "string",
"maxLength": 100000
},
"description": {
"type": "string",
"maxLength": 2000
},
"reactSource": {
"type": "string",
"maxLength": 200000,
"minLength": 1
},
"textFallback": {
"type": "string",
"maxLength": 8000,
"minLength": 1
},
"preparationId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"$defs": {
"__schema0": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/__schema0"
}
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema0"
}
}
]
},
"__schema1": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/__schema1"
}
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema1"
}
}
]
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"app",
"input",
"mcpUrl"
],
"properties": {
"app": {
"type": "object",
"required": [
"appId",
"pluginId",
"revisionId",
"title",
"description",
"textFallback",
"toolName",
"resourceUri",
"serverPath",
"tools"
],
"properties": {
"appId": {
"type": "string",
"pattern": "^cob_[0-7][0-9a-hjkmnp-tv-z]{25}$",
"maxLength": 30,
"minLength": 30
},
"title": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"tools": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"description",
"capability",
"mode",
"readOnly"
],
"properties": {
"mode": {
"enum": [
"input",
"live"
],
"type": "string"
},
"name": {
"type": "string"
},
"readOnly": {
"type": "boolean"
},
"capability": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"pluginId": {
"type": "string",
"pattern": "^plg_[0-7][0-9a-hjkmnp-tv-z]{25}$",
"maxLength": 30,
"minLength": 30
},
"toolName": {
"type": "string",
"const": "open_app"
},
"revisionId": {
"type": "string",
"pattern": "^cov_[0-7][0-9a-hjkmnp-tv-z]{25}$",
"maxLength": 30,
"minLength": 30
},
"serverPath": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"resourceUri": {
"type": "string"
},
"textFallback": {
"type": "string",
"maxLength": 8000,
"minLength": 1
}
},
"additionalProperties": false
},
"input": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema0"
}
},
"launch": {
"type": "object",
"required": [
"connectionId",
"toolName",
"resourceUri",
"arguments"
],
"properties": {
"toolName": {
"type": "string",
"const": "open_app"
},
"arguments": {
"type": "object",
"required": [
"input"
],
"properties": {
"input": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema1"
}
}
},
"additionalProperties": false
},
"resourceUri": {
"type": "string"
},
"connectionId": {
"type": "string"
}
},
"additionalProperties": false
},
"mcpUrl": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Update an existing App with complete replacement React source, title, and textFallback, following create_app's rules. First read_app, and copy its revisionId to expectedRevisionId. Omit cssSource, description, or tools to keep the current ones, or pass complete replacements. Publishes an immutable revision in the same Plugin and MCP server; newly bound Workflows join that Plugin, so everyone it is shared with can run them. Requires editor access and the mcp:write scope.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 11 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
reactSource
Not provided
Missing description. Explain what this value means and how to supply it.
cssSource
Not provided
Missing description. Explain what this value means and how to supply it.
title
Not provided
Missing description. Explain what this value means and how to supply it.
description
Not provided
Missing description. Explain what this value means and how to supply it.
textFallback
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › name
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › description
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › capability
Not provided
Missing description. Explain what this value means and how to supply it.
tools › items › mode
Not provided
Missing description. Explain what this value means and how to supply it.
appId
Not provided
Missing description. Explain what this value means and how to supply it.
expectedRevisionId
Not provided
Missing description. Explain what this value means and how to supply it.
Shorten the title to an action and subject; move usage details into the description.
Description84/100
Read an App's latest summary, declared tools, and React/CSS source before editing. Requires mcp:read and editor access, not merely permission to open the App. Does not open or run the App.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 1 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
appId
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Search connection actions, saved Workflows, and skills by keyword. Direct tools such as create_skill, get_skill, and the App builders prepare_app, create_app, read_app, and update_app are outside this search; call them directly. Search covers native Google Workspace capabilities (Gmail, Calendar, Drive, Gmail drafts), org-connected external MCPs, and namespaced OpenWork Admin tools for allowlisted platform admins. Accessible Workflows appear as marketplace matches with kind workflow and execute through execute_capability like every other exact search result. Try 2-4 keyword variants before deciding a capability is unavailable. Native API matches include a connector-namespaced name, pathParams, queryParams, querySchema, hasBody, and bodySchema. External MCP matches include argumentsSchema, schemaDigest, and invocation.argumentsField. A match with kind mcp_app is a standard MCP App launch capability, either an App built in OpenWork (its own MCP server at the match path) or an App from a connected MCP server; execute it normally and the OpenWork host will render its advertised ui:// resource. Built-in and marketplace skill matches return SKILL.md content when executed; list_skills and get_skill are the direct, keyword-free way to reach skills.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
intent
Use connect only when the user explicitly asks to connect, reconnect, or set up a service. Ordinary capability discovery must omit this or use discover; it will not show sign-in cards.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Keywords describing the capability you need, e.g. "create organization" or "list workers".
Clear enough to supply this argument.
limit
Max number of matches to return. Defaults to 5.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Optional source filter. all searches every available source; api searches Den API capabilities; admin searches allowlisted platform-admin tools; mcp searches connected external MCP tools; marketplace searches marketplace plugin capabilities; skills searches built-in and marketplace skills; connectors returns the legacy browse catalog envelope without probing connected tools; released clients may render it and new clients ignore it. Defaults to all.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Call a capability found via search_capabilities, by its exact name. Pass path/query/body only as described by that match's pathParams/queryParams/hasBody. For external MCP capabilities, provider-advertised schema mismatches are returned as advisory schemaGuidance alongside the provider result; they do not block the downstream call. When the exact capability is a standard MCP App launch tool, this call preserves its originating tool and ui:// binding so compatible OpenWork hosts render it without requiring a generated direct-tool name. For skill capabilities listed in the remote skill catalog, this returns their authorized SKILL.md content; get_skill reads the same content by skill name without a search. Returns unknown_capability if name doesn't match a current capability — call search_capabilities again.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The exact tool name returned by search_capabilities.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
schemaDigest
For an external MCP match, copy the exact schemaDigest returned by search_capabilities so schema drift can be reported as advisory guidance without blocking the provider call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
path
Path parameters, only if the match's pathParams is non-empty.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Query parameters, only if the match's queryParams is non-empty.
Explain the meaning of this value, not just its name.
body
For native API capabilities, the JSON body. For external MCP capabilities, the arguments object matching argumentsSchema. For an App (kind mcp_app), an optional launch input object the App receives.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "execute_capability",
"title": "Execute capability",
"description": "Call a capability found via search_capabilities, by its exact name. Pass path/query/body only as described by that match's pathParams/queryParams/hasBody. For external MCP capabilities, provider-advertised schema mismatches are returned as advisory schemaGuidance alongside the provider result; they do not block the downstream call. When the exact capability is a standard MCP App launch tool, this call preserves its originating tool and ui:// binding so compatible OpenWork hosts render it without requiring a generated direct-tool name. For skill capabilities listed in the remote skill catalog, this returns their authorized SKILL.md content; get_skill reads the same content by skill name without a search. Returns unknown_capability if name doesn't match a current capability — call search_capabilities again.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"body": {
"description": "For native API capabilities, the JSON body. For external MCP capabilities, the arguments object matching argumentsSchema. For an App (kind mcp_app), an optional launch input object the App receives."
},
"name": {
"type": "string",
"minLength": 1,
"description": "The exact tool name returned by search_capabilities."
},
"path": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "Path parameters, only if the match's pathParams is non-empty."
},
"query": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "Query parameters, only if the match's queryParams is non-empty."
},
"schemaDigest": {
"type": "string",
"pattern": "^sha256:[a-f0-9]{64}$",
"description": "For an external MCP match, copy the exact schemaDigest returned by search_capabilities so schema drift can be reported as advisory guidance without blocking the provider call."
}
}
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List every skill available to the signed-in OpenWork member: the built-in Cloud skills plus each marketplace or plugin skill they may use. Needs no keywords. Each entry carries the stable name, the exact capability, the title and description, and the marketplace / plugin source when known. Pass the returned name or capability to get_skill to read that skill's SKILL.md. Use query only to narrow a long catalog.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Optional keywords; keeps skills whose name, title, description, marketplace, or plugin contains every word. Omit to list everything.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max number of skills to return. Defaults to every match, at most 200.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Read one skill's authorized SKILL.md by its name or exact capability, as returned by list_skills or the skill index. The text content is the complete SKILL.md; read it fully before following it. Returns unknown_skill when nothing matches — call list_skills for the exact name.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
name
The skill name (e.g. create-skill) or its exact capability (e.g. skill:create-skill or plugin:<pluginId>:<configObjectId>).
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Create one private OpenWork Cloud skill in a new Plugin. Pass a complete SKILL.md with valid frontmatter and instructions. The skill is immediately available to its creator; this does not publish it to a Marketplace or share it. Returns the saved skill details and a text confirmation.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pluginName
Display name for the new Plugin.
Clear enough to supply this argument.
skillMarkdown
Complete SKILL.md source, including frontmatter and instructions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Update one existing OpenWork Cloud skill by creating a new immutable version, without creating a duplicate Plugin. Pass the skill's config object id and the complete replacement SKILL.md. Returns the saved skill details and a text confirmation.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
skillId
The existing skill's config object id (cob_…).
Clear enough to supply this argument.
skillMarkdown
Complete replacement SKILL.md source, including frontmatter and instructions.
Clear enough to supply this argument.
reason
Optional short reason recorded on the new version.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Read an authorized immutable result from a Workflow and present it as a Workflow Artifact. Use the latest successful snapshot by default, or pass receiptId to pin an exact snapshot. This tool never runs or refreshes a Workflow; Automations and explicit Workflow runs own data refresh. Clients without MCP Apps support receive the same artifact as Markdown text.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
configObjectId
The Workflow configObjectId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
receiptId
Optional exact immutable artifact receipt. Defaults to the latest successful snapshot.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxAgeMs
Freshness threshold used for the rendered status. Defaults to 24 hours.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Test a confined JavaScript function body; end with return of JSON-safe data. No imports, fetch, process or host access; use tools for external work and Promise.all for independent calls. mode defaults to adhoc with optional input parameters. Explicit live mode can call the same tools as adhoc (including connection tools), rejects all caller input, and supplies only input.runtime.{now,today,dayStart,dayEnd,timeZone} from the server; optional IANA timeZone defaults to UTC and is live-only. Use exact scriptPath from search_capabilities, never guessed namespaces or operation names. For a discovered Den/native path call it with {path:{...},query:{...},body:{...}} only as advertised; native query parameters must be wrapped in query, e.g. {query:{q:input.query}}. External MCP paths take their argumentsSchema object directly. Example adhoc code: return 1 + 1. Example live code: return {today:input.runtime.today}. tools.$codemode.search({query}) is for adhoc exploration; saved Workflows must call discovered paths directly. Optional inputSchema is checked before dispatch and outputSchema after execution; inspect discovered outputSchema for result shape rather than guessing. Successful tests return value plus authoring-test metadata and receiptId; source retention availability/scope controls whether saveWorkflow can reuse that receipt. This is not a saved Workflow artifact snapshot. To back an App with a reusable live procedure: test with mode:live and outputSchema, saveWorkflow with receiptId and the same schemas (omit code/currentInput), then bind that saved Workflow in create_app with mode live.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
4 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
code
Not provided
Missing description. Explain what this value means and how to supply it.
mode
Not provided
Missing description. Explain what this value means and how to supply it.
input
Adhoc parameters, normalized from JSON if needed. Live rejects any caller input, including runtime.
Clear enough to supply this argument.
timeZone
IANA time zone for live mode only; defaults to UTC.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inputSchema
JSON Schema object checked against script input before any tool dispatch.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
outputSchema
JSON Schema object checked against the returned value. Discover capability outputSchema to design this contract.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "execute_capability_script",
"title": "Execute capability script",
"description": "Test a confined JavaScript function body; end with return of JSON-safe data. No imports, fetch, process or host access; use tools for external work and Promise.all for independent calls. mode defaults to adhoc with optional input parameters. Explicit live mode can call the same tools as adhoc (including connection tools), rejects all caller input, and supplies only input.runtime.{now,today,dayStart,dayEnd,timeZone} from the server; optional IANA timeZone defaults to UTC and is live-only. Use exact scriptPath from search_capabilities, never guessed namespaces or operation names. For a discovered Den/native path call it with {path:{...},query:{...},body:{...}} only as advertised; native query parameters must be wrapped in query, e.g. {query:{q:input.query}}. External MCP paths take their argumentsSchema object directly. Example adhoc code: return 1 + 1. Example live code: return {today:input.runtime.today}. tools.$codemode.search({query}) is for adhoc exploration; saved Workflows must call discovered paths directly. Optional inputSchema is checked before dispatch and outputSchema after execution; inspect discovered outputSchema for result shape rather than guessing. Successful tests return value plus authoring-test metadata and receiptId; source retention availability/scope controls whether saveWorkflow can reuse that receipt. This is not a saved Workflow artifact snapshot. To back an App with a reusable live procedure: test with mode:live and outputSchema, saveWorkflow with receiptId and the same schemas (omit code/currentInput), then bind that saved Workflow in create_app with mode live.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1
},
"mode": {
"enum": [
"adhoc",
"live"
],
"type": "string",
"default": "adhoc"
},
"input": {
"description": "Adhoc parameters, normalized from JSON if needed. Live rejects any caller input, including runtime."
},
"timeZone": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "IANA time zone for live mode only; defaults to UTC."
},
"inputSchema": {
"type": "object",
"description": "JSON Schema object checked against script input before any tool dispatch.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"outputSchema": {
"type": "object",
"description": "JSON Schema object checked against the returned value. Discover capability outputSchema to design this contract.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search capabilitiesSearch connection actions, saved Workflows, and skills by keyword.
02List skillsList every skill available to the signed-in OpenWork member: the built-in Cloud skills plus each marketplace or plugin skill they may use.
03Get skillRead one skill's authorized SKILL.md by its name or exact capability, as returned by list_skills or the skill index.
04Render Workflow ArtifactRead an authorized immutable result from a Workflow and present it as a Workflow Artifact.
05ConnectionApp-only authorized live connection status.
Want to run these tasks against your MCP server with us?
openwork-den-api-agent setup, tools, quality score, publishing readiness, and alternatives.
How do I add openwork-den-api-agent to Claude, ChatGPT, or Cursor?
Add openwork-den-api-agent to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://api.openworklabs.com/mcp/agent.
Is openwork-den-api-agent MCP ready for ChatGPT and Claude?
As of October 15, 2026, openwork-den-api-agent scores 88/100 on Manufact's MCP publishing checklist. The scan does not yet meet ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is openwork-den-api-agent's MCP tool documentation?
As of October 15, 2026, openwork-den-api-agent scores 75/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 14 of 14 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to openwork-den-api-agent?
As of October 15, 2026, alternatives to openwork-den-api-agent in developer-tools on the Manufact MCP catalog include Held at the Gate, Speko, turva.dev, AgentMail, and Celesto Cloud Computers.
How can openwork-den-api-agent improve its MCP documentation?
connection_action is the lowest-scoring reviewed tool at 44/100. 0 of 1 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.