Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/tests-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ jobs:
$OCC "php occ app:install collectives" || echo "collectives already installed"
$OCC "php occ app:install mail"
$OCC "php occ app:install forms" || echo "forms already installed"
$OCC "php occ app:enable circles" || echo "circles enable failed (may not be shipped)"
SMTP4DEV_IP=$(docker inspect ${{ job.services.smtp4dev.id }} --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
echo "smtp4dev IP: $SMTP4DEV_IP"
$OCC "php occ mail:account:create admin 'Test Mail' test@localhost $SMTP4DEV_IP 143 none test test $SMTP4DEV_IP 25 none test test"
Expand Down
8 changes: 5 additions & 3 deletions PROGRESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,15 @@
- [x] upload_file_from_path tool: stream a local file to Nextcloud. Off by default; enabled via NEXTCLOUD_MCP_UPLOAD_ROOT, restricted to files inside that root (symlinks resolved) (2026-04-21)
- [x] File Reminders tools: get_file_reminder, set_file_reminder, remove_file_reminder (2026-04-22)
- [x] Forms tools: 25 tools covering forms, questions, options, shares, submissions CRUD + export (2026-04-23)
- [x] Circles (Teams) tools: 14 tools — list/CRUD circles, member add/remove/level, search, join/leave (2026-04-24)

### In Progress

### Blocked
(none)

### Next Up
- Weather Status (fully OCS). Tables skipped for now — OCS v2 API is incomplete (rows/columns/views require v1 REST).
- Weather Status (fully OCS). Tables, Polls, Notes, Deck, Bookmarks, Photos skipped — API not OCS or OCS incomplete.

## Phases

Expand Down Expand Up @@ -96,7 +97,8 @@
| File Helpers | — | 26 |
| File Reminders | 3 | 20 |
| Forms | 25 | 34 |
| **Total** | **127** | **805** |
| Circles | 14 | 31 |
| **Total** | **141** | **836** |

Files shows 10, but one (`upload_file_from_path`) is only registered when
`NEXTCLOUD_MCP_UPLOAD_ROOT` is configured. Default deployments expose 126 tools.
`NEXTCLOUD_MCP_UPLOAD_ROOT` is configured. Default deployments expose 140 tools.
24 changes: 22 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ export NEXTCLOUD_PASSWORD=your-app-password
nc-mcp-server
```

## 126 Tools Across 22 Nextcloud Apps
## 140 Tools Across 23 Nextcloud Apps

A 127th tool, `upload_file_from_path`, is registered only when the operator sets
A 141st tool, `upload_file_from_path`, is registered only when the operator sets
`NEXTCLOUD_MCP_UPLOAD_ROOT`. See [Files](#files) for details.

| Category | Tools | Protocol |
Expand All @@ -57,6 +57,7 @@ A 127th tool, `upload_file_from_path`, is registered only when the operator sets
| [Mail](#mail) | accounts, mailboxes, messages, send | OCS |
| [Collectives](#collectives) | list, pages, create, trash, restore | OCS |
| [Forms](#forms) | CRUD forms, questions, options, shares, submissions + export | OCS |
| [Circles (Teams)](#circles-teams) | list, CRUD, members (add/remove/promote), join/leave, search | OCS |
| [Unified Search](#unified-search) | list providers, search across apps | OCS |
| [App Management](#app-management) | list, info, enable, disable apps | OCS |

Expand Down Expand Up @@ -394,6 +395,25 @@ call; the body is streamed in chunks rather than loaded into memory.
| `delete_submission` | destructive | Delete one submission |
| `delete_all_submissions` | destructive | Delete every submission on a form |

### Circles (Teams)

| Tool | Permission | Description |
|------|-----------|-------------|
| `list_circles` | read | List circles the current user can see |
| `get_circle` | read | Get a single circle including the current user's membership |
| `list_circle_members` | read | List members of a circle |
| `search_circles` | read | Search circles and candidate members (users/groups/mail) by term |
| `create_circle` | write | Create a circle; caller becomes owner |
| `update_circle_name` | write | Rename a circle |
| `update_circle_description` | write | Update description |
| `update_circle_config` | write | Update config bitmask (VISIBLE, OPEN, INVITE, HIDDEN, etc.) |
| `add_circle_member` | write | Add a user, group, email, or nested circle as a member |
| `update_circle_member_level` | write | Promote/demote a member (member/moderator/admin/owner) |
| `join_circle` | write | Join an open circle |
| `leave_circle` | write | Leave a circle |
| `delete_circle` | destructive | Delete a circle |
| `remove_circle_member` | destructive | Kick a member |

### Unified Search

| Tool | Permission | Description |
Expand Down
2 changes: 2 additions & 0 deletions src/nc_mcp_server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
announcements,
app_management,
calendar,
circles,
collectives,
comments,
contacts,
Expand Down Expand Up @@ -60,6 +61,7 @@ def create_server(config: Config | None = None) -> FastMCP:
announcements.register(mcp)
app_management.register(mcp)
calendar.register(mcp)
circles.register(mcp)
collectives.register(mcp)
comments.register(mcp)
contacts.register(mcp)
Expand Down
Loading