JFrog CLI for Agent Plugins
Manage agent plugins in JFrog Artifactory with jf agent plugins: publish, install, update, list, search, and delete plugins using flags and environment variables for CI and interactive workflows.
This page is the CLI reference for jf agent plugins in JFrog CLI v2.106.0 or later. It covers publish, install, update, list, search, and delete commands, including flags and environment variables. Improved list and update behavior (and related publish version handling) requires JFrog CLI v2.116.0 or later.
For repository setup, marketplace files, and agent connection walkthroughs, see Agent Plugins Repositories.
All examples use the full command path (for example, jf agent plugins publish). Agent Plugins commands require JFrog CLI v2.106.0 or later (introduced with the jf agent namespace). Standard JFrog CLI server override flags (--url, --user, --password, --access-token, --server-id) apply to every command. When omitted, credentials and server URL come from your active jf config profile.
Commands and reference
When to Use
Use jf agent plugins when you publish, install, update, list, search, or delete AI agent plugin packages stored in JFrog Artifactory repositories with package type agentplugins. Plugins are distributed as zip bundles described by plugin.json.
Prerequisites
Before using jf agent plugins, you need:
- A local JFrog Artifactory repository configured for the agentplugins package type.
- JFrog CLI v2.106.0 or later configured to point to your JFrog Artifactory server. For
listandupdate, use v2.116.0 or later. For installation steps, see Download and Install the JFrog CLI. - For harness-based installs when you omit
--version, a<HARNESS>-marketplace.jsonfile in the repository root (for example,cursor-marketplace.json).
The following tasks cover each command in the jf agent plugins namespace:
Interactive and CI Non-Interactive Modes
Agent Plugins commands follow the same interactive rules as JFrog CLI for Skills: prompts appear in a normal terminal; CI, piped stdin, or --quiet skip prompts and require explicit flags. Per-command Expected Output and Examples are under Publish, Install, and Update.
Search, list, and delete have no interactive confirmation prompts. update --all asks for confirmation in an interactive terminal (skipped for --quiet, --dry-run, or CI). For commands that use repository auto-discovery, if --repo is omitted and more than one agentplugins repository exists, the repository picker applies. See Plugins Repository Resolution.
What to Set Explicitly for CI or Quiet Mode
| Scenario | What to provide in CI |
|---|---|
| More than one agentplugins repository | --repo REPO or JFROG_AGENT_PLUGINS_REPO |
| Publish when version already exists | CI errors: version 1.0.0 of plugin 'my-plugin' already exists. Use a different version or remove the existing one |
Harness install without --version | Requires <HARNESS>-marketplace.json in the repository root, or pass --version |
| Install with failed evidence check | Install fails unless JFROG_AGENT_PLUGINS_DISABLE_QUIET_FAILURE=true |
Update all installed plugins (--all) | Confirmation is skipped in CI; pass --harness and optional --repo filter explicitly |
JFrog Xray
Post-publish Xray security gating applies to Skills (
jf agent skills publish), not tojf agent plugins publish. Enable Xray on Skills repositories per Skills Repositories.
Commands at a Glance
The following table summarizes each documented command in the jf agent plugins namespace.
| Command | What it does |
|---|---|
jf agent plugins publish | Package and upload a plugin folder to JFrog Artifactory |
jf agent plugins install | Download and install a plugin for one or more harnesses |
jf agent plugins update | Upgrade an installed plugin to a newer version |
jf agent plugins delete | Remove a specific plugin version from a repository |
jf agent plugins list | Browse plugins in a repository or inspect locally installed plugins |
jf agent plugins search | Search for plugins by name across Agent Plugins repositories |
Publish a Plugin
Packages the local plugin folder into a zip and uploads it to JFrog Artifactory. The version is resolved from --version, then plugin.json, then a default of 1.0.0 when neither provides a version. Version collision prompts match Publish a Skill (Enter version to publish:, collision menu). Plugins do not run the Skills Xray post-publish gate.
Note
Before upload, the CLI updates the top-level
versionfield in every discovered harnessplugin.jsonunder the plugin folder so the packaged manifests match the resolved publish version. Commit or restore those local files if you need the previous values after publishing.
To publish a plugin folder:
jf agent plugins publish PATH_TO_PLUGIN_FOLDER --repo REPOSITORY_NAMEWhere:
PATH_TO_PLUGIN_FOLDER: Path to the plugin folder containingplugin.json(CLI argument name:path)REPOSITORY_NAME: Agent plugins local repository key in JFrog Artifactory
Flags
The following table lists flags for jf agent plugins publish.
| Flag | Description | Default |
|---|---|---|
--repo | Target agent plugins repository key. If omitted, auto-discovered (see Plugins Repository Resolution). | Auto-discovered |
--version | Override the version from plugin.json. | From plugin.json |
--signing-key | Path to PGP private key for evidence signing. Overrides EVD_SIGNING_KEY_PATH. | — |
--key-alias | Alias for the signing key. Overrides EVD_KEY_ALIAS. | — |
--quiet | Skip interactive prompts (version collision, missing version). Enabled automatically in CI ($CI=true). | $CI |
--build-name | Build name for JFrog build-info collection. Requires --build-number. | — |
--build-number | Build number for JFrog build-info collection. Requires --build-name. | — |
--module | Module name in build-info for the published artifact. | Plugin slug |
Expected Output
When the requested version already exists:
10:14:02 [Warn] Version 1.0.0 of plugin 'my-plugin' already exists in repository 'agents-local'.
Choose an action:
[o] Overwrite the existing version
[n] Enter a new version
[a] Abort
Your choice (o/n/a): o
10:14:03 [Info] Overwriting version 1.0.0...For missing-version prompts, see Publish a Skill.
CI Behavior
Version collision errors: version 1.0.0 of plugin 'my-plugin' already exists. Use a different version or remove the existing one. See What to Set Explicitly for CI or Quiet Mode on this page and JFrog CLI for Skills.
Examples
jf agent plugins publish ~/plugins/my-plugin --repo agents-localPublish with evidence signing:
jf agent plugins publish ~/plugins/my-plugin --repo agents-local \
--signing-key ./private.key \
--key-alias my-evd-keyInstall a Plugin
Downloads a plugin zip from JFrog Artifactory and installs it for one or more harnesses, or to a custom local directory.
To install a plugin:
jf agent plugins install PLUGIN_NAME \
(--harness HARNESS_NAME[,HARNESS_NAME...] [--global] | --path DIR) \
[--repo REPOSITORY_NAME] \
[--version PLUGIN_VERSION]This matches the usage string registered in the CLI: jf agent plugins install SLUG (--harness … | --path DIR) [--repo REPO] [--version VER].
Where:
PLUGIN_NAME: Plugin slug in the repository (CLI argument name:slug)HARNESS_NAME: Built-in or custom harness name (comma-separated for multiple harnesses on install)REPOSITORY_NAME: Agent plugins repository key (optional when auto-discovered)PLUGIN_VERSION: SemVer,latest, or omitted. If you pass--version, the CLI installs that version directly from the repository, even when the plugin is not listed in the harnessmarketplace.json. Installation can fail if that version is not compatible with the harness.
One of --harness or --path is required.
Version Resolution
| Mode | --version value | Behavior |
|---|---|---|
| Harness install | Omitted | Downloads each <HARNESS>-marketplace.json from the repository root and uses the version listed for the plugin slug. All harnesses must resolve to the same version. |
| Harness install | latest | Resolves the highest available SemVer in the repository. |
| Harness install | Exact SemVer | Uses the version if it exists in the repository. In interactive mode, if the version is missing, the CLI prompts you to pick from available versions. In CI or --quiet mode, the command fails with the list of available versions. |
Path install (--path) | Omitted or latest | Resolves the highest available SemVer in the repository. |
| Path install | Exact SemVer | Same validation and prompt behavior as harness install. |
If marketplace lookup fails, re-run with --version VER (for example, --version 1.0.0 or --version latest) to install directly from JFrog Artifactory.
Plugin slugs must match ^[a-z0-9][a-z0-9-]*$ (lowercase letters, digits, and hyphens; must start with a letter or digit).
Install Modes
Built-in harnesses (claude, cursor, codex) support global scope only. When you omit both --global and --project-dir, the CLI defaults to global scope. Project-scoped harness installs (--project-dir without --global) are rejected for built-in harnesses.
| Mode | Flag combination | Where the plugin lands |
|---|---|---|
| Harness (global, default) | --harness NAME | See Supported Built-in Harnesses (or custom globalDir from agent-config.json) |
| Harness (explicit global) | --harness NAME --global | Same as harness default |
| Direct path | --path DIR | DIR/SLUG |
Flags
The following table lists flags for jf agent plugins install.
| Flag | Description | Default |
|---|---|---|
--repo | Agent plugins repository to download from. See Plugins Repository Resolution. | Auto-discovered |
--version | Version to install. See Version Resolution. | Marketplace or latest SemVer |
--harness | Comma-separated harness names. Paths resolved from ~/.jfrog/agents/agent-config.json (plugins-agents key), then built-in defaults. Mutually exclusive with --path. | — |
--global | Install under each harness's configured globalDir. Default for built-in harnesses when scope is omitted. Mutually exclusive with --project-dir. | true for built-in harnesses |
--project-dir | Project root for project-scoped harness installs. Only valid for custom harness entries in agent-config.json that define projectDir. Built-in harnesses reject project-scoped install. Mutually exclusive with --global. | — |
--path | Local base directory for a direct install at PATH/SLUG. Mutually exclusive with --harness, --project-dir, and --global. | — |
--format | Output format: table or json. | table |
--quiet | Skip interactive prompts. In quiet or CI mode, evidence verification failure causes the install to fail unless JFROG_AGENT_PLUGINS_DISABLE_QUIET_FAILURE=true is set. | $CI |
During installation, the CLI verifies evidence when signing keys are configured in JFrog Artifactory.
Expected Output
When evidence verification fails:
10:14:10 [Warn] Evidence verification failed: <reason from server>
The plugin is unattested. Continue with installation? (y/n) [n]? yWhen plugin files install successfully but the native agent CLI is missing from PATH (Claude or Codex harness only), the install summary reports a warning status with instructions to complete registration manually.
For path installs with a missing --version, the version picker matches Install a Skill (Select a version:).
CI Behavior
Evidence verification failure fails unless JFROG_AGENT_PLUGINS_DISABLE_QUIET_FAILURE=true. See What to Set Explicitly for CI or Quiet Mode.
Examples
Install for Cursor using marketplace version:
jf agent plugins install my-plugin --harness cursor --repo agents-localInstall a specific version for multiple harnesses:
jf agent plugins install my-plugin --harness cursor,claude --repo agents-local --version 1.0.0Install globally for Codex:
jf agent plugins install my-plugin --harness codex --repo agents-local --version latestInstall to a custom path:
jf agent plugins install my-plugin --path ./vendor/plugins --repo agents-localInstall Metadata
On successful install, the CLI writes .jfrog/plugin-info.json under each installed plugin directory. This manifest records the source repository, installed version, harness, scope, and project directory. jf agent plugins list --harness and jf agent plugins update use this file for registry comparisons and update targeting.
Supported Built-in Harnesses
The following harnesses are supported out of the box for plugins. Paths are resolved from ~/.jfrog/agents/agent-config.json under the plugins-agents key. Built-in harnesses support global scope only.
| Harness name | Global install path | Post-install hook |
|---|---|---|
claude | ~/.claude/plugins/local/jfrog/<REPO_KEY>/<slug> | Writes local marketplace and runs claude plugin commands when CLI is available |
cursor | ~/.cursor/plugins/local/<slug> | None (Cursor auto-discovers from ~/.cursor/plugins/local/) |
codex | ~/.agents/plugins/local/jfrog/<REPO_KEY>/<slug> | Writes local marketplace and runs codex plugin commands when CLI is available |
<REPO_KEY> is the agent plugins repository key from --repo or auto-discovery.
To add or override a harness:
{
"plugins-agents": {
"my-agent": {
"projectDir": ".my-agent/plugins",
"globalDir": "~/.my-agent/plugins"
}
}
}Note
The CLI copies plugin files only to
projectDir/globalDirmentioned in the JSON above (or to a custom path when you use--path). Each harness is responsible for loading plugins from those locations. If a harness cannot auto-discover plugins from the configured path, the plugin might not load even though the CLI install completed successfully.
Custom harness entries may define both projectDir and globalDir. Project-scoped install is only available for harnesses with a non-empty projectDir.
You can also set plugin-manifest-paths in the same file to customize the ordered list of relative plugin.json paths checked during publish.
Update a Plugin
Updates an installed plugin to a newer (or specific) version. The CLI compares the currently installed version against the target version and skips targets that are already up to date. If the update fails, the previous install is restored from a backup under <install-base>/.plugin-backup/.
Requires JFrog CLI v2.116.0 or later.
To update a single installed plugin:
jf agent plugins update --slug PLUGIN_NAME \
(--harness HARNESS_NAME[,HARNESS_NAME...] [--global] [--project-dir DIR] | --path DIR) \
[--repo REPOSITORY_NAME] \
[--version PLUGIN_VERSION] \
[--dry-run] [--force] [--format table|json]To update every JFrog CLI-installed plugin for one or more harnesses:
jf agent plugins update --all --harness HARNESS_NAME[,HARNESS_NAME...] \
[--global] [--project-dir DIR] \
[--repo REPOSITORY_NAME] \
[--dry-run] [--force] [--format table|json]Where:
PLUGIN_NAME: Plugin slug to update (required as--slug, not as a positional argument)HARNESS_NAME,DIR,REPOSITORY_NAME: Same meaning asjf agent plugins installPLUGIN_VERSION: Target SemVer orlatest(default for single-plugin update)
--slug and --all are mutually exclusive. --all cannot be combined with --version or --path.
Flags
The following table lists flags for jf agent plugins update.
| Flag | Description | Default |
|---|---|---|
--slug | Plugin slug to update. Required unless --all is set. | — |
--all | Update every JFrog CLI-installed plugin for the given --harness list to its latest version. Mutually exclusive with --slug, --version, and --path. | false |
--repo | Agent plugins repository. For a single-plugin update, resolved like other commands (see Plugins Repository Resolution). For --all, optional filter that keeps only plugins whose .jfrog/plugin-info.json records that repository. | Auto-discovered (single); optional filter (--all) |
--version | Target version for a single-plugin update. Omit for latest. Not allowed with --all. | latest |
--harness | Comma-separated harness names. Same resolution as jf agent plugins install. Required for --all. | — |
--global | Update under each harness's configured globalDir. Default for built-in harnesses when scope is omitted. Mutually exclusive with --project-dir. | true for built-in harnesses |
--project-dir | Project root for project-scoped updates. Only valid for custom harness entries that define projectDir. Built-in harnesses reject project-scoped update. Mutually exclusive with --global. | — |
--path | Base directory of an existing direct install (PATH/SLUG). Mutually exclusive with --harness, --project-dir, --global, and --all. | — |
--dry-run | Preview what would be updated without downloading or changing files. | false |
--force | Re-download and reinstall even if the plugin is already at the target version. | false |
--format | Output format for the update summary: table or json. | table |
--quiet | Skip interactive prompts (including the --all confirmation). | $CI |
Examples
Update my-plugin to the latest version for Cursor:
jf agent plugins update --slug my-plugin --harness cursor --repo agents-localUpdate to a specific version with dry-run preview:
jf agent plugins update --slug my-plugin --harness cursor --repo agents-local --version 2.0.0 --dry-runUpdate every jf-installed plugin for Claude and Codex:
jf agent plugins update --all --harness claude,codexForce reinstall even if already at the target version:
jf agent plugins update --slug my-plugin --harness cursor --repo agents-local --forceGet a machine-readable update summary:
jf agent plugins update --slug my-plugin --harness cursor --repo agents-local --format jsonExample JSON response:
{
"slug": "my-plugin",
"version": "2.0.0",
"results": [
{
"agent": "cursor",
"scope": "global",
"path": "/Users/you/.cursor/plugins/local/my-plugin",
"status": "ok",
"detail": "Executed successfully with no issues."
}
]
}Delete a Plugin
Removes a specific version of a plugin from an agent plugins repository. The CLI does not show an interactive confirmation prompt or other terminal prompts. Repository auto-discovery behaves like other commands; see Plugins Repository Resolution.
To delete a plugin version from an agent plugins repository:
jf agent plugins delete PLUGIN_NAME --version PLUGIN_VERSION [--repo REPOSITORY_NAME]Where:
PLUGIN_NAME: Plugin slug to delete (CLI argument name:slug)PLUGIN_VERSION: Version to remove (required)REPOSITORY_NAME: Agent plugins repository key (optional when auto-discovered)
Flags
| Flag | Description | Default |
|---|---|---|
--version | Version to delete. Required. | — |
--repo | Agent plugins repository key. See Plugins Repository Resolution. | Auto-discovered |
--dry-run | Show what would be deleted without making any changes. | false |
Examples
jf agent plugins delete my-plugin --version 1.0.0 --repo agents-localPreview deletion:
jf agent plugins delete my-plugin --version 1.0.0 --repo agents-local --dry-runList Plugins
Lists plugins in the following modes:
- Registry (
--repo): Plugins in an Agent Plugins repository (latest version per plugin) - Local / global (
--harness): Plugins installed for one or more harnesses
Exactly one of --repo or --harness is required. --repo and --harness are mutually exclusive. --global and --project-dir are mutually exclusive.
When you pass --harness without --global or --project-dir, list defaults to global scope (same default as install and update for built-in harnesses). Built-in harnesses (claude, cursor, codex) reject project-scoped list; use --global or omit scope flags.
Requires JFrog CLI v2.116.0 or later.
To list plugins in a repository or installed for a harness:
# List plugins in a repository
jf agent plugins list --repo REPOSITORY_NAME [--limit N] [--sort-by updated|downloads] [--format table|json]
# List plugins installed for one or more harnesses (global by default)
jf agent plugins list --harness HARNESS_NAME[,HARNESS_NAME...] [--global] [--check-updates]
# List plugins installed for a custom harness that supports project scope
jf agent plugins list --harness CUSTOM_HARNESS --project-dir DIRWhere:
REPOSITORY_NAME: Agent plugins repository to list (mutually exclusive with--harness)HARNESS_NAME: Harness for installed-plugin listing (comma-separated for multiple harnesses)N: Maximum number of results
Flags
The following table lists flags for jf agent plugins list.
| Flag | Description | Default |
|---|---|---|
--repo | Agent plugins repository to list. Mutually exclusive with --harness. | — |
--harness | Comma-separated harness names to list installed plugins for. Mutually exclusive with --repo. | — |
--project-dir | Project root for harness-scoped listing. Only for custom harnesses that define projectDir. Mutually exclusive with --global. | — |
--global | List from each harness's global directory. Default when --harness is set and scope flags are omitted. Mutually exclusive with --project-dir. | true with --harness |
--limit | Maximum number of results to return. | All |
--sort-by | Sort field. With --repo: updated (default) or downloads. With --harness: name (only option). | updated / name |
--sort-order | Sort order for --harness mode: asc or desc. Not supported with --repo. | asc |
--check-updates | With --harness only: compare installed versions against Artifactory. Adds REGISTRY LATEST and STATUS columns. Requires a configured JFrog Artifactory server. Not supported with --repo. | false |
--format | Output format: table or json. | table |
Status Values for Check Updates
When you use --check-updates with --harness, the STATUS column uses the following values.
| Status | Meaning |
|---|---|
current | Installed version matches the latest in the registry |
behind | A newer version is available in the registry |
ahead | Installed version is newer than the latest in the registry |
unknown | Registry could not be reached, repo is unknown, or version comparison failed |
Examples
List all plugins in a repository:
jf agent plugins list --repo agents-localList plugins installed for Cursor and check for updates:
jf agent plugins list --harness cursor --check-updatesList plugins for Claude and Codex as JSON (object keyed by harness name):
jf agent plugins list --harness claude,codex --format jsonExample JSON response (single harness):
[
{
"name": "my-plugin",
"version": "1.0.0",
"description": "Example plugin.",
"repo": "agents-local",
"path": "$HOME/.cursor/plugins/local/my-plugin"
}
]Example JSON response (repository mode):
[
{
"name": "my-plugin",
"version": "1.2.0",
"source": "Repo: agents-local"
}
]Search Plugins
Searches for plugins by name using the Artifactory property search API. The CLI matches against the agentplugins.name property. Queries without * are wrapped as *QUERY* so substring matches work; if your query already contains *, it is passed through unchanged. This command has no interactive prompts; see Interactive and CI Non-Interactive Modes.
Repo resolution for search is different from publish/install/delete: search uses only --repo or JFROG_AGENT_PLUGINS_REPO. It does not auto-discover agentplugins repositories or show the repository picker. If both are omitted, the property search runs without a repository filter.
To search for plugins by name:
jf agent plugins search QUERY [--repo REPOSITORY_NAME] [--format json]Where:
QUERY: Plugin name or search term (required positional argument; substring match by default)REPOSITORY_NAME: Optional repository to search (or setJFROG_AGENT_PLUGINS_REPO)
Flags
| Flag | Description | Default |
|---|---|---|
--repo | Agent plugins repository to search. When omitted, uses JFROG_AGENT_PLUGINS_REPO if set; otherwise searches without a repository filter. | — |
--format | Output format: table or json. | table |
Examples
Search without a repository filter:
jf agent plugins search web-scraperSearch a specific repository with JSON output:
jf agent plugins search web-scraper --repo agents-local --format jsonExample JSON response:
[
{
"name": "web-scraper",
"version": "1.2.0",
"repository": "agents-local",
"description": "Scrapes web pages for agent workflows."
}
]Plugins Repository Resolution
For publish, install, update (single-plugin), and delete, when --repo is omitted the CLI resolves the repository using the following priority order:
--repoflag valueJFROG_AGENT_PLUGINS_REPOenvironment variable- Auto-discovery: queries JFrog Artifactory for all local repositories with package type agentplugins
- If exactly one is found, it is used automatically.
- If multiple are found in interactive mode, you are prompted to select one.
- If multiple are found in CI or quiet mode, the command fails with the list of options.
Exceptions:
list --repo: requires an explicit--repovalue (no env var fallback and no auto-discovery).list --harness: local listing;--repois not used.--check-updatesreads each plugin's recorded repository from install metadata or the native registry.update --all:--repois an optional filter against each plugin's recorded repository; it does not resolve a shared target repository.search: uses only--repoorJFROG_AGENT_PLUGINS_REPO; no auto-discovery or repository picker.
Expected Output
When more than one agentplugins repository exists and --repo is omitted for a command that uses auto-discovery:
Select an agent plugins repository: agents-localCI Behavior
Fails with: multiple agent plugins repositories found (repo-a, repo-b); specify --repo or set JFROG_AGENT_PLUGINS_REPO.
Plugins Environment Variables
| Variable | Commands | Description | Default |
|---|---|---|---|
JFROG_AGENT_PLUGINS_REPO | publish, install, update (single), delete, search | Specifies the agent plugins repository when --repo is not set. Not used by list. | — |
EVD_SIGNING_KEY_PATH | publish | Path to the PGP private key for evidence signing. Overridden by --signing-key. | — |
JFROG_CLI_SIGNING_KEY | publish | Alternative path to the PGP signing key. Lower priority than EVD_SIGNING_KEY_PATH. | — |
EVD_KEY_ALIAS | publish | Alias for the signing key. Overridden by --key-alias. | — |
JFROG_CLI_BUILD_NAME | publish | Build name for build-info collection. Overridden by --build-name. | — |
JFROG_CLI_BUILD_NUMBER | publish | Build number for build-info collection. Overridden by --build-number. | — |
JFROG_AGENT_PLUGINS_DISABLE_QUIET_FAILURE | install | Set to true to allow installation to continue when evidence verification fails in CI or quiet mode. | false |
Related Topics
Updated 3 days ago
