Skip to content

Move box to https://mcp.box.simular.ai/mcp and migrate old relay entries - #19

Merged
chenchenSimular merged 2 commits into
chenchen/gemini-clifrom
chenchen/mcp-box-url
Nov 4, 2026
Merged

chenchenSimular merged 2 commits into
chenchen/gemini-clifrom
chenchen/mcp-box-url

Conversation

@chenchenSimular

@chenchenSimular chenchenSimular commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Closes #18. Stacked on #17 (base chenchen/gemini-cli). Both ship together as CLI 0.1.3.

Why

box's MCP server moved to https://mcp.box.simular.ai/mcp (OAuth issuer https://mcp.box.simular.ai). The old https://relay.simular.cloud/mcp still answers. But its protected-resource metadata now names https://mcp.box.simular.ai/mcp as the resource, so Claude Code, Codex and OpenCode refuse to sign in through it ("Protected resource ... does not match expected https://relay.simular.cloud"). That is why the install matrix on #17 failed.

What

  • New URL everywhere in prod: CLI default (DEFAULT_MCP_URL), claude/.mcp.json, hermes/mcp.json, dsh/cordis.patch.yml, READMEs, tests and the install matrix. Staging stays staging.relay.simular.cloud (no staging mcp host exists).
  • Plugin versions:
    • claude 0.1.0 → 0.1.1. A bump is required: claude plugin update compares versions.
    • hermes 0.1.0 → 0.1.1.
    • dsh 0.2.0 → 0.2.1. The README links dsh-v0.2.1, so tag dsh-v0.2.1 right after merge.
  • Migration in the CLI:
    • relay.simular.cloud moves to a new OLD_HOSTS list. It still counts as box by Simular, so the foreign-box guard accepts both the old and new URL as ours, and so does the old box-control.
    • connect rewrites an entry at the old address. It prints "box moved from https://relay.simular.cloud/mcp to https://mcp.box.simular.ai/mcp. may ask you to sign in to box again."
    • Claude Code: when the installed box@simular-box plugin still points at the old URL, connect runs claude plugin marketplace update simular-box, then claude plugin update box@simular-box --scope <its scope>. It then re-reads the plugin, and fails with a fix if the URL is still old (for example a forked or pinned marketplace). Then it says to restart Claude Code. I checked this against Claude Code 2.1.316 with a git marketplace: plugin update alone reports "already at the latest version" until the marketplace is updated.
    • doctor reports an entry at the old address as "box's old address, which no longer signs in; box is now at …". The endpoint probe now also fails when the metadata resource doesn't match the URL (RFC 9728), which is exactly this outage.
    • remove removes entries at either address.
  • Install matrix:
    • Every client is seeded with a box at the old address. connect must move it and print the sign-in note.
    • Claude Code installs the old plugin (0.0.1, relay URL) from a local git marketplace built from this checkout, then pushes this branch's plugin to it, the way a merge to main would. So the job tests this branch's plugin and the real update path, not main's plugin from GitHub. Git's url.<base>.insteadOf maps a fake https URL to the local repo through GIT_CONFIG_* env vars, set only in the isolated test environment.

What migrates automatically and what doesn't

Install Migrates?
Cursor, Codex, OpenCode, Gemini CLI, VS Code, Hermes (config.yaml), OpenClaw set up by the CLI Yes, on the next npx @simular-ai/box@0.1.3 connect. The user signs in again in the app.
Claude Code plugin box@simular-box Via connect (marketplace + plugin update, then restart). Without the CLI, only once the user runs /plugin marketplace update simular-box and /plugin update box@simular-box. Claude Code does not auto-update third-party marketplaces by default.
Hermes plugin folder (hermes/, copied by hand) No. The user copies the folder again. connect only edits config.yaml.
dsh plugin No. The user installs the dsh-v0.2.1 tarball (after the tag), and box-portal's link needs bumping.
Claude Desktop connector, or a server added by hand No. The user edits the URL in the app. doctor flags any it can read.
Anyone who doesn't re-run the CLI No. Their app fails sign-in until they act.

Tests

  • Unit (43 pass):
    • The old/new/staging host rules.
    • The probe's resource-mismatch check.
    • doctor's old-address message.
    • The real CLI moving Cursor and Codex entries off the old address (with the note; a re-run is quiet) and remove of an old entry.
    • The Claude plugin update path: dry run, update, idempotent, and the stale-marketplace error.
  • Install matrix: the claude-code job was run locally on macOS against Claude Code 2.1.316. CI covers 3 OSes.

