Commit Graph
2172 Commits
Author SHA1 Message Date
Chris CoutinhoandClaude Opus 4.6 33d679e174 feat: add --version option to CLI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 00:24:50 +02:00
github-actions[bot] 4922fb3ac5 bump: version 0.70.4 → 0.71.0 2026-04-07 22:10:12 +00:00
Chris CoutinhoandGitHub 21e4174df3 Merge pull request #689 from cbcoutinho/feat/stdio-transport
feat: add stdio transport support for local MCP usage
2026-04-08 00:09:49 +02:00
github-actions[bot] 98a0ba3745 bump: version 0.70.3 → 0.70.4 2026-04-07 22:03:06 +00:00
Chris CoutinhoandGitHub e76e3e1306 Merge pull request #690 from cbcoutinho/fix/cognito-offline-access-scope
fix: conditionally include offline_access based on IdP discovery
2026-04-08 00:02:35 +02:00
Chris CoutinhoandClaude Opus 4.6 f340380898 fix: address third round of review feedback
Add BasicAuthLifespanContext Protocol to make the contract between
StdioContext and get_client() explicit and type-safe. Document why
mcp.get_context() is required for non-template resources. Add News
and Collectives to README Supported Apps table, fix transport default.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:59:39 +02:00
Chris CoutinhoandClaude Opus 4.6 7730f926cb fix: conditionally include offline_access based on IdP discovery
AWS Cognito provides refresh tokens automatically with the authorization
code flow but does not list offline_access as a supported scope. Check
the IdP's scopes_supported discovery field before including it in
requests, and always accept refresh tokens from responses regardless.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:48:49 +02:00
Chris CoutinhoandClaude Opus 4.6 1af85bc05e fix: address second round of review feedback
- Remove dead monkeypatch in test_stdio_calls_get_stdio_mcp
- Add _reload_config() teardown to single_user_env fixture
- Tighten AVAILABLE_APPS type to Callable[[FastMCP], None]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:26:46 +02:00
Chris CoutinhoandClaude Opus 4.6 e9c46a04a0 fix: address PR review feedback and fix CI test failures
- Revert default transport to streamable-http (not a breaking change)
- Extract AVAILABLE_APPS constant to server/__init__.py (DRY)
- Wrap get_stdio_mcp ValueError in click.ClickException for clean errors
- Fix test_stdio.py: call _reload_config() so dynaconf sees env changes
- Use lazy %-style logging in stdio.py
- Add private API comments in test assertions
- Derive --enable-app CLI choices from AVAILABLE_APPS
- README: show explicit --transport stdio in uvx examples

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 23:03:12 +02:00
Chris CoutinhoandClaude Opus 4.6 09006fcea9 feat: add stdio transport support for local MCP usage
Add a lightweight stdio transport path so users can run the server
locally with MCP clients like Claude Code using `uvx nextcloud-mcp-server run`.

- New `nextcloud_mcp_server/stdio.py` with minimal FastMCP setup for
  single-user BasicAuth (no OAuth, semantic search, or background sync)
- Default transport changed from streamable-http to stdio
- Dockerfile updated to explicitly use streamable-http for containers
- CLI `--enable-app` now includes news, collectives, and sharing
- README Quick Start section with uvx and MCP client config examples

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 22:48:14 +02:00
github-actions[bot] 776e2ce693 bump: version 0.70.2 → 0.70.3 2026-04-07 20:23:42 +00:00
Chris CoutinhoandGitHub 23995ce64d Merge pull request #675 from cbcoutinho/renovate/mcp-1.x
fix(deps): update dependency mcp to >=1.27,<1.28
2026-04-07 22:23:22 +02:00
Chris CoutinhoandGitHub 9934a78970 Merge pull request #688 from cbcoutinho/ci/remove-pat-from-release-workflows
ci: remove PAT from release workflows
2026-04-07 22:11:37 +02:00
Chris CoutinhoandClaude Opus 4.6 1e380caade ci: remove PAT from release workflows, use workflow_call instead
Tags pushed with GITHUB_TOKEN don't trigger other workflows (GitHub's
anti-recursion protection), which is why a PAT was needed. Instead,
chain release and docker workflows directly via workflow_call from
bump-version, eliminating the need for a personal access token.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 22:10:25 +02:00
github-actions[bot] 3af670ace5 bump: version 0.70.1 → 0.70.2 2026-04-07 18:32:27 +00:00
Chris CoutinhoandClaude Opus 4.6 f8fb34d113 fix: conditionally include offline_access in Flow 2 scope request
Flow 2 hardcoded offline_access in the scope string, but providers
like AWS Cognito don't support this scope (they handle refresh tokens
via client config). This caused invalid_scope errors on the Astrolabe
semantic search enablement flow.

