Skip to content

AX-1644 - add jfrog mcp#26

Open
yanivt-jfrog wants to merge 10 commits into
mainfrom
AX-1644-mcp
Open

AX-1644 - add jfrog mcp#26
yanivt-jfrog wants to merge 10 commits into
mainfrom
AX-1644-mcp

Conversation

@yanivt-jfrog

Copy link
Copy Markdown
Collaborator

No description provided.

@yanivt-jfrog yanivt-jfrog changed the title Ax 1644 mcp AX-1644 - add jfrog mcp Jun 16, 2026

@YoniMelki YoniMelki left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — AX-1644: built-in always-on JFrog MCP (Cursor)

The change is coherent: mcp.json switches the jfrog server from a direct remote URL to npx @jfrog/agent-guard with _JF_ARGS=mcp=jfrog-mcp, and the README + jfrog-mcp-management.md hard-rules clearly explain the always-on, catalog-exempt model and the jfrog vs jfrog-catalog coexistence story. The template guidance (scope: plugin (jfrog), never run catalog flows against it, the admin-allowlist troubleshooting) is genuinely good.

Two things to resolve before merge:

1. ${VAR:-default} registry expansion in Cursor (functional risk). The bundled mcp.json depends on Cursor expanding a bash-style default inside args. If Cursor doesn't implement :-default semantics, npx gets the literal ${...} string as --registry and package resolution fails. This is a new pattern (the catalog flow writes a concrete URL, not a :-default). Please confirm the server launches with JFROG_AGENT_GUARD_REPO both set and unset. (inline)

2. JFROG_PLATFORM_URLJFROG_URL is a breaking, format-changing rename. Needs a migration note + an explicit "must include https://" caveat. (inline)

Also heads-up (no change required here): the agent-guard-hook validates --registry as a literal http(s) URL and reads the raw mcp.json, so the ${VAR:-default} form would be rejected by a deployed hook — I've flagged that on the agent-guard PR for coordination.

Comment thread plugins/jfrog/mcp.json Outdated
"command": "npx",
"args": [
"--yes",
"--registry", "${JFROG_AGENT_GUARD_REPO:-https://releases.jfrog.io/artifactory/api/npm/coding-agents-npm/}",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verify ${VAR:-default} expansion in Cursor. This relies on Cursor expanding the bash-style default ${JFROG_AGENT_GUARD_REPO:-https://...} inside args at launch. Cursor's mcp.json interpolation is ${env:VAR} / ${VAR} style and — as far as I know — does not implement bash :-default semantics. If that's the case, npx receives the literal string ${JFROG_AGENT_GUARD_REPO:-https://...} as the --registry value, which is not a valid registry, and package resolution fails. This pattern is new to this PR (the catalog flow writes a concrete <REGISTRY_URL>, never a :-default). Please confirm the built-in server actually launches in Cursor with JFROG_AGENT_GUARD_REPO unset (so the default fires) and set. Related: the agent-guard-hook validates this exact arg as a literal http(s) URL — see my note on the agent-guard PR.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved. The `--registry` value is now the hardcoded `https://releases.jfrog.io/artifactory/api/npm/coding-agents-npm/\` — no `${VAR:-default}` expansion, so the Cursor-interpolation concern is moot. I verified the new entry against agent-guard's own `agent-guard-hook.mjs`: `validateAgentGuard` returns `null` (pass), whereas the old `${VAR:-...}` string returned "not an http(s) URL" (would have denied every tool call). 👍

Comment thread README.md Outdated
| Variable | Description |
| --- | --- |
| `JFROG_PLATFORM_URL` | Your JFrog platform URL, e.g. `mycompany.jfrog.io` |
| `JFROG_URL` | Your JFrog platform URL, e.g. `https://mycompany.jfrog.io` |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This renames the user-facing env var JFROG_PLATFORM_URLJFROG_URL and changes its format: the old var was host-only (mycompany.jfrog.io), the new one is a full URL with scheme (https://mycompany.jfrog.io). That's a breaking change for existing users. Two asks:

  1. Add a short migration note so upgraders know to switch the variable (and add the scheme).
  2. agent-guard does not prepend a scheme (buildJfrogMCPDetails only trims trailing slashes), so a carried-over host-only value yields mycompany.jfrog.io/mcp and the connection fails silently. A one-line "must include https://" caveat would prevent that.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved. The breaking rename is now called out prominently: a Breaking: bullet in "What's new" and a dedicated upgrade blockquote in Authentication, both explaining the host-only → full-URL-with-scheme format change. One tiny nit (non-blocking): the note is filed under "What's new in v0.5.0" and says "pre-v0.5.0", but plugin.json is now 0.5.5 — consider aligning the version label. 👍

@YoniMelki YoniMelki left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review — both findings resolved ✅

Re-reviewed at head 37bdf19 (was CHANGES_REQUESTED). Both blocking findings are addressed:

  1. mcp.json registry expansion — now a hardcoded https://releases.jfrog.io/artifactory/api/npm/coding-agents-npm/ (no ${JFROG_AGENT_GUARD_REPO:-default}). I verified this exact entry against agent-guard's agent-guard-hook.mjs: validateAgentGuardnull (passes); the old ${VAR:-default} string returned "not an http(s) URL" and would have denied every tool call on the built-in jfrog server. The Cursor ${env:VAR}-interpolation + hook-rejection risk is gone. ✅
  2. JFROG_PLATFORM_URLJFROG_URL breaking rename — now flagged with a Breaking: bullet in "What's new" and a dedicated upgrade blockquote in Authentication, both spelling out the host-only → full-URL-with-scheme change and the silent-breakage failure mode. ✅

Docs are notably thorough (Prerequisites add Node ≥14/npx, new "JFrog MCP" section, troubleshooting entry that correctly frames the admin MCP-allowlist case as an enterprise-policy issue).

One non-blocking nit: the breaking note lives under "What's new in v0.5.0" / "pre-v0.5.0" but plugin.json is now 0.5.5 — worth aligning the version label. Not a blocker.

Switching to APPROVE.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants