Commit Graph
2052 Commits
Author SHA1 Message Date
Chris CoutinhoandClaude Opus 4.6 fe8799a133 fix: resolve OAuth compatibility issues for login-flow deployment
- Drop OIDC fork: comment out third_party/oidc mount, use upstream
  v1.16.3 from app store (fixes consent redirect race, PR #631)
- Support client_secret_basic auth: add _extract_basic_auth() helper
  so TS MCP SDK can authenticate at token endpoint (RFC 6749 §2.3.1)
- Multi-issuer JWT validation: accept tokens with internal Docker
  issuer (http://app:80) or public URL (NEXTCLOUD_PUBLIC_ISSUER_URL)
  since AS proxy obtains tokens server-to-server
- Introspection fallback: try token introspection when JWT verification
  fails, supporting both JWT and opaque token types
- Register all tool scopes in DCR: add semantic:read, collectives:read,
  collectives:write to OIDC client allowed_scopes so tokens include
  them and semantic search tools are visible to authenticated clients
- Auto-create Astrolabe OAuth client: new app-hook creates OIDC client
  and stores credentials in config.php so the "Authorize via OAuth"
  button works without manual setup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 15:05:26 +02:00
github-actions[bot] 3cf4c777ed bump: version 0.58.15 → 0.58.16 2026-03-28 14:59:22 +00:00
Chris CoutinhoandGitHub 78d3da6611 Merge pull request #662 from cbcoutinho/renovate/nextcloud-33-33.x
chore(deps): update nextcloud-33 docker tag to v33.0.1
2026-03-28 15:59:05 +01:00
renovate-bot-cbcoutinho[bot]andGitHub 4354ee7270 chore(deps): update nextcloud-33 docker tag to v33.0.1 2026-03-28 11:20:49 +00:00
github-actions[bot] bd81477295 bump: version 0.58.14 → 0.58.15 2026-03-28 09:53:31 +00:00
github-actions[bot] 1948360b83 bump: version 0.66.0 → 0.66.1 2026-03-28 09:53:31 +00:00
Chris CoutinhoandGitHub 89791a558b Merge pull request #657 from cbcoutinho/fix/renovate-nextcloud-version-pinning
fix: pin Renovate Nextcloud updates to matching major version
2026-03-28 10:53:11 +01:00
Chris CoutinhoandGitHub fd303dde36 Merge pull request #651 from cbcoutinho/renovate/docker.io-qdrant-qdrant-1.x
chore(deps): update docker.io/qdrant/qdrant docker tag to v1.17.1
2026-03-28 10:52:57 +01:00
github-actions[bot] 407203d020 bump: version 0.58.13 → 0.58.14 2026-03-28 09:52:52 +00:00
Chris CoutinhoandGitHub 8729b1dd1f Merge pull request #652 from cbcoutinho/renovate/qdrant-1.x
chore(deps): update helm release qdrant to v1.17.1
2026-03-28 10:52:37 +01:00
github-actions[bot] d5b9b2ed04 bump: version 0.58.12 → 0.58.13 2026-03-28 09:52:11 +00:00
Chris CoutinhoandGitHub a4d1e5f6a6 Merge pull request #654 from cbcoutinho/renovate/anthropics-claude-code-action-1.x
chore(deps): update anthropics/claude-code-action action to v1.0.81
2026-03-28 10:51:54 +01:00
Chris CoutinhoandClaude Opus 4.6 1482d2d43d fix: pin Renovate Nextcloud updates to matching major version
The custom regex manager matched all nextcloud_image entries with the
same depName, causing Renovate to bump all matrix entries (NC 31, 32, 33)
to the latest version instead of only the targeted major.

Fix by capturing nextcloud_version to create version-specific dep names
(nextcloud-31, nextcloud-32, nextcloud-33) with allowedVersions rules
constraining each to its own major. Also pins docker-compose.yml to 32.x
and removes redundant inline # renovate: comments that could cause
duplicate matching.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 10:48:55 +01:00
github-actions[bot] 19fab2a381 bump: version 0.58.11 → 0.58.12 2026-03-28 08:41:12 +00:00
github-actions[bot] 35abc4eaae bump: version 0.65.4 → 0.66.0 2026-03-28 08:41:11 +00:00
Chris CoutinhoandGitHub c56249dcc4 Merge pull request #647 from cbcoutinho/feature/collectives-support
feat: add Nextcloud Collectives app support
2026-03-28 09:40:50 +01:00
Chris CoutinhoandClaude Opus 4.6 52470ea713 fix: address PR review feedback (round 9)
- Fix emoji clearing bug: use _UNSET sentinel in update_collective so
  emoji=None sends {"emoji": null} instead of raising ValueError
- Move collectives_get_trashed_collectives to Read Tools section
- Remove redundant is_trash field from ListTrashedPagesResponse
- Add page lifecycle note to collectives_trash_page docstring
- Add unit test for clearing collective emoji via update_collective
- Add integration test for clearing collective emoji via MCP tool

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 09:19:53 +01:00
renovate-bot-cbcoutinho[bot]andGitHub 162bb5b7e4 chore(deps): update anthropics/claude-code-action action to v1.0.81 2026-03-27 23:20:33 +00:00
renovate-bot-cbcoutinho[bot]andGitHub 57c3bdcaba chore(deps): update helm release qdrant to v1.17.1 2026-03-27 15:36:33 +00:00
github-actions[bot] ecb0b8331a bump: version 0.58.10 → 0.58.11 2026-03-27 14:18:07 +00:00
github-actions[bot] 83e430dd66 bump: version 0.65.3 → 0.65.4 2026-03-27 14:18:07 +00:00
Chris CoutinhoandGitHub d6632e13b2 Merge pull request #649 from cbcoutinho/fix/pin-starlette-below-1.0
fix: pin starlette<1.0 to prevent startup crash
2026-03-27 15:17:44 +01:00
github-actions[bot] ff770d7d1b bump: version 0.58.9 → 0.58.10 2026-03-27 14:17:35 +00:00
Chris CoutinhoandGitHub d85ff8d2b3 Merge pull request #650 from cbcoutinho/renovate/anthropics-claude-code-action-1.x
chore(deps): update anthropics/claude-code-action action to v1.0.80
2026-03-27 15:17:15 +01:00
Chris CoutinhoandClaude Opus 4.6 cb16060b1b fix: address PR review feedback (round 8)
- Fix inconsistent error code in set_collective_emoji (400 → -32603)
- Allow clearing emoji via set_collective_emoji(emoji=None)
- Remove destructiveHint from trash operations (soft deletes are recoverable)
- Change delete_collective to idempotentHint=False (requires trash precondition)
- Add restore_collective and get_trashed_collectives tools
- Add unit tests for ValueError guard, clear-emoji path, and new tools
- Add integration test for full trash/restore/delete lifecycle
- Verify move_page returns new title in response message

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 11:26:26 +01:00
renovate-bot-cbcoutinho[bot]andGitHub 129a5b9125 chore(deps): update docker.io/qdrant/qdrant docker tag to v1.17.1 2026-03-26 23:19:50 +00:00
renovate-bot-cbcoutinho[bot]andGitHub 84fafa6a6b chore(deps): update anthropics/claude-code-action action to v1.0.80 2026-03-26 23:19:45 +00:00
Chris CoutinhoandClaude Opus 4.6 7224a2ebe3 fix: address PR review feedback (round 7) and fix CI
- Rename collectives_update_collective to collectives_set_collective_emoji
  (more precise since only emoji is settable)
- Use standard JSON-RPC error code -32603 (INTERNAL_ERROR) instead of -1
- Handle UnicodeDecodeError when reading page content via WebDAV
- Replace brittle 'Welcome' content assertion with length check

Fixes CI: test_update_operations_not_idempotent no longer matches the
renamed tool, which is correctly idempotent (no ETag involved).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 23:18:42 +01:00
Chris CoutinhoandClaude Opus 4.6 b6d01fc0bd fix: pin starlette<1.0 to prevent startup crash (#648)
Starlette 1.0.0 removed the @app.middleware() decorator, which breaks
nextcloud-mcp-server on fresh installs. Pin starlette<1.0 until we
address the full set of breaking changes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:30:57 +01:00
Chris CoutinhoandClaude Opus 4.6 85119bde91 fix: address PR review feedback (round 6)
- Fix assign_tag sending Content-Type header with no body
- Mark collectives_update_collective as idempotent (no ETag involved)
- Raise OCSError when 'data' key missing instead of silent fallback
- Tighten color validator to 3 or 6 hex chars only
- Add comment explaining null emoji semantics in set_page_emoji

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:38:11 +01:00
Chris CoutinhoandClaude Opus 4.6 aa46c6147b fix: address PR review feedback (round 5)
- Validate OCS envelope in trash_collective, delete_collective, trash_page
- Guard _unwrap_ocs against non-OCS responses with informative OCSError
- Remove _get_ocs_headers() indirection, use class constants directly
- Split headers: _OCS_HEADERS (GET) vs _OCS_HEADERS_JSON (with body)
- Fix docstring claiming emoji param is required when it is optional
- Rename misleading test, add test for non-OCS envelope handling

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 13:49:28 +01:00
Chris CoutinhoandClaude Opus 4.6 95edd9ba8e fix: add trash/delete collective tools and address review feedback (round 4)
Add collectives_trash_collective and collectives_delete_collective MCP
tools with proper destructiveHint annotations. Refactor integration test
fixture to use MCP tools for cleanup instead of direct httpx/OCS calls.
Optimize _get_ocs_headers() to class-level constant.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 07:36:40 +01:00
github-actions[bot] 2be63a85e5 bump: version 0.58.8 → 0.58.9 2026-03-26 06:17:24 +00:00
Chris CoutinhoandGitHub 72754856f5 Merge pull request #642 from cbcoutinho/renovate/anthropics-claude-code-action-1.x
chore(deps): update anthropics/claude-code-action action to v1.0.79
2026-03-26 07:17:08 +01:00
renovate-bot-cbcoutinho[bot]andGitHub f14b2ec76e chore(deps): update anthropics/claude-code-action action to v1.0.79 2026-03-26 05:22:41 +00:00
Chris CoutinhoandClaude Opus 4.6 f3caad122d fix: address PR review feedback (round 3)
Bugs:
- assign_tag/remove_tag now call _unwrap_ocs to surface OCS-level errors
- trash_page changed to idempotentHint=False (trashing twice errors)
- WebDAV path parts stripped of slashes to prevent double-slash paths

Robustness:
- _unwrap_ocs uses ocs.get("data", {}) instead of ocs["data"]
- Unit test added for missing data key in OCS envelope

Minor:
- MCP error codes use -1 (project convention) instead of HTTP status codes
- update_collective docstring notes that emoji is required
- CollectiveTag.color validated as hex format via field_validator

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 13:25:09 +01:00
Chris CoutinhoandClaude Opus 4.6 44a27bd9e9 fix: address PR review feedback (round 2)
Bug fixes:
- Catch OCSError/HTTPStatusError in all server tools, convert to McpError
- Guard update_collective against empty body (raise ValueError)
- Use restore_page response data in status message

ADR-017 annotation fix:
- Distinguish "remove" (reversible association) from "delete" (permanent):
  remove_tag and deck_remove_label_from_card no longer set destructiveHint
- Update annotation test to exclude "remove" from destructive keywords

Data model improvements:
- Add trashTimestamp field to PageInfo
- Create ListTrashedPagesResponse with is_trash context flag
- Add collective_id to ListTagsResponse

Test robustness:
- Read NC credentials from environment variables (not hardcoded)
- Filter landing page by parentId == 0 instead of assuming pages[0]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:08:13 +01:00
Chris CoutinhoandClaude Opus 4.6 3393cd9756 fix: correct tool annotations to match ADR-017 conventions
- Add destructiveHint=True to collectives_remove_tag (matches "remove"
  keyword pattern in annotation tests)
- Change collectives_update_collective to idempotentHint=False (update
  operations are non-idempotent per project convention)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 08:14:59 +01:00
Chris CoutinhoandClaude Opus 4.6 e5ad625a66 fix: address PR review feedback for Collectives support
- Validate OCS envelope status before unwrapping data (raise OCSError on
  statuscode >= 400)
- Fix test data: filePath should be "" for root-level pages, not filename
- Catch specific exceptions (HTTPStatusError, OSError) instead of bare
  Exception in WebDAV content fetch, include error in log message
- Return updated resource data from update_collective, move_page, and
  set_page_emoji instead of discarding API responses
- Fix create_page docstring to mention collectivePath/filePath/fileName
- Remove unused additional_headers parameter from _get_ocs_headers
- Add unit test for OCS error status validation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 08:07:37 +01:00
Chris CoutinhoandClaude Opus 4.6 32f5a0fe52 feat: add Nextcloud Collectives app support (#621)
Implement MCP tools for the Collectives wiki/documentation app, enabling
agentic workflows for team knowledge base management.

16 tools covering collectives, pages, tags, search, and trash:
- Read: list collectives, list/get pages (with WebDAV content), search,
  list tags, list trashed pages
- Write: create/update collective, create/move/trash/restore pages,
  set emoji, create/assign/remove tags

Includes Docker hook for app installation, OCS API client with envelope
unwrapping, Pydantic models, unit tests (16), and integration tests (10).

Closes #621

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 07:53:50 +01:00
github-actions[bot] 7cbe323ef9 bump: version 0.58.7 → 0.58.8 2026-03-23 06:17:08 +00:00
Chris CoutinhoandGitHub ed3e3fe6d0 Merge pull request #611 from cbcoutinho/renovate/ghcr.io-astral-sh-uv-0.x
chore(deps): update ghcr.io/astral-sh/uv docker tag to v0.10.12
2026-03-23 07:16:53 +01:00
renovate-bot-cbcoutinho[bot]andGitHub 4aef5926ea chore(deps): update ghcr.io/astral-sh/uv docker tag to v0.10.12 2026-03-22 23:20:00 +00:00
github-actions[bot] 445c0fb7dd bump: version 0.58.6 → 0.58.7 2026-03-22 21:01:05 +00:00
github-actions[bot] 98f7740a54 bump: version 0.65.2 → 0.65.3 2026-03-22 21:01:05 +00:00
Chris CoutinhoandGitHub b90861c4e8 Merge pull request #640 from cbcoutinho/refactor/remove-smithery-update-qdrant
Remove Smithery deployment mode, update qdrant-client for PyPI publishing
2026-03-22 22:00:45 +01:00
Chris CoutinhoandClaude Opus 4.6 581718ee42 build: update qdrant-client to upstream >=1.17.0
The fork (cbcoutinho/qdrant-client fix/fusion-score-threshold) has been
merged upstream as PR #1138 and released in v1.17.0. Remove the git source
override in [tool.uv.sources] to unblock clean PyPI publishing, since git
dependencies are excluded from wheels.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:18:38 +01:00
Chris CoutinhoandClaude Opus 4.6 7956c3c061 refactor: remove Smithery deployment mode
Smithery is no longer a supported deployment mode. Remove all Smithery-specific
code paths, middleware, configuration, and tests. This simplifies the codebase
by eliminating DeploymentMode enum, SmitheryConfigMiddleware, session config
context variables, and the smithery_main entrypoint.

Files deleted: Dockerfile.smithery, smithery.yaml, smithery_main.py
ADR-016 retained with deprecated status for historical reference.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:15:47 +01:00
github-actions[bot] 5e9bd5dd74 bump: version 0.58.5 → 0.58.6 2026-03-22 17:42:29 +00:00
github-actions[bot] a7796d5177 bump: version 0.65.1 → 0.65.2 2026-03-22 17:42:29 +00:00