Only include offline_access when enable_offline_access is explicitly
set, matching the behavior of DCR scope registration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 20:31:55 +02:00
renovate-bot-cbcoutinho[bot]andGitHub c84df249a0 fix(deps): update dependency mcp to >=1.27,<1.28 2026-04-07 16:19:01 +00:00
github-actions[bot] c2b19a2983 bump: version 0.70.0 → 0.70.1 2026-04-07 16:08:16 +00:00
Chris CoutinhoandGitHub 0dbd031fe7 Merge pull request #687 from cbcoutinho/fix/cognito-audience-fallback
fix: fall back to client_id when aud claim is absent (Cognito compat)
2026-04-07 18:07:50 +02:00
Chris CoutinhoandClaude Opus 4.6 c3da7acc87 fix: fall back to client_id when aud claim is absent (Cognito compat)
AWS Cognito access tokens do not include an `aud` claim per RFC 7519 —
they use `client_id` instead. This causes `_has_mcp_audience` to reject
all Cognito-issued tokens with "Missing MCP audience. Got []".

When `aud` is empty, fall back to the `client_id` JWT claim for audience
validation. The MCP server's own client_id will be present there since
the AS proxy exchanges the authorization code using its credentials.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 18:06:15 +02:00
Chris CoutinhoandGitHub d7653535f0 Merge pull request #658 from cbcoutinho/renovate/nextcloud-31-31.0.14
chore(deps): update nextcloud-31:31.0.14 docker digest to 07ec73c
2026-04-07 17:10:32 +02:00
Chris CoutinhoandGitHub 63c5d5255a Merge pull request #678 from cbcoutinho/renovate/downloads.unstructured.io-unstructured-io-unstructured-api-0.x
chore(deps): update downloads.unstructured.io/unstructured-io/unstructured-api docker tag to v0.1.2
2026-04-07 17:10:17 +02:00
github-actions[bot] 6c7b0a81b3 bump: version 0.69.0 → 0.70.0 2026-04-07 15:01:44 +00:00
Chris CoutinhoandGitHub f624ccbb0f Merge pull request #686 from cbcoutinho/feat/oidc-resource-server-scope-prefix
feat: add OIDC resource server scope prefix for Cognito compatibility
2026-04-07 17:01:14 +02:00
Chris CoutinhoandClaude Opus 4.6 cc6ba65993 fix: address second round of PR review for scope prefix
- Use dynaconf (get_settings()) instead of os.getenv for OIDC_RESOURCE_SERVER_ID
- Re-add Settings field, _field_map entry, and settings.toml default
- Add trailing-slash guard (.rstrip("/")) to prevent double-slash in scopes
- Add double-prefixing guard: skip scopes already carrying the prefix
- Add @pytest.mark.unit to test module
- Add test for already-prefixed scopes
- Document OIDC_RESOURCE_SERVER_ID in docs/configuration.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:58:29 +02:00
Chris CoutinhoandClaude Opus 4.6 f67d4d1116 fix: address PR review for OIDC scope prefix feature
Add offline_access to OIDC standard scopes exclusion list to prevent it
from being incorrectly prefixed, which would break Cognito refresh token
flows. Extract scope transformation into testable _transform_scopes_for_idp()
helper, add debug logging for prefixed scopes, remove unused Settings field
(oauth_routes.py consistently uses os.getenv), and add unit tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:44:08 +02:00
Chris CoutinhoandClaude Opus 4.6 e21ddd91b9 feat: add OIDC resource server scope prefix for Cognito compatibility
When OIDC_RESOURCE_SERVER_ID is set, prefix resource scopes with the
identifier when forwarding to the IdP (e.g., calendar.read becomes
https://example.com/calendar.read). Required for IdPs like AWS Cognito
that mandate {resource_server_id}/{scope} format for custom scopes.
OIDC standard scopes (openid, profile, email) are forwarded as-is.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:33:47 +02:00
Chris CoutinhoandGitHub 2f146f8408 Merge pull request #685 from cbcoutinho/chore/remove-helm-chart
chore: remove helm chart (migrated to cbcoutinho/helm-charts)
2026-04-07 16:33:31 +02:00
Chris Coutinho f9f637b1ce Merge remote-tracking branch 'origin/master' into chore/remove-helm-chart 2026-04-07 16:32:53 +02:00
Chris CoutinhoandClaude Opus 4.6 c4b74e7e20 chore: remove helm chart (migrated to cbcoutinho/helm-charts)
The helm chart has been migrated to a dedicated repository at
https://github.com/cbcoutinho/helm-charts. This removes the chart
source, release workflow, bump script, and updates all documentation
to point to the new repository.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:31:35 +02:00
github-actions[bot] 1b64b9ffd2 bump: version 0.58.31 → 0.58.32 2026-04-07 13:50:09 +00:00
github-actions[bot] 1276de8e22 bump: version 0.68.4 → 0.69.0 2026-04-07 13:50:09 +00:00
Chris CoutinhoandGitHub 010c598b24 Merge pull request #680 from cbcoutinho/docs/adr-024-dynaconf-config-management
docs: ADR-025 dynaconf configuration management
2026-04-07 15:49:46 +02:00
Chris CoutinhoandClaude Opus 4.6 76b1fc4447 docs: address PR review feedback on ADR-025 dynaconf configuration management
Incorporate reviewer feedback across three review rounds:

- Remove post_hooks from Phase 1 constructor; defer to Phase 4
- Fix Validator syntax: use condition=lambda instead of ne= kwarg
- Add MCP_DEPLOYMENT_MODE validator to catch typos at startup
- Add CRITICAL to LOG_LEVEL validator enum
- Make OTEL_TRACES_SAMPLER_ARG validation conditional on ratio samplers
- Add all missing provider env vars to settings.toml (Bedrock, Anthropic, Ollama, Simple)
- Add provider secrets to .secrets.toml.example
- Fix DynaconfDict import to stable public API path
- Strengthen ignore_unknown_envvars risk: CI lint check mandatory before Phase 2
- Document ValidationError vs ValueError breaking change in Phase 3
- Acknowledge environments=True legacy risk with mitigation
- Address root_path pip-install concern (intentional: pip uses env vars)
- Add enable_token_exchange to adapter example; note exhaustive field mapping
- Clarify Provider Registry is Phase 6 with explanation of os.getenv coexistence
- Improve test isolation fixture with teardown reload + _dynaconf visibility note
- Add Docker Compose volume mount host-file existence note

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:48:50 +02:00
github-actions[bot] e24a1c0e84 bump: version 0.58.30 → 0.58.31 2026-04-07 12:18:06 +00:00
github-actions[bot] 806b9decbc bump: version 0.68.3 → 0.68.4 2026-04-07 12:18:05 +00:00
Chris Coutinho 5b093e49b1 Merge remote-tracking branch 'origin/master' into docs/adr-024-dynaconf-config-management 2026-04-07 14:17:57 +02:00
Chris CoutinhoandGitHub 6f16ece92b Merge pull request #682 from cbcoutinho/refactor/scope-separator-colon-to-dot
refactor: change OAuth scope separator from colon to dot
2026-04-07 14:17:46 +02:00
Chris CoutinhoandClaude Opus 4.6 b8b1616897 fix: resolve dynaconf settings.toml not found in non-editable installs
The root_path for dynaconf resolved to site-packages instead of the
application root when installed non-editable (Docker). This caused all
settings without env var overrides to be None, crashing on startup with
a TypeError in chunk size validation.

Fix root_path to fall back to CWD when settings.toml isn't at the
source-tree path, and refactor get_settings() to only pass values
dynaconf actually has — letting Settings dataclass defaults apply for
unconfigured keys. Mount settings.toml into all docker-compose MCP
services as a read-only volume.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:17:34 +02:00
github-actions[bot] 44ee72b284 bump: version 0.58.29 → 0.58.30 2026-04-07 10:43:04 +00:00
Chris CoutinhoandGitHub a9344382a7 Merge pull request #684 from cbcoutinho/renovate/docker.io-library-nextcloud-32.0.8
chore(deps): update docker.io/library/nextcloud:32.0.8 docker digest to 509caed
2026-04-07 12:42:48 +02:00
github-actions[bot] ca89a1359d bump: version 0.58.28 → 0.58.29 2026-04-07 10:42:33 +00:00
Chris CoutinhoandGitHub cc40f8f916 Merge pull request #661 from cbcoutinho/renovate/nextcloud-32-32.x
chore(deps): update nextcloud-32 docker tag to v32.0.8
2026-04-07 12:42:17 +02:00
Chris CoutinhoandGitHub c45b8ec3a6 Merge pull request #677 from cbcoutinho/renovate/nextcloud-33-33.x
chore(deps): update nextcloud-33 docker tag to v33.0.2
2026-04-07 12:42:05 +02:00
renovate-bot-cbcoutinho[bot]andGitHub be4aeeb1d5 chore(deps): update nextcloud-33 docker tag to v33.0.2 2026-04-07 10:19:32 +00:00
renovate-bot-cbcoutinho[bot]andGitHub a82491de15 chore(deps): update nextcloud-32 docker tag to v32.0.8 2026-04-07 10:19:27 +00:00
renovate-bot-cbcoutinho[bot]andGitHub 182efd19f7 chore(deps): update docker.io/library/nextcloud:32.0.8 docker digest to 509caed 2026-04-07 10:19:09 +00:00
Chris CoutinhoandClaude Opus 4.6 29fd0486c9 refactor: change OAuth scope separator from colon to dot for IDP compatibility
Many identity providers (AWS Cognito, Okta, Azure AD) reject or mishandle
colons in OAuth scope names. This migrates all custom scopes from
`resource:action` to `resource.action` format (e.g., `notes:read` →
`notes.read`), which is universally accepted and aligns with industry
conventions (Microsoft, Google).

Includes Alembic migration 004 for stored scope strings and ADR-024
documenting the rationale and RFC references.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 10:07:02 +02:00
Chris CoutinhoandClaude Opus 4.6 c8e4cbe825 feat: implement dynaconf configuration management (ADR-024 phases 1-3)
Replace ~80 manual os.getenv() calls in config.py with dynaconf-backed
configuration, enabling TOML file-based config alongside existing env
var support. Zero breaking changes — Settings dataclass interface and
all consumers unchanged.

Phase 1: Create settings.toml with all config keys and defaults,
.secrets.toml.example template, update .gitignore, initialize Dynaconf
instance with envvar_prefix=False and environment section switching.

Phase 2: Wire adapter — replace os.getenv() with _dynaconf.get() in
get_settings(), get_document_processor_config(), and deprecation/
dependency resolution helpers. Automatic type coercion eliminates ~30
manual int()/float()/.lower()=="true" patterns.

Phase 3: Add 12 declarative validators for port ranges, positive
integers, enum constraints, and float ranges. Remove redundant negative
overlap check from Settings.__post_init__.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:22:19 +02:00
Chris Coutinho f34c74afbc Merge remote-tracking branch 'origin/master' into docs/adr-024-dynaconf-config-management 2026-04-05 19:42:26 +02:00