addTaskLink
ChatGPTSave a web link (URL) on a task, in the Links section of the task card. Use this when the user wants to add, save, attach or keep a link, URL, website, Figma file, Google Doc or other web page on a specific task. Each call adds one link to the bottom of the task's list; call it once per link. MonoDesk fetches the page's title to show when no title is given. The response includes the link's id and a url pointing at the task. To attach a file stored in MonoDesk instead, use linkFileToTask.
archiveClient
ChatGPTArchive a client. Use this when the user wants to archive, remove, or delete a client. Use listClients first to find the client ID if needed. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
archiveLabel
ChatGPTArchive a task label. Archived labels are hidden from the list but preserved on existing tasks. Use listLabels first to find the label ID. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
archiveProject
ChatGPTArchive a project. Use this when the user wants to archive, remove, or delete a project. Use listProjects first to find the project ID if needed. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
archiveTask
ChatGPTArchive one or more tasks. Use this when the user wants to archive, remove, or delete tasks. Use listTasks first to find task IDs if needed. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
batchCreateClients
ChatGPTCreate many clients in one call. Use this for a list supplied directly in conversation. For attached files, use readImportFile, previewFileImport and confirmFileImport. Never loop createClient, which asks the user to approve every single client that has a website and scrapes each site in turn. Returns a per-row result: what was created, what was skipped as a duplicate, and what failed with the reason. By default it does NOT scrape websites for branding, which is what makes a bulk import fast and unattended; pass fetchBranding only when the user asked for it and the list is short.
batchCreateProjects
ChatGPTCreate many projects in one call. Use this for a list supplied directly in conversation. For attached files, use readImportFile, previewFileImport and confirmFileImport. Never loop createProject. Each project needs a client, given as a client ID or an exact client name; create the clients first with batchCreateClients so the names resolve. Returns a per-row result: what was created, and what failed with the reason (an unresolvable client is the usual one). Rows are independent, so one bad client reference does not abandon the rest.
batchCreateTasks
ChatGPTCreate multiple tasks (and their subtasks) in a single operation. For ordered children under an existing parent, supply root parentTaskId and put the children in tasks; the whole batch is atomic and no parent is created. Omit projectId to inherit its project, and omit tasks[].subtasks on this path. parentTaskId and tasks[].subtasks are mutually exclusive: a plan whose tasks carry their own subtasks goes to a project with no parentTaskId, and the card the user is chatting from is context, not a parent, unless they asked for subtasks of it. Use this instead of calling createTask repeatedly when you need to create several tasks at once (e.g., during onboarding or project setup). Project is optional: provide projectId for project tasks, or omit projectId for planner-only tasks. Each task can carry its own assigneeId ("me" assigns the current user) and can include subtasks; only one level of nesting is supported. projectId is a top-level field, not per task. Array order is board order: tasks and each task's subtasks are created in the order given, so "subtasks 1 to 10 in this order" just means listing them in that order. Pass position: "top" to put the whole batch above the existing cards. When the project is already scoped and the user has asked for tasks, create them with this tool now; do not ask for confirmation or present the list for approval first.
batchLogTimeEntries
ChatGPTLog many time entries in one call. Use this for time entries supplied directly in conversation. For attached timesheets or CSV exports, use readImportFile, previewFileImport and confirmFileImport. Never loop logTimeEntry, which writes one row per call and asks the user to approve each one. Send up to 100 entries per call and repeat for the rest of the supplied list. Every entry is stored as the connected user against a task that already exists, so create the clients, projects and tasks first. Pass projectId with each task name whenever the file has a project column. startTime is an ISO 8601 timestamp with a timezone offset; a value with no offset is read as UTC. durationMinutes is whole minutes. Returns a per-row result: created, skipped as an exact duplicate, or failed with the reason. Resending a batch does not double-log, so a stopped import is resumed by sending the remaining rows. A row that cannot be resolved fails on its own and the rest are still written. Overlapping times are written, not rejected. There is no note, rate or user field, and another person's rows cannot be logged on this account.
batchUpdateTasks
ChatGPTUpdate multiple tasks in a single operation, and the tool for reordering a board. Supports estimatedDurationMinutes, scheduledStartAt, a per-item listId to move cards between columns (a column UUID, or an exact column title that is unique on that card's own board; titles are editable and only unique within one project, so use listTasks with projectId for that board's column ids and listType; omit listId to keep the column unchanged), and a batch-level position ("top" or "bottom") that reorders every listed card. Also takes a per-item milestoneId, by milestone id or exact name on that card's own project, or 'CLEAR' to take a card out of its milestone: this is how a set of cards is mapped into a project's phases, and a label is never a substitute for a milestone. The updates array order becomes board order within each target column. Once you have the tasks the user named and the change they asked for, apply it with this tool; do not ask for confirmation first.
confirmFileImport
ChatGPTCommit the exact preview produced by previewFileImport after showing the user its mapping, changes and counts. Requires the preview ID; no replacement rows are accepted. Safe to retry the same ID. If the workspace has changed, make a fresh preview and obtain confirmation again. Import history can remove unchanged newly created records; updates to existing clients remain. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
confirmFileUpload
ChatGPTStep 2 of 2 for attaching a file from disk. Call this after the bytes have been PUT to the uploadUrl from createFileUploadUrl. Verifies the upload actually landed, records its real size and type, and creates the file in MonoDesk against the task, project or client the upload was created for. Safe to retry: a second call with the same fileId returns the same file.
createClient
ChatGPTCreate a new client in the user's organization directly. When the user wants a new client but has not named it, ask only "What's the client's name?" in one short line, with no steps and no options. When the user names the client ("create a client called Harbour Co"), create it straight away with just the name; do not stop to ask for a website first. Website is optional; when provided, brand assets (logo, colors, imagery) are fetched automatically. After creating a client without a website, ask in one short line whether they have its website so you can import the logo and colours; when they reply with one, call updateClient with that website and the branding is fetched then. NEVER guess or fabricate the website URL. Only pass a website the user explicitly provided or confirmed (a wrong URL pulls in the wrong company's branding). Navigation: Before creating, navigate to 'clients' page. After creating, navigate to the new client using the returned clientId. SKIP all navigation when the active workflow or system instructions say to stay in chat (e.g. Co-Worker shortcuts). Finish the workflow in chat and offer a link at the end instead.
createFileUploadUrl
ChatGPTStep 1 of 2 for attaching a file from disk. Returns a short-lived signed upload URL for a file you are about to upload, plus the fileId to confirm it with. Pass exactly one of taskId, projectId or clientId to say where the file belongs. Then PUT the file bytes to uploadUrl (a plain HTTPS PUT, no auth header, Content-Type set to the file's mime type), then call confirmFileUpload with the fileId. Nothing appears in MonoDesk until confirmFileUpload runs. Maximum 100MB.
createLabel
ChatGPTCreate a new task label with a name and colour. Labels are organization-wide and can be applied to tasks in any project. Use listLabels first to check if a similar label already exists.
createLead
ChatGPTAdd a lead to the Leads board: someone who has asked about work, or who the user wants to chase, and has not said yes yet. Use this, not createClient, whenever the user says lead, prospect, enquiry or inquiry.
createMilestone
ChatGPTAdd a milestone to a project. Milestones are the project's phases (such as "Discovery", "Design" or "Launch"): they run in order above the board, tasks are grouped under them with milestoneId on updateTask or batchUpdateTasks, and the client portal shows them as the project plan. A new milestone goes after the existing ones unless you pass position. By default it shows on the client portal without its task names. Call listTasks with projectId first to see the milestones the project already has, so you do not add one twice. The response includes the milestone's id and a url pointing at the project.
createProject
ChatGPTCreate a new project for a client. Use listClients first to find the client ID if needed. The project starts with three board columns, one of each type: todo, doing and done. Navigation: Before creating, navigate to 'projects' page. After creating, navigate to the new project using the returned projectId.
createProjectNote
ChatGPTCreate a note in a project. A note is a markdown file in the project's Files tab that the team can open and edit as a page. Use this when the user asks to save, write up or keep something in a project, e.g. 'save this to the project as Roadmap'. Returns the note's link.
createSubtask
ChatGPTCreate a subtask under an existing top-level task. Subtasks are lightweight checklist items: the name, and optionally an assignee. New subtasks go to the end of the parent's checklist unless you pass position: "top". To add multiple children in a requested order, use batchCreateTasks with root parentTaskId set to this existing parent and tasks listed in that order; do not call createSubtask concurrently or recreate the parent. Pass "me" as assigneeId to assign yourself. Use listTasks with includeSubtasks to see existing subtasks.
createTask
ChatGPTCreate a new top-level task. Cards land at the bottom of their column unless you pass position: "top". Only name is required; every other field is optional. Omitting description, assigneeId, estimatedDurationMinutes or scheduledStartAt means the task has none of that. Omitting listId is different: the task lands in the project's default (first) column, not in no column. Project is optional: provide projectId to add it to a project's board, or omit projectId to create a planner-only task. By default, tasks are created in the first column when project context is available. Use the listId parameter for a specific column - call listTasks with projectId first to get the column ids and their listType. For assignment, pass "me" to assign yourself, or use listTeamMembers to get another user's ID. To create a subtask under an existing task, use createSubtask instead.
deleteMilestone
ChatGPTDelete a milestone from a project. Its tasks are not deleted: they stay on the board, are taken out of the milestone, and the response says how many. The milestone also leaves the client portal's project plan. milestoneId takes the milestone's id, or its exact name together with projectId; listTasks with projectId returns the project's milestones with their ids. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
exportTimeLogsCsv
ChatGPTExport the user's logged time for a date range as a CSV file they can download, one row per entry with date, start, end, duration in both h:mm and decimal hours, client, project and task. Use this whenever the user wants their tracked time as a file, a spreadsheet, a timesheet or a download: for their own records, for an accountant, or to bill a client. For answering questions about tracked time in the chat, use listTimeLogs instead; this tool creates a file.
find
ChatGPTLook up the ID of something by its name. Searches projects, tasks, clients, team members and leads (and board columns when you ask for them) across the current organisation in one call, and returns up to 25 matches with id, type, name and url, best match first: exact name, then names starting with the query, then names containing it. Leads in every stage are searched, won and lost included, and each lead match carries its stage. If the user cannot see one of the areas searched, that source is listed in skippedSources and the rest are still returned. Use this when the user names a thing but you do not have its ID. It replaces calling listProjects, listClients, listTeamMembers and listLeads just to translate a name. Read-only.
getFileDownloadUrl
ChatGPTGenerate a temporary signed download URL for a file. Returns a URL valid for 1 hour.
getLead
ChatGPTRead one lead in full: contact, website, source, estimated value and size, notes, stage history and what it is linked to (client, proposal, meeting, research report).
getMyProfile
ChatGPTGet the currently authenticated user's profile: their name, email, current organization, and all organization memberships. Call this to find out who you are acting on behalf of.
getSchedule
ChatGPTGet the user's scheduled tasks across ALL projects for a date range. Returns tasks grouped by day with total minutes per day. Use this before scheduling new tasks to avoid double-booking days that already have work.
linkFileToTask
ChatGPTAttach a file that already exists in MonoDesk to a task. Use this for files uploaded earlier that were never assigned to a card. The file takes on the task's project and client if it had none; it never moves between projects. Folders and external links cannot be attached. Pass setAsCover to also make an image the task's cover; this works on a file already attached to the task too.
listClients
ChatGPTList the user's clients from the database. Use this when the user asks about their clients, wants to see who they work with, or needs client information.
listFiles
ChatGPTSearch and list the user's uploaded files. Use this when the user asks about their files, wants to find a document, or needs to locate an uploaded file. Returns file metadata including name, type, size, and associated client/project. Supports filtering by name, file type (image, document, video, audio, other), client, or project.
listHelpArticles
ChatGPTSTEP 1 OF 2 for help QUESTIONS. Returns an index only: the official MonoDesk help article titles, summaries, headings, keywords and slugs, never article text. The index is not an answer. Call readHelpArticle on the best-matching slug for the content, and write the reply from that article body. For product how-to questions, choose the relevant guide by meaning (e.g. create a client = add a client), then read it with readHelpArticle. Large libraries return categories: call again with the relevant category slug. Follow nextOffset with the same category for more entries. Reuse the index if already present in the conversation. Never answer a how-do-I or product-behaviour question from titles, summaries, headings or keywords alone. This index describes the documentation, not the product: it lists which articles someone has written, so a missing guide never means the product or your tools cannot do the thing. When the user asks you to DO something, use the action tools; do not consult this index to work out whether you are allowed to.
listLabels
ChatGPTList all available task labels for the organization. Labels are organization-wide and can be applied to tasks in any project. Use this to see existing labels before creating new ones or when the user asks about labels.
listLeads
ChatGPTList the workspace's leads: people or businesses who might become clients, on the Leads board. Returns each lead's ID, name, stage, contact, website, source and estimated value. By default only open leads.
listProjects
ChatGPTList the user's projects from the database. Use this when the user asks about their projects, wants to see what they're working on, or needs project information. Each project returns id, name, clientId, client, archived and url (a link to the project in the app). The project overview, type and billing setup are omitted by default. Pass includeDetails: true to get them. Archived projects are excluded by default. Only use includeArchived: true when the user explicitly asks about archived projects or wants to unarchive one. Never include archived projects for general queries.
listTaskActivity
ChatGPTList the activity log for a task, showing who created it, what actions were taken, and what fields were changed. Use this to see the audit trail or history of a task.
listTasks
ChatGPTList tasks, either for one project or across the whole workspace. Pass projectId to get that board's columns, including empty ones, each with its id, title and listType ("todo", "doing" or "done"); titles are editable, so use listType to tell which column completes a task. The same call returns that project's milestones, each with its id, name and order, and every task that sits under one carries milestoneId and milestoneName. Omit projectId and it returns matching tasks from every non-archived project you can see, defaulted to your own tasks, with projectId and projectName on each row: one call instead of one per project, which is what "what should I work on" and "plan my week" need. Returns task details including scheduled dates, completion status (completedAt), labels, assignees, which column/list each task is in, and a url linking to the task in the app. A task with links saved on its card carries a links array, each entry with id, url and title (the custom title, else the page title, else null); use those ids with updateTaskLink and removeTaskLink. Supports filtering by assignee, completion date range, list/column, and labels. Descriptions are omitted by default (each task carries hasDescription instead). Pass includeDescriptions: true to read card contents. Results are paged: limit defaults to 100 (max 500) and the response reports totalCount, returnedCount, hasMore and nextOffset. count is kept as an alias of totalCount for older callers.
listTeamMembers
ChatGPTList all team members in the user's current organization. Use this when the user wants to see team members, or when you need to get user IDs for assigning tasks. Returns member details including user IDs, emails, names, roles, and an isMe flag marking the current user. To assign something to the current user you can pass "me" as assigneeId instead of calling this tool.
listTimeLogs
ChatGPTList the user's logged time entries for a date range, grouped by day with per-day totals. Use this to see what's already logged: to find gaps in the timesheet, answer questions about tracked time, and avoid creating duplicate entries before calling logTimeEntry.
logTimeEntry
ChatGPTLog one time entry against a task. For more than one entry, or a file of historical time, use batchLogTimeEntries instead of calling this repeatedly. durationMinutes is the only timing detail required: leave startTime out and the entry ends now and starts durationMinutes earlier, so "log two hours on the logo task" can be logged in one call. Pass startTime (full ISO 8601, zone included) when the user names a specific time or an earlier day. Every entry MUST attach to a task. Use listTasks to find the right one, or offer createTask first when none fits. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
moveProjectToClient
ChatGPTMove a project between client records in the connected MonoDesk workspace. Both the project and destination client must belong to that same workspace. The changes are to MonoDesk records, including its built-in client portal; this does not transfer the project to another workspace or an external client system. This is not a rename: for every other project edit use updateProject. Use it only when the user asks to move or reassign a project to another client. What the move does, none of which can be undone by moving it back: the project's files are re-stamped onto the new client, the client portal thread is closed and detached, and the old client's hub notifications for the project are retired. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
moveTaskToProject
ChatGPTMove a task to a different project. This is not a column change: to move a card between columns on the same board use updateTask with listId, and for every other task edit use updateTask. Use it only when the user asks to move a task to another project. What the move does: the card lands at the bottom of the destination project's first column, and its subtasks, time logs and comments are re-stamped onto the new project with it. A subtask cannot be moved on its own - move its parent instead. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
previewFileImport
ChatGPTPrepare a reversible import preview from the complete attached file: clients, leads, projects, tasks or time. Map each source column to a destination field key, or empty string to ignore it. Corrections use zero-based data row indexes. Returns counts, issues and an editable review link. Does not create business records. Show the mapping, ignored columns and counts to the user, resolve errors, then call confirmFileImport to open the approval control. Use this instead of chaining batch creates for file imports.
readFileContent
ChatGPTRead the text content of a file into the chat context. Use this when the user wants you to analyze, summarize, or reference the contents of a specific file. Supports PDF, text, markdown, CSV, and JSON files. For images, returns a description that the file is an image. For a note (an editable markdown or text file) it also returns contentHash; pass it to updateProjectNote when you replace the note. Use listFiles first to find the file ID if needed.
readFileRows
ChatGPTRead a page of rows from an uploaded delimited file (CSV, TSV) without pulling the whole file into the conversation. Returns the header as columns plus rows, where rows[i][j] is the value for columns[j]. Handles quoted fields, embedded newlines, a UTF-8 BOM and mixed line endings, and skips blank rows. Page through a large file with offset and limit: each result carries totalRows and a nextOffset to pass back, or null at the end. Long cells are cut to a preview on this path and flagged with cellsTruncated; pass fullCells: true with rowIndexes to read those rows in full before saving them. Use this for inspecting and analysing delimited files. For importing records, use readImportFile, previewFileImport and confirmFileImport. The file stays on the server, so neither its size nor how many turns have passed since it was attached limits what you can read.
readHelpArticle
ChatGPTSTEP 2 OF 2. Read one official MonoDesk help article using its exact slug from listHelpArticles. Returns the article text and the canonical web URL to cite. Only read articles relevant to the user's question. Call this on the best match from listHelpArticles before answering any how-do-I or product-behaviour question; an answer built from index titles or summaries without reading the body is not acceptable. Answer from the retrieved article text, including faithful paraphrases of it. When this article is missing the detail the user asked about, check another plausible article from the index before concluding; if it is still not covered, say the help centre does not specify it rather than supplying it from general knowledge of other products.
readImportFile
ChatGPTInspect an attached CSV, TSV or Excel export. Returns sheet names, all headers, total row counts and sample rows. Use previewFileImport next to map the entire file on the server without truncating cells.
removeTaskLink
ChatGPTRemove a link from a task's Links section. Use this when the user wants to delete or take off a link saved on a task. Get the linkId from the links array that listTasks returns on each task. The web page itself is not affected. The response includes a url pointing at the task. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.
unarchiveClient
ChatGPTUnarchive (restore) a client. Use this when the user wants to restore or unarchive a client. Use listClients first to find the client ID if needed.
unarchiveLabel
ChatGPTUnarchive (restore) a task label. Use this when the user wants to restore a previously archived label. Use listLabels first to find the label ID.
unarchiveProject
ChatGPTUnarchive (restore) a project. Use this when the user wants to restore or unarchive a project. Use listProjects first to find the project ID if needed.
unarchiveTask
ChatGPTUnarchive (restore) one or more tasks. Use this when the user wants to restore or unarchive tasks. Use listTasks first with includeArchived=true to find task IDs if needed.
updateClient
ChatGPTUpdate an existing client's information. Use this when the user wants to rename a client or change client details. Use listClients first to find the client ID if needed. Setting a website here also fetches the brand assets from it (logo, cover, colours, socials, plus description and industry) and fills in only what the client does not have yet, so a client created by name can get its branding once the user gives the website. Existing logos, colours and details are never overwritten. Only pass a website the user gave or confirmed.
updateLabel
ChatGPTUpdate an existing task label's name or colour. Use listLabels first to find the label ID.
updateLead
ChatGPTChange a lead: its name, contact, website, source, estimated value, size or notes; move it to another stage; mark it lost with a reason; link or unlink a proposal; or archive it. Winning a lead is winLead.
updateMilestone
ChatGPTChange a project milestone: rename it, move it earlier or later in the project's timeline with position, or change what the client portal shows for it. Only the fields you pass change. milestoneId takes the milestone's id, or its exact name together with projectId; listTasks with projectId returns the project's milestones with their ids and order. To put tasks into or take them out of a milestone, use updateTask or batchUpdateTasks with milestoneId instead.
updateProject
ChatGPTUpdate an existing project. Use this when the user wants to rename a project, set an overview/description, set project type, or configure billing. Use listProjects first to find the project ID if needed. To move a project to a different client, use moveProjectToClient instead. This tool cannot change the client.
updateProjectNote
ChatGPTAdd to or rewrite a note in a project's Files. Works on any editable text file there, including uploaded .md and .txt files. mode 'append' adds content to the very end after a blank line, so use it only when the addition belongs there; mode 'replace' swaps the whole body, and is how to add something inside a section or list: read the note, then send the full updated note with every other line unchanged, plus the contentHash the read returned. If the note changed after that read the replace is refused with a conflict, so read it again and redo the change. Returns the note's link and its new contentHash.
updateTask
ChatGPTUpdate an existing task. Use this when the user wants to edit a task, change its name, description, column/status, duration, position on the board, or mark it as complete/incomplete. Use position to move a card within its column ("top", "bottom", or { afterTaskId }); a listId move with no position lands at the bottom of the target column. Omitted fields are left unchanged; the sentinels 'CLEAR' and 'UNASSIGN' clear a field. taskId takes the task's id, the first 8+ characters of its id, or its exact name when that name is unique on the project in question or among your open tasks. Each board has columns whose titles are editable and only unique within one project, so prefer the id: call listTasks with projectId to see the current columns and their ids and listType ("todo", "doing" or "done") and pass that id as listId. A column name is accepted only when it is the exact title of one column on this task's own board; an empty string or an invented ID never is. Omit listId to keep the column unchanged. Use completed: true/false to mark tasks complete or reopen them, and the tool picks the column whose type is done. Passing listId and completed together is only accepted when they agree. Setting assigneeId replaces the task's assignee list with that single user, so any other assignees are removed. Use milestoneId to put the task under one of its project's milestones, by milestone id or exact name, or 'CLEAR' to take it out of one; a label is never a substitute for a milestone. To move a task to a different project, use moveTaskToProject instead - this tool cannot change the project.
updateTaskLink
ChatGPTEdit a link saved on a task: change its web address, its title, or both. Use this when the user wants to rename a task's link, correct its URL, or clear a custom title. Get the linkId from the links array that listTasks returns on each task. Fields you leave out stay as they are. The response includes a url pointing at the task.
winLead
ChatGPTWin a lead: turn it into a client (a new one, or an existing client) and mark it won, optionally starting a project too. The same as the Win button on the lead. This tool executes when called. Follow your MCP client's approval policy before calling it; the server does not open a separate confirmation dialog.