[STG-2487] feat: static multi-marketplace manifest catalog (browse-only, CLI-only)#3
Open
shrey150 wants to merge 5 commits into
Open
[STG-2487] feat: static multi-marketplace manifest catalog (browse-only, CLI-only)#3shrey150 wants to merge 5 commits into
shrey150 wants to merge 5 commits into
Conversation
…MCP) Repurpose browse-plugin into a dedicated, static (no-codebase) repo that external agent marketplaces can SHA-pin. Ships only the `browse` plugin, in all 5 marketplace formats, pointed at the hosted Browserbase MCP. Add root marketplace manifests for every format: - .claude-plugin/marketplace.json (Claude Code) - .codex-plugin/plugin.json (Codex) - .cursor-plugin/marketplace.json (Cursor, browse-only) - .agents/plugins/marketplace.json (generic .agents) - .grok-plugin/plugin.json (Grok) - gemini-extension.json (Gemini CLI) - .mcp.json + server.json (hosted MCP: https://mcp.browserbase.com/mcp) Per-plugin manifests under plugins/browse/{.claude-plugin,.codex-plugin, .cursor-plugin,.grok-plugin}/plugin.json + plugins/browse/.mcp.json, all referencing ./skills/, ./.mcp.json, and assets/logo.svg. De-Playwright: remove the custom TypeScript MCP server, npm build, agent runtime dirs, the browser-automation skill, rules, and the entire functions plugin. Ship the canonical browse CLI SKILL.md instead. Add .github/CODEOWNERS (* @browserbase/gtm), rewrite README + add-a-plugin docs for the static hosted-MCP layout, drop build steps from release.yml. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Every manifest shipped a bare https://mcp.browserbase.com/mcp URL with no auth (no header, no query param). Live-tested via real marketplace installs in Claude Code and Gemini CLI: the model reaches the hosted MCP tool but every call is rejected server-side with "Invalid query parameters" (no browserbaseApiKey in header or query string; full OAuth 2.1 isn't deployed either). A static, git-pinned public repo can't safely embed a real API key, so there's no one-click fix available for this distribution path today. This audience (devs pulling the marketplace into Claude Code, Codex, Cursor, Gemini CLI) already has shell access, so MCP added no reach CLI doesn't already cover. Scope to CLI-only: strip mcpServers from all plugin manifests, delete .mcp.json/server.json, and give Gemini a real CLI path via a GEMINI.md context file (Gemini's SKILL.md equivalent) instead of its MCP-only extension. Live end-to-end verified against the real repo files post-change: Claude Code (zero MCP tools registered, real browse CLI call, correct result) and Gemini CLI (real shell calls via GEMINI.md, correct result). Codex install/registration verified clean; invocation untestable on this machine due to an unrelated expired local OpenAI API key. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The nested plugins/browse/ layout was scaffolding for when this repo held two plugins (browse + functions). Now that it's committed to shipping a single browse plugin, the nesting has no remaining beneficiary and breaks third-party tools with a simpler root-scan convention — confirmed with Hermes Agent's skill "tap" mechanism, which hardcodes looking for skills/ at repo root and can't find our skill nested under plugins/browse/skills/. Moves skills/browse/SKILL.md and the per-format plugin.json files up to repo root, updates every marketplace file's source/path from "./plugins/browse" to ".", and removes the now-redundant duplicate Codex/Grok plugin.json files that existed at both root and nested paths. Matches link-cli's own flat layout, the reference this repo was modeled on from the start. node scripts/validate-template.mjs passes clean (same benign hooks/mcp warnings as before). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This repo's copy was from 2026-07-07 (pre-STG-2513) and was missing: - --local vs --remote guidance for Chrome-less containers/CI/sandboxes - BROWSE_SESSION env-var precedence rule (don't pass --session if it's already set) - Named contexts (cloud contexts create --name / list), which shipped in browse@0.9.1 and is live in the current published browse@0.9.4 -- this repo still had the old ID-only surface Pulled verbatim from origin/main (stagehand#82c489bd). Auto-sync (stagehand#2330) is still a draft proposal, so this is a manual, one-time pull -- re-sync by hand until that lands.
ziruihao
approved these changes
Jul 9, 2026
Leftover from before the CLI-only scoping (a1b3d03) deleted .mcp.json and server.json -- this repo doesn't ship an MCP config anymore.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Repurposes
browserbase/browse-plugininto the dedicated, static (no-codebase) repo that external agent marketplaces SHA-pin. Ships only thebrowseplugin, in all 5 marketplace formats, CLI-only — abrowseCLI skill that shells out viaBash/run_shell_command, no bundled MCP server.Added — root marketplace manifests (one per format)
.claude-plugin/marketplace.json.codex-plugin/plugin.json.cursor-plugin/marketplace.json.agents/plugins/marketplace.json.agentsmarketplace.grok-plugin/plugin.jsongemini-extension.json+GEMINI.mdAdded — per-plugin manifests under
plugins/browse/.claude-plugin/,.codex-plugin/,.cursor-plugin/,.grok-plugin/plugin.jsoneach referencing./skills/andassets/logo.svg. The canonical browse CLISKILL.md(copied fromstagehand/packages/cli/skills/browse/) lands atskills/browse/SKILL.md(repo root, post-flatten) with itsname/descriptionfrontmatter intact.SKILL.md freshness
There's no auto-sync yet (stagehand#2330 is still a draft proposal), so
skills/browse/SKILL.mdis a manual, point-in-time copy ofstagehand/packages/cli/skills/browse/SKILL.md. Refreshed once more (2026-07-09) to pull in container/CI--remoteguidance,BROWSE_SESSIONprecedence, and the named-contexts surface (cloud contexts create --name) that had shipped inbrowse@0.9.1+ but wasn't in this repo's earlier copy. Re-sync by hand until the auto-sync PR lands.browse@0.9.5published the same day (npm +ghcr.io/browserbase/browse) — diffed this repo'sskills/browse/SKILL.mdagainststagehand'sorigin/maincopy after that release and they're byte-identical, so this file matches whatnpm i -g browseactually installs today, not a bleeding-edgemainthat's ahead of the published package.Removed — the de-Playwright, and (later) the de-MCP
Deleted the custom TypeScript MCP server and all app code (
plugins/browse/{src,scripts,agent,package.json,package-lock.json,tsconfig.json},plugins/browse/skills/browser-automation/,plugins/browse/rules/,plugins/functions/). Then, after live-testing the hosted-MCP wiring (see "Why CLI-only" below), removed it too:mcpServersstripped from everyplugin.json,.mcp.json(root + per-plugin) andserver.jsondeleted,gemini-extension.jsonrewritten to a plain CLI-context extension. Net across both changes: +926 / −3932.Why CLI-only, not MCP
The plugin originally bundled both a CLI-shelling skill and a hosted-MCP reference (
.mcp.json→https://mcp.browserbase.com/mcp) side by side, letting the agent pick either at runtime. Live-testing that MCP path (real marketplace installs, real headless invocations — not just schema validators) found it's currently broken for every client, and not fixable within this PR's scope:Authorization: Bearer, nox-bb-api-keyheader, no?browserbaseApiKey=query param.initialize/tools/listare unauthenticated by design;start/navigate/etc. are not). With none supplied, every real tool call was rejected:{"jsonrpc":"2.0","error":{"code":-32000,"message":"Invalid query parameters"}}. Confirmed independently through two different real clients (Claude Code, Gemini CLI) — same error, same root cause both times.https://mcp.browserbase.com/.well-known/oauth-protected-resourceandoauth-authorization-server, both 404; zerooauth/authorize|token|registerroutes exist anywhere inbrowserbase/core'sorigin/main.Given that, and that this audience already has shell access (Claude Code, Codex, Cursor, Gemini CLI, Grok all run with a sandbox), a bundled MCP server adds no reach for these clients while introducing a broken/confusing fallback path — in testing, the agent would sometimes pick the (broken) MCP tool over the (working) CLI skill when both were present. CLI-only removes that ambiguity and matches what's actually proven to work. The hosted MCP remains the right integration for shell-less surfaces (ChatGPT, claude.ai) — that's a separate initiative, gated on OAuth for those specific directories, tracked outside this PR.
E2E Test Matrix
Manifest validators (all formats, run against this branch)
node scripts/validate-template.mjsValidation passed.(exit 0) + 2 benign warnings: nohooks/hooks.json, nomcp.json(expected now — CLI-only)owner.nameset, non-emptyplugins[], source-dir/name match, referencedlogo/skillspaths + SKILL.md frontmatter all exist. Re-ran clean after the 2026-07-09 SKILL.md refresh.claude plugin validate ./claude plugin validate . --strict✔ Validation passed(both)claude plugin validate plugins/browse/... --strict✔ Validation passed(both)gemini extensions validate .Extension . has been successfully validated.codex plugin marketplace add <abs>→codex plugin list→ removebrowse@browserbase-pluginsresolved atplugins/browseplugin-marketplaceclone)Catalog OK, generatedbrowseentry resolvesskills: [{browse, ...}], nomcpServerskeygrokCLI itself isn't installed locally — not live-invocation-tested.Real install-and-invoke (live, this session — not just validators)
claude plugin marketplace add→install→ headlessclaude -ptask ("navigate to example.com, report the title") against the actual repo filesclaude plugin detailsreportedMCP servers (0). Transcript shows onlySkill/Bashtool calls — the model shelled out tobrowse open ... --local, got back"title": "Example Domain", answered correctly. Zeromcp__*calls anywhere.gemini extensions install ~/Developer/browse-plugin→ headlessgemini --yolotask, same promptGEMINI.md), no MCP servers. Tworun_shell_commandcalls (browse open ... --local,browse stop), correct answer, zero MCP calls.codex plugin marketplace add→codex plugin add→ headlesscodex exec, same promptbrowse@browserbase-pluginsinstalled/enabled). Invocation blocked by this machine's localcodex loginhaving an expired OpenAI API key (401 invalid_api_key) — an environment issue unrelated to the plugin; the turn never started so no tool call was attempted. Needs a valid local Codex login to complete.All three live tests ran against the real, post-change repo files (not scratch copies), with full install → invoke → cleanup, and confirmed the working tree was left unmodified by testing.
Not proven / left for review
grokCLI invocation (not installed locally).codex loginis refreshed.🤖 Generated with Claude Code
Note
Medium Risk
Large behavioral break for installs that relied on bundled MCP/tools, though risk to production services is low because the change removes executable code rather than altering auth or data paths.
Overview
Repurposes the repo into a static, SHA-pinnable marketplace catalog with no app code: agents get JSON manifests plus
skills/browse/SKILL.md(andGEMINI.mdfor Gemini) that teach shelling out to the globalbrowseCLI instead of bundling Playwright, TypeScript, or an MCP server.Layout and packaging: Drops nested
plugins/browse/and the entireplugins/functions/plugin. Repo root is now the plugin (source: "."), with new/updated manifests for Claude, Codex, Cursor,.agents, Grok, andgemini-extension.json. Cursor marketplace lists onlybrowse.Removed runtime: Deletes the custom MCP server (
mcp.json,plugins/browse/src/*), npm package/build (package.json, lockfile,tsconfig), MCP-oriented skills/rules, and Chrome-profile/runtime gitignore entries. Release workflow no longer runsnpm ci/build—onlyvalidate-template.mjsand tarball packaging.Docs: README and
docs/add-a-plugin.mdrewritten for CLI-only positioning and flat layout; adds.github/CODEOWNERS.Reviewed by Cursor Bugbot for commit 17f860a. Bugbot is set up for automated code reviews on this repo. Configure here.