Skip to content

v1.7.0

Choose a tag to compare

@prih prih released this 25 Mar 13:32
· 145 commits to main since this release

Released: March 2026

Highlights

  • Full OAuth 2.0 support — both client_credentials and Authorization Code + PKCE (S256) grant types. AI chat clients (Claude.ai, etc.) authenticate via the browser-based consent flow; programmatic clients use client credentials. Discovery at GET /.well-known/oauth-authorization-server.
  • Frontend auth pages — consent page at /ui/auth/authorize (shows requesting service hostname, inline login if needed), standalone login page at /ui/auth/signin with returnUrl redirect.
  • Redis backend — optional Redis support (server.redis) for session store (auth codes, OAuth sessions) and embedding cache. Enables horizontal scaling and survives server restarts. In-memory fallback when disabled.
  • Tool naming consistency — all 58 MCP tools audited and renamed to consistent graph_verb_noun prefixes. Parameter names, defaults, and descriptions aligned across MCP tools and REST endpoints.

New Endpoints

  • GET /.well-known/oauth-authorization-server — RFC 8414 OAuth discovery metadata
  • POST /api/oauth/authorize — issue authorization code (JSON request/response)
  • POST /oauth/token — token exchange for client_credentials, authorization_code, and refresh_token grants
  • GET /api/oauth/userinfo — returns { sub, name, email } from Bearer token
  • POST /api/oauth/introspect — RFC 7662 token introspection
  • POST /api/oauth/revoke — RFC 7009 token revocation
  • POST /api/oauth/end-session — session termination

OAuth

  • oauth_refresh JWT type — refresh tokens are self-contained signed JWTs with type: "oauth_refresh", separate from UI refresh type. Only accepted at POST /oauth/token.
  • Atomic auth code exchangeSessionStore.getAndDelete() prevents TOCTOU race conditions on single-use authorization codes.
  • PKCE S256 — code challenge verification required for all Authorization Code flows.
  • Open redirect protectionreturnUrl on /ui/auth/signin validated to allow only relative paths.

Security

  • Auth before project lookup — MCP handler checks authentication before resolving the project, preventing project ID enumeration
  • WWW-Authenticate: Bearer on 401 — RFC 6750 header on all MCP 401 responses
  • Express trust proxyX-Forwarded-For and X-Forwarded-Proto correctly trusted behind reverse proxies

Configuration

  • New server.redis section: enabled, url, prefix, embeddingCacheTtl
  • Docker Compose includes Redis service with healthcheck
  • include field accepts YAML array in addition to single glob string

Fixes

  • Cleaner MCP responses — internal fields (fileEmbedding, pendingLinks, pendingImports, pendingEdges, version), null values, and empty arrays stripped
  • docs_get_node — removed fileEmbedding, pendingLinks, mtime from response
  • code_get_symbol — removed fileEmbedding, pendingImports, pendingEdges from response
  • notes_get, tasks_get, skills_get — removed version; null fields and empty arrays stripped

Tests

  • 1700 tests across 44 suites
  • Full OAuth endpoint coverage: discovery, authorize, token (all 3 grants), userinfo, introspect, revoke, end-session
  • Session store unit tests (Memory + Redis mock)
  • Embedding cache unit tests (Memory LRU + Redis mock)

Documentation

  • Updated all auth docs: docs/authentication.md, docs/security.md, docs/api-rest.md, docs/configuration.md
  • Updated site docs: security/authentication.md, guides/mcp-clients.md, getting-started/configuration.md
  • Updated README.md with OAuth and Redis overview
  • Updated docs/docker.md with Redis compose example