Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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 | 20 |
| **Total** | **141** | **825** |

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