Skip to main content
Glama

Nextcloud MCP Server

Lint Unit Tests Integration Tests codecov

NextcloudVersion PythonVersion Python PyPI License: MIT

Experimental — This repository is fully maintained by AI (Claude). It serves as an experiment in autonomous AI-driven open-source development.

An MCP (Model Context Protocol) server that exposes Nextcloud APIs as tools for AI assistants. Connect any MCP-compatible client (Claude Desktop, Claude Code, etc.) to your Nextcloud instance and let AI manage your files, calendar, contacts, conversations, and more.

Quick Start

pip install nc-mcp-server

Set environment variables and connect:

export NEXTCLOUD_URL=https://your-nextcloud.example.com
export NEXTCLOUD_USER=your-username
export NEXTCLOUD_PASSWORD=your-app-password
nc-mcp-server

Related MCP server: nextcloud-mcp

222 Tools Across 24 Nextcloud Apps

A 223rd tool, upload_file_from_path, is registered only when the operator sets NEXTCLOUD_MCP_UPLOAD_ROOT. See Files for details.

Category

Tools

Protocol

Files

list, read, search, upload (text / binary / from path), copy, move, delete

WebDAV

File Sharing

list, get, create, update, delete shares; accept, decline and leave shares from others

OCS

Trashbin

list, restore, delete item, empty trash

WebDAV

File Versions

list, restore versions

WebDAV

File Comments

list, add, edit, delete comments

WebDAV

File Reminders

get, set, remove per-file reminders

OCS

System Tags

list, create, assign, unassign, delete tags

WebDAV

Users

get current, list, get, create, update, enable/disable, delete users

OCS

Groups

list groups and members, create, delete groups

OCS

User Status

get, set, clear status

OCS

Notifications

list, dismiss one, dismiss all

OCS

Activity

activity feed with filters, search by file, time and user, daily counts

OCS

Talk

conversations, messages, threads, participants, edits, reactions, read state, shared items, pins, reminders, personal settings and tags, participant and conversation management

OCS

Talk Polls

get, create, vote, close polls

OCS

Announcements

list, create, delete announcements

OCS

Calendar

list calendars, CRUD events

CalDAV

Contacts

list address books, CRUD contacts

CardDAV

Tasks

list lists, CRUD tasks, complete

CalDAV

Mail

accounts, mailboxes, messages, send, move, flags, tags

OCS + REST

Collectives

list, pages, create, edit, move and copy, search, tags, attachments, public links, trash, restore

OCS

Forms

CRUD forms, questions, options, shares, submissions + export

OCS

Circles (Teams)

list, CRUD, members (add/remove/promote), join/leave, search

OCS

Cospend

shared expense tracking — projects, members, bills

OCS

Unified Search

list providers, search across apps

OCS

App Management

list, info, enable, disable apps

OCS

Flow

list, create, update, delete automation rules; list what they can be built from

OCS

Security: Permission Model

Every tool has a required permission level. You control what the AI is allowed to do:

Level

What it can do

Environment variable

read (default)

List files, read files, get users, view notifications

NEXTCLOUD_MCP_PERMISSIONS=read

write

Everything in read + upload files, send messages, create events

NEXTCLOUD_MCP_PERMISSIONS=write

destructive

Everything in write + delete files, remove shares, empty trash

NEXTCLOUD_MCP_PERMISSIONS=destructive

If a tool is called without sufficient permission, it returns a clear error explaining what permission is needed — no silent failures, no accidental deletions.

Installation

pip install nc-mcp-server

Or with pipx / uvx for isolated installation:

pipx install nc-mcp-server
# or
uvx nc-mcp-server

Or from source:

git clone https://github.com/cloud-py-api/nc_mcp_server.git
cd nc_mcp_server
pip install -e .

Configuration

Set these environment variables:

# Required
export NEXTCLOUD_URL=https://your-nextcloud.example.com
export NEXTCLOUD_USER=your-username
export NEXTCLOUD_PASSWORD=your-app-password  # Use an app password, not your main password!

# Optional
export NEXTCLOUD_MCP_PERMISSIONS=read  # read (default), write, or destructive
export NEXTCLOUD_MCP_RETRY_MAX=3       # max retries on 429/503 (default: 3, 0 to disable)
export NEXTCLOUD_MCP_UPLOAD_ROOT=      # unset (default). If set to an absolute directory,
                                       # enables upload_file_from_path, restricted to files
                                       # inside that directory (symlinks resolved).

Getting an App Password

  1. Log into your Nextcloud instance

  2. Go to Settings > Security

  3. Under "Devices & sessions", create a new app password

  4. Use this password for NEXTCLOUD_PASSWORD

Since Nextcloud 34.0.1 an app-password session never counts as password-confirmed, so with an app password the admin tools Nextcloud guards with password confirmation (create_user, update_user, set_user_enabled, delete_user, create_group, delete_group, enable_app, disable_app) fail with "Password confirmation is required". To use them, allow the MCP server's IP address in config.php (Nextcloud 34.0.3 and newer), e.g. 'allowed_no_password_confirmation_ranges' => ['192.0.2.10/32']. With the account's login password they work without that: when Nextcloud asks for a confirmation, the server repeats the request as a fresh login. Accounts with two-factor authentication cannot log in with their password here, so they need an app password and the exemption.

Usage

With Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "nextcloud": {
      "command": "nc-mcp-server",
      "env": {
        "NEXTCLOUD_URL": "https://your-nextcloud.example.com",
        "NEXTCLOUD_USER": "your-username",
        "NEXTCLOUD_PASSWORD": "your-app-password",
        "NEXTCLOUD_MCP_PERMISSIONS": "read"
      }
    }
  }
}

With Claude Code

claude mcp add nextcloud \
  -e NEXTCLOUD_URL=https://your-nextcloud.example.com \
  -e NEXTCLOUD_USER=your-username \
  -e NEXTCLOUD_PASSWORD=your-app-password \
  -e NEXTCLOUD_MCP_PERMISSIONS=read \
  -- nc-mcp-server

As HTTP Server (for containers/remote)

nc-mcp-server --transport http
# Listens on http://0.0.0.0:8100 by default

Stdio Mode (default)

nc-mcp-server
# Communicates via stdin/stdout — used by MCP clients like Claude Desktop

Available Tools

Files

Tool

Permission

Description

list_directory

read

List files and folders in a directory

get_file

read

Read a file's content (returns images as MCP ImageContent)

search_files

read

Search files by name, MIME type, or path pattern

upload_file

write

Upload or overwrite a text file

upload_file_binary

write

Upload or overwrite a binary file (images, PDFs, archives) from base64-encoded content

upload_file_from_path

write

Stream a local file from the server's filesystem — only registered when NEXTCLOUD_MCP_UPLOAD_ROOT is set

create_directory

write

Create a new directory

copy_file

write

Copy a file or directory

move_file

destructive

Move or rename a file

delete_file

destructive

Delete a file or directory (moves to trash)

upload_file_from_path is off by default because it gives the AI read access to the local filesystem. To enable it, set NEXTCLOUD_MCP_UPLOAD_ROOT to an absolute directory — only files resolving inside that directory (after symlink resolution) can be uploaded. This is the right choice when you need to upload multi-GB files that would blow past the size limit of an inline base64 tool call; the body is streamed in chunks rather than loaded into memory.

File Sharing

Tool

Permission

Description

list_shares

read

List shares for a file/folder, all your shares, or the shares others gave you (federated included)

get_share

read

Get details of a specific share

list_pending_shares

read

List shares offered to you that wait to be accepted, from this server and federated

create_share

write

Share a file/folder (user, group, public link, email)

update_share

write

Update share permissions, expiration, password, etc.

accept_share

write

Accept a pending share

delete_share

destructive

Remove a share, or leave one you received

decline_share

destructive

Decline a pending share

Trashbin

Tool

Permission

Description

list_trash

read

List deleted files in the trash bin

restore_trash_item

write

Restore a file from trash to its original location

delete_trash_item

destructive

Permanently delete a single item from trash

empty_trash

destructive

Permanently delete all items in trash

File Versions

Tool

Permission

Description

list_versions

read

List version history of a file

restore_version

write

Restore a previous version of a file

File Comments

Tool

Permission

Description

list_comments

read

List comments on a file

add_comment

write

Add a comment to a file

edit_comment

write

Edit an existing comment

delete_comment

destructive

Delete a comment

File Reminders

Tool

Permission

Description

get_file_reminder

read

Get the reminder set on a file (null if none)

set_file_reminder

write

Set or replace a reminder due date (ISO 8601, must be in the future)

remove_file_reminder

destructive

Remove the reminder from a file

System Tags

Tool

Permission

Description

list_tags

read

List all available tags

get_file_tags

read

Get tags assigned to a file

create_tag

write

Create a new tag

assign_tag

write

Assign a tag to a file

unassign_tag

destructive

Remove a tag from a file

delete_tag

destructive

Delete a tag

Users

Tool

Permission

Description

get_current_user

read

Get current authenticated user info

list_users

read

List or search users

get_user

read

Get specific user details

create_user

write

Create a new user (admin only)

update_user

write

Change display name, email, password, quota, language, manager, groups and sub-admin groups in one call (Nextcloud 34+)

set_user_enabled

write

Enable or disable a user account (admin or sub-admin); disabling needs destructive

delete_user

destructive

Delete a user (admin only)

update_user has Nextcloud validate every field before applying any of them. Users can change their own display name, email, language and password with it; Nextcloud 34 and 35 only accept the underlying call from admins and sub-admins, so for a regular user's own account the tool sets those fields one at a time instead, without that all-or-nothing check. Passing password, groups or subadmin_groups needs the destructive level, as does disabling an account with set_user_enabled.

Groups

Tool

Permission

Description

list_groups

read

List or search groups with member counts (admin)

list_group_members

read

