Chris Coutinho
|
e331544cee
|
feat: Implement RFC 8693 token exchange for Keycloak (ADR-002 Tier 2)
Implements OAuth 2.0 Token Exchange (RFC 8693) enabling the MCP server to
exchange service account tokens for user-scoped tokens. This provides an
alternative to refresh tokens for background operations.
**Core Implementation:**
- Added `get_service_account_token()` method to KeycloakOAuthClient for
client_credentials grant
- Added `exchange_token_for_user()` method implementing RFC 8693 token exchange
- Fixed Fernet encryption key handling in RefreshTokenStorage (was incorrectly
base64 decoding already-encoded keys)
- Updated OAuth configuration to support offline_access scope and refresh token
storage infrastructure
**Keycloak Configuration:**
- Enabled `serviceAccountsEnabled` in realm-export.json
- Added `token.exchange.grant.enabled` attribute
- Added `client.token.exchange.standard.enabled` attribute (required for
Keycloak 26.2+ Standard Token Exchange V2)
- Fresh Keycloak imports now correctly enable token exchange
**Docker Compose:**
- Added TOKEN_ENCRYPTION_KEY and ENABLE_OFFLINE_ACCESS environment variables
- Created oauth-tokens volume for refresh token storage
- Configured both mcp-oauth and mcp-keycloak services
**Testing & Documentation:**
- Added tests/manual/test_token_exchange.py - Validates complete RFC 8693 flow
- Added tests/manual/test_nextcloud_impersonate.py - Documents session-based
impersonation limitations
- Added docs/oauth-impersonation-findings.md - Comprehensive investigation
findings and resolution documentation
**Verified Working:**
✅ Service account token acquisition (client_credentials grant)
✅ RFC 8693 token exchange for internal-to-internal tokens
✅ Exchanged tokens validate with Nextcloud APIs
✅ Keycloak 26.4.2 Standard Token Exchange V2 support
**Known Limitations:**
- User impersonation (requested_subject) requires Keycloak Legacy V1 with
preview features
- Cross-client token exchange limited to same realm
- Refresh token storage infrastructure ready but unused (MCP protocol limitation)
Dependencies: aiosqlite>=0.20.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-02 22:03:19 +01:00 |
|
github-actions[bot]
|
5259658458
|
bump: version 0.22.6 → 0.22.7
|
2025-10-29 11:18:41 +00:00 |
|
github-actions[bot]
|
e1aca04aff
|
bump: version 0.22.5 → 0.22.6
|
2025-10-29 10:57:44 +00:00 |
|
github-actions[bot]
|
e647c87dd8
|
bump: version 0.22.4 → 0.22.5
|
2025-10-29 10:54:54 +00:00 |
|
github-actions[bot]
|
202058bdc8
|
bump: version 0.22.3 → 0.22.4
|
2025-10-29 10:44:11 +00:00 |
|
github-actions[bot]
|
8221046d8a
|
bump: version 0.22.2 → 0.22.3
|
2025-10-29 10:35:58 +00:00 |
|
github-actions[bot]
|
9ec7637579
|
bump: version 0.22.1 → 0.22.2
|
2025-10-29 10:30:39 +00:00 |
|
github-actions[bot]
|
3878beaf65
|
bump: version 0.22.0 → 0.22.1
|
2025-10-29 10:17:08 +00:00 |
|
github-actions[bot]
|
0e7e74867f
|
bump: version 0.21.0 → 0.22.0
|
2025-10-29 09:32:27 +00:00 |
|
github-actions[bot]
|
57a2157c58
|
bump: version 0.20.0 → 0.21.0
|
2025-10-25 18:33:56 +00:00 |
|
yuisheaven
|
f0e5333e43
|
Merge branch 'master' into feature/introduce_files_parsing_with_unstructured_service_for_webdav_files_retrieval
|
2025-10-25 17:23:38 +02:00 |
|
github-actions[bot]
|
04e0ab127a
|
bump: version 0.19.1 → 0.20.0
|
2025-10-24 18:24:45 +00:00 |
|
Chris Coutinho
|
1117a83a52
|
Merge pull request #237 from cbcoutinho/feature/app-scopes
Feature/app scopes
|
2025-10-24 20:24:15 +02:00 |
|
github-actions[bot]
|
50a824155c
|
bump: version 0.19.0 → 0.19.1
|
2025-10-24 04:36:51 +00:00 |
|
renovate-bot-cbcoutinho[bot]
|
3baf10662f
|
fix(deps): update dependency mcp to >=1.19,<1.20
|
2025-10-24 04:06:55 +00:00 |
|
Chris Coutinho
|
d452684535
|
feat: Split read/write scopes into app:read/write scopes
|
2025-10-24 04:38:49 +02:00 |
|
github-actions[bot]
|
bfbaed9a66
|
bump: version 0.18.0 → 0.19.0
|
2025-10-23 23:50:51 +00:00 |
|
yuisheaven
|
29df645d53
|
Merge branch 'master' into feature/introduce_files_parsing_with_unstructured_service_for_webdav_files_retrieval
|
2025-10-23 21:30:09 +02:00 |
|
github-actions[bot]
|
87c6f077f3
|
bump: version 0.17.1 → 0.18.0
|
2025-10-23 10:23:48 +00:00 |
|
Chris Coutinho
|
c069d78f80
|
feat: Initialize JWT-scoped tools
|
2025-10-22 06:21:16 +02:00 |
|
yuisheaven
|
98627593d5
|
corrected smaller merge issues
|
2025-10-21 20:55:33 +02:00 |
|
yuisheaven
|
64649c902d
|
Merge branch 'master' into feature/introduce_files_parsing_with_unstructured_service_for_webdav_files_retrieval
|
2025-10-21 20:37:00 +02:00 |
|
github-actions[bot]
|
4984496d81
|
bump: version 0.17.0 → 0.17.1
|
2025-10-20 21:16:09 +00:00 |
|
Chris Coutinho
|
e8f1340133
|
fix(caldav): Fix caldav search() due to missing todos
|
2025-10-20 22:18:46 +02:00 |
|
Chris Coutinho
|
6ba87e7e05
|
chore: update caldav ref
|
2025-10-20 11:52:29 +02:00 |
|
github-actions[bot]
|
45bbf97033
|
bump: version 0.16.0 → 0.17.0
|
2025-10-19 22:55:23 +00:00 |
|
Chris Coutinho
|
a143123acc
|
fix(caldav): Check that calendar exists after creation to avoid race condition
Verify that field preservation tests still operate
|
2025-10-19 23:44:39 +02:00 |
|
Chris Coutinho
|
92e18825bc
|
feat(caldav): Add support for tasks
|
2025-10-19 18:02:43 +02:00 |
|
Chris Coutinho
|
d398a8c8e6
|
refactor: Migrate from internal CalendarClient to caldav library
|
2025-10-19 15:47:17 +02:00 |
|
github-actions[bot]
|
cb7a609ec2
|
bump: version 0.15.2 → 0.16.0
|
2025-10-19 00:13:49 +00:00 |
|
Chris Coutinho
|
5395f8d3d6
|
chore: Update lock file
|
2025-10-19 02:02:05 +02:00 |
|
Chris Coutinho
|
b72514bb32
|
ci: Add pytest-timeout to dev deps
|
2025-10-19 00:27:19 +02:00 |
|
Chris Coutinho
|
1459fe9bc8
|
test: Replace pytest-asyncio plugin fixtures with anyio fixtures
|
2025-10-18 22:02:25 +02:00 |
|
github-actions[bot]
|
a389f2940e
|
bump: version 0.15.1 → 0.15.2
|
2025-10-17 23:17:32 +00:00 |
|
github-actions[bot]
|
7549c988f4
|
bump: version 0.15.0 → 0.15.1
|
2025-10-17 02:49:37 +00:00 |
|
github-actions[bot]
|
0aeef1b87e
|
bump: version 0.14.3 → 0.15.0
|
2025-10-17 01:25:56 +00:00 |
|
github-actions[bot]
|
6734de8389
|
bump: version 0.14.2 → 0.14.3
|
2025-10-17 00:04:25 +00:00 |
|
renovate-bot-cbcoutinho[bot]
|
16b9123af3
|
fix(deps): update dependency mcp to >=1.18,<1.19
|
2025-10-16 19:20:47 +00:00 |
|
github-actions[bot]
|
e0a68d47a5
|
bump: version 0.14.1 → 0.14.2
|
2025-10-16 08:32:29 +00:00 |
|
renovate-bot-cbcoutinho[bot]
|
7b2002c1b5
|
fix(deps): update dependency pillow to v12
|
2025-10-15 22:09:01 +00:00 |
|
github-actions[bot]
|
9e4c20a4b1
|
bump: version 0.14.0 → 0.14.1
|
2025-10-15 15:26:35 +00:00 |
|
github-actions[bot]
|
46deb0f726
|
bump: version 0.13.0 → 0.14.0
|
2025-10-15 09:53:45 +00:00 |
|
github-actions[bot]
|
52044ef053
|
bump: version 0.12.6 → 0.13.0
|
2025-10-13 23:30:55 +00:00 |
|
Chris Coutinho
|
37b0577bfd
|
test: Add asyncio tests using Playwright
|
2025-10-14 01:23:38 +02:00 |
|
github-actions[bot]
|
b19eb37ee2
|
bump: version 0.12.5 → 0.12.6
|
2025-10-11 16:31:34 +00:00 |
|
renovate-bot-cbcoutinho[bot]
|
3340a63f86
|
fix(deps): update dependency mcp to >=1.17,<1.18
|
2025-10-10 16:08:58 +00:00 |
|
yuisheaven
|
ce5724f05e
|
adjusted pyproject.toml config and uv.lock
|
2025-10-04 04:26:33 +02:00 |
|
github-actions[bot]
|
b60da57597
|
bump: version 0.12.4 → 0.12.5
|
2025-10-03 06:20:51 +00:00 |
|
renovate-bot-cbcoutinho[bot]
|
b10fba0678
|
fix(deps): update dependency mcp to >=1.16,<1.17
|
2025-10-02 22:10:23 +00:00 |
|
renovate-bot-cbcoutinho[bot]
|
55945c6c0f
|
chore(deps): lock file maintenance
|
2025-09-29 04:12:15 +00:00 |
|