diff --git a/CHANGELOG.md b/CHANGELOG.md index 8734e5c..f86ff67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [3.2.0] - 2026-02-24 + +### claude.ai Protocol Compatibility & Social Login Consent + +Adds full MCP Authorization Specification compliance for claude.ai Connectors, social login on the OAuth consent screen, and 15 bug fixes from comprehensive testing. + +#### Added +- **`client_secret_basic` Authentication** (RFC 6749 §2.3.1): Token endpoint now accepts client credentials via `Authorization: Basic` header in addition to `client_secret_post` +- **Token Revocation Endpoint** (RFC 7009): `POST /oauth/revoke` for revoking access and refresh tokens, with `client_secret_basic` support +- **`resource` Parameter** (RFC 8707): Authorization and token requests accept the `resource` parameter; JWT access tokens include the `aud` claim binding tokens to the MCP server URL +- **Social Login on OAuth Consent**: OAuth authorize page detects dashboard sessions, allowing users logged in via GitHub/Google to authorize MCP clients without re-entering API keys +- **Session-Based Consent**: `__session__` consent mode creates JWT tokens with `sub: "admin:..."` or `sub: "user:..."` claims based on session identity +- **Social Login Return URL**: `mcp_auth_next` cookie preserves OAuth flow state across social login redirects, with open redirect protection + +#### Fixed +- `get_system_info` returned hardcoded version `v2.6.0` instead of actual version +- Internal `"phase": "X.3"` debug field exposed in system info +- `/dashboard/audit-logs` caused redirect loop (removed from nav) +- Settings page used wrong sidebar layout +- Server mode displayed `sse` instead of `streamable-http` +- Plugin descriptions showed "No description" when description existed +- 404 page was unstyled plain text (now styled standalone page) +- OAuth flows failed without `PUBLIC_URL` env var +- Endpoint page showed wrong example tools per project +- Health check timestamps showed "None" for new projects +- Health checks missing `auth_valid` field causing dashboard errors +- `ENCRYPTION_KEY` not validated on startup (now fails fast with clear error) +- Stale JWT tokens caused 500 errors instead of 401 +- Per-user MCP endpoint returned 500 `ImportError` on first request +- Copy button displayed Python `repr()` instead of clean JSON + +#### Improved +- API key modal stays open until user clicks "Done" (was 0.5s auto-close) +- `health_metric_recorded` events filtered from project activity feed +- WooCommerce health checks use `consumer_key`/`consumer_secret` authentication + +#### Tests +- Test suite expanded from 290 to 442 tests (+152) +- Added 23 Phase B OAuth protocol tests +- Added Phase C social login consent tests + +--- + ## [3.1.0] - 2026-02-23 ### Live Platform Foundation (Track E.1 - E.3) diff --git a/README.md b/README.md index f8c3952..b9f05ce 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Connect your sites, stores, repos, and databases — manage them all through Cla [![Python 3.11+](https://img.shields.io/badge/python-3.11+-3776ab.svg)](https://www.python.org/) [![PyPI](https://img.shields.io/pypi/v/mcphub-server.svg)](https://pypi.org/project/mcphub-server/) [![Docker](https://img.shields.io/docker/v/airano/mcphub?label=docker)](https://hub.docker.com/r/airano/mcphub) -[![Tests: 290 passing](https://img.shields.io/badge/tests-290%20passing-brightgreen.svg)]() +[![Tests: 442 passing](https://img.shields.io/badge/tests-442%20passing-brightgreen.svg)]() [![Tools: 596](https://img.shields.io/badge/tools-596-orange.svg)]() [![CI](https://github.com/airano-ir/mcphub/actions/workflows/ci.yml/badge.svg)](https://github.com/airano-ir/mcphub/actions/workflows/ci.yml) @@ -363,7 +363,7 @@ Without Docker socket, WP-CLI tools return "not available" but all REST API tool # Install with dev dependencies pip install -e ".[dev]" -# Run tests (290 tests) +# Run tests (442 tests) pytest # Format and lint diff --git a/pyproject.toml b/pyproject.toml index 4e50333..d09a415 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mcphub-server" -version = "3.1.0" +version = "3.2.0" description = "AI-native management hub for WordPress, WooCommerce, and self-hosted services via Model Context Protocol (MCP)" authors = [ {name = "MCP Hub", email = "contact@mcphub.dev"} diff --git a/server.py b/server.py index 3ba9e3a..95e29ac 100644 --- a/server.py +++ b/server.py @@ -126,7 +126,7 @@ logging.basicConfig( logger = logging.getLogger(__name__) # Server version — read from pyproject.toml, fallback to importlib.metadata -SERVER_VERSION = "3.1.0" +SERVER_VERSION = "3.2.0" try: _pyproject = os.path.join(os.path.dirname(__file__), "pyproject.toml") with open(_pyproject) as _f: