Read openwork://agent/guidance.md with resources/read before working; it contains the full connection, remote-session, import, and Workflow rules.
Search capabilities with 2-4 keyword variants; execute only exact returned names. Copy external argumentsSchema into body and schemaDigest into schemaDigest. Schema guidance is advisory; never repeat a successful provider call because of it.
Only use intent connect for an explicit connect/reconnect request. Discovery must not trigger sign-in. Relay the connection's exact action; a downstream failure does not mean OpenWork needs reconnecting. Never invent credentials or claim setup is ready.
Use list_skills/get_skill for authorized skills and follow the matching skill before creating or sharing one. update_skill publishes an immutable version.
For Apps read build-an-app with get_skill, then use prepare_app/create_app/read_app/update_app; never substitute local HTML or legacy views. Open Apps via their discovered capability.
Honor requests to work remotely by delegating the whole request with remote-session:create/send, then reading its receipt; do not perform that work here. Only schedule an Automation when asked.
Protocol
Pass100/10016 / 16 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
App-only: check the current member's authorized external MCP connection and stored credential readiness. Returns structured connectionId, connectionName, state, responsible actor, message, and suggested action, plus a text fallback. Does not contact the provider, start OAuth, or change credentials. Errors return text with isError.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
connectionId
The external MCP connection ID from a connection status result, not a provider name or capability ID. The current member must have access to it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
App-only: validate the member's authenticate or skip choice against current authorized connection readiness. Authenticate requires an eligible per-member OAuth connection; unsupported setup returns an error. Returns a structured connection_action_intent with action and connection status, also serialized as text. Does not start OAuth, change credentials, or persist the choice. Errors return text with isError.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
connectionId
The external MCP connection ID from a connection status result, not a provider name or capability ID. The current member must have access to it.
Clear enough to supply this argument.
action
The member's choice in the connection App: authenticate validates eligibility for per-member OAuth; skip returns a skip intent. Neither choice starts OAuth, changes credentials, or saves a preference.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Prepare an App before writing its source, using a title naming its outcome, a description of what the person sees and does, and exact tools from search_capabilities (none for a self-contained App). Returns preparationId for create_app, title, verified tools with inputSchema/readOnly/kind/mode, starter { reactSource, cssSource }, and nextSteps. The starter pattern is lookup when all tools read, action when one changes data, or standalone with no tools; nextSteps identifies tools not yet wired. Does not run tools, create a Plugin, or publish an App. Requires mcp:write. Follow skill:build-an-app for authoring rules.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
Short human-readable title naming the App's outcome, not a generic label such as Dashboard.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
One sentence describing what the person sees and does in the App.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tools › items › name
Name exposed by this App and used to select this tool in app.callServerTool.
Clear enough to supply this argument.
tools › items › description
What this tool does for the person using the App, including any changes it makes.
Clear enough to supply this argument.
tools › items › capability
Exact capability name returned by search_capabilities: a saved Workflow, connection tool, or read-only OpenWork GET action.
Clear enough to supply this argument.
tools › items › mode
input (default) passes the caller's arguments; live runs a saved Workflow using server-supplied input.runtime and accepts only an optional timeZone.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Create and publish an App as its own MCP server from complete React/CSS source, textFallback, and declared tools. Read skill:build-an-app for required source, host, approval, caching, and tool-call rules before writing source; start with prepare_app and pass its preparationId (optional for older clients). This call rechecks bindings, compiles source, and saves the App; no Workflow, output schema, or Automation is required. Bind exact capabilities from search_capabilities: saved Workflows, connection tools, or read-only OpenWork GET actions. To change OpenWork data, bind a saved Workflow. Tools run as the person using the App. Load read-only data on open after the launch result arrives; changes and approval-required calls need their own button, one call per click. Creates a new private Plugin unless pluginId selects an existing one. Bound Workflows join that Plugin; sharing it shares the App and those Workflows. Requires mcp:write. Returns app (summary including appId, pluginId, revisionId and tools, not source), input (empty launch input), mcpUrl, and usually launch { connectionId, toolName, resourceUri, arguments }. launch is omitted when the App is beyond OpenWork's connection limit; mcpUrl still works in MCP clients. OpenWork opens an available App in a sidebar tab; other hosts receive its MCP URL and text fallback. Reply briefly.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reactSource
Complete React source default-exporting a component receiving { app, input, result, hostContext }. React is injected; use no imports. Follow skill:build-an-app's source and tool-call rules.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cssSource
Complete CSS source using host theme variables and responsive container rules. Omit on creation for empty CSS; omit on update to keep existing CSS.
Clear enough to supply this argument.
title
Short human-readable title naming the App's outcome, not a generic label such as Dashboard.
Clear enough to supply this argument.
description
One sentence describing what the person sees and does in the App.
Clear enough to supply this argument.
textFallback
Readable plain-text alternative describing what the App shows, for hosts that cannot render it; usually one or two sentences.
Clear enough to supply this argument.
tools › items › name
Name exposed by this App and used to select this tool in app.callServerTool.
Clear enough to supply this argument.
tools › items › description
What this tool does for the person using the App, including any changes it makes.
Clear enough to supply this argument.
tools › items › capability
Exact capability name returned by search_capabilities: a saved Workflow, connection tool, or read-only OpenWork GET action.
Clear enough to supply this argument.
tools › items › mode
input (default) passes the caller's arguments; live runs a saved Workflow using server-supplied input.runtime and accepts only an optional timeZone.
Clear enough to supply this argument.
pluginId
Existing Plugin ID (plg_...) to contain the App; omit to create a new private Plugin named after the App. Sharing that Plugin shares the App and its bound Workflows.
Clear enough to supply this argument.
preparationId
UUID returned by prepare_app, correlating this build with its preparation in chat. It grants no access and does not skip validation; older clients may omit it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Update an existing App with complete replacement React source, title, and textFallback, following create_app's rules. First read_app, and copy its app.revisionId to expectedRevisionId. Omit cssSource, description, or tools to keep the current ones, or pass complete replacements. Follow skill:build-an-app's source and tool-call rules. 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. Returns app (updated summary, not source), input (empty launch input), mcpUrl, and launch { connectionId, toolName, resourceUri, arguments } unless OpenWork's connection limit prevents opening it. The MCP URL remains usable. OpenWork opens an available App in a sidebar tab.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reactSource
Complete React source default-exporting a component receiving { app, input, result, hostContext }. React is injected; use no imports. Follow skill:build-an-app's source and tool-call rules.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cssSource
Complete CSS source using host theme variables and responsive container rules. Omit on creation for empty CSS; omit on update to keep existing CSS.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
Short human-readable title naming the App's outcome, not a generic label such as Dashboard.
Clear enough to supply this argument.
description
Replacement description of what the person sees and does; omit to keep the current description, or pass an empty string to clear it.
Clear enough to supply this argument.
textFallback
Readable plain-text alternative describing what the App shows, for hosts that cannot render it; usually one or two sentences.
Clear enough to supply this argument.
tools › items › name
Name exposed by this App and used to select this tool in app.callServerTool.
Clear enough to supply this argument.
tools › items › description
What this tool does for the person using the App, including any changes it makes.
Clear enough to supply this argument.
tools › items › capability
Exact capability name returned by search_capabilities: a saved Workflow, connection tool, or read-only OpenWork GET action.
Clear enough to supply this argument.
tools › items › mode
input (default) passes the caller's arguments; live runs a saved Workflow using server-supplied input.runtime and accepts only an optional timeZone.
Clear enough to supply this argument.
appId
App ID (cob_...) from search_capabilities or an App result's app.appId; not its Plugin ID, revision ID, or capability name.
Clear enough to supply this argument.
expectedRevisionId
Latest revision ID (cov_...) from read_app's app.revisionId. The update fails if someone has published another revision since that read.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Read an App before editing. Returns app (latest summary including appId, pluginId, revisionId, title, description, textFallback, tools and launch resource/server identifiers), reactSource, and cssSource. Use app.revisionId as update_app's expectedRevisionId; tools are summaries, not input schemas. 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.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
appId
App ID (cob_...) from search_capabilities or an App result's app.appId; not its Plugin ID, revision ID, or capability name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/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. Returns matches with exact name, summary, kind, invocation schemas, and connection status where available; optional hint explains coverage or next steps. connectionAction carries an explicit sign-in card; connectorCatalog contains setup suggestions, not executable tools. Built-in and marketplace skills return SKILL.md when executed; list_skills/get_skill reach them directly.
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
Result budget for the highest-ranking capability matches.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Source to search: API operations, platform-admin tools, connected MCPs, marketplace capabilities, or skills. connectors browses setup suggestions without probing tools; all combines accessible sources.
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
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 the capability's content and, when supplied, its structuredContent unchanged: provider fields, Workflow results, skill content, or an App launch reference. Connection failures can include a connectionAction card; schemaGuidance is advisory. Other failures return error details in text with isError. Returns unknown_capability for stale names; search again.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Capability identifier from a current search_capabilities match or authorized skill catalog entry.
Clear enough to supply this argument.
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
Values substituted into the native API route placeholders named by the match's pathParams.
Clear enough to supply this argument.
query
Native API URL query values used to filter, sort, or page the request, keyed as advertised by the match's querySchema and queryParams.
Clear enough to supply this argument.
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 the capability's content and, when supplied, its structuredContent unchanged: provider fields, Workflow results, skill content, or an App launch reference. Connection failures can include a connectionAction card; schemaGuidance is advisory. Other failures return error details in text with isError. Returns unknown_capability for stale names; search 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": "Capability identifier from a current search_capabilities match or authorized skill catalog entry."
},
"path": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "Values substituted into the native API route placeholders named by the match's pathParams."
},
"query": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "Native API URL query values used to filter, sort, or page the request, keyed as advertised by the match's querySchema and queryParams."
},
"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.
Description100/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. Read-only; requires an active OpenWork membership. Returns skills (authorized matching descriptors, without SKILL.md content), total (matches before limit), and an optional hint for empty or truncated results. 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
Keywords to narrow the authorized catalog; every search token must appear in the skill's name, title, description, marketplace, or plugin. Omit to browse without filtering.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Number of matching skill descriptors to include; total still counts all matches, so use query to narrow a truncated catalog.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"skills",
"total"
],
"properties": {
"hint": {
"type": "string",
"description": "Guidance when the catalog is empty or the returned list is truncated."
},
"total": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Number of authorized matching skills before applying limit."
},
"skills": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"title",
"description",
"capability",
"location"
],
"properties": {
"name": {
"type": "string",
"description": "Stable skill name accepted by get_skill."
},
"title": {
"type": "string",
"description": "Human-readable skill title."
},
"location": {
"type": "string",
"description": "skill:// resource URI for this skill."
},
"capability": {
"type": "string",
"description": "Exact capability identifier accepted by get_skill or execute_capability."
},
"pluginName": {
"type": "string",
"description": "Source Plugin's display name, when known."
},
"description": {
"type": "string",
"description": "Summary of what the skill does and when to use it."
},
"marketplaceName": {
"type": "string",
"description": "Source marketplace's display name, when known."
}
},
"additionalProperties": false
},
"description": "Authorized matching skill descriptors, capped by limit; does not include SKILL.md content."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_skills",
"title": "List skills",
"description": "List every skill available to the signed-in OpenWork member: the built-in Cloud skills plus each marketplace or plugin skill they may use. Read-only; requires an active OpenWork membership. Returns skills (authorized matching descriptors, without SKILL.md content), total (matches before limit), and an optional hint for empty or truncated results. 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.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Number of matching skill descriptors to include; total still counts all matches, so use query to narrow a truncated catalog."
},
"query": {
"type": "string",
"maxLength": 200,
"description": "Keywords to narrow the authorized catalog; every search token must appear in the skill's name, title, description, marketplace, or plugin. Omit to browse without filtering."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"skills",
"total"
],
"properties": {
"hint": {
"type": "string",
"description": "Guidance when the catalog is empty or the returned list is truncated."
},
"total": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Number of authorized matching skills before applying limit."
},
"skills": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"title",
"description",
"capability",
"location"
],
"properties": {
"name": {
"type": "string",
"description": "Stable skill name accepted by get_skill."
},
"title": {
"type": "string",
"description": "Human-readable skill title."
},
"location": {
"type": "string",
"description": "skill:// resource URI for this skill."
},
"capability": {
"type": "string",
"description": "Exact capability identifier accepted by get_skill or execute_capability."
},
"pluginName": {
"type": "string",
"description": "Source Plugin's display name, when known."
},
"description": {
"type": "string",
"description": "Summary of what the skill does and when to use it."
},
"marketplaceName": {
"type": "string",
"description": "Source marketplace's display name, when known."
}
},
"additionalProperties": false
},
"description": "Authorized matching skill descriptors, capped by limit; does not include SKILL.md content."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Read one skill's authorized SKILL.md by its name or exact capability, as returned by list_skills or the skill index. Read-only; requires an active OpenWork membership and access to the skill. The text response is the complete SKILL.md; read it fully before following it. Structured content returns the skill descriptor plus content (the complete normalized SKILL.md) and optional provenance; it does not execute the instructions. Returns unknown_skill for missing or ambiguous references, skill_unavailable if the source is gone, or skill_needs_setup with status and action when a required connection is not ready. Call list_skills for an exact name or capability.
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 skill name (e.g. create-skill) or its exact capability (e.g. skill:create-skill or plugin:<pluginId>:<configObjectId>).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"title",
"description",
"capability",
"location",
"content"
],
"properties": {
"name": {
"type": "string",
"description": "Stable skill name accepted by get_skill."
},
"title": {
"type": "string",
"description": "Human-readable skill title."
},
"content": {
"type": "string",
"description": "Complete authorized SKILL.md with normalized name and description frontmatter followed by the source instructions."
},
"location": {
"type": "string",
"description": "skill:// resource URI for this skill."
},
"capability": {
"type": "string",
"description": "Exact capability identifier accepted by get_skill or execute_capability."
},
"pluginName": {
"type": "string",
"description": "Source Plugin's display name, when known."
},
"provenance": {
"type": "string",
"description": "Source or attribution information for the skill, when available."
},
"description": {
"type": "string",
"description": "Summary of what the skill does and when to use it."
},
"marketplaceName": {
"type": "string",
"description": "Source marketplace's display name, when known."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_skill",
"title": "Get skill",
"description": "Read one skill's authorized SKILL.md by its name or exact capability, as returned by list_skills or the skill index. Read-only; requires an active OpenWork membership and access to the skill. The text response is the complete SKILL.md; read it fully before following it. Structured content returns the skill descriptor plus content (the complete normalized SKILL.md) and optional provenance; it does not execute the instructions. Returns unknown_skill for missing or ambiguous references, skill_unavailable if the source is gone, or skill_needs_setup with status and action when a required connection is not ready. Call list_skills for an exact name or capability.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 512,
"minLength": 1,
"description": "The skill name (e.g. create-skill) or its exact capability (e.g. skill:create-skill or plugin:<pluginId>:<configObjectId>)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"title",
"description",
"capability",
"location",
"content"
],
"properties": {
"name": {
"type": "string",
"description": "Stable skill name accepted by get_skill."
},
"title": {
"type": "string",
"description": "Human-readable skill title."
},
"content": {
"type": "string",
"description": "Complete authorized SKILL.md with normalized name and description frontmatter followed by the source instructions."
},
"location": {
"type": "string",
"description": "skill:// resource URI for this skill."
},
"capability": {
"type": "string",
"description": "Exact capability identifier accepted by get_skill or execute_capability."
},
"pluginName": {
"type": "string",
"description": "Source Plugin's display name, when known."
},
"provenance": {
"type": "string",
"description": "Source or attribution information for the skill, when available."
},
"description": {
"type": "string",
"description": "Summary of what the skill does and when to use it."
},
"marketplaceName": {
"type": "string",
"description": "Source marketplace's display name, when known."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Create one private OpenWork Cloud skill in a new Plugin. Requires an active OpenWork Cloud membership, mcp:write scope, and permission to create Plugins and config objects. Pass a complete SKILL.md with valid name and description frontmatter and instructions. Creates persistent Plugin and skill records, not a draft; the skill is immediately available to its creator. This does not publish it to a Marketplace or share it. Returns structured saved-skill details: schemaVersion, optional mode (omitted means created), name, description, pluginId, skillId, and libraryUrl (or null), plus a text confirmation. Failures return an error code and message with isError.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pluginName
Display name for the new Plugin.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
skillMarkdown
The skill document to save: YAML frontmatter with name and description, followed by Markdown instructions telling an agent how and when to perform the task.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"schemaVersion",
"name",
"pluginId",
"skillId",
"description",
"libraryUrl"
],
"properties": {
"mode": {
"enum": [
"created",
"updated"
],
"type": "string",
"description": "Whether the skill was created or updated; omitted means created."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Saved skill title derived from its SKILL.md."
},
"skillId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Skill config object identifier; use this for subsequent update_skill calls."
},
"pluginId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Identifier of the new Plugin on create, or a visible associated Plugin on update."
},
"libraryUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Link to the Plugin in the OpenWork library, or null when unavailable."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Saved skill summary derived from its SKILL.md."
},
"schemaVersion": {
"type": "string",
"const": "1",
"description": "Version of the saved-skill response format."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create_skill",
"title": "Create skill",
"description": "Create one private OpenWork Cloud skill in a new Plugin. Requires an active OpenWork Cloud membership, mcp:write scope, and permission to create Plugins and config objects. Pass a complete SKILL.md with valid name and description frontmatter and instructions. Creates persistent Plugin and skill records, not a draft; the skill is immediately available to its creator. This does not publish it to a Marketplace or share it. Returns structured saved-skill details: schemaVersion, optional mode (omitted means created), name, description, pluginId, skillId, and libraryUrl (or null), plus a text confirmation. Failures return an error code and message with isError.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pluginName",
"skillMarkdown"
],
"properties": {
"pluginName": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Display name for the new Plugin."
},
"skillMarkdown": {
"type": "string",
"maxLength": 1048576,
"minLength": 1,
"description": "The skill document to save: YAML frontmatter with name and description, followed by Markdown instructions telling an agent how and when to perform the task."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"schemaVersion",
"name",
"pluginId",
"skillId",
"description",
"libraryUrl"
],
"properties": {
"mode": {
"enum": [
"created",
"updated"
],
"type": "string",
"description": "Whether the skill was created or updated; omitted means created."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Saved skill title derived from its SKILL.md."
},
"skillId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Skill config object identifier; use this for subsequent update_skill calls."
},
"pluginId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Identifier of the new Plugin on create, or a visible associated Plugin on update."
},
"libraryUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Link to the Plugin in the OpenWork library, or null when unavailable."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Saved skill summary derived from its SKILL.md."
},
"schemaVersion": {
"type": "string",
"const": "1",
"description": "Version of the saved-skill response format."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Publish a new immutable version of an existing OpenWork Cloud skill, without creating a duplicate Plugin or changing its sharing grants. Requires an active OpenWork Cloud membership, mcp:write scope, and editor access to the skill. Pass its config object id and the complete replacement SKILL.md, not a patch. Immediately replaces the latest instructions for users with access and may remove stale required-connection bindings. Earlier immutable versions remain in history; this tool cannot overwrite or erase a published version. To undo the content change, publish another version with the previous content. Repeated calls create additional versions. Returns structured saved-skill details: schemaVersion, mode (updated), name, description, pluginId (a visible associated Plugin), skillId, and libraryUrl (or null), plus a text confirmation. Failures return an error code and message with isError; a failure resolving saved details can occur after the version was written.
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.
skillId
The existing skill's config object id (cob_…).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
skillMarkdown
Complete replacement SKILL.md source, including frontmatter and instructions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reason
Why the skill is being changed; recorded as the new version's source revision reference for traceability.
Explain what happens when this optional value is omitted.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"schemaVersion",
"name",
"pluginId",
"skillId",
"description",
"libraryUrl"
],
"properties": {
"mode": {
"enum": [
"created",
"updated"
],
"type": "string",
"description": "Whether the skill was created or updated; omitted means created."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Saved skill title derived from its SKILL.md."
},
"skillId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Skill config object identifier; use this for subsequent update_skill calls."
},
"pluginId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Identifier of the new Plugin on create, or a visible associated Plugin on update."
},
"libraryUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Link to the Plugin in the OpenWork library, or null when unavailable."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Saved skill summary derived from its SKILL.md."
},
"schemaVersion": {
"type": "string",
"const": "1",
"description": "Version of the saved-skill response format."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "update_skill",
"title": "Update skill",
"description": "Publish a new immutable version of an existing OpenWork Cloud skill, without creating a duplicate Plugin or changing its sharing grants. Requires an active OpenWork Cloud membership, mcp:write scope, and editor access to the skill. Pass its config object id and the complete replacement SKILL.md, not a patch. Immediately replaces the latest instructions for users with access and may remove stale required-connection bindings. Earlier immutable versions remain in history; this tool cannot overwrite or erase a published version. To undo the content change, publish another version with the previous content. Repeated calls create additional versions. Returns structured saved-skill details: schemaVersion, mode (updated), name, description, pluginId (a visible associated Plugin), skillId, and libraryUrl (or null), plus a text confirmation. Failures return an error code and message with isError; a failure resolving saved details can occur after the version was written.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"skillId",
"skillMarkdown"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Why the skill is being changed; recorded as the new version's source revision reference for traceability."
},
"skillId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "The existing skill's config object id (cob_…)."
},
"skillMarkdown": {
"type": "string",
"maxLength": 1048576,
"minLength": 1,
"description": "Complete replacement SKILL.md source, including frontmatter and instructions."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"schemaVersion",
"name",
"pluginId",
"skillId",
"description",
"libraryUrl"
],
"properties": {
"mode": {
"enum": [
"created",
"updated"
],
"type": "string",
"description": "Whether the skill was created or updated; omitted means created."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Saved skill title derived from its SKILL.md."
},
"skillId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Skill config object identifier; use this for subsequent update_skill calls."
},
"pluginId": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Identifier of the new Plugin on create, or a visible associated Plugin on update."
},
"libraryUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Link to the Plugin in the OpenWork library, or null when unavailable."
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Saved skill summary derived from its SKILL.md."
},
"schemaVersion": {
"type": "string",
"const": "1",
"description": "Version of the saved-skill response format."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Read a retained, successful immutable result from a Workflow the current member can access and display it as an artifact. Use the latest successful snapshot by default, or pass receiptId to select an exact snapshot from that Workflow. Returns structured schemaVersion, artifact metadata (freshness, generation time, Workflow version, receipt and digest), and data, with the retained result as Markdown text for clients without MCP Apps support. Missing, inaccessible, or unreadable snapshots return isError with error and message in JSON text. This tool never runs or refreshes a Workflow, writes a snapshot, or contacts connected providers; use an explicit Workflow run or Automation to refresh data.
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.
configObjectId
The saved Workflow's configObjectId from capability discovery or a Workflow run, not its Plugin ID, version ID, or artifact view ID. The current member must have access.
Clear enough to supply this argument.
receiptId
An immutable successful run receipt belonging to this Workflow. Omit to read its latest successful retained snapshot; supply to pin an exact historical result.
Clear enough to supply this argument.
maxAgeMs
Age threshold in milliseconds for labeling a retained artifact as fresh or stale. Does not filter snapshots, reject stale results, or trigger a refresh.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/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 rather than guessing. Returns value and metadata: receiptId, mode, executionType, verification, executedAt/fetchedAt, optional timeZone, and retention (scope, ttlMs, available, canSaveByReceipt, and any error/message). Retention determines whether saveWorkflow can reuse the receipt. This is an authoring test, 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.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
code
JavaScript function body using input and discovered tools; return the JSON-safe value to inspect or save as a Workflow result.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
mode
Execution input model: adhoc uses caller parameters; live uses only server-supplied clock and time-zone runtime values for a reusable live Workflow.
Clear enough to supply this argument.
input
Adhoc parameters, normalized from JSON if needed. Live rejects any caller input, including runtime.
Clear enough to supply this argument.
timeZone
Time zone used to compute input.runtime's calendar date and day boundaries during live execution.
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.
{
"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 rather than guessing. Returns value and metadata: receiptId, mode, executionType, verification, executedAt/fetchedAt, optional timeZone, and retention (scope, ttlMs, available, canSaveByReceipt, and any error/message). Retention determines whether saveWorkflow can reuse the receipt. This is an authoring test, 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,
"description": "JavaScript function body using input and discovered tools; return the JSON-safe value to inspect or save as a Workflow result."
},
"mode": {
"enum": [
"adhoc",
"live"
],
"type": "string",
"default": "adhoc",
"description": "Execution input model: adhoc uses caller parameters; live uses only server-supplied clock and time-zone runtime values for a reusable live Workflow."
},
"input": {
"description": "Adhoc parameters, normalized from JSON if needed. Live rejects any caller input, including runtime."
},
"timeZone": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Time zone used to compute input.runtime's calendar date and day boundaries during live execution."
},
"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
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"value",
"metadata"
],
"properties": {
"value": {
"description": "JSON-safe value returned by the script, with the shape defined by the caller's outputSchema when supplied."
},
"metadata": {
"type": "object",
"required": [
"receiptId",
"mode",
"executionType",
"verification",
"executedAt",
"fetchedAt",
"retention"
],
"properties": {
"mode": {
"enum": [
"adhoc",
"live"
],
"type": "string"
},
"timeZone": {
"type": "string"
},
"fetchedAt": {
"type": "string"
},
"receiptId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"retention": {
"type": "object",
"required": [
"scope",
"ttlMs",
"available",
"canSaveByReceipt"
],
"properties": {
"error": {
"type": "string"
},
"scope": {
"enum": [
"shared",
"process",
"unavailable"
],
"type": "string"
},
"ttlMs": {
"type": "number"
},
"message": {
"type": "string"
},
"available": {
"type": "boolean"
},
"canSaveByReceipt": {
"type": "boolean"
}
},
"additionalProperties": false
},
"executedAt": {
"type": "string"
},
"verification": {
"enum": [
"schema",
"not-requested"
],
"type": "string"
},
"executionType": {
"type": "string",
"const": "authoring-test"
}
},
"additionalProperties": false
}
},
"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.
04Validate connection choiceApp-only: validate the member's authenticate or skip choice against current authorized connection readiness.
05View Workflow resultRead a retained, successful immutable result from a Workflow the current member can access and display it as an artifact.
Want to run these tasks against your MCP server with us?
OpenWork Connect setup, tools, quality score, publishing readiness, and alternatives.
How do I add OpenWork Connect to Claude, ChatGPT, or Cursor?
Add OpenWork Connect 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 Connect MCP ready for ChatGPT and Claude?
As of October 15, 2026, OpenWork Connect scores 100/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is OpenWork Connect's MCP tool documentation?
As of October 15, 2026, OpenWork Connect scores 92/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 Connect?
As of October 20, 2026, alternatives to OpenWork Connect in developer-tools on the Manufact MCP leaderboard include Held at the Gate, Speko, turva.dev, AgentMail, and AgentPhone.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.