List the users in a group (admins, the group's sub-admins and members)

create_group

write

Create a group (admin only)

delete_group

destructive

Delete a group (admin only)

User Status

Tool

Permission

Description

get_user_status

read

Get a user's status (online, away, dnd, etc.)

set_user_status

write

Set your status and custom message

clear_user_status

destructive

Clear your status

Notifications

Tool

Permission

Description

list_notifications

read

List all notifications

dismiss_notification

write

Dismiss a single notification

dismiss_all_notifications

write

Dismiss all notifications

Activity

Tool

Permission

Description

get_activity

read

View recent activity with filtering, sorting, and pagination; search by file path, time range and user (Nextcloud 35)

list_activity_filters

read

List the activity filters this server offers

get_activity_counts

read

Count activities per day over the last days (Nextcloud 35)

Talk

Tool

Permission

Description

list_conversations

read

List all Talk conversations

get_conversation

read

Get conversation details

get_messages

read

Get messages from a conversation, or from one thread

get_participants

read

List participants in a conversation

list_threads

read

List the most recently active threads in a conversation

get_thread

read

Get a thread's title, reply count and first/last message

list_subscribed_threads

read

List the threads you follow across all conversations

get_message_context

read

Get the messages before and after one message

get_reactions

read

List who reacted to a message, and with what

list_shared_items

read

List files, media, polls, locations and more shared in a conversation

search_mentions

read

Find who can be mentioned, with the text to put in a message

list_message_reminders

read

List your upcoming message reminders

list_conversation_tags

read

List your personal conversation tags

list_conversation_presets

read

List the presets create_conversation can start from

send_message

write

Send a message; can start a thread or post into one

create_conversation

write

Create a one-to-one, group or public conversation, optionally from a preset

update_conversation

write

Rename, describe, lock (read-only) or open (public) a conversation (moderators); making it private needs destructive; owners can preserve it (Talk 25+)

add_participant

write

Add a user, group, team, email guest or federated user (moderators)

set_participant_role

write

Make a participant owner (Talk 25+), moderator or user

rename_thread

write

Rename a thread

set_thread_notification_level

write

Set your notification level for a thread

edit_message

write

Edit a message (own ones, or any as a moderator of a group conversation; within 24 hours)

add_reaction

write

React to a message with an emoji

mark_conversation_read

write

Mark a conversation read, fully or up to a message

mark_conversation_unread

write

Mark the last message unread again

set_conversation_preferences

write

Your own settings: favorite, archived, important, sensitive, message and call notifications

pin_message

write

Pin a message for everyone, optionally until a time (moderators)

set_message_reminder

write

Get a notification about a message later

create_conversation_tag

write

Create a personal conversation tag

rename_conversation_tag

write

Rename a conversation tag

set_conversation_tags

write

Set which of your tags a conversation has

delete_message

destructive

Delete a message

leave_conversation

destructive

Leave a conversation

remove_participant

destructive

Remove someone from a conversation (moderators)

delete_conversation

destructive

Delete a conversation for everyone (moderators; one-to-one ones can only be left)

remove_reaction

destructive

Take back your reaction to a message

unpin_message

destructive

Unpin a message for everyone, or hide it only for you

remove_message_reminder

destructive

Cancel a message reminder

delete_conversation_tag

destructive

Delete a conversation tag

The thread tools need a Talk version that advertises the threads capability (Talk 22, which ships with Nextcloud 32, and newer), so every Nextcloud release supported here has them. A thread ID is the message ID of the thread's first message.

Messages read back with their mentions and shared objects filled in ("@Jane Doe", "report.pdf") instead of the placeholders Talk stores ({mention-user1}, {file}).

Talk Polls

Tool

Permission

Description

get_poll

read

Get poll details and results

create_poll

write

Create a poll in a conversation

vote_poll

write

Vote on a poll

close_poll

write

Close a poll

Announcements

Tool

Permission

Description

list_announcements

read

List announcements

create_announcement

write

Create an announcement

delete_announcement

destructive

Delete an announcement

Calendar

Tool

Permission

Description

list_calendars

read

List user's calendars

get_events

read

Get events from a calendar (with date filtering)

get_event

read

Get a single event by UID

create_event

write

Create a calendar event

update_event

write

Update an event (partial updates supported)

delete_event

destructive

Delete a calendar event

Contacts

Tool

Permission

Description

list_addressbooks

read

List user's address books

get_contacts

read

Get contacts with pagination

get_contact

read

Get a single contact by UID

create_contact

write

Create a contact (multi-value email/phone supported)

update_contact

write

Update a contact (ETag concurrency control)

delete_contact

destructive

Delete a contact

Tasks

Tool

Permission

Description

list_task_lists

read

List task lists (CalDAV VTODO collections)

get_tasks

read

List tasks in a list (with status/completed filters)

get_task

read

Get a single task by UID

create_task

write

Create a task (due date, priority, categories, etc.)

update_task

write

Update a task (partial updates supported)

complete_task

write

Mark a task as completed

delete_task

destructive

Delete a task

Mail

Tool

Permission

Description

list_mail_accounts

read

List mail accounts

list_mailboxes

read

List mailboxes (folders) for an account

list_mail_messages

read

List messages in a mailbox

get_mail_message

read

Get full message content

send_mail

write

Send an email

move_mail_message

write

Move a message to another mailbox of the same account (its ID changes)

set_mail_message_flags

write

Mark as read/unread, starred, answered

create_mail_tag

write

Create a tag, or get the existing one with the same label

add_mail_message_tag

write

Tag a message

remove_mail_message_tag

write

Remove a tag from a message

Collectives

Tool

Permission

Description

list_collectives

read

List all collectives

get_collective_pages

read

List pages in a collective

get_collective_page

read

Get a page's content

search_collective_pages

read

Search the text of a collective's pages

list_recent_collective_pages

read

List the most recently changed pages across collectives

list_collective_tags

read

List a collective's page tags

list_collective_page_attachments

read

List the files attached to a page

list_collective_shares

read

List your public links to a collective and its pages

create_collective

write

Create a new collective

create_collective_page

write

Create a page in a collective, optionally with its text

update_collective_page

write

Change a page's text, title or emoji

move_collective_page

write

Move or copy a page under another page, also into another collective

create_collective_tag

write

Create a page tag

update_collective_tag

write

Rename a tag or change its color

set_collective_page_tags

write

Set which tags a page has

share_collective

write

Create a public link to a collective or one page, optionally editable and with a password

update_collective_share

write

Change a public link's editing and password

trash_collective

destructive

Move a collective to trash

delete_collective

destructive

Permanently delete a trashed collective, optionally with its team (and, when told, the team's folder)

trash_collective_page

destructive

Move a page to trash

delete_collective_page

destructive

Permanently delete a trashed page

delete_collective_tag

destructive

Delete a tag, taking it off its pages

delete_collective_share

destructive

Remove a public link

restore_collective

write

Restore a collective from trash

restore_collective_page

write

Restore a page from trash

Forms

Tool

Permission

Description

list_forms

read

List forms (filter by ownership: "owned" or "shared"; omit to merge both)

get_form

read

Get a form with questions, options, shares

list_questions

read

List questions on a form

get_question

read

Get a single question

list_submissions

read

List submissions (owner only), with pagination and text filter

get_submission

read

Get a single submission with answers

create_form

write

Create an empty form or clone from an existing form

update_form

write

Update form properties (title, access, state, maxSubmissions, etc.)

create_question

write

Add a question (short, long, multiple, dropdown, date, file, grid, …)

update_question

write

Update question properties

reorder_questions

write

Reorder all questions on a form

create_options

write

Add answer options to a choice question

update_option

write

Update option text

reorder_options

write

Reorder options within a question

create_form_share

write

Share a form with user, group, circle, or link

update_form_share

write

Update share permissions

submit_form

write

Submit answers to a form

update_submission

write

Edit an existing submission (requires allowEditSubmissions)

export_submissions

write

Export submissions as a spreadsheet to a Nextcloud folder

delete_form

destructive

Delete a form and all its content

delete_question

destructive

Delete a question

delete_option

destructive

Delete an option

delete_form_share

destructive

Revoke a share

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. Optionally with a team folder (Nextcloud 35 + Team folders app)

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

destructive

Leave a circle. The owner's leave passes ownership to any other member (pending invitations count), or destroys the circle when no one else is left; refuses to lose a team folder unless told

delete_circle

destructive

Delete a circle; refuses to delete its team folder and files unless told

remove_circle_member

destructive

Kick a member

Cospend

Shared expense tracking ("who paid for what"). Requires the Cospend app to be installed and enabled. All routes are OCS at /ocs/v2.php/apps/cospend/api/v1/.

Tool

Permission

Description

list_cospend_projects

read

List projects the user can access

get_cospend_project

read

Get full project info (members, balance, shares, settings)

get_cospend_project_statistics

read

Per-member spending stats (paid/spent/balance) with filters

get_cospend_project_settlement

read

Suggested reimbursement transactions to settle a project

list_cospend_members

read

List members of a project

list_cospend_bills

read

List bills with filters (payer, category, search, pagination)

get_cospend_bill

read

Get a single bill

create_cospend_project

write

Create a project (caller becomes ADMIN)

update_cospend_project

write

Update project name, currency, sort, archive, etc.

create_cospend_member

write

Add a member (free-form name or linked to a Nextcloud user)

update_cospend_member

write

Update name/weight/color/activated/userid

create_cospend_bill

write

Create a bill (defaults date to today if neither date nor timestamp set)

update_cospend_bill

write

Update any bill field

delete_cospend_project

destructive

Delete a project and all its data

delete_cospend_member

destructive

Delete (or soft-disable if member has bills)

delete_cospend_bill

destructive

Delete a bill (default: trash; pass move_to_trash=False to purge)

Tool

Permission

Description

list_search_providers

read

List available search providers (files, mail, talk, etc.)

unified_search

read

Search across one or more providers with pagination

App Management

Tool

Permission

Description

list_apps

read

List installed apps

get_app_info

read

Get detailed app information

enable_app

write

Enable an app (admin only)

disable_app

destructive

Disable an app (admin only)

Flow

Tool

Permission

Description

list_flows

read

List Flow rules of the user or (admin) global scope

get_flow_options

read

List the operations, entities, events and checks a rule can use, with operators and value formats for the built-in checks

create_flow

write

Create a rule; global rules need destructive

update_flow

write

Change a rule's name, checks, settings or events; global rules need destructive

delete_flow

destructive

Delete a rule

The available operations depend on the installed apps (Talk adds "Write to conversation", for example), and Nextcloud has no API that lists them, so get_flow_options reads them from the Flow settings page. Global rules act on every user's files, which is why they need the destructive level. Rules that would run a command or command-line arguments of the agent's choosing on the server (the workflow_script app's operation, or workflow_ocr with custom ocrmypdf arguments) are refused at any level.

Development

# Clone and install
git clone https://github.com/cloud-py-api/nc_mcp_server.git
cd nc_mcp_server
python3 -m venv venv && source venv/bin/activate
pip install -e ".[dev]"

# Run tests
pytest                              # Unit tests
pytest tests/integration/ -v        # Integration tests (needs running Nextcloud)

# Lint & type check
ruff check . && ruff format --check .
pyright

Integration Tests

Integration tests run against a real Nextcloud instance. Set the environment variables and run:

export NEXTCLOUD_URL=http://localhost:8080
export NEXTCLOUD_USER=admin
export NEXTCLOUD_PASSWORD=admin
pytest tests/integration/ -v

CI runs the integration tests against Nextcloud 34 and 35 using the official Docker images.

About This Project

This project is an experiment in AI-autonomous open-source development. The entire codebase — including this README — is written and maintained by Claude (Anthropic's AI assistant). Human oversight is limited to:

  • High-level design decisions

  • Code review of pull requests

  • Resolving architectural questions

The goal is to explore how far autonomous AI development can go in building production-quality, well-tested software.

Available Tools

222 tools
accept_shareA
Idempotent

Accept a share offered to the current user, adding it to their files.

Accepting a share that was already accepted changes nothing. A group share the user declined or left earlier is restored first, since Nextcloud refuses to accept it otherwise.

Args: share_id: The pending share's id from list_pending_shares, as a string (federated share ids can be too long for a JSON number). federated: True for a federated share from another server (federated: true in list_pending_shares). Shares from this server and federated shares are numbered separately.

Returns: Confirmation message.

Inputs: share_id (required), federated. Returns: result

add_circle_memberA

Add a user, group, email, or nested circle as a member. Requires moderator+.

Args: circle_id: String circle id. user_id: The identifier of the principal being added. For user: the uid. For group: the group id. For mail: the email address. For circle: the string circle id (singleId). member_type: One of "user" (default), "group", "mail", "contact", "circle". Determines how user_id is interpreted.

Returns: JSON of the new member (id, singleId, userId, level, status). Status is "Member" for direct add and "Invited" when the circle has the INVITE config flag set.

Inputs: user_id (required), circle_id (required), member_type. Returns: result

add_commentA

Add a comment to a file.

Use @username in the message to mention other users. Maximum message length is 1000 characters.

Args: file_id: The numeric file ID to comment on. message: The comment text (max 1000 characters). Use @username to mention users.

Returns: Confirmation with the new comment ID.

Inputs: file_id (required), message (required). Returns: result

add_mail_message_tagA
Idempotent

Tag a message. Tagging a message that already has the tag changes nothing.

Args: message_id: The message database ID. Use list_mail_messages to find it. imap_label: The tag's IMAP label (for example "$needs_reply"), as returned by create_mail_tag or shown in the tags of list_mail_messages. Mail's built-in tags use $label1 (Important), $label2 (Work), $label3 (Personal), $label4 (To Do) and $label5 (Later).

Returns: JSON object with message_id and the tag (id, display_name, imap_label, color).

Inputs: imap_label (required), message_id (required). Returns: result

add_participantA
Idempotent

Add someone to a conversation. Needs moderator rights; adding someone twice changes nothing.

Args: token: The conversation token. participant: Who to add: a user ID, group ID, team (circle) ID, email address or federated cloud ID, matching source. source: "users" (default), "groups" (adds every member), "circles" (a team), "emails" (invites a guest by email) or "federated_users" (someone on another server, when federation is enabled). One-to-one and note-to-self conversations take nobody.

Returns: Confirmation message; get_participants lists attendee IDs.

Inputs: token (required), participant (required), source. Returns: result

add_reactionB
Idempotent

React to a chat message with an emoji. Reacting twice with the same one changes nothing.

Args: token: The conversation token. message_id: The message to react to. reaction: One emoji, e.g. "👍".

Returns: JSON object mapping each reaction on the message to who used it.

Inputs: token (required), reaction (required), message_id (required). Returns: result

assign_tagA
Idempotent

Assign a system tag to a file.

Use list_tags to find available tag IDs and list_directory to find file IDs. Assigning an already-assigned tag has no effect.

Args: file_id: The numeric file ID. tag_id: The tag ID to assign.

Returns: Confirmation message.

Inputs: tag_id (required), file_id (required). Returns: result

clear_user_statusA
Idempotent

Clear the current user's status message and icon.

This removes the custom status message and icon but does NOT change the online status type (online, away, etc.).

Returns: Confirmation message.

Inputs: no named parameters. Returns: result

close_pollA
DestructiveIdempotent

Close a poll in a Talk conversation.

Once closed, no more votes can be cast and results become visible to all participants (regardless of result_mode). Only the poll creator or a conversation moderator can close a poll.

This action is irreversible — a closed poll cannot be reopened.

Args: token: The conversation token. poll_id: The poll ID to close.

Returns: JSON object with the final poll results including all votes and details.

Inputs: token (required), poll_id (required). Returns: result

complete_taskA
Idempotent

Mark a task as completed.

Sets the task's status to COMPLETED, percent-complete to 100, and records the completion timestamp. No-ops if already completed.

For optimistic locking, pass the etag from a previous get_task call.

Args: list_id: Task list identifier (e.g. "tasks"). task_uid: The task's UID to complete. Use get_tasks to find UIDs. etag: Optional ETag from a previous read for optimistic locking.

Returns: Confirmation message.

Inputs: list_id (required), task_uid (required), etag. Returns: result

copy_fileA
Idempotent

Copy a file or directory in Nextcloud.

Creates a copy at the destination path. The source remains unchanged. Fails if the destination already exists.

Args: source: Source path. Example: "Documents/report.md" destination: Destination path. Example: "Documents/report-backup.md"

Returns: Confirmation message.

Inputs: source (required), destination (required). Returns: result

create_announcementA

Create a new announcement in Nextcloud. Requires admin privileges.

Announcements are posted to the Announcement Center and optionally trigger activity entries, notifications, and/or emails for the targeted groups.

Args: subject: Announcement title (1-512 characters, required). message: Announcement body in Markdown format. plain_message: Plain text version of the body. If empty, the markdown message is used as fallback. groups: List of group IDs to target (e.g. ["admin", "staff"]). Default: ["everyone"] (visible to all users). activities: Post to the activity stream (default: true). notifications: Send in-app notifications (default: true). emails: Send email notifications (default: false). comments: Allow comments on this announcement (default: true).

Returns: JSON object with the created announcement details.

Inputs: subject (required), emails, groups, message, +4 more. Returns: result

create_circleA

Create a new circle (team).

Args: name: Display name of the new circle. Does not have to be unique. personal: If True, create a personal circle visible only to the owner (useful for private contact groups). local: If True, mark the circle as local (not federated to other instances) even when global scope is enabled. team_folder: If True, also create a team folder: a shared folder every member sees in Files, named after the team (with a number added when that name is taken; see its mountPoint). Needs Nextcloud 35 or later with the Team folders app. Deleting the team later deletes the folder and its files too.

Returns: JSON of the new circle including its generated id. The caller is automatically added as owner (level=9). With team_folder, it also has team_folder (id, mountPoint, quota) or null with team_folder_note saying why none was created.

Inputs: name (required), local, personal, team_folder. Returns: result

create_collectiveA

Create a new collective (shared knowledge base).

A collective is a wiki-like space where team members can create and edit pages together. It automatically creates a landing page, and a team (circle) of the same name for its members. On Nextcloud 35+ with the Team folders app, that team also gets a team folder.

Args: name: Name of the collective (required, must be unique). emoji: Optional emoji icon for the collective (e.g. "📚").

Returns: JSON object with the created collective details, and team_folder (the folder's name) when its team got one.

Inputs: name (required), emoji. Returns: result

create_collective_pageA

Create a new page in a collective.

Pages are Markdown documents organized in a tree structure. Every page must have a parent — use the landing page ID as parent for top-level pages.

Args: collective_id: The numeric collective ID. parent_id: Parent page ID. Use the landing page ID from get_collective_pages for top-level pages. title: Title of the new page (required). content: Optional Markdown text for the page.

Returns: JSON object with the created page details.

Inputs: title (required), parent_id (required), collective_id (required), content. Returns: result

create_collective_tagB

Create a page tag in a collective.

Args: collective_id: The numeric collective ID. name: The tag's name. color: Six hex digits, with or without "#" (default "0082C9", Nextcloud blue).

Returns: JSON with the new tag (id, name, color).

Inputs: name (required), collective_id (required), color. Returns: result

create_contactA

Create a new contact in an address book.

Provide at least full_name, or given_name/family_name.

For a single email/phone, use the email/phone params. For multiple, use emails/phones with an array of {"value","type"} objects: emails=[{"value":"a@b.com","type":"WORK"},{"value":"a@home.com","type":"HOME"}] Do not provide both email and emails (or phone and phones).

Args: full_name: Full display name (e.g. "John Doe"). given_name: First name (e.g. "John"). family_name: Last name (e.g. "Doe"). email: Single email address (convenience, adds as TYPE=WORK). phone: Single phone number (convenience, adds as TYPE=CELL). emails: Array of {"value","type"} for multiple emails. Overrides email. phones: Array of {"value","type"} for multiple phones. Overrides phone. organization: Company/organization name. title: Job title. note: Free-text note. book_id: Address book ID (default "contacts").

Returns: JSON contact object with uid, full_name, and all set fields.

Inputs: note, email, phone, title, +7 more. Returns: result

create_conversationA

Create a new Talk conversation.

Args: room_type: 1 for a one-to-one conversation, 2 for a group conversation, 3 for a public one. Group conversations are invite-only; public ones can be joined via link. A one-to-one conversation with someone you already have one with returns the existing one. name: Display name for the conversation (ignored for one-to-one). invite: User ID to invite; required for one-to-one, optional for group. description: Optional description for group and public conversations. preset: Optional preset identifier from list_conversation_presets; its settings (permissions, lobby, read-only, ...) are applied to the new conversation. An explicit room_type still wins over the preset's.

Returns: JSON object with the created conversation details, including its token.

Inputs: name (required), room_type (required), invite, preset, +1 more. Returns: result

create_conversation_tagB

Create a personal conversation tag.

Up to 100 of your own tags, with distinct names of up to 250 characters.

Args: name: The tag's name.

Returns: JSON with the new tag (id, name, type, sort_order).

Inputs: name (required). Returns: result

create_cospend_billA

Create a bill (expense) in a Cospend project. Requires PARTICIPANT access.

Args: project_id: String project id. what: Short description of the expense (e.g. "Pizza"). amount: Total amount paid. payer: Member id of the person who paid. payed_for: Non-empty list of member ids who share the cost. Cospend requires at least one ower per bill — passing [] raises ValueError (the server would reject it on create and silently no-op on update, so we reject it up front for both). date: Date string "YYYY-MM-DD". Defaults to today (UTC) if both date and timestamp are omitted; the underlying API requires one. timestamp: Alternative to date — Unix seconds. If both are set, the server uses timestamp. comment: Free-form longer note. category_id: Category id (see project's categories). Omit for uncategorized (id=0). payment_mode_id: Payment mode id (see project's paymentmodes). Omit for unset (id=0). repeat: Repetition mode: "n"=no repeat (default), "d"=daily, "w"=weekly, "b"=biweekly, "s"=semi-monthly, "m"=monthly, "y"=yearly. repeat_freq: Every N units (default 1). E.g. repeat="m", repeat_freq=3 means quarterly. repeat_until: Stop repeating after this date "YYYY-MM-DD". repeat_all_active: 0 (default) = repeat with the same owers, 1 = on each repetition use whoever is currently active.

Returns: JSON {"bill_id": } — the integer id of the new bill.

Inputs: what (required), payer (required), amount (required), payed_for (required), +10 more. Returns: result

create_cospend_memberA

Add a member to a Cospend project. Requires MAINTAINER access.

Args: project_id: String project id. name: Display name of the new member. user_id: Link this member to a Nextcloud user id (optional). If set, the member can see the project in their Cospend UI. weight: Share weight (default 1.0). A weight-2 member counts double in even splits. active: If False, the member is created soft-disabled (rare — usually create active and disable later via update_cospend_member). color: Hex color like "#aabbcc". Omit to let the server pick.

Returns: JSON of the new member: id (use as memberId in other tools), name, weight, activated, userid, color (RGB dict), lastchanged.

Inputs: name (required), project_id (required), color, active, +2 more. Returns: result

create_cospend_projectA

Create a new Cospend project. The caller becomes ADMIN of it.

Args: project_id: Desired string id (slug). If the id is already taken, the server appends a digit to make it unique — check the id field of the returned project for the actual id assigned. name: Display name (does not have to be unique).

Returns: JSON of the new project (full info — same shape as get_cospend_project), including the resolved id and the default categories and payment modes that the server seeds.

Inputs: name (required), project_id (required). Returns: result

create_directoryB
Idempotent

Create a new directory in Nextcloud.

Args: path: Directory path to create. Example: "Documents/Projects/NewProject"

Returns: Confirmation message.

Inputs: path (required). Returns: result

create_eventA

Create a new calendar event.

Args: calendar_id: Calendar identifier (e.g. "personal"). summary: Event title/summary. start: Start date or datetime in ISO 8601 format. For timed events: "2026-04-01T10:00:00Z" or "2026-04-01T10:00:00". For all-day events: "2026-04-01". end: End date or datetime. Optional — defaults to 1 hour after start for timed events, or next day for all-day events. all_day: Set to true for an all-day event. When true, start/end are dates only. description: Optional event description/notes. location: Optional event location. status: Event status: "CONFIRMED" (default), "TENTATIVE", or "CANCELLED". categories: Optional comma-separated category names (e.g. "Work,Meeting"). rrule: Optional recurrence rule in iCalendar RRULE format. Examples: "FREQ=DAILY;COUNT=5", "FREQ=WEEKLY;BYDAY=MO,WE,FR", "FREQ=MONTHLY;BYMONTHDAY=15;UNTIL=20261231T235959Z".

Returns: JSON object with the created event's uid and summary.

Inputs: start (required), summary (required), calendar_id (required), end, +6 more. Returns: result

create_flowA
Destructive

Create a Nextcloud Flow rule: when an event happens and all checks match, run an operation.

Use get_flow_options for the operation, entity, event and check class names of the scope; an unknown class name makes Nextcloud fail with a server error. User flows act on the current user's files only. Global flows act on everyone's and need the destructive permission level: a global access control rule whose checks match too much locks every user, this server included, out of their files. Operations that would run a command, or command-line arguments, of the agent's choosing on the server are refused.

Args: operation_class: Class of the operation to run, from get_flow_options. Example: "OCA\Talk\Flow\Operation" checks: Conditions that must all match, at least one. Each is an object with "class", "operator" and "value", e.g. {"class": "OCA\WorkflowEngine\Check\FileName", "operator": "matches", "value": "/.pdf$/i"}. get_flow_options lists operators and value formats for the built-in checks. scope: "user" (default) or "global" (admin only). name: Optional name for the rule. operation_config: The operation's own settings; the format depends on the operation. Talk's "Write to conversation" takes {"m": 1, "t": ""} (m: 1 no mention, 2 mention yourself, 3 mention everyone in the room, moderators only), as an object or a JSON string. Empty for operations without settings. entity: What the rule acts on. Defaults to files ("OCA\WorkflowEngine\Entity\File"), the only entity Nextcloud ships. events: Entity events that trigger the rule, e.g. ["\OCP\Files::postCreate"]. Required unless the operation has events_fixed in get_flow_options, in which case leave it empty.

Returns: JSON with the created flow, as list_flows shows it.

Inputs: checks (required), operation_class (required), name, scope, +3 more. Returns: result

create_formA

Create a new form. Returns the form with a generated id and default empty title.

Args: from_id: Optional id of an existing form to clone (copies questions and options; does not copy submissions or shares).

Returns: JSON of the new form. Use update_form to set title/description, then create_question to add questions.

Inputs: from_id. Returns: result

create_form_shareA

Share a form with a user, group, circle, or via public link.

Args: form_id: Numeric form id. share_type: 0=user, 1=group, 3=link (public), 7=circle. share_with: User/group/circle id to share with. Omit for link shares. permissions: Array of strings from: "submit" (fill out), "edit" (modify form definition), "results" (view submissions), "results_delete" (delete submissions), "embed" (render in other pages). Defaults to ["submit"].

Returns: JSON of the new share with its id.

Inputs: form_id (required), share_type (required), share_with, permissions. Returns: result

create_groupA

Create a new group. Requires admin rights (or delegated user administration).

Add users to it with update_user (its "groups" field).

Args: group_id: The group ID, used by the other tools to refer to it. Cannot be changed later. display_name: Name shown in the web interface. Defaults to the ID.

Returns: Confirmation message.

Inputs: group_id (required), display_name. Returns: result

create_mail_tagA
Idempotent

Create a mail tag, or get the existing tag with the same IMAP label.

Tags belong to the current user and are stored on messages as IMAP keywords. Mail derives the IMAP label from the display name (for example "Needs Reply" becomes "$needs_reply"). If a tag with that label already exists, it is returned unchanged, including its color. Mail's built-in tags Important, Work, Personal, To Do and Later have the labels $label1 to $label5; tag messages with those labels rather than creating tags with the same names.

Args: display_name: Tag name shown in the Mail app (at most 128 characters, none of ( ) { ] " \ % * /). color: Hex color such as "#0082c9".

Returns: JSON object with id, display_name, imap_label and color. Pass imap_label to add_mail_message_tag and remove_mail_message_tag.

Inputs: color (required), display_name (required). Returns: result

create_optionsA

Add one or more answer options to a choice question (dropdown/multiple/etc.).

Args: form_id: Numeric form id. question_id: Numeric question id. Intended for choice-type questions (dropdown, multiple, multiple_unique, linearscale, grid); options on other types are accepted by the server but have no effect. option_texts: Array of option labels to create. Each creates a separate option in order.

Returns: JSON array of created options with their assigned ids and order.

Inputs: form_id (required), question_id (required), option_texts (required). Returns: result

create_pollA

Create a poll in a Talk conversation.

Polls can only be created in group or public conversations (not one-to-one). A chat message is automatically posted announcing the poll.

Args: token: The conversation token. Use list_conversations to find tokens. question: The poll question (max 32,000 characters). options: List of voting options (minimum 2 options required). Example: ["Yes", "No", "Maybe"] result_mode: 0 for public results (voters see results immediately after voting), 1 for hidden results (results shown only after poll is closed). Default: 0 (public). max_votes: Maximum number of options a user can vote for. 0 means unlimited (user can select all options). Default: 0.

Returns: JSON object with poll details: id, question, options, status, result_mode, max_votes.

Inputs: token (required), options (required), question (required), max_votes, +1 more. Returns: result

create_questionA

Add a question to a form.

Args: form_id: Numeric form id. question_type: One of: "short" (single-line text), "long" (multi-line text), "multiple" (checkbox), "multiple_unique" (radio), "dropdown", "date", "time", "file", "grid", "color", "linearscale". "datetime" is rejected by Nextcloud — use separate "date" and "time" questions. text: Question text. Defaults to empty; update_question can set it later. subtype: For question_type="grid" only, the cell type: "radio", "checkbox", or "number". from_id: Optional id of an existing question to clone.

Returns: JSON of the new question including its assigned id and order. For choice types (dropdown/multiple/multiple_unique), use create_options to add the answer choices.

Inputs: form_id (required), question_type (required), text, from_id, +1 more. Returns: result

create_shareA

Create a new share for a file or folder.

Args: path: Path to the file or folder to share (e.g. "/Documents/report.pdf"). share_type: Type of share: 0=user, 1=group, 3=public link, 4=email, 6=federated, 10=talk room. share_with: Recipient — required for all types except link (3). User share (0): username. Group share (1): group name. Email share (4): email address. Federated (6): user@remote.server. Talk room (10): room token. permissions: Bitwise permission flags. 1=read, 2=update, 4=create, 8=delete, 16=share. Common values: 1 (read-only), 15 (full, no reshare), 31 (all). Default: all permissions (31) for user/group, read-only (1) for links. Note: file shares automatically strip create (4) and delete (8) flags. password: Optional password for link (3) or email (4) shares. expire_date: Optional expiration date in "YYYY-MM-DD" format. note: Optional note/message for the share recipient. label: Optional display label for link shares (max 255 chars). public_upload: Enable public upload on shared folders (link shares only).

Returns: JSON object with the created share details including id, url (for links), token, etc.

Inputs: path (required), share_type (required), note, label, +5 more. Returns: result

create_tagB

Create a new system tag. Requires admin privileges for non-visible/non-assignable tags.

Args: name: Tag display name. user_visible: Whether regular users can see this tag (default: true). user_assignable: Whether regular users can assign this tag to files (default: true).

Returns: JSON with the created tag ID and name.

Inputs: name (required), user_visible, user_assignable. Returns: result

create_taskA

Create a new task in a task list.

Args: list_id: Task list identifier (e.g. "tasks"). summary: Task title/summary. description: Optional task description/notes. due: Optional due date/time in ISO 8601 format (e.g. "2026-04-10T18:00:00Z"). start: Optional start date/time in ISO 8601 format. status: Task status: "NEEDS-ACTION" (default), "IN-PROCESS", "COMPLETED", or "CANCELLED". priority: Priority 0-9 (0=undefined, 1=highest, 5=medium, 9=lowest). Default 0. percent_complete: Completion percentage 0-100. Default 0. categories: Optional comma-separated category names (e.g. "Work,Urgent").

Returns: JSON object with the created task's uid and summary.

Inputs: list_id (required), summary (required), due, start, +5 more. Returns: result

create_userA

Create a new Nextcloud user. Requires admin privileges.

Args: user_id: Login name for the new user. password: Password for the new user. display_name: Display name. Defaults to user_id if empty. email: Email address for the new user.

Returns: JSON with the created user ID.

Inputs: user_id (required), password (required), email, display_name. Returns: result

decline_shareA
DestructiveIdempotent

Decline a share offered to the current user that is waiting to be accepted.

Declining a share made directly to the user deletes it, so the owner has to share again to offer it again. A declined group share is only hidden from this user: Nextcloud keeps it in list_pending_shares (marked declined) and accept_share can still take it. A declined federated share is removed and the other server is told, except for a federated group share, which Nextcloud keeps offering (under a new id once the user had accepted it before).

Args: share_id: The pending share's id from list_pending_shares, as a string (federated share ids can be too long for a JSON number). federated: True for a federated share from another server (federated: true in list_pending_shares).

Returns: Confirmation message.

Inputs: share_id (required), federated. Returns: result

delete_all_submissionsA
DestructiveIdempotent

Delete every submission on a form. Does not delete the form itself.

Args: form_id: Numeric form id.

Returns: Confirmation.

Inputs: form_id (required). Returns: result

delete_announcementA
DestructiveIdempotent

Delete an announcement from Nextcloud. Requires admin privileges.

This permanently removes the announcement and all associated comments and notifications. This action is irreversible.

Args: announcement_id: The numeric announcement ID. Use list_announcements to find IDs.

Returns: Confirmation message.

Inputs: announcement_id (required). Returns: result

delete_circleA
DestructiveIdempotent

Delete a circle. Requires owner level. Removes all memberships.

Args: circle_id: String circle id. delete_team_folder: Deleting a circle also deletes its team folder (Nextcloud 35+ with the Team folders app) and every file in it, for all members, also when it is an older group folder an admin linked to the team. If the circle has one, the tool refuses unless this is true.

Returns: Confirmation with the deleted id, and deleted_team_folder (the folder's name) when a team folder goes with it. Circles finishes the deletion in the background within seconds.

Inputs: circle_id (required), delete_team_folder. Returns: result

delete_collectiveA
DestructiveIdempotent

Permanently delete a collective from the trash.

The collective must be in the trash first (use trash_collective). This action is irreversible: all pages are permanently removed.

Args: collective_id: The numeric collective ID. delete_team: Also delete the team (circle) behind the collective, with every membership and anything shared with the team. Needs you to own the team; otherwise nothing is deleted. The team goes even if it existed before the collective. With false (default) it stays as an ordinary team. delete_team_folder: Deleting the team also deletes its team folder (Nextcloud 35+ with the Team folders app, which gives new collectives' teams one) and every file in it. With delete_team, the tool refuses if the team has a team folder unless this is true.

Returns: Confirmation message.

Inputs: collective_id (required), delete_team, delete_team_folder. Returns: result

delete_collective_pageA
DestructiveIdempotent

Permanently delete a page from the collective's trash.

The page must be in the trash first (use trash_collective_page). This action is irreversible.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID.

Returns: Confirmation message.

Inputs: page_id (required), collective_id (required). Returns: result

delete_collective_shareA
DestructiveIdempotent

Remove a public link; it stops working at once.

Args: collective_id: The numeric collective ID. token: The share token, from list_collective_shares. page_id: The page the link is for, 0 for the whole collective (default: looked up from the token).

Returns: Confirmation message.

Inputs: token (required), collective_id (required), page_id. Returns: result

delete_collective_tagB
DestructiveIdempotent

Delete a collective's page tag; pages lose it.

Args: collective_id: The numeric collective ID. tag_id: The tag's ID, from list_collective_tags.

Returns: Confirmation message.

Inputs: tag_id (required), collective_id (required). Returns: result

delete_commentA
DestructiveIdempotent

Delete a comment from a file.

Only the comment author can delete their own comment. This action is irreversible.

Args: file_id: The numeric file ID. comment_id: The comment ID to delete.

Returns: Confirmation message.

Inputs: file_id (required), comment_id (required). Returns: result

delete_contactA
DestructiveIdempotent

Permanently delete a contact from an address book.

Args: uid: The contact UID to delete. book_id: Address book ID (default "contacts").

Returns: Confirmation message.

Inputs: uid (required), book_id. Returns: result

delete_conversationA
DestructiveIdempotent

Delete a conversation with all its messages for everyone. Needs moderator rights.

One-to-one conversations cannot be deleted; leave them with leave_conversation.

Args: token: The conversation token.

Returns: Confirmation message.

Inputs: token (required). Returns: result

delete_conversation_tagA
DestructiveIdempotent

Delete one of your conversation tags; its conversations lose it.

Args: tag_id: The tag's ID, from list_conversation_tags.

Returns: Confirmation message.

Inputs: tag_id (required). Returns: result

delete_cospend_billA
DestructiveIdempotent

Delete a Cospend bill. Requires PARTICIPANT access.

Returns HTTP 403 ("project deletion is disabled") if the project has deletionDisabled set. Use update_cospend_project to clear that flag first if you need to delete bills.

Args: project_id: String project id. bill_id: Integer bill id. move_to_trash: If True (default), move to the project trash bin — the bill can be restored later by setting deleted=0 via update_cospend_bill. If False, hard-delete (irreversible).

Returns: JSON {"project_id": ..., "bill_id": ..., "moved_to_trash": }.

Inputs: bill_id (required), project_id (required), move_to_trash. Returns: result

delete_cospend_memberA
DestructiveIdempotent

Delete (or disable) a Cospend project member. Requires MAINTAINER access.

Members with bills cannot be hard-deleted — they are soft-disabled instead (activated=false) so existing bill history stays valid. Members without any bill are permanently removed.

Args: project_id: String project id. member_id: Integer member id.

Returns: JSON {"project_id": ..., "member_id": ..., "deleted": true}.

Inputs: member_id (required), project_id (required). Returns: result

delete_cospend_projectA
DestructiveIdempotent

Delete a Cospend project and all its members, bills, and shares.

Requires ADMIN access on the project. The project-delete endpoint does NOT honor deletionDisabled (only delete_cospend_bill is gated by that flag), so this irrevocably removes everything regardless.

Args: project_id: String project id.

Returns: JSON {"project_id": ..., "message": "DELETED"}.

Inputs: project_id (required). Returns: result

delete_eventA
DestructiveIdempotent

Delete a calendar event by its UID.

The event is moved to the calendar trashbin and can be restored from the Nextcloud web interface within the retention period.

Args: calendar_id: Calendar identifier (e.g. "personal"). event_uid: The event's UID to delete. Use get_events to find UIDs.

Returns: Confirmation message.

Inputs: event_uid (required), calendar_id (required). Returns: result

delete_fileA
DestructiveIdempotent

Delete a file or directory from Nextcloud.

WARNING: This permanently deletes the file/directory (moves to trash if enabled).

Args: path: Path to delete. Example: "Documents/old-file.txt"

Returns: Confirmation message.

Inputs: path (required). Returns: result

delete_flowA
DestructiveIdempotent

Delete a Nextcloud Flow rule.

Args: flow_id: The flow's ID, from list_flows. scope: The scope the flow is in: "user" (default) or "global".

Returns: Confirmation message.

Inputs: flow_id (required), scope. Returns: result

delete_formA
DestructiveIdempotent

Delete a form, including all questions, options, shares, and submissions.

Args: form_id: Numeric form id.

Returns: Confirmation with the deleted id.

Inputs: form_id (required). Returns: result

delete_form_shareB
DestructiveIdempotent

Revoke a share on a form.

Args: form_id: Numeric form id. share_id: Numeric share id.

Returns: Confirmation with the deleted id.

Inputs: form_id (required), share_id (required). Returns: result

delete_groupA
DestructiveIdempotent

Delete a group. Requires admin rights (or delegated user administration).

The members keep their accounts, but lose the group's memberships and anything shared with the group. The "admin" group cannot be deleted.

Args: group_id: The group ID to delete.

Returns: Confirmation message.

Inputs: group_id (required). Returns: result

delete_messageA
DestructiveIdempotent

Delete a chat message from a Talk conversation.

Only the message author or a moderator can delete a message. The message is replaced with "Message deleted" in the conversation.

Args: token: The conversation token. message_id: The ID of the message to delete.

Returns: Confirmation message.

Inputs: token (required), message_id (required). Returns: result

delete_optionA
DestructiveIdempotent

Delete an answer option from a question.

Args: form_id: Numeric form id. question_id: Numeric question id. option_id: Numeric option id.

Returns: Confirmation with the deleted id.

Inputs: form_id (required), option_id (required), question_id (required). Returns: result

delete_questionA
DestructiveIdempotent

Delete a question and its options from a form.

Args: form_id: Numeric form id. question_id: Numeric question id.

Returns: Confirmation with the deleted id.

Inputs: form_id (required), question_id (required). Returns: result

delete_shareA
DestructiveIdempotent

Delete (unshare) a share by its ID.

This revokes access for the share recipient. The file/folder itself is not deleted. Called by the recipient on a share they received (list_shares with shared_with_me), it removes the share from their files instead: a share made directly to them is deleted for the owner too, a group share only stops showing up for them. Leaving a federated share tells the other server, except for a federated group share, which goes back to list_pending_shares instead, under the id it had in list_shares.

Args: share_id: The share ID to delete. Use list_shares to find share IDs. Pass federated share IDs as strings: they can be too long for a JSON number. federated: True to leave a federated share received from another server (federated: true in list_shares with shared_with_me). Those are numbered separately from this server's shares.

Returns: Confirmation message.

Inputs: share_id (required), federated. Returns: result

delete_submissionB
DestructiveIdempotent

Delete a single submission.

Args: form_id: Numeric form id. submission_id: Numeric submission id.

Returns: Confirmation with the deleted id.

Inputs: form_id (required), submission_id (required). Returns: result

delete_tagA
DestructiveIdempotent

Permanently delete a system tag.

This removes the tag from all files it was assigned to. This action is irreversible.

Args: tag_id: The tag ID to delete.

Returns: Confirmation message.

Inputs: tag_id (required). Returns: result

delete_taskA
DestructiveIdempotent

Delete a task by its UID.

The task is moved to the calendar trashbin and can be restored from the Nextcloud web interface within the retention period.

Args: list_id: Task list identifier (e.g. "tasks"). task_uid: The task's UID to delete. Use get_tasks to find UIDs.

Returns: Confirmation message.

Inputs: list_id (required), task_uid (required). Returns: result

delete_trash_itemA
DestructiveIdempotent

Permanently delete a single item from the trash bin.

This action is irreversible. The file or folder will be permanently destroyed and cannot be recovered.

Args: trash_path: The trash path identifier from list_trash (e.g. "document.txt.d1711000000").

Returns: Confirmation message.

Inputs: trash_path (required). Returns: result

delete_userA
DestructiveIdempotent

Permanently delete a Nextcloud user. Requires admin privileges.

This cannot be undone. The user's data and files will be removed. The user also leaves every team, which deletes the teams they own that have no other member (a pending invitation counts as one), with those teams' team folders and their files (Nextcloud 35+ with the Team folders app). To only block access, disable the account with set_user_enabled instead.

Args: user_id: The user ID to delete.

Returns: Confirmation message.

Inputs: user_id (required). Returns: result

disable_appA
DestructiveIdempotent

Disable a Nextcloud app. Requires admin privileges.

Deactivates the app, making its features unavailable. The app data is preserved and can be re-enabled later.

Be careful: disabling core apps (like files, dav) can break Nextcloud functionality.

Args: app_id: The app identifier to disable (e.g. "weather_status").

Returns: Confirmation message.

Inputs: app_id (required). Returns: result

dismiss_all_notificationsA
DestructiveIdempotent

Dismiss (permanently delete) ALL notifications for the current user.

This cannot be undone. Use list_notifications first to review what will be dismissed.

Returns: Confirmation message.

Inputs: no named parameters. Returns: result

dismiss_notificationA
DestructiveIdempotent

Dismiss (permanently delete) a single notification by its ID.

Use list_notifications first to find the notification_id to dismiss.

Args: notification_id: The numeric ID of the notification to dismiss.

Returns: Confirmation message.

Inputs: notification_id (required). Returns: result

edit_commentA
Idempotent

Edit a comment on a file.

Only the comment author can edit their own comment.

Args: file_id: The numeric file ID. comment_id: The comment ID to edit. message: The new comment text (max 1000 characters).

Returns: Confirmation message.

Inputs: file_id (required), message (required), comment_id (required). Returns: result

edit_messageA
Idempotent

Replace the text of a chat message. Talk marks it as edited and tells the conversation.

Only your own messages (or, for a moderator, any in a group conversation), only within 24 hours, and not system messages or shared polls and locations; for a shared file the new text becomes its caption. Mentions read back from get_messages show names; to keep a mention when editing, write it as search_mentions gives it (@"user-id").

Args: token: The conversation token. message_id: The message to edit. message: The new text. Mentions work as in send_message.

Returns: JSON with the edited message.

Inputs: token (required), message (required), message_id (required). Returns: result

empty_trashA
DestructiveIdempotent

Permanently delete ALL items in the trash bin.

This action is irreversible. All trashed files and folders will be permanently destroyed and cannot be recovered.

Returns: Confirmation message.

Inputs: no named parameters. Returns: result

enable_appA
Idempotent

Enable a Nextcloud app. Requires admin privileges.

Activates a previously disabled or newly installed app. This makes the app's features available to users.

Args: app_id: The app identifier to enable (e.g. "spreed", "mail").

Returns: Confirmation message.

Inputs: app_id (required). Returns: result

export_submissionsA

Export submissions to a spreadsheet file in the user's Nextcloud storage.

Args: form_id: Numeric form id. path: Destination folder path inside the user's files (no trailing slash). The generated file is created inside this folder. file_format: Optional format override: "csv", "xlsx", "ods". Defaults to the form's configured fileFormat.

Returns: JSON with the created file's name.

Inputs: path (required), form_id (required), file_format. Returns: result

get_activityA
Read-onlyIdempotent

Get the recent activity feed for the current Nextcloud user.

Activities track what happened across Nextcloud: file changes, shares, calendar events, comments, and more.

Filters include "all", "self" (your actions), "by" (others' actions), "files", "files_sharing", "files_favorites", "calendar", "comments" and more, depending on the installed apps; list_activity_filters lists them.

To get activities for a specific file or object, provide both object_type and object_id (e.g., object_type="files", object_id=742), and leave activity_filter at "all". This also clears the returned activities' notifications, as the web interface does when it shows a file's activity.

Args: activity_filter: Activity filter id (default: "all"). limit: Maximum number of activities to return (1-200, default: 30). since: Activity ID to paginate from. Use the "since" value from the previous call's pagination to fetch the next page. Default 0 = newest. object_type: Filter by object type (e.g., "files"). Must be used together with object_id. object_id: Filter by object ID. Must be used together with object_type. sort: Sort order: "desc" (newest first, default) or "asc" (oldest first). search: Only activities whose file path contains this text (2-255 characters after trimming, case-insensitive), which leaves out activities without a file. start: Only activities at or after this time: an ISO 8601 date (from its start, UTC) or a time with a time zone. end: Only activities at or before this time: an ISO 8601 date (to its end, UTC) or a time with a time zone. actor: Only activities done by this user ID. search, start, end and actor need Nextcloud 35 (Activity 8); on older servers they are refused rather than ignored.

Returns: JSON object with "data" (list of activities) and "pagination" (count, has_more, since). Use since value for the next page.

Inputs: end, sort, actor, limit, +6 more. Returns: result

get_activity_countsA
Read-onlyIdempotent

Count the current user's activities per day over the last days, e.g. to see when something happened.

Needs Nextcloud 35 (Activity 8). Days are the user's days in their Nextcloud time zone, ending today, while a date passed to get_activity's start and end is a UTC day; to list one of these days, pass start and end as times with the user's UTC offset (e.g. 2026-09-20T00:00:00+02:00 and 2026-09-20T23:59:59+02:00).

Args: activity_filter: Activity filter id (default: "all"); see list_activity_filters. days: Number of days ending today (1-366, default 30). search: Only count activities whose file path contains this text (2-255 characters). actor: Only count activities done by this user ID. object_type: Only count activities about this object; must be used together with object_id, and with activity_filter left at "all". object_id: The object's ID, e.g. a file ID for object_type "files".

Returns: JSON object with "from" and "to" (dates), "counts" (date to count, only days with activity), "total" and "max". "partial_before" is set when Nextcloud stopped counting at its row limit: counts for that date and earlier are missing, so a shorter window gives complete numbers.

Inputs: days, actor, search, object_id, +2 more. Returns: result

get_app_infoA
Read-onlyIdempotent

Get detailed information about an installed Nextcloud app. Requires admin privileges.

Returns app metadata including name, version, description, and author.

Args: app_id: The app identifier (e.g. "spreed", "mail", "collectives"). Use list_apps to find available app IDs.

Returns: JSON object with app details: id, name, summary, version, author.

Inputs: app_id (required). Returns: result

get_circleA
Read-onlyIdempotent

Get full details of a circle including the current user's membership info.

Args: circle_id: String circle id (the hash from list_circles, e.g. "cUXI7OgXkF6u5jWUoE73AtmyjVE2ZRl").

Returns: JSON object with the circle's name, description, config, settings, source, population, creation timestamp, and initiator object describing the current user's membership (id, singleId, level, status, userId).

Inputs: circle_id (required). Returns: result

get_collective_pageA
Read-onlyIdempotent

Get a single page from a collective, including its content.

Collectives serves page metadata and page text from two different places, so this reads the page's Markdown file after the metadata call.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID. Use get_collective_pages to find IDs.

Returns: JSON object with page details and "content", the page's Markdown text. An empty page has an empty string. When the file cannot be read, "content" is null and "content_error" says why.

Inputs: page_id (required), collective_id (required). Returns: result

get_collective_pagesA
Read-onlyIdempotent

List pages in a collective.

Returns the page tree including the landing page and all subpages.

Args: collective_id: The numeric collective ID. Use list_collectives to find IDs. limit: Maximum number of pages to return (1-200, default 50). offset: Number of pages to skip for pagination (default 0).

Returns: JSON with "data" (list of pages with id, title, emoji, timestamp, size) and "pagination" (count, offset, limit, has_more). Page text is not included here; read one page with get_collective_page to get it.

Inputs: collective_id (required), limit, offset. Returns: result

get_contactA
Read-onlyIdempotent

Get a single contact by UID.

Args: uid: The contact UID. Use get_contacts to find UIDs. book_id: Address book ID (default "contacts").

Returns: JSON contact object with uid, full_name, name, emails, phones, addresses, organization, title, note, etag.

Inputs: uid (required), book_id. Returns: result

get_contactsA
Read-onlyIdempotent

Get contacts from an address book.

Args: book_id: Address book ID (default "contacts"). Use list_addressbooks to find IDs. limit: Maximum number of contacts to return (1-500, default 50). offset: Number of contacts to skip for pagination (default 0).

Returns: JSON with "data" (list of contact objects with uid, full_name, name, emails, phones, addresses, organization, title, note) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset, book_id. Returns: result

get_conversationA
Read-onlyIdempotent

Get details about a specific Talk conversation.

Args: token: The conversation token (short alphanumeric ID, e.g. "abc12xyz"). Use list_conversations to find tokens.

Returns: JSON object with conversation details.

Inputs: token (required). Returns: result

get_cospend_billA
Read-onlyIdempotent

Get a single Cospend bill (expense) by id. Requires VIEWER access.

Args: project_id: String project id. bill_id: Integer bill id.

Returns: JSON bill object: id, what (description), amount, payer_id, owers (list of member dicts who share the cost), owerIds (id list), date (YYYY-MM-DD), timestamp (Unix seconds), comment, categoryid, paymentmodeid, repeat ("n"=none, "d"=daily, "w"=weekly, "b"=biweekly, "s"=semi-monthly, "m"=monthly, "y"=yearly), repeatfreq, repeatallactive, repeatuntil, deleted (0=live, 1=in trash), lastchanged.

Inputs: bill_id (required), project_id (required). Returns: result

get_cospend_projectA
Read-onlyIdempotent

Get full info for a single Cospend project (members, balance, shares, …).

Requires VIEWER access on the project.

Args: project_id: String project id (slug).

Returns: JSON object with the same shape as one entry from list_cospend_projects. Use members for member ids/names and balance for the per-member balance map.

Inputs: project_id (required). Returns: result

get_cospend_project_settlementA
Read-onlyIdempotent

Suggested reimbursement transactions to settle a Cospend project.

Requires VIEWER access.

Args: project_id: String project id. centered_on: Member id to center the plan on. All suggested transactions will involve this member (e.g. "everyone pays Alice"). max_timestamp: Settle up to this date (Unix seconds). Member balances will be zero at this date and bills after it are ignored.

Returns: JSON object with transactions (list of {from, to, amount} — from/to are member ids) and balances (map of member-id → current balance).

Inputs: project_id (required), centered_on, max_timestamp. Returns: result

get_cospend_project_statisticsA
Read-onlyIdempotent

Per-member spending statistics for a Cospend project.

Requires VIEWER access. All filters are optional and AND-combined.

Args: project_id: String project id. ts_min: Only include bills with timestamp >= ts_min (Unix seconds). ts_max: Only include bills with timestamp <= ts_max. payment_mode_id: Filter by payment mode. category_id: Filter by category. amount_min: Only include bills with amount >= amount_min. amount_max: Only include bills with amount <= amount_max. currency_id: Convert/filter by currency id. payer_id: Only include bills paid by this member. show_disabled: Include disabled members in the output.

Returns: JSON object with stats (list of {member, balance, paid, spent, filtered_balance}), plus aggregates such as memberMonthlyStats / categoryStats depending on filters.

Inputs: project_id (required), ts_max, ts_min, payer_id, +6 more. Returns: result

get_current_userA
Read-onlyIdempotent

Get information about the currently authenticated Nextcloud user.

Returns: JSON with user details: id, displayname, email, quota, groups, etc.

Inputs: no named parameters. Returns: result

get_eventA
Read-onlyIdempotent

Get full details of a specific calendar event by its UID.

Args: calendar_id: Calendar identifier (e.g. "personal"). event_uid: The event's UID. Use get_events to find UIDs.

Returns: JSON object with full event details: uid, summary, dtstart, dtend, description, location, status, all_day, etag, and optionally rrule, categories.

Inputs: event_uid (required), calendar_id (required). Returns: result

get_eventsA
Read-onlyIdempotent

Get events from a calendar, optionally filtered by time range.

Without start/end, returns all events in the calendar. With start and end, returns only events overlapping that range (including recurring event instances).

Args: calendar_id: Calendar identifier (default "personal"). Use list_calendars to find IDs. start: Optional range start in ISO 8601 UTC format: "2026-04-01T00:00:00Z". Required if end is provided. end: Optional range end in ISO 8601 UTC format: "2026-04-30T23:59:59Z". Required if start is provided. limit: Maximum number of events to return (1-500, default 50). offset: Number of events to skip for pagination (default 0).

Returns: JSON with "data" (list of event objects) and "pagination" (count, offset, limit, has_more).

Inputs: end, limit, start, offset, +1 more. Returns: result

get_fileA
Read-onlyIdempotent

Read a file's content from Nextcloud.

Text files are returned as text. Image files (PNG, JPEG, GIF, WebP) are returned as viewable images. Other binary files return metadata.

Args: path: File path relative to user's root. Example: "Documents/notes.md"

Returns: File content as text, an image, or metadata for unsupported binary files.

Inputs: path (required). Returns: result

get_file_reminderA
Read-onlyIdempotent

Get the reminder set on a specific file.

Returns the due date as an ISO 8601 timestamp, or null if no reminder is set for the file. Also returns null when the file does not exist — the Nextcloud API does not distinguish the two cases, so this tool cannot be used to check file existence.

Args: file_id: Numeric Nextcloud file id. Get this from list_directory, search_files, or any tool that returns file metadata.

Returns: JSON object with file_id and due_date. due_date is null when no reminder is set.

Inputs: file_id (required). Returns: result

get_file_tagsA
Read-onlyIdempotent

Get all system tags assigned to a file.

Use list_directory to find a file's numeric ID (file_id field).

Args: file_id: The numeric file ID.

Returns: JSON list of tags assigned to this file.

Inputs: file_id (required). Returns: result

get_flow_optionsA
Read-onlyIdempotent

List what a Flow rule can be built from in a scope: operations, entities, events and checks.

Read this before create_flow: the available operations depend on the installed apps (Talk's "Write to conversation", for one, or core's "Block file versioning" for global flows), and some only exist in one scope.

Args: scope: "user" or "global" (admin only).

Returns: JSON with "operations" (class, name, description, entity: the entity the operation is bound to or null, events_fixed: true when the operation decides its own events and create_flow takes none, trigger), "entities" (class, name, events with event and name) and "checks" (class, entities it applies to, empty meaning any; for the checks Nextcloud ships also operators and a value description).

Inputs: scope. Returns: result

get_formA
Read-onlyIdempotent

Get a form's full definition including questions, options, and shares.

Args: form_id: Numeric form id from list_forms.

Returns: JSON object with the full form: title, description, access, expires, isAnonymous, submitMultiple, state, maxSubmissions, questions (each with options, type, isRequired, etc.), shares, and submissionCount. Does NOT include submission answers — use list_submissions for those.

Inputs: form_id (required). Returns: result

get_mail_messageA
Read-onlyIdempotent

Get a full email message including its body.

Retrieves the complete message with body text, message ID, tags, and attachment metadata.

Args: message_id: The message database ID. Use list_mail_messages to find it.

Returns: JSON object with: id, subject, date, from, to, cc, bcc, message_id, body, flags, tags (display_name and imap_label, if any), and attachments list (if any).

Inputs: message_id (required). Returns: result

get_message_contextA
Read-onlyIdempotent

Get the messages around one message, e.g. to read the discussion a search result or mention is in.

Reading context leaves the read marker and notifications as they are.

Args: token: The conversation token. message_id: The message to center on. limit: How many messages to fetch before and after it (1-100, default 20). thread_id: Only messages of this thread (default 0 = the whole conversation). include_system: Also show system messages such as joins and edits (default false).

Returns: One line per message, oldest first, in the same "[id] author: text" form as get_messages; the requested message's line is marked with ">>".

Inputs: token (required), message_id (required), limit, thread_id, +1 more. Returns: result

get_messagesA
Read-onlyIdempotent

Get chat messages from a Talk conversation.

Returns messages in reverse chronological order (newest first). Uses a compact format: "[id] author: message text" - one line per message. Messages inside a thread are marked after the author: the thread's first message as '[id] author [thread <thread_id> ""]: text', the rest of the thread as "[id] author [thread <thread_id>]: text".

IMPORTANT: Start with a small limit (20-50). If you need more context, use before_message_id with the oldest message ID from the previous call to paginate backwards through the history.

Args: token: The conversation token. Use list_conversations to find tokens. limit: Maximum number of messages to return (1-200, default: 50). Start small to avoid exceeding response size limits. before_message_id: Fetch messages older than this message ID (for pagination). Use the smallest message ID from a previous call. Default 0 means start from the newest message. include_system: Include system messages like "User joined", "Conversation created" (default: false - only chat messages). thread_id: Only return messages of this thread (default 0 = all messages, including thread messages). Use list_threads to find thread IDs.

Returns: Compact text with one message per line: "[id] author: message". The last line shows pagination info if more messages may exist. Empty when nothing matches, for example when there is nothing older than before_message_id.

Inputs: token (required), limit, thread_id, include_system, +1 more. Returns: result

get_participantsA
Read-onlyIdempotent

List participants in a Talk conversation.

Args: token: The conversation token. Use list_conversations to find tokens. limit: Maximum number of participants to return (1-200, default 50). offset: Number of participants to skip for pagination (default 0).

Returns: JSON with "data" (list of participant objects with attendee_id, actor_id, display_name, participant_type, in_call) and "pagination" (count, offset, limit, has_more).

Inputs: token (required), limit, offset. Returns: result

get_pollA
Read-onlyIdempotent

Get a poll from a Talk conversation.

Returns poll details including question, options, current votes (if visible), and which options the current user voted for.

Vote visibility depends on the poll's result_mode:

  • "public": votes are visible after you vote.

  • "hidden": votes are only visible after the poll is closed.

Args: token: The conversation token. Use list_conversations to find tokens. poll_id: The poll ID. Poll IDs appear in chat messages when a poll is created.

Returns: JSON object with poll details: id, question, options, status, result_mode, max_votes, votes, num_voters, voted_self.

Inputs: token (required), poll_id (required). Returns: result

get_questionA
Read-onlyIdempotent

Get a single question including its options.

Args: form_id: Numeric form id. question_id: Numeric question id.

Returns: JSON object with the question's full definition.

Inputs: form_id (required), question_id (required). Returns: result

get_reactionsA
Read-onlyIdempotent

List who reacted to a message, and with what.

Args: token: The conversation token. message_id: The message ID. reaction: Only this reaction, e.g. "👍" (default: all).

Returns: JSON object mapping each reaction to the display names of who used it.

Inputs: token (required), message_id (required), reaction. Returns: result

get_shareA
Read-onlyIdempotent

Get details of a specific share by its ID.

Args: share_id: The numeric share ID.

Returns: JSON object with share details: id, share_type, path, permissions, share_with, url (for link shares), expiration, note, label, etc.

Inputs: share_id (required). Returns: result

get_submissionA
Read-onlyIdempotent

Get a single submission by id, including all answers.

Args: form_id: Numeric form id. submission_id: Numeric submission id.

Returns: JSON object with the submission's userId, timestamp, and answers array.

Inputs: form_id (required), submission_id (required). Returns: result

get_taskA
Read-onlyIdempotent

Get full details of a specific task by its UID.

Args: list_id: Task list identifier (e.g. "tasks"). task_uid: The task's UID. Use get_tasks to find UIDs.

Returns: JSON object with full task details: uid, summary, description, status, priority, percent_complete, dtstart, due, completed, etag, and optionally categories.

Inputs: list_id (required), task_uid (required). Returns: result

get_tasksA
Read-onlyIdempotent

Get tasks from a task list.

Returns all tasks in the list, ordered as stored in CalDAV.

Args: list_id: Task list identifier (default "tasks"). Use list_task_lists to find IDs. limit: Maximum number of tasks to return (1-500, default 50). offset: Number of tasks to skip for pagination (default 0).

Returns: JSON with "data" (list of task objects) and "pagination" (count, offset, limit, has_more). Each task has: uid, summary, description, status, priority, percent_complete, dtstart, due, completed, etag, and optionally categories.

Inputs: limit, offset, list_id. Returns: result

get_threadA
Read-onlyIdempotent

Get details of one thread in a Talk conversation.

Returns the thread's summary, not its messages; use get_messages(token, thread_id=...) to read the messages.

Args: token: The conversation token. Use list_conversations to find tokens. thread_id: The thread ID, which is the ID of the thread's first message. Shown as "[thread ]" in get_messages output.

Returns: JSON object with thread_id, token, title, num_replies, last_activity, notification_level and first/last messages as compact lines.

Inputs: token (required), thread_id (required). Returns: result

get_userB
Read-onlyIdempotent

Get detailed information about a specific Nextcloud user.

Args: user_id: The user ID to look up. Example: "admin", "john.doe"

Returns: JSON with user details: id, displayname, email, quota, groups, language, etc.

Inputs: user_id (required). Returns: result

get_user_statusA
Read-onlyIdempotent

Get the status of a Nextcloud user.

Returns the user's online status (online, away, dnd, invisible, offline), custom status message, status icon, and when the status will be cleared.

Args: user_id: User ID to look up. Leave empty to get your own status.

Returns: JSON object with user_id, status, message, icon, and clear_at.

Inputs: user_id. Returns: result

join_circleA
Idempotent

Join an open circle on behalf of the current user.

The circle must have the OPEN config flag (16); otherwise the server returns an error. For invitation-only circles, the circle's admin or moderator must use add_circle_member instead.

Args: circle_id: String circle id.

Returns: JSON of the current user's new membership (id, level, status).

Inputs: circle_id (required). Returns: result

leave_circleA
DestructiveIdempotent

Leave a circle the current user is a member of.

IMPORTANT: When the owner leaves, the server makes another member the owner (the highest level, then the longest-standing). Any entry of list_circle_members counts, even a group, a nested circle or a pending invitation or join request. When the owner is the last one, leaving destroys the entire circle, with no confirmation prompt. Because of this implicit destroy, this tool requires DESTRUCTIVE permission (matching leave_conversation in Talk).

Args: circle_id: String circle id. delete_team_folder: Destroying the circle also deletes its team folder (Nextcloud 35+ with the Team folders app) and every file in it. When that would happen, the tool refuses unless this is true.

Returns: JSON of the circle the user just left (circle fields: id, name, config, population, initiator, …). Empty when the caller loses visibility on the circle after leaving (e.g. when the circle is destroyed).

Inputs: circle_id (required), delete_team_folder. Returns: result

leave_conversationA
DestructiveIdempotent

Leave a Talk conversation.

After leaving, the user will no longer receive notifications or see the conversation in their list. For group conversations, the user can be re-invited. For one-to-one conversations, this removes the conversation permanently for the user.

Args: token: The conversation token of the conversation to leave.

Returns: Confirmation message.

Inputs: token (required). Returns: result

list_activity_filtersA
Read-onlyIdempotent

List the activity filters get_activity accepts on this server.

Returns: JSON list of filters with "id" (the value for activity_filter) and "name".

Inputs: no named parameters. Returns: result

list_addressbooksA
Read-onlyIdempotent

List address books for the current user.

Returns user-owned address books (excludes system-generated books like Accounts and Recently Contacted).

Returns: JSON list of address books with id, name, description, ctag.

Inputs: no named parameters. Returns: result

list_announcementsA
Read-onlyIdempotent

List announcements from the Nextcloud Announcement Center.

Returns announcements visible to the current user, sorted by newest first. The server returns up to 7 announcements per page.

Admins see all announcements. Regular users only see announcements targeted at their groups or at "everyone".

Args: offset: Announcement ID to paginate from. Pass the smallest ID from a previous call to fetch older announcements. Default 0 means start from the newest.

Returns: JSON object with "data" (list of announcements) and "pagination" (count, offset, has_more). Each announcement has: id, author_id, author, time (unix), subject, message (markdown), groups (admin only), comments (count or false if disabled).

Inputs: offset. Returns: result

list_appsA
Read-onlyIdempotent

List installed Nextcloud apps. Requires admin privileges.

Args: app_filter: Filter apps by status. Options: "enabled" (default) — only enabled apps "disabled" — only disabled apps "all" — all installed apps limit: Maximum number of apps to return (1-500, default 50). offset: Number of apps to skip for pagination (default 0).

Returns: JSON with "data" (list of app ID strings) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset, app_filter. Returns: result

list_calendarsA
Read-onlyIdempotent

List all calendars for the current user.

Returns calendars with their properties including name, color, supported component types (VEVENT, VTODO), and write access status.

Returns: JSON list of calendar objects with: id, name, color, components, writable, ctag. Use the id value with other calendar tools (e.g. "personal").

Inputs: no named parameters. Returns: result

list_circle_membersA
Read-onlyIdempotent

List all members of a circle.

Args: circle_id: String circle id. full_details: If True, include extended info such as circle memberships inherited through this one.

Returns: JSON array of members. Each entry has id (memberId — use with remove_circle_member and update_circle_member_level), singleId (the user's federated id), userId, userType (1=user, 2=group, 4=mail, 8=contact, 16=circle), level (0=none, 1=member, 4=moderator, 8=admin, 9=owner), status ("Member", "Invited", "Requesting"), displayName, instance.

Inputs: circle_id (required), full_details. Returns: result

list_circlesA
Read-onlyIdempotent

List circles (teams) the current user can see.

Args: limit: Max circles to return. Omit for server default (all). offset: Starting offset for pagination.

Returns: JSON array of circles. Each entry includes id (the string singleId used for sharing), name, displayName, description, config (bitmask), source, population, creation, initiator (current-user membership info: level, status, userId).

Inputs: limit, offset. Returns: result

list_collective_page_attachmentsA
Read-onlyIdempotent

List the files attached to a page: those in its attachments folder (images and files embedded in or linked from it) and, for a folder page (one with subpages, a shared page or the landing page), other files next to it. Trashed ones are not listed.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID.

Returns: JSON list of attachments with id, name, mimetype, size, timestamp, type ("text" for the attachments folder, "folder" for files next to the page) and path (usable with get_file).

Inputs: page_id (required), collective_id (required). Returns: result

list_collectivesA
Read-onlyIdempotent

List collectives the current user has access to.

Collectives are shared knowledge bases with wiki-style pages.

Args: limit: Maximum number of collectives to return (1-200, default 50). offset: Number of collectives to skip for pagination (default 0).

Returns: JSON with "data" (list of collectives with id, name, emoji, permissions) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset. Returns: result

list_collective_sharesA
Read-onlyIdempotent

List your public links to a collective and to its single pages; other members' links are not shown.

Args: collective_id: The numeric collective ID.

Returns: JSON list of shares with token, page_id (null for a link to the whole collective; a link made from the landing page shows the landing page's ID), editable, has_password, owner and url.

Inputs: collective_id (required). Returns: result

list_collective_tagsB
Read-onlyIdempotent

List a collective's page tags. Each collective has its own set.

Args: collective_id: The numeric collective ID.

Returns: JSON list of tags with id, name and color. Pages list their tag IDs under "tags".

Inputs: collective_id (required). Returns: result

list_commentsA
Read-onlyIdempotent

List comments on a file.

Returns comments in chronological order (oldest first). Use list_directory to find a file's ID (file_id field).

Args: file_id: The numeric file ID. Get this from list_directory (file_id field). limit: Maximum number of comments to return (1-100, default: 20). offset: Number of comments to skip for pagination (default: 0).

Returns: JSON object with "data" (list of comments) and "pagination" (count, offset, limit, has_more).

Inputs: file_id (required), limit, offset. Returns: result

list_conversation_presetsA
Read-onlyIdempotent

List the presets create_conversation can start from.

Returns: JSON list of presets with identifier (what create_conversation takes), name, description and the settings create_conversation applies.

Inputs: no named parameters. Returns: result

list_conversationsA
Read-onlyIdempotent

List Talk conversations the current user is part of.

Returns every conversation the user has joined, sorted by last activity (newest first). Muted and archived conversations are included; Talk has no filter for them.

Args: limit: Maximum number of conversations to return (1-200, default 50). offset: Number of conversations to skip for pagination (default 0). modified_since: Only conversations with activity since this ISO 8601 time with time zone, e.g. to check what changed since the last look. Your own changes to a conversation (read state, favorite, archive, notifications) count as activity, and ones with a call running are always included.

Returns: JSON with "data" (list of conversation objects) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset, modified_since. Returns: result

list_conversation_tagsA
Read-onlyIdempotent

List your conversation tags, the personal groups of your conversation list.

Tags are yours alone; nobody else sees them. The built-in "favorites" and "other" tags cannot be renamed or deleted, and the favorites group is built from set_conversation_preferences(favorite=...), not from tagging.

Returns: JSON list of tags with id, name, type ("favorites", "other" or "custom") and sort_order. get_conversation and list_conversations show each conversation's tag_ids.

Inputs: no named parameters. Returns: result

list_cospend_billsA
Read-onlyIdempotent

List bills (expenses) in a Cospend project.

Requires VIEWER access.

Args: project_id: String project id. offset: Skip the first N bills (server orders by date desc by default). limit: Max bills to return. Omit for no limit. reverse: If True, oldest-first instead of newest-first. last_changed: Only return bills modified after this Unix timestamp. payer_id: Filter to bills paid by this member. category_id: Filter by category. payment_mode_id: Filter by payment mode. include_bill_id: Force-include this bill id in the result even if it would be paginated out (used to keep a focused bill in view). search_term: Substring match (case-insensitive) on bill what, comment, or amount±1. REQUIRES limit to be set — Cospend silently ignores the search and returns unfiltered results when no limit is provided, so this tool raises ValueError if search_term is given without limit. Pass any limit (e.g. 1000) to apply the filter. deleted: 0 = live bills (default), 1 = trashed bills only.

Returns: JSON object with bills (list of bill dicts — see get_cospend_bill for fields), nb_bills (project-wide bill count under the payer/category/payment-mode/deleted filters; NOT affected by search_term even when search filters bills), allBillIds (full id list before pagination), timestamp (server response time).

Inputs: project_id (required), limit, offset, deleted, +7 more. Returns: result

list_cospend_membersA
Read-onlyIdempotent

List members of a Cospend project.

Requires VIEWER access.

Args: project_id: String project id. last_changed: If provided, only return members modified after this Unix timestamp (used for incremental sync by clients).

Returns: JSON array of members. Each entry has id (integer member id, used as memberId in other tools), name, weight (share weight, default 1), activated (bool — false means soft-disabled but kept for bill history), userid (linked Nextcloud user id, or null for free-form members), color (RGB dict), lastchanged.

Inputs: project_id (required), last_changed. Returns: result

list_cospend_projectsA
Read-onlyIdempotent

List Cospend (shared expense) projects the current user can access.

Returns: JSON array of full project objects. Each entry includes id (string slug, used as projectId in other tools), name, userid (owner), email, lastchanged, deletiondisabled, archived_ts, currencyname, categorysort/paymentmodesort, and myaccesslevel (1=VIEWER, 2=PARTICIPANT, 3=MAINTAINER, 4=ADMIN). Also embeds members, balance, shares, currencies, categories, paymentmodes for each project, and counters nb_bills / total_spent / nb_trashbin_bills.

Inputs: no named parameters. Returns: result

list_directoryA
Read-onlyIdempotent

List files and folders in a Nextcloud directory.

Args: path: Directory path relative to user's root (default: "/" for root). Example: "Documents", "Photos/Vacation" limit: Maximum number of entries to return (1-500, default 50). offset: Number of entries to skip for pagination (default 0).

Returns: JSON with "data" (list of entries with path, is_directory, size, etc.) and "pagination" (count, offset, limit, has_more).

Inputs: path, limit, offset. Returns: result

list_flowsA
Read-onlyIdempotent

List Nextcloud Flow rules (workflows that act on files automatically).

Args: scope: "user" for the current user's own flows, or "global" for the admin flows that apply to everyone (admin only). limit: Maximum number of flows to return (1-200, default 50). offset: Number of flows to skip for pagination (default 0).

Returns: JSON with "data" (flows with id, name, operation_class, operation_config, entity, events and checks, each check having class, operator and value) and "pagination" (count, offset, limit, has_more).

Inputs: limit, scope, offset. Returns: result

list_formsA
Read-onlyIdempotent

List forms visible to the current user.

Args: ownership: Filter. One of: "owned" (forms I created), "shared" (forms shared with me). Omit to get both — the Nextcloud endpoint takes one filter at a time, so this tool calls it twice and merges the results when omitted.

Returns: JSON array of form summaries. Each entry includes id, hash, title, state (0=active, 1=closed, 2=archived), permissions, and metadata. Call get_form(id) for full details including questions.

Inputs: ownership. Returns: result

list_group_membersA
Read-onlyIdempotent

List the users in a group.

Admins, sub-admins of the group and the group's own members may do this.

Args: group_id: The group ID. Use list_groups to find it. limit: Maximum number of user IDs to return (1-500, default 100). offset: Number of user IDs to skip for pagination (default 0).

Returns: JSON with "data" (list of user IDs) and "pagination" (count, offset, limit, has_more). Use get_user for details on a member.

Inputs: group_id (required), limit, offset. Returns: result

list_groupsA
Read-onlyIdempotent

List Nextcloud groups. Requires admin rights (or delegated user administration).

Nextcloud applies limit and offset to each group backend separately, so with more than one (LDAP and local groups, for example) a page can hold more than limit groups, and paging by offset can repeat or skip some.

Args: search: Optional text to filter groups by ID or display name. limit: Maximum number of groups to take from each group backend (1-200, default 50). offset: Number of groups to skip in each group backend (default 0).

Returns: JSON with "data" (list of groups with id, display_name, user_count, disabled_user_count) and "pagination" (count, offset, limit, has_more). The "id" is what update_user and the other group tools expect.

Inputs: limit, offset, search. Returns: result

list_mail_accountsA
Read-onlyIdempotent

List all email accounts configured in Nextcloud Mail.

Returns the accounts and their aliases for the current user. Use the account ID to list mailboxes and send emails.

Returns: JSON list of accounts, each with: id, email, aliases.

Inputs: no named parameters. Returns: result

list_mailboxesA
Read-onlyIdempotent

List mailboxes (folders) for a mail account.

Returns all mailboxes like INBOX, Sent, Drafts, Trash, etc. Use the mailbox ID to list messages in that mailbox.

Args: account_id: The mail account ID. Use list_mail_accounts to find it.

Returns: JSON list of mailboxes, each with: id, name, display_name, unread count, special_role.

Inputs: account_id (required). Returns: result

list_mail_messagesA
Read-onlyIdempotent

List messages in a mailbox, newest first.

Returns message summaries (subject, sender, date, flags, tags) without the full body. Use get_mail_message with a message ID to read the full content.

Args: mailbox_id: The mailbox database ID. Use list_mailboxes to find it. limit: Maximum number of messages to return (1-100, default 20). cursor: Pagination cursor. Pass the smallest message ID from a previous response to fetch older messages.

Returns: JSON object with "data" (list of message summaries) and "pagination" metadata. Each message has: id, subject, date (unix timestamp), from, to, flags, preview, and tags (display_name and imap_label) when it has any.

Inputs: mailbox_id (required), limit, cursor. Returns: result

list_message_remindersA
Read-onlyIdempotent

List your upcoming message reminders, soonest first.

Talk returns at most the next 10, including ones already due but not yet sent, and leaves out federated conversations. In conversations you marked sensitive the message text is left empty.

Returns: JSON list of reminders with token, message_id, remind_at (UTC) and the message as a compact line ("[id] author: text").

Inputs: no named parameters. Returns: result

list_notificationsA
Read-onlyIdempotent

List notifications for the current Nextcloud user.

Returns notifications sorted by newest first. Note: the Nextcloud server returns at most 25 notifications and does not support server-side pagination, so the total available is capped by the server regardless of the limit value.

Args: limit: Maximum number of notifications to return (1-25, default 25). offset: Number of notifications to skip for pagination (default 0).

Returns: JSON with "data" (list of notification objects with notification_id, app, user, datetime, subject, message, and optionally link and actions) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset. Returns: result

list_pending_sharesA
Read-onlyIdempotent

List shares other users offered the current user that are waiting to be accepted.

Shares from users on this server wait here when the user turned off accepting shares automatically (a personal sharing setting) or the admin made accepting them necessary; federated shares from other servers wait here unless they come from a trusted server, whose shares are accepted automatically by default. Accept one with accept_share or decline it with decline_share, passing its id and "federated".

Returns: JSON list of pending shares: id, federated, share_type, path (the item's name), item_type, mimetype (both unknown for federated shares until accepted), uid_owner (the sharer; for federated shares a user on the "remote" server), plus for shares from this server displayname_owner, share_with (a group for group shares), expiration, note, label and declined. Nextcloud keeps offering a group share the user declined, so it stays on this list with declined: true; accept_share still accepts it. A declined federated group share also stays here.

Inputs: no named parameters. Returns: result

list_questionsA
Read-onlyIdempotent

List all questions on a form (same data as get_form.questions).

Args: form_id: Numeric form id.

Returns: JSON array of questions, each with id, type, text, description, isRequired, order, options (for choice questions), and extraSettings.

Inputs: form_id (required). Returns: result

list_recent_collective_pagesA
Read-onlyIdempotent

List the most recently changed pages across all your collectives, newest first.

Changes by anyone count; visits do not.

Args: query: Only pages whose title contains this (default: all). limit: Maximum pages (1-100, default 10).

Returns: JSON list of pages with id, title, collective (its name) and collective_id (null for a collective whose name has no letters or digits), plus the usual page fields.

Inputs: limit, query. Returns: result

list_search_providersA
Read-onlyIdempotent

List available Unified Search providers.

Each Nextcloud app can register search providers. Use the provider id with unified_search to search that provider. The filters field shows what extra filters each provider supports beyond the search term.

Common filter types:

  • since/until: ISO 8601 datetime to bound results by date

  • person: user ID to filter by author/participant

  • title-only: boolean, search titles only

Returns: JSON list of providers with: id, name, app, and optionally filters.

Inputs: no named parameters. Returns: result

list_shared_itemsA
Read-onlyIdempotent

List what was shared in a conversation: files, media, polls, locations, pinned messages and more.

Args: token: The conversation token. item_type: One type to list: audio, deckcard, file, location, media, other, pinned, poll, recording or voice. Empty (default) gives the latest few of every type. limit: Maximum items (per type without item_type: 1-20, default 20; with item_type: 1-200).

Returns: JSON object mapping each type to its items, each the chat message that shared it ("[id] author: text"), in Talk's order (newest first; pinned messages by when they were pinned).

Inputs: token (required), limit, item_type. Returns: result

list_sharesA
Read-onlyIdempotent

List file/folder shares from Nextcloud.

Without arguments, returns all shares owned by the current user. With a path, returns shares for that specific file or folder. With shared_with_me, returns the shares other users gave the current user instead.

Args: path: Optional file/folder path to filter shares (e.g. "/Documents/report.pdf"). reshares: If true, include shares by other users on the same files. subfiles: If true and path is a folder, list shares of files inside it (not the folder itself). shared_with_me: If true, list the shares the current user received from others (directly, through a group, a team or a Talk conversation, or from another server). "path" is then where the item shows up in the current user's files and uid_owner/displayname_owner say who shared it; federated shares have federated: true and the other server in "remote". Shares still waiting to be accepted are not included (see list_pending_shares). Cannot be combined with reshares or subfiles. limit: Maximum number of shares to return (1-200, default 50). offset: Number of shares to skip for pagination (default 0).

Returns: JSON with "data" (list of share objects) and "pagination" (count, offset, limit, has_more). share_type values: 0=user, 1=group, 3=public link, 4=email, 6=federated, 7=team, 9=federated group, 10=talk room, 12=deck card.

Inputs: path, limit, offset, reshares, +2 more. Returns: result

list_submissionsA
Read-onlyIdempotent

List submissions (responses) to a form. Only the form owner can view submissions.

Args: form_id: Numeric form id. query: Optional full-text filter across answer text. limit: Max submissions to return (for pagination). offset: Starting offset (for pagination).

Returns: JSON object with fields: submissions (array of submission objects, each with id, userId, timestamp, answers), questions (the form's questions at submission time), filteredSubmissionsCount.

Inputs: form_id (required), limit, query, offset. Returns: result

list_subscribed_threadsA
Read-onlyIdempotent

List the threads the current user follows, across all conversations.

A user follows the threads they start or post in, and the ones whose notification level they set; threads set to "never" are left out. Sorted by last activity (newest first).

Args: limit: Maximum number of threads to return (1-100, default 100). offset: Number of threads to skip for pagination (default 0).

Returns: JSON with "data" (list of threads, same shape as list_threads; use the token field to know the conversation) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset. Returns: result

list_tagsA
Read-onlyIdempotent

List system tags available in this Nextcloud instance.

System tags are shared labels that can be assigned to files for organization and filtering.

Args: limit: Maximum number of tags to return (1-500, default 50). offset: Number of tags to skip for pagination (default 0).

Returns: JSON with "data" (list of tags with id, name, user_visible, user_assignable) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset. Returns: result

list_task_listsA
Read-onlyIdempotent

List all task lists (CalDAV calendars with VTODO support) for the current user.

Returns task lists with their properties including name, color, supported component types, and write access status.

Returns: JSON list of task list objects with: id, name, color, components, writable, ctag. Use the id value with other task tools (e.g. "tasks").

Inputs: no named parameters. Returns: result

list_threadsA
Read-onlyIdempotent

List the most recently active threads in a Talk conversation.

A thread is started by sending a message with a thread_title (see send_message); its ID is the ID of that first message. Read a thread's messages with get_messages(token, thread_id=...).

Args: token: The conversation token. Use list_conversations to find tokens. limit: Maximum number of threads to return (1-50, default 50). Talk only returns the most recently active threads and has no offset.

Returns: JSON with "data" (list of threads, newest activity first) and "pagination" (count, limit, has_more). Each thread has thread_id, token, title, num_replies, last_activity (Unix timestamp), notification_level (default/always/mention/never) and first/last messages as compact lines "[id] author [thread ]: text" (last is null when there are no replies).

Inputs: token (required), limit. Returns: result

list_trashA
Read-onlyIdempotent

List items in the Nextcloud trash bin.

Returns files and folders that were deleted and can be restored.

Args: limit: Maximum number of items to return (1-200, default 50). offset: Number of items to skip for pagination (default 0).

Returns: JSON with "data" (list of trashed items with trash_path, original_name, original_location, deletion_time, is_directory, size, file_id) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset. Returns: result

list_usersA
Read-onlyIdempotent

List Nextcloud users. Uses server-side pagination.

Args: search: Optional search string to filter users by name/email. limit: Maximum number of users to return (1-200, default 25). offset: Number of users to skip for pagination (default 0).

Returns: JSON with "data" (list of user ID strings) and "pagination" (count, offset, limit, has_more).

Inputs: limit, offset, search. Returns: result

list_versionsA
Read-onlyIdempotent

List versions of a file by its file ID.

Returns the version history. Use the file_id from list_directory or search_files results.

Args: file_id: The numeric Nextcloud file ID. limit: Maximum number of versions to return (1-200, default 50). offset: Number of versions to skip for pagination (default 0).

Returns: JSON with "data" (list of versions with version_id, last_modified, size, content_type, author, label) and "pagination" (count, offset, limit, has_more).

Inputs: file_id (required), limit, offset. Returns: result

mark_conversation_readA
Idempotent

Mark a conversation as read, up to a message or completely.

Marking it completely read also dismisses your Talk notifications for it.

Args: token: The conversation token. message_id: The last message to count as read (default 0 = everything).

Returns: JSON with last_read_message, unread_messages and unread_mention afterwards.

Inputs: token (required), message_id. Returns: result

mark_conversation_unreadA
Idempotent

Mark the last message of a conversation as unread again, as the "Mark as unread" menu entry does.

Args: token: The conversation token.

Returns: JSON with last_read_message, unread_messages and unread_mention afterwards.

Inputs: token (required). Returns: result

move_collective_pageA

Move or copy a page, with its subpages, under another page, in this or another collective.

The page lands first among its new siblings. Needs edit rights in both collectives; a page cannot go under itself or its own subpages.

Args: collective_id: The collective the page is in now. page_id: The page to move or copy. parent_id: The page to put it under, in the target collective; 0 or the landing page ID for the top level. to_collective_id: Another collective to move or copy it to (default 0 = stay in this one). copy: True to copy and leave the original where it is. Every call makes another copy.

Returns: JSON with the page afterwards (the copy, when copying).

Inputs: page_id (required), parent_id (required), collective_id (required), copy, +1 more. Returns: result

move_fileA
Destructive

Move or rename a file/directory in Nextcloud.

Args: source: Current path. Example: "Documents/old-name.txt" destination: New path. Example: "Documents/new-name.txt"

Returns: Confirmation message.

Inputs: source (required), destination (required). Returns: result

move_mail_messageA

Move a message to another mailbox (folder) of the same mail account.

Mail cannot move messages between accounts; such a move fails with "It is not possible to move across accounts yet".

The moved message gets a new ID, so message_id is no longer valid afterwards and must not be reused. IMAP UIDs are per mailbox, and Nextcloud assigns the new ID when it syncs the destination mailbox. The inbox and mailboxes with background sync enabled are synced automatically; other folders are synced when opened in the Mail app. A message that is already in the destination mailbox is left alone and keeps its ID.

Args: message_id: The message database ID. Use list_mail_messages to find it. destination_mailbox_id: The target mailbox ID, in the message's own account. Use list_mailboxes to find it.

Returns: Confirmation message on success.

Inputs: message_id (required), destination_mailbox_id (required). Returns: result

pin_messageA
Idempotent

Pin a message to the top of the conversation for everyone. Needs moderator rights.

Pinned messages are listed by list_shared_items with item_type "pinned".

Args: token: The conversation token. message_id: The message to pin. until: When the pin should expire, as an ISO 8601 time with time zone (default: until someone unpins it). Talk removes expired pins on its next background job run.

Returns: JSON with the pinned message, or a note that it was already pinned.

Inputs: token (required), message_id (required), until. Returns: result

remove_circle_memberA
DestructiveIdempotent

Kick a member out of a circle. Requires moderator+. Cannot remove the owner.

Args: circle_id: String circle id. member_id: The id from list_circle_members (not the userId).

Returns: Confirmation with the removed member id.

Inputs: circle_id (required), member_id (required). Returns: result

remove_file_reminderA
DestructiveIdempotent

Remove the reminder set on a file.

Fails with "No reminder is set" if the file has no active reminder.

Args: file_id: Numeric Nextcloud file id.

Returns: Confirmation message.

Inputs: file_id (required). Returns: result

remove_mail_message_tagA
Idempotent

Remove a tag from a message. The tag itself is kept and can still be used on other messages.

Args: message_id: The message database ID. Use list_mail_messages to find it. imap_label: The tag's IMAP label (for example "$needs_reply").

Returns: JSON object with message_id and the removed tag (id, display_name, imap_label, color).

Inputs: imap_label (required), message_id (required). Returns: result

remove_message_reminderB
DestructiveIdempotent

Cancel your reminder about a message.

Args: token: The conversation token. message_id: The message the reminder is for.

Returns: Confirmation message.

Inputs: token (required), message_id (required). Returns: result

remove_participantA
DestructiveIdempotent

Remove someone from a conversation. Needs moderator rights; owners cannot be removed.

Demote an owner to moderator first (set_participant_role). Removing yourself is leaving: it deletes the conversation when you were the only one in it, and is refused when you are its last moderator.

Args: token: The conversation token. attendee_id: The participant's attendee ID, from get_participants.

Returns: Confirmation message.

Inputs: token (required), attendee_id (required). Returns: result

remove_reactionB
DestructiveIdempotent

Take back your reaction to a chat message.

Args: token: The conversation token. message_id: The message. reaction: The emoji to remove, e.g. "👍".

Returns: JSON object mapping each remaining reaction to who used it.

Inputs: token (required), reaction (required), message_id (required). Returns: result

rename_conversation_tagA
Idempotent

Rename one of your conversation tags; its conversations keep it.

Args: tag_id: The tag's ID, from list_conversation_tags. name: The new name.

Returns: JSON with the tag afterwards.

Inputs: name (required), tag_id (required). Returns: result

rename_threadA
Idempotent

Rename a thread in a Talk conversation.

Only the author of the thread's first message or a conversation moderator can rename a thread. Talk posts a "thread renamed" system message into the thread.

Args: token: The conversation token. Use list_conversations to find tokens. thread_id: The thread ID (the ID of the thread's first message). title: The new thread title (must not be blank). Talk shortens titles longer than 203 characters.

Returns: JSON object of the updated thread (same shape as get_thread).

Inputs: title (required), token (required), thread_id (required). Returns: result

reorder_optionsA
Idempotent

Reorder the options within a question.

Args: form_id: Numeric form id. question_id: Numeric question id. new_order: Array of option ids in the desired order.

Returns: JSON with the updated order for each option id.

Inputs: form_id (required), new_order (required), question_id (required). Returns: result

reorder_questionsA
Idempotent

Reorder the questions on a form. Must list every question id exactly once.

Args: form_id: Numeric form id. new_order: Array of question ids in the desired order.

Returns: JSON with the updated order for each question id.

Inputs: form_id (required), new_order (required). Returns: result

restore_collectiveA

Restore a collective from the trash.

Args: collective_id: The numeric collective ID (from list_collectives or prior trash operation).

Returns: JSON object with the restored collective details.

Inputs: collective_id (required). Returns: result

restore_collective_pageB

Restore a page from the collective's trash.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID.

Returns: JSON object with the restored page details.

Inputs: page_id (required), collective_id (required). Returns: result

restore_trash_itemA
Idempotent

Restore a file or folder from the trash bin to its original location.

The item is restored to its original path. If the original path no longer exists, it is restored to the user's root folder. If a file with the same name already exists, a numeric suffix is added.

Args: trash_path: The trash path identifier from list_trash (e.g. "document.txt.d1711000000").

Returns: Confirmation message.

Inputs: trash_path (required). Returns: result

restore_versionA
Idempotent

Restore a file to a previous version.

The file's current content is replaced with the content from the specified version. The pre-restore content is preserved as a new version in the history, so no data is lost.

Args: file_id: The numeric Nextcloud file ID. version_id: The version identifier from list_versions (a unix timestamp string, e.g. "1711000000").

Returns: Confirmation message.

Inputs: file_id (required), version_id (required). Returns: result

search_circlesA
Read-onlyIdempotent

Search for circles and potential members (users, groups, emails) by term.

Args: term: Search phrase. Matches against names/ids.

Returns: JSON array of search results. Each entry includes id (the singleId for users/groups/circles), userId, displayName, instance, and userType (1=user, 2=group, 4=mail, 8=contact, 16=circle).

Inputs: term (required). Returns: result

search_collective_pagesA
Read-onlyIdempotent

Search the text of a collective's pages.

Uses Collectives' search index, which a background job keeps up to date, so pages written in the last few minutes may not be found yet. For titles, get_collective_pages lists every page.

Args: collective_id: The numeric collective ID. query: Words to look for.

Returns: JSON list of matching pages (id, title, parent_id, emoji, timestamp, ...).

Inputs: query (required), collective_id (required). Returns: result

search_filesA
Read-onlyIdempotent

Search for files in Nextcloud by name and/or MIME type.

Searches recursively through all subdirectories of the given path. Results are sorted by last modified date (newest first).

At least one of query or mimetype must be provided.

Args: query: Text to find anywhere in the file name, case-insensitive, taken literally (% and _ are not wildcards). Example: "report" matches "quarterly-report.pdf", "report-2026.docx". path: Directory to search in (default: "/" for entire user folder). Example: "Documents" to only search in Documents. mimetype: Filter by MIME type prefix. Example: "image" for all images, "application/pdf" for PDFs, "text" for all text files. limit: Maximum number of results (1-100, default: 20). offset: Number of results to skip for pagination (default: 0).

Returns: JSON object with "data" (list of matching files) and "pagination" (count, offset, limit, has_more).

Inputs: path, limit, query, offset, +1 more. Returns: result

search_mentionsA
Read-onlyIdempotent

Find who can be mentioned in a conversation, for writing a message that mentions them.

Args: token: The conversation token. search: Part of a name or ID; an empty string lists the first matches. limit: Maximum results (1-50, default 20). Needs a conversation you can write in.

Returns: JSON list of matches with id, label (display name), source (users, groups, guests, calls for everyone in the room, ...) and "mention", the text to put in the message, e.g. @"john.doe".

Inputs: token (required), search (required), limit. Returns: result

send_mailA

Send an email through a Nextcloud Mail account.

The email is sent via the SMTP server configured for the account.

Args: account_id: The mail account ID to send from. Use list_mail_accounts to find it. to: List of recipient email addresses (at least one required). subject: Email subject line. body: Email body text (plain text or HTML depending on is_html). cc: Optional list of CC email addresses. bcc: Optional list of BCC email addresses. is_html: Set to true if the body contains HTML (default: false, plain text).

Returns: Confirmation message on success.

Inputs: to (required), body (required), subject (required), account_id (required), +3 more. Returns: result

send_messageA

Send a chat message to a Talk conversation.

Supports Markdown formatting. Messages can be up to 32000 characters. Use @mention syntax to mention users: @"user-id" or @"display name".

Threads: pass thread_title to start a new thread with this message as its first message; the thread ID is that message's ID and is returned as thread_id, so pass it as thread_id to keep posting into the thread. An existing message cannot be turned into a thread. thread_title cannot be combined with reply_to or thread_id, and thread_id cannot be combined with reply_to (replying to a message inside a thread posts into that thread anyway).

Args: token: The conversation token. Use list_conversations to find tokens. message: The message text to send (supports Markdown). reply_to: Optional message ID to reply to (default: 0 = not a reply). thread_id: Optional ID of an existing thread to post into without quoting a message (default: 0). Use list_threads to find thread IDs. thread_title: Optional title; when set, the message starts a new thread with this title (default: "" = no new thread). Talk shortens titles longer than 203 characters.

Returns: JSON object of the sent message with its assigned ID, its thread_id (0 when the message is not in a thread) and, for thread messages, thread_title.

Inputs: token (required), message (required), reply_to, thread_id, +1 more. Returns: result

set_collective_page_tagsA
Idempotent

Set which of the collective's tags a page has; tags left out are taken off.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID. tag_ids: The complete list of tag IDs, from list_collective_tags; [] removes all.

Returns: JSON with the page afterwards, its tag IDs under "tags".

Inputs: page_id (required), tag_ids (required), collective_id (required). Returns: result

set_conversation_preferencesA
Idempotent

Change your own settings for a conversation; other participants are not affected.

Only the settings you pass change, one request each; if one fails, the error names it and the settings already changed before it.

Args: token: The conversation token. favorite: Pin it to the top of your conversation list. archived: Move it to (or out of) your archive; archived conversations stay listed with is_archived true. important: Notify you about it even when your status is Do not disturb. sensitive: Hide message previews for it in the conversation list and notifications. notification_level: When to notify you about messages: "always", "mention" (only when mentioned) or "never". Conversations you never changed report "default", which Talk does not accept as a setting. call_notifications: Whether to notify you when a call starts.

Returns: JSON with the conversation afterwards, as get_conversation shows it.

Inputs: token (required), archived, favorite, important, +3 more. Returns: result

set_conversation_tagsA
Idempotent

Set which of your tags a conversation has; tags left out are taken off.

Talk silently drops IDs it does not know and keeps at most 20, so compare the returned tag_ids with what you asked for.

Args: token: The conversation token. tag_ids: The complete list of tag IDs, from list_conversation_tags; [] removes all.

Returns: JSON with the conversation afterwards, including tag_ids.

Inputs: token (required), tag_ids (required). Returns: result

set_file_reminderA
Idempotent

Set or update the reminder on a file.

The due date must be an ISO 8601 timestamp including a timezone and must be in the future. Past timestamps are rejected. Setting a reminder on a file that already has one replaces the existing one.

Args: file_id: Numeric Nextcloud file id. due_date: ISO 8601 timestamp with timezone, e.g. "2026-05-01T10:00:00+00:00" or "2026-05-01T10:00:00Z".

Returns: JSON object with file_id and due_date confirming the value set.

Inputs: file_id (required), due_date (required). Returns: result

set_mail_message_flagsA
Idempotent

Set or clear flags on a message: read/unread, starred, answered.

Only the flags you pass change; the others keep their current value.

Args: message_id: The message database ID. Use list_mail_messages to find it. seen: True marks the message as read, false as unread. flagged: True stars (flags) the message, false removes the star. answered: True marks the message as answered, false clears that mark.

Returns: JSON object with message_id and the flags that were set.

Inputs: message_id (required), seen, flagged, answered. Returns: result

set_message_reminderA
Idempotent

Have Talk remind you about a message later with a notification. Replaces an earlier reminder.

Args: token: The conversation token. message_id: The message to be reminded about. remind_at: When, as an ISO 8601 time with time zone, e.g. "2026-10-01T09:00:00+02:00". Must be in the future.

Returns: JSON with token, message_id and remind_at (UTC).

Inputs: token (required), remind_at (required), message_id (required). Returns: result

set_participant_roleA
Idempotent

Make a participant owner, moderator or plain user. Needs moderator rights (owner rights for owners).

Moderators manage the conversation and its participants. Owners are moderators nobody can remove; only owners can make someone owner or demote an owner, and an owner can step down to moderator. Owners need Talk 25 (Nextcloud 35) and exist only in group and public conversations. Guests can only be moderator or user, groups and teams have no role, and the last moderator cannot be demoted.

Args: token: The conversation token. attendee_id: The participant's attendee ID, from get_participants. role: "owner", "moderator" or "user".

Returns: JSON with the participant afterwards.

Inputs: role (required), token (required), attendee_id (required). Returns: result

set_thread_notification_levelA
Idempotent

Set the current user's notification level for a thread.

Setting any level other than "never" also makes the user follow the thread, so it shows up in list_subscribed_threads; "never" removes it from that list.

Args: token: The conversation token. Use list_conversations to find tokens. thread_id: The thread ID (the ID of the thread's first message). level: One of "default" (use the conversation's setting), "always" (every message), "mention" (only when mentioned) or "never".

Returns: JSON object of the updated thread (same shape as get_thread).

Inputs: level (required), token (required), thread_id (required). Returns: result

set_user_enabledA
DestructiveIdempotent

Enable or disable a user account. Requires admin (or sub-admin) privileges.

A disabled user cannot log in and their sessions and app passwords stop working, but the account, its files and shares are kept. Enable it again to restore access. Nobody can enable or disable their own account. Disabling needs the destructive permission level, enabling the write level.

Args: user_id: The user to enable or disable. enabled: True to enable the account, false to disable it.

Returns: Confirmation message.

Inputs: enabled (required), user_id (required). Returns: result

set_user_statusA
Idempotent

Set the current user's status.

You can set the online status type, a custom message, or both in a single call. At least one of status_type or message must be provided.

Args: status_type: Online status — "online", "away", "dnd", "invisible", or "offline". Leave empty to keep the current status type. message: Custom status message (e.g., "Working from home", "On vacation"). Leave empty to keep the current message. icon: Status icon emoji (e.g., "🏠", "🌴"). Only used with message. clear_at: Unix timestamp when the status message should be cleared. Use 0 to never auto-clear.

Returns: JSON object with the updated status.

Inputs: icon, message, clear_at, status_type. Returns: result

share_collectiveA

Create a public link to a collective, or to one page and its subpages. Anyone with the link can read.

Needs share rights in the collective. Sharing a page without subpages turns it into a folder page (its file becomes /Readme.md, the page ID stays), and sharing the landing page shares the whole collective. Deleting the collective's link leaves page links in place.

Args: collective_id: The numeric collective ID. page_id: A page to share on its own (default 0 = the whole collective). editable: Let people with the link edit too (default false). This needs your edit rights and is ignored when the collective does not let regular members edit; if it fails, the link exists read-only. password: Optional password the link asks for.

Returns: JSON with the share, including its url.

Inputs: collective_id (required), page_id, editable, password. Returns: result

submit_formA

Submit answers to a form on behalf of the current user.

Args: form_id: Numeric form id. answers: Object mapping question id (as string) to array of answer values. Example: {"42": ["my comment"], "43": [1, 3]} where 42 is a text question and 43 has option ids 1 and 3 selected. share_hash: Required if submitting via a public link share instead of direct access. Obtain from the form's hash field.

Returns: Empty OCS data on success (HTTP 201).

Inputs: answers (required), form_id (required), share_hash. Returns: result

trash_collectiveA
DestructiveIdempotent

Move a collective to the trash.

The collective and its pages are soft-deleted. Use restore_collective to undo, or delete_collective to permanently remove it.

Args: collective_id: The numeric collective ID.

Returns: Confirmation message.

Inputs: collective_id (required). Returns: result

trash_collective_pageA
DestructiveIdempotent

Move a page to the collective's trash.

The page is soft-deleted. Use restore_collective_page to undo, or delete_collective_page to permanently remove it. The landing page cannot be trashed.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID.

Returns: Confirmation message.

Inputs: page_id (required), collective_id (required). Returns: result

unassign_tagA
DestructiveIdempotent

Remove a system tag from a file.

Args: file_id: The numeric file ID. tag_id: The tag ID to remove.

Returns: Confirmation message.

Inputs: tag_id (required), file_id (required). Returns: result

unpin_messageA
DestructiveIdempotent

Unpin a message, for everyone (needs moderator rights) or only from your own view.

Args: token: The conversation token. message_id: The pinned message. for_everyone: True (default) removes the pin for all participants; false only hides it for you. Talk remembers one hidden pin per conversation, so hiding another shows this one again.

Returns: Confirmation message.

Inputs: token (required), message_id (required), for_everyone. Returns: result

update_circle_configA
Idempotent

Update a circle's config flags (bitmask). Requires admin or owner level.

The server auto-adjusts dependent flags — inspect the config field of the returned circle to see what was actually stored:

  • Setting REQUEST (64) without OPEN auto-adds OPEN → stored as 80.

  • Setting FEDERATED (32768) without ROOT auto-adds ROOT → stored as 40960.

  • Clearing OPEN while REQUEST is on drops REQUEST too.

  • Clearing ROOT while FEDERATED is on drops FEDERATED too.

Args: circle_id: String circle id. config: Bitmask integer. Valid user-facing flags (combine with OR): 8=VISIBLE (listed for non-members), 16=OPEN (anyone can join via join_circle), 32=INVITE (adding a member generates an invitation to accept), 64=REQUEST (join requests need moderator approval; implies OPEN), 128=FRIEND (members can invite friends), 256=PROTECTED (password-protected; password must be set via a dedicated setting endpoint, not exposed by this tool), 4096=LOCAL (not federated, even on GlobalScale), 8192=ROOT (circle cannot be nested inside another circle), 16384=CIRCLE_INVITE (nested circles confirm before joining), 32768=FEDERATED (federated to other instances; implies ROOT), 65536=MOUNTPOINT (auto-create Files folder). Pass 0 for a fully private, invite-by-admin-only circle. NOTE: 1 (SINGLE), 2 (PERSONAL), 4 (SYSTEM), 512 (NO_OWNER), 1024 (HIDDEN), 2048 (BACKEND), and 131072 (APP) are rejected by the public API (400 "Configuration value is not valid").

Returns: JSON of the updated circle. Compare config in the response to the requested value to detect auto-mutations described above.

Inputs: config (required), circle_id (required). Returns: result

update_circle_descriptionA
Idempotent

Update a circle's description. Requires admin or owner level.

Args: circle_id: String circle id. description: New description text. Pass empty string to clear.

Returns: JSON of the updated circle.

Inputs: circle_id (required), description (required). Returns: result

update_circle_member_levelA
Idempotent

Change a member's level (role) in the circle. Requires admin or owner.

Args: circle_id: String circle id. member_id: The member-level id from list_circle_members (NOT the user's singleId or userId — use the "id" field from members). level: One of "member", "moderator", "admin", "owner". Promoting someone to "owner" transfers ownership; the caller becomes admin. Older Circles releases cannot transfer ownership on SQLite or PostgreSQL; the tool then says so and nothing changes.

Returns: JSON of the updated member (same shape as entries from list_circle_members: id, userId, level, status, circleId, singleId, …). Use the "level" field to confirm the new role. Note: this returns the member, not the circle.

Inputs: level (required), circle_id (required), member_id (required). Returns: result

update_circle_nameA
Idempotent

Rename a circle. Requires admin or owner level on the circle.

Args: circle_id: String circle id. name: New name.

Returns: JSON of the updated circle.

Inputs: name (required), circle_id (required). Returns: result

update_collective_pageA
Idempotent

Change a page's text, title or emoji. Only what you pass changes.

The text replaces the whole page; read it first with get_collective_page to edit part of it. Earlier versions stay in the file's version history. Someone editing the page in the browser at the same time may be asked which version to keep.

Args: collective_id: The numeric collective ID. page_id: The numeric page ID. content: New Markdown text for the whole page. title: New title (renames the page). The landing page cannot be renamed. emoji: New emoji shown before the title; an empty string removes it.

Returns: JSON object with the page afterwards.

Inputs: page_id (required), collective_id (required), emoji, title, +1 more. Returns: result

update_collective_shareA
Idempotent

Change whether a public link lets people edit, and its password. Needs edit rights in the collective.

Args: collective_id: The numeric collective ID. token: The share token, from list_collective_shares. editable: Whether people with the link may edit. page_id: The page the link is for, 0 for the whole collective (default: looked up from the token). password: A new password; an empty string removes it; leave out to keep it.

Returns: JSON with the share afterwards.

Inputs: token (required), editable (required), collective_id (required), page_id, +1 more. Returns: result

update_collective_tagA
Idempotent

Rename a collective's page tag or change its color; pages keep it.

Args: collective_id: The numeric collective ID. tag_id: The tag's ID, from list_collective_tags. name: New name. color: New color, six hex digits with or without "#".

Returns: JSON with the tag afterwards.

Inputs: tag_id (required), collective_id (required), name, color. Returns: result

update_contactA
Idempotent

Update an existing contact. Only provided fields are changed.

Pass an empty string to clear a scalar field (e.g. note=""). For emails/phones, pass [] to remove all. Do not provide both email and emails (or phone and phones).

Requires the contact's current etag (from get_contacts or get_contact) to prevent conflicting updates.

Args: uid: The contact UID to update. etag: Current ETag for conflict detection. Get from get_contacts/get_contact. full_name: New full display name. given_name: New first name. family_name: New last name. email: Set a single email (replaces all, TYPE=WORK). Pass "" to remove all. phone: Set a single phone (replaces all, TYPE=CELL). Pass "" to remove all. emails: Array of {"value","type"} to replace all emails. Pass [] to clear. phones: Array of {"value","type"} to replace all phones. Pass [] to clear. organization: New organization. Pass "" to remove. title: New job title. Pass "" to remove. note: New note. Pass "" to remove. book_id: Address book ID (default "contacts").

Returns: JSON with the updated contact object.

Inputs: uid (required), etag (required), note, email, +9 more. Returns: result

update_conversationA
DestructiveIdempotent

Change a conversation for everyone in it. Needs moderator rights.

Only the fields you pass change, one request each; if one fails, the error names it and the fields already changed before it.

Args: token: The conversation token. name: New name, up to 255 characters. description: New description, up to 2000 characters; an empty string removes it. read_only: True to stop everyone from writing (moderators included); also ends a running call. public: True to let anyone with the link join; fails when the instance requires passwords for public conversations, and for one-to-one, note-to-self and breakout conversations. False makes it invite only and removes everyone who joined through the link, so it needs the destructive permission level. preserved: True to protect it: it cannot be deleted, its history not cleared, and its public and joinable settings not changed until it is unpreserved. Owners only; needs Talk 25 (Nextcloud 35).

Returns: JSON with the conversation afterwards.

Inputs: token (required), name, public, preserved, +2 more. Returns: result

update_cospend_billA
Idempotent

Update a Cospend bill. Requires PARTICIPANT access.

Pass only fields you want to change. See create_cospend_bill for field semantics.

Args: project_id: String project id. bill_id: Integer bill id. what: New description. amount: New amount. payer: New payer member id. payed_for: New non-empty list of ower member ids (replaces, doesn't merge). Passing [] raises ValueError — the server no-ops silently on empty payedFor, which would look like a successful update but leave owers unchanged. date: New "YYYY-MM-DD" date. timestamp: Alternative to date. comment: New comment. category_id: New category id (0 = uncategorized). payment_mode_id: New payment mode id (0 = unset). repeat: New repeat mode ("n", "d", "w", "b", "s", "m", "y"). repeat_freq: New repeat frequency. repeat_until: New stop date "YYYY-MM-DD". Pass empty string to clear (repeat indefinitely). repeat_all_active: New owers behavior on repeat. deleted: 0 = restore from trash, 1 = move to trash. Use delete_cospend_bill for trashing in normal flow.

Returns: JSON {"bill_id": } confirming the updated bill id.

Inputs: bill_id (required), project_id (required), date, what, +12 more. Returns: result

update_cospend_memberA
Idempotent

Update a Cospend member. Requires MAINTAINER access.

Pass only the fields you want to change.

IMPORTANT: Setting activated=False on a member who has no bills will permanently delete them, not just disable them. To always keep a recoverable record, ensure the member has at least one associated bill first, or use delete_cospend_member which is unambiguous.

Args: project_id: String project id. member_id: Integer member id (from list_cospend_members). name: New display name. weight: New share weight. activated: True = active, False = disabled (or deleted if no bills). color: New hex color (with or without leading "#"). Pass empty string to clear the color (server picks one on next display). user_id: Link/unlink to a Nextcloud user id. Pass empty string to unlink.

Returns: JSON of the updated member, or null if the member was deleted as described above.

Inputs: member_id (required), project_id (required), name, color, +3 more. Returns: result

update_cospend_projectA
Idempotent

Update a Cospend project's settings. Requires ADMIN access.

Pass only the fields you want to change; omit the rest.

Args: project_id: String project id. name: New display name. auto_export: Periodic CSV auto-export frequency. Same code set as bill repeat: "n"=none (default), "d"=daily, "w"=weekly, "b"=biweekly, "s"=semi-monthly, "m"=monthly, "y"=yearly. currency_name: Main currency name (free-form string, e.g. "EUR"). Pass empty string to clear. deletion_disabled: When set, delete_cospend_bill returns HTTP 403 ("project deletion is disabled"). delete_cospend_project is NOT gated by this flag and still succeeds. Useful as a guard against accidental bill removal in shared projects. category_sort: Default category ordering. "a"=alphabetical (default), "m"=manual (custom order field), "u"=most used, "r"=recently used. payment_mode_sort: Same options as category_sort, for payment modes. archived_ts: Archive control with three special values. - 0 → archive now (server records the current Unix timestamp). - -1 → unarchive (clears the field). - any other int → archive at that exact Unix timestamp. Note: 0 ARCHIVES the project (it does not unarchive).

Returns: JSON {"project_id": ..., "updated": true} — the OCS endpoint returns no body, so this is a synthetic confirmation.

Inputs: project_id (required), name, archived_ts, auto_export, +4 more. Returns: result

update_eventA
Idempotent

Update an existing calendar event. Only provided fields are changed.

Uses the event's ETag for safe concurrent updates — if the event was modified since it was last read, the update will fail with a conflict error.

Args: calendar_id: Calendar identifier (e.g. "personal"). event_uid: The event's UID to update. Use get_events to find UIDs. summary: New event title. start: New start date/datetime in ISO 8601 format. end: New end date/datetime in ISO 8601 format. description: New description. Pass "" to clear. location: New location. Pass "" to clear. status: New status: "CONFIRMED", "TENTATIVE", or "CANCELLED". categories: New categories as comma-separated string. Pass "" to clear.

Returns: Confirmation message with the updated event UID.

Inputs: event_uid (required), calendar_id (required), end, start, +5 more. Returns: result

update_flowA
DestructiveIdempotent

Change a Nextcloud Flow rule. Only the fields you pass change; the operation class cannot.

Global flows need the destructive permission level.

Args: flow_id: The flow's ID, from list_flows. scope: The scope the flow is in: "user" (default) or "global". name: New name. checks: New complete list of checks (replaces the old ones), each with "class", "operator" and "value"; at least one. operation_config: New operation settings, an object or a JSON string (see create_flow). entity: New entity class. events: New complete list of triggering events.

Returns: JSON with the updated flow, as list_flows shows it.

Inputs: flow_id (required), name, scope, checks, +3 more. Returns: result

update_formA
Idempotent

Update a form's properties.

Args: form_id: Numeric form id. key_value_pairs: Object with the fields to change. Common keys: title (str), description (str), isAnonymous (bool), submitMultiple (bool), allowEditSubmissions (bool), expires (unix timestamp, 0 = never), showExpiration (bool), state (0=active, 1=closed, 2=archived), maxSubmissions (int, 0 = unlimited), submissionMessage (str), access (object with permitAllUsers/showToAllUsers), fileFormat, path (destination folder for the generated submissions spreadsheet — must be sent together with fileFormat to (re)link the form to a file).

Returns: JSON of the updated form (refetched after the patch for convenience).

Inputs: form_id (required), key_value_pairs (required). Returns: result

update_form_shareB
Idempotent

Update a share's permissions.

Args: form_id: Numeric form id. share_id: Numeric share id. key_value_pairs: Object with fields to change. Most commonly: permissions (array of strings — see create_form_share).

Returns: JSON of the updated share (refetched via the parent form).

Inputs: form_id (required), share_id (required), key_value_pairs (required). Returns: result

update_optionA
Idempotent

Update an option's properties.

Args: form_id: Numeric form id. question_id: Numeric question id. option_id: Numeric option id. key_value_pairs: Object with fields to change. Common keys: text (str). Do NOT pass order — use reorder_options instead.

Returns: JSON of the updated option (refetched via the parent question).

Inputs: form_id (required), option_id (required), question_id (required), key_value_pairs (required). Returns: result

update_questionA
Idempotent

Update a question's properties (cannot change order — use reorder_questions).

Args: form_id: Numeric form id. question_id: Numeric question id. key_value_pairs: Object with fields to change. Common keys: text (str), description (str), isRequired (bool), name (str, alternate id for public linking), extraSettings (object; varies by question type).

Returns: JSON of the updated question (refetched after the patch).

Inputs: form_id (required), question_id (required), key_value_pairs (required). Returns: result

update_shareA
Idempotent

Update properties of an existing share.

Only provided parameters are changed. Omitted parameters keep their current value.

Args: share_id: The numeric share ID to update. permissions: New permission flags (1=read, 2=update, 4=create, 8=delete, 16=share). password: Set or change password (link/email shares only). Pass "" to remove password. expire_date: Set expiration in "YYYY-MM-DD" format. Pass "" to remove expiration. note: Set or update the share note. Pass "" to clear. label: Set or update the share label. Pass "" to clear. public_upload: Enable (true) or disable (false) public upload on shared folders (link shares only). hide_download: Show (false) or hide (true) the download button on public link shares.

Returns: JSON object with the updated share details.

Inputs: share_id (required), note, label, password, +4 more. Returns: result

update_submissionA
Idempotent

Update an existing submission's answers. Requires allowEditSubmissions on the form.

Args: form_id: Numeric form id. submission_id: Numeric submission id. Must belong to the current user. answers: Full replacement answers object (same shape as submit_form).

Returns: JSON of the updated submission (refetched).

Inputs: answers (required), form_id (required), submission_id (required). Returns: result

update_taskA
Idempotent

Update an existing task. Only provided fields are changed.

For optimistic locking, pass the etag from a previous get_task or get_tasks call. If the task was modified since that read, the update will fail with a 412 Precondition Failed error. If omitted, the current etag is fetched automatically (still safe against concurrent writes during this call, but won't detect earlier external changes).

Args: list_id: Task list identifier (e.g. "tasks"). task_uid: The task's UID to update. Use get_tasks to find UIDs. summary: New task title. description: New description. Pass "" to clear. due: New due date/time in ISO 8601 format. Pass "" to clear. start: New start date/time in ISO 8601 format. Pass "" to clear. status: New status: "NEEDS-ACTION", "IN-PROCESS", "COMPLETED", or "CANCELLED". priority: New priority 0-9 (0=undefined, 1=highest, 9=lowest). percent_complete: New completion percentage 0-100. categories: New categories as comma-separated string. Pass "" to clear. etag: Optional ETag from a previous read for optimistic locking.

Returns: Confirmation message with the updated task UID.

Inputs: list_id (required), task_uid (required), due, etag, +7 more. Returns: result

update_userA
DestructiveIdempotent

Change several fields of a user account in one call. Needs Nextcloud 34 or newer.

Only the fields you pass are changed. Nextcloud validates all of them first and applies none if one fails; the error then names each rejected field. A few requests are skipped without an error, so compare the returned "groups" and "subadmin" with what you asked for: a sub-admin cannot take the user out of groups they do not administer, only full admins can add someone to "admin", and nobody can be made sub-admin of "admin".

Changing another user needs admin rights, or sub-admin rights over one of their groups; sub-admin groups need admin rights. Any user can change their own display name (if the instance allows it), email, language and password. Nextcloud only accepts this call from admins and sub-admins, though, so for a regular user's own account the fields are set one by one instead, and a rejected field then no longer undoes the ones set before it.

After changing your own password, the old one stops working, including for this server if it logs in with it; app passwords keep working.

Args: user_id: The user to change. Example: "john.doe" display_name: New display name. An empty string resets it to the user ID. email: New primary email address. An empty string removes it. password: New password. Must satisfy the instance's password policy. Needs the destructive permission level, since the old password is gone afterwards. quota: Storage quota, e.g. "5 GB", "500 MB", a byte count, "none" (unlimited) or "default". language: Language code, e.g. "en", "de", "fr". manager: User ID of the user's manager (Nextcloud does not check that it exists). An empty string removes it. groups: The complete list of group IDs the user should be in: groups missing from it are left, new ones joined, and [] leaves every group. Get the current ones with get_user and IDs with list_groups. Needs the destructive permission level, since it can remove memberships. Taking your own account out of "admin" this way is refused. subadmin_groups: The complete list of groups the user should administer as a sub-admin; [] removes all. Needs the destructive permission level.

Returns: JSON with the user's details after the change, as get_user returns them.

Inputs: user_id (required), email, quota, groups, +5 more. Returns: result

upload_fileA
Idempotent

Upload or overwrite a text file in Nextcloud.

Use this for plain-text content (markdown, source code, CSV, JSON, etc.). For binary files (images, PDFs, archives), use upload_file_binary instead.

Creates the file if it doesn't exist. Overwrites if it does.

Args: path: Destination path relative to user's root. Example: "Documents/report.md" content: Text content to write to the file.

Returns: Confirmation message.

Inputs: path (required), content (required). Returns: result

upload_file_binaryA
Idempotent

Upload or overwrite a binary file in Nextcloud.

Use this for images, PDFs, archives, or any non-text content. The content must be base64-encoded. For plain-text files, use upload_file instead.

Creates the file if it doesn't exist. Overwrites if it does.

Args: path: Destination path relative to user's root. Example: "Photos/photo.png" content_base64: File bytes encoded as a base64 string. May be empty to create an empty file. content_type: MIME type for the upload request (e.g. "image/png", "application/pdf"). If omitted, inferred from the path extension; falls back to "application/octet-stream". Note: Nextcloud re-derives the stored MIME type from the filename, so this mainly controls the HTTP upload header.

Returns: Confirmation message with the uploaded byte count.

Inputs: path (required), content_base64 (required), content_type. Returns: result

vote_pollA
Idempotent

Vote on a poll in a Talk conversation.

Voting replaces any previous vote — calling this again with different option_ids changes your vote. You cannot vote on closed polls.

Args: token: The conversation token. poll_id: The poll ID. Use get_poll to see available polls. option_ids: List of option indices to vote for (0-based). For example, if options are ["Yes", "No", "Maybe"], use [0] to vote "Yes", or [0, 2] to vote "Yes" and "Maybe". The number of choices must not exceed the poll's max_votes (0 means unlimited).

Returns: JSON object with updated poll details including your votes (voted_self) and current vote counts (if visible).

Inputs: token (required), poll_id (required), option_ids (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 222 tools

    Disambiguation4/5

    Across 222 tools spanning many Nextcloud apps, most names and descriptions are carefully differentiated (e.g. get_event vs get_events, list_shares vs list_pending_shares vs list_shared_items, create_tag vs create_collective_tag vs create_mail_tag). A few generic names such as create_tag, assign_tag, and list_tags could be confused with app-specific tag tools, and the sheer breadth makes selection harder, but the detailed descriptions largely disambiguate.

    Naming Consistency5/5

    Nearly all tools follow a snake_case verb_noun pattern: list_*, get_*, create_*, update_*, delete_*, set_*, remove_*, add_*, etc. App-specific prefixes (collective_, cospend_, conversation_, mail_) are applied predictably. No mixed camelCase or wildly inconsistent verb styles appear.

    Tool Count1/5

    222 tools is an extreme mismatch for an MCP server set, far beyond the 50+ threshold for 'extreme mismatch.' Even if each app area is covered, the total surface is too heavy for an agent to navigate efficiently without specialized routing.

    Completeness5/5

    The surface provides deep CRUD/lifecycle coverage across files, shares, tags, comments, versions, trash, calendars, tasks, contacts, Talk, forms, collectives, circles, Cospend, mail, announcements, users/groups, flows, activity, and search. Only minor optional operations (e.g. update_announcement, hard delete_mail_message) are absent, which are not dead ends for core workflows.

    Maintenance

    ActivitySlowing
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers