Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ JFrog plugin for [Cursor](https://cursor.com): artifact management, security sca

- **Official skills.** The plugin now uses the official [jfrog-skills](https://github.com/jfrog/jfrog-skills) v0.11.0, replacing the previously bundled skill content. This brings structured reference files, automation scripts, and a three-tier tool selection strategy (MCP, CLI, REST/GraphQL).
- **Package safety skill.** New `jfrog-package-safety-and-download` skill for checking whether packages are safe, curated, or allowed before downloading them through Artifactory.
- **Built-in `jfrog` MCP** routed through `@jfrog/agent-guard`. **Breaking:** the previous `JFROG_PLATFORM_URL` env var (host-only, e.g. `mycompany.jfrog.io`) is replaced by `JFROG_URL`, which **must include the scheme** (e.g. `https://mycompany.jfrog.io`). Carrying over the old host-only value will produce a silently-broken endpoint URL — re-export the variable with `https://` before relaunching Cursor. See [Authentication](#authentication).
---

## Features
Expand Down Expand Up @@ -52,12 +53,16 @@ Use either the marketplace link from the [Configure Cursor](https://docs.jfrog.c

| Variable | Description |
| --- | --- |
| `JFROG_PLATFORM_URL` | Your JFrog platform URL, e.g. `mycompany.jfrog.io` |
| `JFROG_URL` | Your JFrog platform URL **including the scheme**, e.g. `https://mycompany.jfrog.io`. A host-only value (e.g. `mycompany.jfrog.io`) will produce a malformed endpoint and the MCP will fail to connect. |
| `JFROG_ACCESS_TOKEN` | Your JFrog access token |

> **Upgrading from a pre-v0.5.0 plugin?** The old `JFROG_PLATFORM_URL` (host-only) is gone — re-export your URL as `JFROG_URL` with `https://` in front of the host.

The built-in `jfrog` MCP launches `npx @jfrog/agent-guard` and reads both `JFROG_URL` and `JFROG_ACCESS_TOKEN` from the launching shell, so make sure they're exported in the shell that starts Cursor.

### 2. Configure the JFrog CLI

Run `jf login` for browser-based setup, or set the `JFROG_ACCESS_TOKEN` environment variable. MCP-based workflows authenticate via OAuth and require no additional configuration.
Run `jf login` for browser-based setup, or set the same `JFROG_ACCESS_TOKEN` from step 1.

---

Expand Down
2 changes: 1 addition & 1 deletion plugins/jfrog/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "jfrog",
"displayName": "JFrog Platform",
"version": "0.5.4",
"version": "0.5.5",
"description": "JFrog Platform integration with MCP, security skills, supply-chain best practices, and JFrog Agent Guard governance for adding, removing, and listing MCP servers.",
"author": {
"name": "JFrog",
Expand Down
18 changes: 14 additions & 4 deletions plugins/jfrog/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,28 @@ JFrog Platform integration for Cursor — artifact management, security scanning
2. An admin must **enable the JFrog MCP Server** on the platform (Cloud/SaaS only):
- Navigate to **Administration > General > Settings** in the JFrog UI.
- Toggle the **MCP Server** option ON and save.
3. Set the `JFROG_PLATFORM_URL` environment variable to your JFrog instance (e.g., `mycompany.jfrog.io`).
4. **JFrog CLI** (`jf`) is used by the skills for authentication and REST/GraphQL API operations. If missing, the agent will attempt to install it. You can also install manually via `brew install jfrog-cli` or the [official install script](https://jfrog.com/help/r/jfrog-cli/install-the-jfrog-cli).
3. Set the `JFROG_URL` (full URL, e.g. `https://mycompany.jfrog.io`) and `JFROG_ACCESS_TOKEN` environment variables — the built-in `jfrog` MCP needs both at launch.
4. **Node.js** (≥ 14) — with `npx` on your `PATH` (used to launch `@jfrog/agent-guard`).
5. **JFrog CLI** (`jf`) is used by the skills for authentication and REST/GraphQL API operations. If missing, the agent will attempt to install it. You can also install manually via `brew install jfrog-cli` or the [official install script](https://jfrog.com/help/r/jfrog-cli/install-the-jfrog-cli).

CLI authentication options: run `jf login` for browser-based setup, or set the `JFROG_ACCESS_TOKEN` environment variable. MCP-based workflows authenticate via **OAuth** and require no additional configuration.
CLI authentication options: run `jf login` for browser-based setup, or set the same `JFROG_ACCESS_TOKEN` from step 3.

## Included

| Component | Path | Description |
|---|---|---|
| **MCP** | `mcp.json` | Remote JFrog MCP server (OAuth, no API keys) |
| **MCP** | `mcp.json` | Built-in JFrog MCP routed through `@jfrog/agent-guard` to `${JFROG_URL}/mcp` (server name: `jfrog`). Always available, not subject to AI Catalog policy — see [JFrog MCP](#jfrog-mcp). |
| **Hook** | `hooks/hooks.json` | Agent Guard — MCP server governance via JFrog AI Catalog |

### JFrog MCP

The plugin ships a built-in `jfrog` MCP registered in `mcp.json`. Cursor
launches it automatically as `npx @jfrog/agent-guard` with
`_JF_ARGS=mcp=jfrog-mcp`. agent-guard recognizes that shape, skips the AI
Catalog, and connects directly to `${JFROG_URL}/mcp` with
`Authorization: Bearer ${JFROG_ACCESS_TOKEN}` (both env vars are listed
under [Prerequisites](#prerequisites)).

### Skills

| Skill | Triggers when you mention... |
Expand Down
10 changes: 9 additions & 1 deletion plugins/jfrog/mcp.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
{
"mcpServers": {
"jfrog": {
"url": "https://${JFROG_PLATFORM_URL}/mcp"
"command": "npx",
"args": [
"--yes",
"--registry", "https://releases.jfrog.io/artifactory/api/npm/coding-agents-npm",
"@jfrog/agent-guard"
],
"env": {
"_JF_ARGS": "mcp=jfrog-mcp"
}
}
}
}
21 changes: 19 additions & 2 deletions plugins/jfrog/templates/jfrog-mcp-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ STOP — do NOT run the command with guesses.

## Adding an MCP

**Note — built-in `jfrog`:** the bundled `jfrog` entry
(`_JF_ARGS=mcp=jfrog-mcp`, bypasses the catalog) is NEVER installed,
inspected, or edited via this flow. For catalog-managed tool policy
on JFrog, install the catalog version under a DIFFERENT `mcpServers`
key (e.g., `jfrog-catalog`) so it coexists with the built-in.

**Did the user name a specific MCP package?** ("add `foo-mcp`",
"install `@scope/bar`"). If NOT — they said something like "yes",
"add an MCP", "what can I install" — your FIRST action is to show
Expand Down Expand Up @@ -290,6 +296,9 @@ Outcomes:

## Removing an MCP

**Note — built-in `jfrog`:** removal is only via uninstalling the
`jfrog` plugin from Cursor; never delete it from the bundled `mcp.json`.

1. Delete the entry from `mcpServers` in the file it was installed
in (`.cursor/mcp.json` or `~/.cursor/mcp.json`).
2. If OAuth was used (Step 5), also remove its entry from
Expand All @@ -305,7 +314,7 @@ touching any file or shell:

| User said… | Run |
| --- | --- |
| "available", "what can I install", "what's in the catalog", "list MCPs" without other context | **Available to install** below — go straight to `--list-available`; do NOT inspect local files first |
| "available", "what can I install", "what's in the catalog", "list MCPs", "what MCPs can I use", "which MCP servers can I use" without other context | **Available to install** below — go straight to `--list-available`; do NOT inspect local files first |
| "installed", "configured", "connected", "running", "what MCPs do I have" | **Currently installed** below |
| ambiguous / both | run **both** subsections in order: Currently installed first, then Available to install, and present them as separate tables |

Expand All @@ -326,7 +335,9 @@ elsewhere.
and whose `args` include `@jfrog/agent-guard`, show: display name
(the JSON key), package (`mcp=` in `_JF_ARGS`), server
ID (value after `--server`), scope (project / user).
3. If a configured entry does not appear in `cursor agent mcp list`,
3. The bundled `jfrog` entry (`_JF_ARGS=mcp=jfrog-mcp`) is reported
with `scope: plugin (jfrog)`, `package: jfrog-mcp (bundled)`.
4. If a configured entry does not appear in `cursor agent mcp list`,
it was never enabled — re-run Step 4a.

### Available to install
Expand Down Expand Up @@ -421,6 +432,12 @@ the display name.
Tools & MCP** — never enabled. Re-run Step 4a
(`cursor agent mcp enable <name>`); if the entry is brand-new,
also `Developer: Reload Window` so Cursor picks up the file.
- **Built-in `jfrog` MCP missing** — almost always `JFROG_URL` /
`JFROG_ACCESS_TOKEN` not exported in the launching shell
(agent-guard reads them from the shell for the plugin's bundled
`jfrog` entry — they MUST NEVER be added to any `mcp.json` `env`
block, including the bundled one); agent-guard fails fast at
startup, check the error in the Cursor MCP / Output panel.
- **Agent Guard: `multiple/no JFrog server configured`** (the agent guard
cannot pick a JFrog server) — pass `--server <ID>` (after
`jf c add <SERVER_ID>`) OR export both `JFROG_URL` and
Expand Down
Loading