Review

An independent review (simular-code-review plus a secure-coding invariant review) found nothing blocking. One suggestion is fixed in the second commit: re-check the plugin's URL after the update instead of reporting success blindly. Security: the set of hosts treated as ours is unchanged (same three hosts). The update commands use fixed arguments with an allowlisted scope. The git insteadOf mapping exists only in the test env.

Not verified

  • An interactive OAuth sign-in end to end at the new URL.
  • The real GitHub marketplace update path for an existing user. It was simulated with a local git marketplace.
  • Whether personal keys (Hermes/OpenClaw/dsh key mode) still work at the old address.

🤖 Generated with Claude Code

chenchenSimular and others added 2 commits November 4, 2026 12:33
The box MCP server moved from relay.simular.cloud to mcp.box.simular.ai. The old
address now returns protected-resource metadata naming the new URL, so MCP
clients refuse to sign in through it.

- CLI default URL, Claude Code / Hermes / dsh plugin configs and docs point at
  the new URL; plugin versions bumped (claude 0.1.1, hermes 0.1.1, dsh 0.2.1).
- connect rewrites a box entry at the old address (it stays "ours"), and says
  the app may ask to sign in again. For Claude Code it runs
  `claude plugin marketplace update` + `claude plugin update` when the
  installed plugin still points at the old URL.
- doctor flags an entry at the old address, and an endpoint whose metadata
  names a different resource.
- Install matrix seeds a box at the old address for every client and, for
  Claude Code, installs the old plugin from a local git marketplace built
  from this checkout, so it tests this branch's plugin and the update path.

Refs #18

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-up: if the marketplace still serves the old .mcp.json (a fork
or pinned ref), connect now fails with the fix instead of reporting success
and re-running the update on every connect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chenchenSimular
chenchenSimular merged commit ab377f2 into chenchen/gemini-cli Nov 4, 2026
53 of 54 checks passed
@chenchenSimular
chenchenSimular deleted the chenchen/mcp-box-url branch November 4, 2026 04:53
chenchenSimular added a commit that referenced this pull request Nov 4, 2026
…the CLI (#17)

* cli: Gemini CLI support, clear permission errors, Codex hint without the CLI

- gemini-cli client on our JSON writer: ~/.gemini/settings.json,
  mcpServers.box = {type: "http", url}; connect, doctor and remove, with
  the same foreign-server guard, backups and box-control cleanup. The
  next hint is `/mcp auth box` in a trusted folder.
- When a config can't be written (EACCES/EPERM), connect says so; for
  Codex it prints the steps to add box in the Codex app's Settings.
- The Codex sign-in hint points at the app when `codex` is not on PATH.
- gemini-cli joins the real-client install matrix on Linux, macOS and
  Windows (@google/gemini-cli@0.66.0).

Closes #16

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* cli: name the config (not a temp file) when it can't be changed; cover EBUSY

From review of #17: the permission message printed err.path, which can be
a temp file or a file whose folder is the real problem. It now names the
client's config and says the file or its folder may belong to another user.
EBUSY (Windows, app holds the file) gets the same help. The Codex app
steps are offered for the case where the app holds the file.

Refs #16

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Release @simular-ai/box 0.1.3 (Gemini CLI)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Move box to https://mcp.box.simular.ai/mcp and migrate old relay entries (#19)

* Move box to https://mcp.box.simular.ai/mcp and migrate old relay entries

The box MCP server moved from relay.simular.cloud to mcp.box.simular.ai. The old
address now returns protected-resource metadata naming the new URL, so MCP
clients refuse to sign in through it.

- CLI default URL, Claude Code / Hermes / dsh plugin configs and docs point at
  the new URL; plugin versions bumped (claude 0.1.1, hermes 0.1.1, dsh 0.2.1).
- connect rewrites a box entry at the old address (it stays "ours"), and says
  the app may ask to sign in again. For Claude Code it runs
  `claude plugin marketplace update` + `claude plugin update` when the
  installed plugin still points at the old URL.
- doctor flags an entry at the old address, and an endpoint whose metadata
  names a different resource.
- Install matrix seeds a box at the old address for every client and, for
  Claude Code, installs the old plugin from a local git marketplace built
  from this checkout, so it tests this branch's plugin and the update path.

Refs #18

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* cli: check the Claude Code plugin's URL after updating it

Review follow-up: if the marketplace still serves the old .mcp.json (a fork
or pinned ref), connect now fails with the fix instead of reporting success
and re-running the update on every connect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant