v1.7.0
Released: March 2026
Highlights
- Full OAuth 2.0 support — both
client_credentialsand 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 atGET /.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/signinwithreturnUrlredirect. - 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_nounprefixes. Parameter names, defaults, and descriptions aligned across MCP tools and REST endpoints.
New Endpoints
GET /.well-known/oauth-authorization-server— RFC 8414 OAuth discovery metadataPOST /api/oauth/authorize— issue authorization code (JSON request/response)POST /oauth/token— token exchange forclient_credentials,authorization_code, andrefresh_tokengrantsGET /api/oauth/userinfo— returns{ sub, name, email }from Bearer tokenPOST /api/oauth/introspect— RFC 7662 token introspectionPOST /api/oauth/revoke— RFC 7009 token revocationPOST /api/oauth/end-session— session termination
OAuth
oauth_refreshJWT type — refresh tokens are self-contained signed JWTs withtype: "oauth_refresh", separate from UIrefreshtype. Only accepted atPOST /oauth/token.- Atomic auth code exchange —
SessionStore.getAndDelete()prevents TOCTOU race conditions on single-use authorization codes. - PKCE S256 — code challenge verification required for all Authorization Code flows.
- Open redirect protection —
returnUrlon/ui/auth/signinvalidated to allow only relative paths.
Security
- Auth before project lookup — MCP handler checks authentication before resolving the project, preventing project ID enumeration
WWW-Authenticate: Beareron 401 — RFC 6750 header on all MCP 401 responses- Express
trust proxy—X-Forwarded-ForandX-Forwarded-Protocorrectly trusted behind reverse proxies
Configuration
- New
server.redissection:enabled,url,prefix,embeddingCacheTtl - Docker Compose includes Redis service with healthcheck
includefield 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— removedfileEmbedding,pendingLinks,mtimefrom responsecode_get_symbol— removedfileEmbedding,pendingImports,pendingEdgesfrom responsenotes_get,tasks_get,skills_get— removedversion; 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.mdwith OAuth and Redis overview - Updated
docs/docker.mdwith Redis compose example