Nanobot

Nanobot brings browser OAuth to remote MCP servers

Nanobot adds a browser-based OAuth path for remote MCP servers while migrating its integration toward MCP SDK v2 with legacy compatibility. A concurrent settings-backend split separates Web UI configuration domains so auth and transport changes do not remain one undifferentiated service.

← Back to homeOriginal source ↗

HKUDS/nanobot PR #5316 is the inspected primary source: “feat(mcp): add browser OAuth for remote servers.” The related records below were inspected as supporting context rather than independent confirmation.

The facts

- HKUDS/nanobot PR #5316 was created 2026-08-10T06:05:28Z and was closed at inspection; its title is “feat(mcp): add browser OAuth for remote servers.” - HKUDS/nanobot PR #5179 was created 2026-07-30T08:44:25Z and was open at inspection; its title is “Migrate MCP integration to SDK v2 with legacy compatibility.” - HKUDS/nanobot PR #5323 was created 2026-08-10T10:54:25Z and was open at inspection; its title is “refactor(webui): split settings backend by domain.” - The repository reported 46829 stars, 803 open issues, default branch main, and last push 2026-08-10T16:25:39Z. - The latest tagged-release baseline checked was v0.3.0 published 2026-07-25T08:08:47Z.

What changed

HKUDS/nanobot PR #5316 reports: Summary add browser-based OAuth for remote Streamable HTTP and SSE MCP servers using the official MCP SDK add one-click Xmind, Notion, and Linear presets, plus OAuth support for imported/custom MCP configs let custom HTTP/SSE servers choose None, OAuth, or Headers directly in the Apps UI make the Apps catalog explicitly describe MCP tools and show clear Connect / Connecting / Connected states persist scoped MCP credentials outside config.json and hot-reload tools after authorization register nanobot branding metadata so provider consent pages can show the project icon and website support OAuth from a remotely accessed plain-HTTP WebUI with a guided full-callback-URL paste flow UX The primary flow is Apps -> MCP -> Connect -> provider consent. HTTPS and localhost WebUIs return to nanobot automatically without copying anything a remote plain-HTTP WebUI registers a loopback callback, explains that the localhost page will not load, and presents one field for pasting the complete URL from the browser address bar; users do not need to identify or extract the authorization code an explicit Cancel action remains available throughout authorization,

HKUDS/nanobot PR #5179 reports: Summary migrate the MCP client integration from the v1 ClientSession API to the v2 high-level Client API add the MCP SDK's httpx2 transport while preserving SSRF validation, redirect checks, DNS pinning, proxy routing, and finite timeouts preserve compatibility with legacy SSE and streamable HTTP servers, including stale-session reconnects and v1 camelCase response fields update MCP connection, retry, reconnect, probe, proxy, redirect, and content rendering tests for the v2 API Why MCP 2.x implements the 2026-07-28 protocol and changes the Python SDK client and model APIs. A direct migration can hang against legacy SSE servers during automatic protocol discovery and can miss reconnects when older streamable HTTP servers return Session not found. This change uses the legacy handshake for SSE, leaves stdio and streamable HTTP on automatic negotiation, and recognizes legacy stale-session errors before reconnecting. Compatibility and impact existing MCP configuration remains valid legacy mcp==1.26.0 SSE and streamable HTTP servers were exercised against this branch legacy SDK-style fields inputSchema, isError, and mimeType remain readable alongside v2 snake_case fields users upgrading an existing checkout must reinstall Python

HKUDS/nanobot PR #5323 reports: Summary split the settings backend into model/provider, capability, system/channel, and shared-contract domains keep settings_api.py as the compatibility/config facade and settings_routes.py as the HTTP/WebSocket dispatcher preserve PR #5321's gateway-owned settings service, explicit config path, serialized atomic writes, and OAuth registry add direct domain-contract tests without changing webui/src Stack This is stack 1/2: PR6 will be branched from and target this PR's head branch. Verification 613 passed, 1 skipped across settings, gateway, CLI gateway, and WebSocket/channel suites WebUI: 53 files / 978 tests passed production WebUI build passed Ruff passed for nanobot/ and tests/ BasedPyright: 0 errors, 0 warnings isolated browser smoke passed: settings read, authenticated WebSocket write, refresh persistence, legacy HTTP mutation 405, clean console, clean runtime teardown simplify, verify, and candidate-review gates: PASS Risk This is a large but primarily mechanical ownership migration. Settings wire shape, paths, authentication, persistence, gateway service ownership, and frontend behavior are preserved. Live third-party OAuth/provider credential exchange was not exercised; those paths remain covered by focused registry and routing tests.

Why it matters

Remote MCP is no longer just a socket problem once operators authenticate in a browser. Redirect state, token custody, compatibility and settings ownership must agree across CLI, gateway and UI. The operator test is whether visible output, retained state and authority still describe the same event after retries, background work or restart.

Current

The primary record was closed when captured on 2026-08-11. The tagged-release baseline was v0.3.0 published 2026-07-25T08:08:47Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.

Evidence

The primary URL is https://github.com/HKUDS/nanobot/pull/5316. Supporting records are https://github.com/HKUDS/nanobot/pull/5179 and https://github.com/HKUDS/nanobot/pull/5323. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.

Source boundary

Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.

Operator take

Bind callback state to one pending connection, store tokens outside rendered settings, and test legacy and SDK-v2 transports against the same authorization boundary. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.

Caveat

Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.

Source inspected; source state, environment and release boundary remain explicit.