MCP-Server

opencode-workbench

io.github.simonmak-ascent/opencode-workbench

Was dieses MCP kann

Provisions, inspects, updates, and removes an OpenCode workbench and MCP stack on local or SSH-accessible Linux machines.

apply_clone
Apply a Workbench clone
Apply the Workbench profile to a target: clone the repo and install missing components (OpenCode CLI, Node/pnpm, MCP servers, skills, plugins, optional Docker). It OVERWRITES `<home>/.config/opencode/opencode.json`, copies `AGENTS.md`, resets an existing profile repo to `origin/main`, and runs global installs that need write permission (plus SSH for `mode:ssh`) and can take minutes. Writes a names-only `~/.env.workbench` (mode 600); never secret values. Consent-gated and idempotent: without `confirm:true` it returns the plan and changes nothing. Parameter semantics: `components` defaults to required+core; `workspace` defaults to `~/opencode-workbench`; `skipRepo` skips the clone/update; `profileUrl` overrides the git remote; `dryRun` returns the plan. To preview only, use plan_clone.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target'], 'properties': {'dryRun': {'type': 'boolean', 'description': 'Report only; make no changes.'}, 'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to actually install. When absent, the call returns a plan and makes no changes.'}, 'skipRepo': {'type': 'boolean', 'description': 'Do not clone/update the profile repo on the target.'}, 'workspace': {'type': 'string', 'description': 'Target directory for the profile repo.'}, 'components': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids to include; defaults to required+core.'}, 'profileUrl': {'type': 'string', 'description': 'Override profile git URL.'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'workspace', 'configPath', 'envPath', 'installed', 'skipped', 'envVars', 'dryRun', 'model', 'providerMode', 'degraded'], 'properties': {'plan': {'type': 'object', 'required': ['toInstall', 'commands'], 'properties': {'commands': {'type': 'array', 'items': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'command': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Privileged command preview per component.'}, 'toInstall': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids that would be installed.'}}, 'description': 'Presented when confirmation is required.', 'additionalProperties': False}, 'model': {'type': 'string', 'description': 'Default model selected for the target (DeepSeek when its key is present, else the OpenCode Zen free floor).'}, 'dryRun': {'type': 'boolean', 'description': 'True when the run made no changes.'}, 'target': {'type': 'string', 'description': 'Label of the target.'}, 'envPath': {'type': 'string', 'description': 'Path of the written ~/.env.workbench template.'}, 'envVars': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Environment variable names listed in the env template.'}, 'skipped': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids skipped (already present or manual).'}, 'degraded': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'reason'], 'properties': {'id': {'type': 'string'}, 'reason': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Capabilities disabled because required credentials are absent; fill the named env vars to enable them.'}, 'installed': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'code', 'output'], 'properties': {'id': {'type': 'string', 'description': 'Component id installed.'}, 'code': {'type': 'number', 'description': 'Exit code of the install step.'}, 'output': {'type': 'string', 'description': 'Captured install output (truncated).'}}, 'additionalProperties': False}, 'description': 'Components installed, with exit codes and output.'}, 'workspace': {'type': 'string', 'description': 'Directory where the profile repo was cloned.'}, 'configPath': {'type': 'string', 'description': 'Path of the written opencode.json.'}, 'providerMode': {'enum': ['deepseek', 'zen', 'degraded'], 'type': 'string', 'description': 'Which provider the model resolves to.'}, 'requiresConfirmation': {'type': 'boolean', 'description': 'True when the call returned a plan without applying; re-call with confirm:true to install.'}}, 'additionalProperties': False}
describe_workbench
Workbench server info
Describe this MCP server from its bundled profile without contacting any target or making a network call: repository URL, the default component set, components grouped by tier (required/core/optional), and optional MCP add-ons. It takes no parameters, is always safe, and returns instantly. Use it first to resolve a component id for install_component/remove_component/update_component or to see available add-ons; use inspect_target for a machine's live state.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['repo', 'repoGit', 'packageRoot', 'defaultComponents', 'optionalMcp', 'components'], 'properties': {'repo': {'type': 'string', 'description': 'Web URL of the workbench repository.'}, 'repoGit': {'type': 'string', 'description': 'Git clone URL of the workbench repository.'}, 'components': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'tier', 'description', 'manual'], 'properties': {'id': {'type': 'string', 'description': 'Component identifier — pass this to install_component.'}, 'tier': {'enum': ['required', 'core', 'optional'], 'type': 'string', 'description': 'Component tier.'}, 'title': {'type': 'string', 'description': 'Human-readable component name.'}, 'manual': {'type': 'boolean', 'description': 'True when the step cannot be fully automated.'}, 'description': {'type': 'string', 'description': 'What the component provides.'}}, 'additionalProperties': False}, 'description': 'Every component with id, tier and description.'}, 'optionalMcp': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional MCP add-on ids available in the profile.'}, 'packageRoot': {'type': 'string', 'description': 'Filesystem path of the installed package.'}, 'defaultComponents': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids installed by default.'}}, 'additionalProperties': False}
inspect_target
Inspect a Linux target
Probe one Linux machine — this host (`local`) or a remote host over SSH (`ssh`) — and report its OS, kernel, architecture, package manager, Node/npm, OpenCode, Docker, and per-tool detection flags, plus the names (never values) of credentials present. Read-only: it runs one shell probe as the target user (over SSH when `mode:ssh`), installs nothing, writes nothing, contacts no external service, and can take a few seconds per hop. Parameter semantics: `target.mode` selects local vs ssh (default `local`); `target.host` is required only for ssh; `target.user` defaults to the ssh config/current user; `target.cwd` sets the directory for relative checks; `target.port`/`identityFile` pass straight to ssh. Use it to see what a clone would touch, then plan_clone to turn that into an ordered plan and apply_clone to perform it.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target'], 'properties': {'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['user', 'home', 'workspaceDefault', 'configDir', 'has'], 'properties': {'has': {'type': 'object', 'description': 'Detection flags for git, curl, node, npm, corepack, pnpm, docker, uv, gh, opencode, sudo.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'boolean'}}, 'arch': {'type': 'string', 'description': 'CPU architecture (e.g. x86_64, aarch64).'}, 'home': {'type': 'string', 'description': 'Home directory on the target.'}, 'osId': {'type': 'string', 'description': 'OS identifier (e.g. ubuntu, debian, rhel).'}, 'user': {'type': 'string', 'description': 'Detected user on the target.'}, 'kernel': {'type': 'string', 'description': 'Kernel name and release.'}, 'osName': {'type': 'string', 'description': 'Human-readable OS name.'}, 'configDir': {'type': 'string', 'description': 'OpenCode config directory on the target.'}, 'osVersion': {'type': 'string', 'description': 'OS version string.'}, 'envPresent': {'type': 'string', 'description': 'Space-separated names of credentials present on the target (values are never read).'}, 'npmModules': {'type': 'string', 'description': 'npm global modules directory.'}, 'nodeVersion': {'type': 'string', 'description': 'Installed Node.js version, if any.'}, 'opencodeBin': {'type': 'string', 'description': 'Path to the opencode binary, if installed.'}, 'dockerRunning': {'type': 'boolean', 'description': 'Whether the Docker daemon is reachable.'}, 'packageManager': {'type': 'string', 'description': 'Detected package manager (apt-get, dnf, yum, apk, pacman, zypper, or none).'}, 'workspaceDefault': {'type': 'string', 'description': 'Default directory where the profile repo will be cloned.'}}, 'additionalProperties': False}
install_component
Install one Workbench component
Install a single Workbench component by id (e.g. `node`, `opencode`, `npm-mcps`, `skills`) on a target; `component` must be an id from describe_workbench. Overwrites that component's files when present (e.g. `skills`/`plugins` replace the copies under `<home>/.config/opencode`); global installs need write permission and can take minutes. Idempotent and consent-gated: without `confirm:true` it returns the plan. Parameter semantics: `component` is required; `workspace` defaults to `~/opencode-workbench`; `confirm` defaults to false (plan only). Use it for one targeted component; use apply_clone to install the full default set.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'component'], 'properties': {'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to actually install. When absent, the call returns a plan and makes no changes.'}, 'component': {'type': 'string', 'description': 'Component id from describe_workbench.'}, 'workspace': {'type': 'string', 'description': 'Target directory for the profile repo.'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'workspace', 'configPath', 'envPath', 'installed', 'skipped', 'envVars', 'dryRun', 'model', 'providerMode', 'degraded'], 'properties': {'plan': {'type': 'object', 'required': ['toInstall', 'commands'], 'properties': {'commands': {'type': 'array', 'items': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'command': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Privileged command preview per component.'}, 'toInstall': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids that would be installed.'}}, 'description': 'Presented when confirmation is required.', 'additionalProperties': False}, 'model': {'type': 'string', 'description': 'Default model selected for the target (DeepSeek when its key is present, else the OpenCode Zen free floor).'}, 'dryRun': {'type': 'boolean', 'description': 'True when the run made no changes.'}, 'target': {'type': 'string', 'description': 'Label of the target.'}, 'envPath': {'type': 'string', 'description': 'Path of the written ~/.env.workbench template.'}, 'envVars': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Environment variable names listed in the env template.'}, 'skipped': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids skipped (already present or manual).'}, 'degraded': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'reason'], 'properties': {'id': {'type': 'string'}, 'reason': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Capabilities disabled because required credentials are absent; fill the named env vars to enable them.'}, 'installed': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'code', 'output'], 'properties': {'id': {'type': 'string', 'description': 'Component id installed.'}, 'code': {'type': 'number', 'description': 'Exit code of the install step.'}, 'output': {'type': 'string', 'description': 'Captured install output (truncated).'}}, 'additionalProperties': False}, 'description': 'Components installed, with exit codes and output.'}, 'workspace': {'type': 'string', 'description': 'Directory where the profile repo was cloned.'}, 'configPath': {'type': 'string', 'description': 'Path of the written opencode.json.'}, 'providerMode': {'enum': ['deepseek', 'zen', 'degraded'], 'type': 'string', 'description': 'Which provider the model resolves to.'}, 'requiresConfirmation': {'type': 'boolean', 'description': 'True when the call returned a plan without applying; re-call with confirm:true to install.'}}, 'additionalProperties': False}
list_required_credentials
List required credentials
List the credentials the profile references, which the target already provides, and how to acquire each missing one. Value-blind: it reads only whether each env var is set — no values, no network, no writes — via one read-only probe. Parameter semantics: `target` selects the machine (`local` or SSH) and its `home` sets the returned `template` path and the env file the presence check reads; there are no other parameters. Returns `present`/`missing` var-name arrays plus one guidance record per credential (`var`, `purpose`, `url`, `method`, `command`). Use it after plan_clone to see what would degrade; act on one credential with run_auth_flow.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target'], 'properties': {'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'present', 'missing', 'template', 'credentials'], 'properties': {'target': {'type': 'string', 'description': 'Label of the inspected target.'}, 'missing': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Credential names not present.'}, 'present': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Credential names already present on the target.'}, 'template': {'type': 'string', 'description': 'Path of the env file to fill in.'}, 'credentials': {'type': 'array', 'items': {'type': 'object', 'required': ['var', 'label', 'purpose', 'method', 'present'], 'properties': {'url': {'type': 'string', 'description': 'Where to create/obtain the key.'}, 'var': {'type': 'string', 'description': 'Environment variable name.'}, 'label': {'type': 'string', 'description': 'Human-readable name.'}, 'method': {'enum': ['paste', 'oauth', 'cli', 'instruction'], 'type': 'string', 'description': 'Recommended acquisition method.'}, 'command': {'type': 'string', 'description': 'Exact non-interactive command, when one exists.'}, 'present': {'type': 'boolean', 'description': 'Whether the target already provides it (value never read).'}, 'purpose': {'type': 'string', 'description': 'What uses it.'}, 'optional': {'type': 'boolean', 'description': 'True when only a subset of tools degrades without it.'}}, 'additionalProperties': False}, 'description': 'Every credential the profile references with its acquisition guidance.'}}, 'additionalProperties': False}
plan_clone
Plan a Workbench clone
Return a read-only plan for a target: compare it against the Workbench profile and list each component as `install`, `present`, or `manual`, with the commands that would run. It still runs a detection probe on the target (same access as inspect_target) but clones nothing and writes nothing. Parameter semantics: `components` restricts the diff to those ids (default: required+core); `workspace` sets the expected profile path on the target (default `~/opencode-workbench`); `profileUrl` overrides the git remote. Use it to preview before apply_clone, which performs the changes.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target'], 'properties': {'dryRun': {'type': 'boolean', 'description': 'Report only; make no changes.'}, 'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}, 'skipRepo': {'type': 'boolean', 'description': 'Do not clone/update the profile repo on the target.'}, 'workspace': {'type': 'string', 'description': 'Target directory for the profile repo.'}, 'components': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids to include; defaults to required+core.'}, 'profileUrl': {'type': 'string', 'description': 'Override profile git URL.'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'inspect', 'steps', 'toInstall'], 'properties': {'steps': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'tier', 'action', 'description'], 'properties': {'id': {'type': 'string', 'description': 'Component id.'}, 'tier': {'enum': ['required', 'core', 'optional'], 'type': 'string', 'description': 'Component tier.'}, 'title': {'type': 'string', 'description': 'Component name.'}, 'action': {'enum': ['install', 'present', 'manual'], 'type': 'string', 'description': 'Planned action: install, already present, or manual step.'}, 'command': {'type': 'string', 'description': 'Preview of the privileged command that would run, for consent.'}, 'description': {'type': 'string', 'description': 'What the component provides.'}}, 'additionalProperties': False}, 'description': 'Per-component plan.'}, 'target': {'type': 'string', 'description': 'Label of the inspected target.'}, 'inspect': {'type': 'object', 'required': ['user', 'home', 'workspaceDefault', 'configDir', 'has'], 'properties': {'has': {'type': 'object', 'description': 'Detection flags for git, curl, node, npm, corepack, pnpm, docker, uv, gh, opencode, sudo.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'boolean'}}, 'arch': {'type': 'string', 'description': 'CPU architecture (e.g. x86_64, aarch64).'}, 'home': {'type': 'string', 'description': 'Home directory on the target.'}, 'osId': {'type': 'string', 'description': 'OS identifier (e.g. ubuntu, debian, rhel).'}, 'user': {'type': 'string', 'description': 'Detected user on the target.'}, 'kernel': {'type': 'string', 'description': 'Kernel name and release.'}, 'osName': {'type': 'string', 'description': 'Human-readable OS name.'}, 'configDir': {'type': 'string', 'description': 'OpenCode config directory on the target.'}, 'osVersion': {'type': 'string', 'description': 'OS version string.'}, 'envPresent': {'type': 'string', 'description': 'Space-separated names of credentials present on the target (values are never read).'}, 'npmModules': {'type': 'string', 'description': 'npm global modules directory.'}, 'nodeVersion': {'type': 'string', 'description': 'Installed Node.js version, if any.'}, 'opencodeBin': {'type': 'string', 'description': 'Path to the opencode binary, if installed.'}, 'dockerRunning': {'type': 'boolean', 'description': 'Whether the Docker daemon is reachable.'}, 'packageManager': {'type': 'string', 'description': 'Detected package manager (apt-get, dnf, yum, apk, pacman, zypper, or none).'}, 'workspaceDefault': {'type': 'string', 'description': 'Default directory where the profile repo will be cloned.'}}, 'description': 'Full inspection of the target.', 'additionalProperties': False}, 'toInstall': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids that will be installed.'}}, 'additionalProperties': False}
remove_component
Remove one Workbench component
Uninstall one Workbench component by id from a target — the inverse of install_component — for a bounded, documented subset with an automated uninstall (e.g. `opencode`, `pnpm`, `npm-mcps`, `skills`, `docker-containers`); `component` must be an id from describe_workbench. Idempotent: an already-absent component reports `absent`; a component with no automated uninstall (system packages such as git/curl/node) reports `manual`. Destructive and consent-gated: without `confirm:true` it returns a preview and changes nothing, and it deletes only that component's files — never `opencode.json` or the profile repo. Parameter semantics: `workspace` sets the profile path some removals need; `dryRun` reports without changing. Use it to tear down one component; for several, call it per id.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'component'], 'properties': {'dryRun': {'type': 'boolean', 'description': 'Report the action without changing anything.'}, 'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to actually remove. When absent, the call returns a preview and makes no changes.'}, 'component': {'type': 'string', 'description': 'Component id from describe_workbench.'}, 'workspace': {'type': 'string', 'description': 'Profile repo directory (used by components whose removal needs it).'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'id', 'action', 'code', 'output'], 'properties': {'id': {'type': 'string', 'description': 'Component id acted on.'}, 'code': {'type': 'number', 'description': 'Exit code of the action.'}, 'action': {'enum': ['removed', 'updated', 'absent', 'manual'], 'type': 'string', 'description': 'What happened: removed, updated, already absent, or manual (no automated uninstall).'}, 'output': {'type': 'string', 'description': 'Captured output (truncated).'}, 'target': {'type': 'string', 'description': 'Label of the target.'}, 'requiresConfirmation': {'type': 'boolean', 'description': 'True when the call returned a preview without acting; re-call with confirm:true.'}}, 'additionalProperties': False}
run_auth_flow
Acquire one credential (best-effort)
Return the acquisition plan for one credential on a target: the provider URL, the exact non-interactive command when one exists (e.g. `opencode auth login`, `opencode mcp auth vercel`, `gh auth login`), and whether it is already present. Read-only and value-blind: it emits guidance and re-checks presence with one read-only probe; it does not run the commands or handle secret values. Parameter semantics: `var` must be an env var name returned by list_required_credentials (unknown names error); `target` selects the machine and its `home` is where the value should be written. Use it for a single credential; it does not replace that listing.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'var'], 'properties': {'var': {'type': 'string', 'description': 'Credential env var name from list_required_credentials (e.g. OPENCODE_API_KEY).'}, 'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'var', 'method', 'present', 'verified', 'next'], 'properties': {'url': {'type': 'string', 'description': 'Provider URL to open.'}, 'var': {'type': 'string', 'description': 'Credential being acquired.'}, 'next': {'type': 'string', 'description': 'What to do next.'}, 'method': {'enum': ['paste', 'oauth', 'cli', 'instruction'], 'type': 'string', 'description': 'Acquisition method.'}, 'target': {'type': 'string', 'description': 'Label of the target.'}, 'command': {'type': 'string', 'description': 'Command for the agent/user to run.'}, 'present': {'type': 'boolean', 'description': 'Whether the credential is present now.'}, 'verified': {'type': 'boolean', 'description': 'True when the credential is present and ready.'}}, 'additionalProperties': False}
update_component
Update one Workbench component
Update one Workbench component in place by id: re-run its install script to fetch the current version (e.g. `opencode` re-runs the official installer; `npm-mcps` reinstalls the latest globals). It OVERWRITES the component's files, needs write permission, and can take minutes for global installs; the resolved version may change. Parameter semantics: `component` must be an id from describe_workbench; `workspace` defaults to `~/opencode-workbench`; `dryRun` previews; `confirm` defaults to false — set `confirm:true` to apply. For the whole profile use apply_clone.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'component'], 'properties': {'dryRun': {'type': 'boolean', 'description': 'Report the action without changing anything.'}, 'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to actually update. When absent, the call returns a preview and makes no changes.'}, 'component': {'type': 'string', 'description': 'Component id from describe_workbench.'}, 'workspace': {'type': 'string', 'description': 'Profile repo directory (used by components whose update needs it).'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'id', 'action', 'code', 'output'], 'properties': {'id': {'type': 'string', 'description': 'Component id acted on.'}, 'code': {'type': 'number', 'description': 'Exit code of the action.'}, 'action': {'enum': ['removed', 'updated', 'absent', 'manual'], 'type': 'string', 'description': 'What happened: removed, updated, already absent, or manual (no automated uninstall).'}, 'output': {'type': 'string', 'description': 'Captured output (truncated).'}, 'target': {'type': 'string', 'description': 'Label of the target.'}, 'requiresConfirmation': {'type': 'boolean', 'description': 'True when the call returned a preview without acting; re-call with confirm:true.'}}, 'additionalProperties': False}
verify_clone
Verify a Workbench clone
Re-check a target after a clone: return a per-component `present`/`missing` list plus whether `opencode.json` and `~/.env.workbench` exist. Read-only and idempotent: it runs a detection probe (SSH or local) and checks files, writing nothing. `target` selects the machine (`local` or SSH) and its `home` is where the `opencode.json` and `~/.env.workbench` checks run; `components` restricts the check to those ids (omit it to check every component, the default); `workspace` sets the profile path used by component checks. Use it after apply_clone and after component changes; for a pre-clone preview use plan_clone.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target'], 'properties': {'dryRun': {'type': 'boolean', 'description': 'Report only; make no changes.'}, 'target': {'type': 'object', 'required': ['mode'], 'properties': {'cwd': {'type': 'string', 'description': 'Working directory on the target.'}, 'host': {'type': 'string', 'description': 'SSH host (required when mode=ssh).'}, 'mode': {'enum': ['local', 'ssh'], 'type': 'string', 'description': 'Run on this machine (local) or a remote host (ssh).'}, 'port': {'type': 'integer', 'maximum': 9007199254740991, 'description': 'SSH port.', 'exclusiveMinimum': 0}, 'user': {'type': 'string', 'description': 'SSH user (defaults to ssh config / current user).'}, 'identityFile': {'type': 'string', 'description': 'SSH private key path.'}}, 'description': 'The machine to operate on: this host (local) or a remote host over SSH (ssh).'}, 'skipRepo': {'type': 'boolean', 'description': 'Do not clone/update the profile repo on the target.'}, 'workspace': {'type': 'string', 'description': 'Target directory for the profile repo.'}, 'components': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids to include; defaults to required+core.'}, 'profileUrl': {'type': 'string', 'description': 'Override profile git URL.'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['target', 'configExists', 'envExists', 'components', 'missing'], 'properties': {'target': {'type': 'string', 'description': 'Label of the target.'}, 'missing': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component ids detected as missing.'}, 'envExists': {'type': 'boolean', 'description': 'Whether ~/.env.workbench exists on the target.'}, 'components': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'present'], 'properties': {'id': {'type': 'string', 'description': 'Component id.'}, 'present': {'type': 'boolean', 'description': 'Whether the component is detected as present.'}}, 'additionalProperties': False}, 'description': 'Per-component presence detection.'}, 'configExists': {'type': 'boolean', 'description': 'Whether opencode.json exists on the target.'}}, 'additionalProperties': False}
Hinzugefügt
run_auth_flow
4. October 2026 02:40
Hinzugefügt
list_required_credentials
4. October 2026 02:40
Hinzugefügt
update_component
4. October 2026 02:40
Hinzugefügt
remove_component
4. October 2026 02:40
Hinzugefügt
install_component
4. October 2026 02:40
Hinzugefügt
verify_clone
4. October 2026 02:40
Hinzugefügt
apply_clone
4. October 2026 02:40
Hinzugefügt
plan_clone
4. October 2026 02:40
Hinzugefügt
inspect_target
4. October 2026 02:40
Hinzugefügt
describe_workbench
4. October 2026 02:40