# Decknote > Decknote is a kanban board where every card opens as a full page (Notion-style). People and AI agents share the same boards: through a remote MCP server an agent can do everything a person does in the app — boards, lists, cards, checklists, comments, labels, custom fields, rules, attachments, sharing, notifications, settings, projects with time tracking, estimates, clients and reports, invoices and estimates, the client portal, workload, project templates, notes and discussions, time imports, and upgrading — with that person's permissions. ## Connect an AI app (ChatGPT, Claude, Claude Code, Cursor, VS Code) - MCP server (OAuth, recommended): https://decknote.app/mcp - Transport: Streamable HTTP, protocol 2025-06-18. Add it as a remote / custom connector; the app opens a Decknote window, the person logs in and clicks Allow. No token to copy. - Authorization: OAuth 2.1 with PKCE (S256) and dynamic client registration. Discovery starts from the 401 on /mcp (WWW-Authenticate resource_metadata), or directly at https://decknote.app/.well-known/oauth-protected-resource/mcp and https://decknote.app/.well-known/oauth-authorization-server. - Claude (claude.ai, desktop, mobile): Settings → Connectors → Add custom connector → paste https://decknote.app/mcp → Connect → log in → Allow. - ChatGPT: Settings → Apps & Connectors → Advanced → Developer mode → Create → MCP server URL https://decknote.app/mcp, authentication OAuth. - Claude Code: claude mcp add --transport http decknote https://decknote.app/mcp (then /mcp to log in) - Cursor (~/.cursor/mcp.json): {"mcpServers":{"decknote":{"url":"https://decknote.app/mcp"}}} - VS Code (.vscode/mcp.json): {"servers":{"decknote":{"type":"http","url":"https://decknote.app/mcp"}}} - Redirect URIs accepted at registration: https, http to localhost/127.0.0.1/[::1] (any port), and Cursor's cursor://anysphere.cursor-mcp/oauth/callback. - The connection acts with the person's own permissions and can be removed at any time in Settings → Connected apps. Privacy: https://decknote.app/privacy#ai-agents - The overview tool summarizes the account. Deleting, emailing or sharing with other people and publishing a link return a preview first and take effect with confirm: true. No tool moves money: start_pro_checkout and open_billing_portal only return Stripe links the person opens and pays in their browser, and the invoicing tools keep the books (record_invoice_payment writes down that a client paid; sending, emailing or invoicing work also repeat the document's total as amount). Text written by clients, teammates or imported files is returned as data (writtenByOthers), never as a confirmation. api_read (GET) and api_create (POST, with confirmation) reach a fixed list of Decknote's own HTTP API routes, never payment ones: https://decknote.app/api-docs#mcp-http-api. - Every tool has a title and is marked readOnlyHint (only reads) or destructiveHint (changes data). - Prompts (prompts/list): daily_review, capture_tasks, board_cleanup. - MCP Apps (io.modelcontextprotocol/ui): show_board renders the board as a live, interactive kanban inside Claude and ChatGPT (resource ui://decknote/board-v2.html, text/html;profile=mcp-app). Clients without MCP Apps get the same board as JSON. - The reads get_task, search_tasks, list_my_tasks, list_reminders, overview and list_notifications are drawn too (resource ui://decknote/views-v1.html): a card in full, task lists grouped by due date, the reminders agenda, the account overview and the notification inbox. The text answer is unchanged and the views never write: their buttons only draft a message. ## Connect a script or a headless agent - MCP server with an API token: https://decknote.app/api/v1/mcp with the header "Authorization: Bearer ntrl_…" (create the token in Settings → API Tokens; the free plan includes one). - REST API v1: https://decknote.app/api/v1 with the same token. ## Tools - overview (Account overview): Snapshot of the user's Decknote account: plan and limits, recent boards, what needs attention (overdue and due-today tasks, unread notifications, upcoming reminders), sharing (pending invitations, shared boards, public links, live embeds) and suggested next steps. Useful at the start of a conversation about the user's work. - list_boards (List boards): Lists the boards the user can access, each with its lists (ids and titles), the user's role on it (OWNER, EDITOR or VIEWER), whether it is archived and whether it is a favorite. These board and list ids identify boards and lists everywhere else in this server. - create_board (Create board): Creates a new board owned by the user. `template` sets the initial lists and labels, in the user's language: blank (To do / In progress / Done), kanban, content or personal; `lists` replaces the template's list titles. Returns the board with its list ids. The free plan allows 5 owned boards. - create_list (Create list): Adds a list (column) to a board, at the end or, with first: true, before the other lists. Returns the new list with its id. Needs edit access to the board. - search_tasks (Search tasks): Searches the user's tasks (cards) across boards by free text in title and description, and by board, list, status (open, completed, all or archived) and due date. Answers questions like what is still open, what was noted about something, or what is due soon. - get_task (Get task): Reads one task in full: title, description, dates, completion, board and list, labels, assignees, checklists with their items, comments with reactions, attachments, links to other tasks, custom field values, whether the user watches it and the user's pending reminders, with the id of each part. - create_task (Create task): Adds a task (card) to a list, or to a board's first list when only boardId is given. The description becomes the card's page and accepts Markdown (headings, bullet and numbered lists, - [ ] task lists, bold, italic, code, links, fenced code). Optional due date, reminders, repeat (Pro) and a checklist. The board's rules for new cards run, as in the app. - update_task (Update task): Edits a task: title, description, due date, start date, repeat or cover (a color, or one of the task's image attachments). The description accepts Markdown and replaces the card's whole page. null clears a date, the repeat or the cover. - complete_task (Complete task): Marks a task as completed (done). - reopen_task (Reopen task): Marks a completed task as not done again. - archive_task (Archive task): Archives a task: it leaves the board but keeps all its data and can be restored from the board's archive. Archiving a dated repeating task creates its next occurrence, as in the app. - move_task (Move task): Moves a task to another list: on the same board, optionally to a position (index 0 = top), or on another board the user can edit (it lands at the end). Moving to another board drops the old board's labels and the assignees and watchers who can't see the new board, as in the app. - add_comment (Add comment): Adds a comment to a task as the user. By default nobody is notified. With notify: true it notifies @mentioned board members and the card's watchers by push and email, as commenting in the app does; that needs confirm: true, and without it the result is a preview of who would be notified. - add_reminder (Add reminder): Adds a reminder for the user on a task: a push notification and an email at a chosen moment. Either `at` (an ISO 8601 instant), or relative to the due date (`daysBefore` + local `time` + IANA `timeZone`), which follows the due date when it moves and repeats with repeating tasks. - list_reminders (List reminders): Lists the user's pending reminders, soonest first, optionally on one board, with each task's title and due date. - remove_reminder (Remove reminder): Deletes one of the user's reminders. - search (Search cards): Searches the open and completed cards of every board the user can access by text in title and description. Returns card ids, titles (with the board) and links. - fetch (Fetch card): Reads one card by id as a document: title, board and list, due date, labels, description, checklists and comments. - get_board (Get board): Reads one board in full, like opening it in the app: lists with their cards (dates, labels, assignees, checklist progress, custom field values), labels, members and the user's role, custom fields, rules, card templates, the user's saved views, recently archived cards, the public link and pending invitations (owner only) and the plan limits that apply, with every id. - list_activity (List board activity): Lists a board's activity history, newest first: who did what, and when. How far back it goes follows the board owner's plan (Free: 40 entries, Pro: 200), as in the app. - update_board (Update board): Changes a board's title, icon (one emoji), cover color or background image (Pro; PNG, JPEG, WEBP or GIF up to 5 MB, base64-encoded), or removes the background. Needs edit access to the board. - set_board_preferences (Set board preferences): Sets the user's own preferences for a board: favorite (starred) and muted (no notifications from it). Affects only the user. - duplicate_board (Duplicate board): Copies a board the user can see into a new board the user owns: lists, cards (content, dates, checklists, labels) and look. Members, comments and attachments are not copied. Counts toward the free plan's 5 owned boards. - archive_board (Archive board): Archives a board the user owns: it leaves everyone's dashboard and keeps all its data until it is restored. Archived boards don't count toward the free plan's 5 owned boards. - restore_board (Restore board): Restores an archived board the user owns to everyone's dashboard. - delete_board (Delete board): Permanently deletes a board the user owns, with every list, card, comment and attachment on it, also for the people it is shared with. Irreversible. Without confirm: true nothing is deleted and the result is a preview of what would be lost. - import_trello_board (Import Trello board): Creates a board from a Trello JSON export (in Trello: Menu → Print, export and share → Export as JSON): lists, cards with Markdown descriptions, dates, labels, checklists, comments and links. Counts toward the free plan's 5 owned boards. - share_board (Share board): Shares a board the user owns with someone by email, as EDITOR or VIEWER. People with an account get access right away; others get an invitation to sign up. Decknote emails them either way, so it needs confirm: true; without it the result is a preview. Sharing is a Pro feature on the web (one flat price, not per person). - update_member (Change member role): Changes a member's role on a board the user owns: EDITOR (can change things) or VIEWER (read only). - remove_member (Remove member): Removes someone from a board the user owns: they lose access, and their assignments, watches and reactions on it are removed (their comments stay). Needs confirm: true; without it the result is a preview. - leave_board (Leave board): Removes the user from a board someone else shared with them; only the owner can add them back. The owner can't leave their own board. Needs confirm: true; without it the result is a preview. - transfer_board (Transfer board ownership): Hands a board the user owns to one of its members: they become the owner (their plan then decides the board's Pro features) and the user stays on as an editor. Needs confirm: true; without it the result is a preview. - set_public_link (Set public link): Turns a board's public read-only link on or off, or issues a new one so the old one stops working. Anyone with the link can view the board without an account. Owner only. Needs confirm: true; without it the result is a preview. - list_embeds (List embeds): Lists the live embeds of a board the user owns (the board shown inside another app of the user's). - create_embed (Create embed): Lets another app of the user's show this board in an iframe (Pro, owner only): a name and up to 5 https origins allowed to frame it, read-only unless canEdit. That app's server then requests a session through the REST API. Needs confirm: true; without it the result is a preview. - revoke_embed (Revoke embed): Turns off one of a board's embeds: the app showing it loses access at its next request. Needs confirm: true; without it the result is a preview. - update_list (Update list): Renames a list, sets its WIP limit (Pro; null clears it) or moves it to another position among the board's lists (index 0 = first). Needs edit access to the board. - duplicate_list (Duplicate list): Copies a list with its open cards (content, dates, labels, checklists) to the end of the same board. - sort_list (Sort list): Reorders a list's cards by due date (soonest first, undated last), by title (A to Z) or by creation (newest first). - delete_list (Delete list): Permanently deletes a list and every card in it, archived ones included. Irreversible. Needs confirm: true; without it the result is a preview with the number of cards that would be lost. - create_label (Create label): Adds a label to a board. Colors: green, yellow, orange, red, purple, blue, sky, pink. - update_label (Update label): Renames or recolors a label; the change shows on every card that has it. - delete_label (Delete label): Deletes a label from a board and removes it from every card that has it. Needs confirm: true; without it the result is a preview. - create_custom_field (Create custom field): Adds a custom field to a board's cards: text, number, select (with up to 20 options), checkbox or date. The free plan allows 3 per board. - update_custom_field (Update custom field): Renames a custom field or changes a select field's options. Removing an option that cards use clears it from them, which needs confirm: true; without it the result is a preview. - delete_custom_field (Delete custom field): Deletes a custom field and its value on every card. Needs confirm: true; without it the result is a preview. - create_saved_view (Create saved view): Saves a personal view of a board: how to show it (board, table, calendar or timeline) and a filter (due date, labels, assignees). Only the user sees it. The free plan allows 3 per board. - delete_saved_view (Delete saved view): Deletes one of the user's saved views. Needs confirm: true; without it the result is a preview. - create_automation (Create automation): Adds a board rule: WHEN a card is added to a list / moved to a list / gets a label, THEN move it, add or remove a label, assign someone, set the due date N days ahead, archive it, or comment. Triggers: card_added, card_moved, label_added (card_added/card_moved need triggerListId, label_added needs triggerLabelId). Actions: move_to_list, add_label, remove_label, assign, set_due, archive, comment (move_to_list needs actionListId; add_label/remove_label need actionLabelId; assign needs actionUserId; set_due needs actionDays; comment needs actionText). Free plan: 1 per board. - set_automation_enabled (Enable or disable automation): Turns a board rule on or off without deleting it. - delete_automation (Delete automation): Deletes a board rule. Needs confirm: true; without it the result is a preview. - duplicate_task (Duplicate task): Copies a task right below the original: title, description, dates, labels, cover, field values and checklists (not comments, assignees or attachments). - restore_task (Restore task): Puts an archived task back on its list. - delete_task (Delete task): Permanently deletes a task with its comments, checklists and attachments. Irreversible. Needs confirm: true; without it the result is a preview of what would be lost. - set_task_labels (Set task labels): Adds and/or removes labels of the task's board on a task. Adding a label runs the board's 'label added' rules, as in the app. - set_task_assignees (Set task assignees): Assigns or unassigns board members on a task. Assigning someone other than the user sends them a push and an email, as in the app, so it needs confirm: true and returns a preview without it; self-assigning and unassigning don't. - watch_task (Watch task): Starts or stops watching a task (watchers are notified of new comments on it). Affects only the user. - set_task_field (Set task custom field): Sets a custom field's value on a task, or clears it with null. text: any text; number: a number; select: one of its options; checkbox: true or false; date: YYYY-MM-DD. - link_tasks (Link tasks): Relates two tasks on the same board: 'blocks' (from blocks to) or 'relates' (both ways). - unlink_tasks (Unlink tasks): Removes a relation between two tasks. - bulk_tasks (Bulk update tasks): Acts on up to 100 tasks of one board at once, like multi-select in the app: moves them to a list, adds a label, or archives them (repeating ones create their next occurrence). - create_task_from_template (Create task from template): Adds a task to a list from one of the board's card templates. - save_task_as_template (Save task as template): Saves a task's description and labels as a reusable card template on its board. - delete_card_template (Delete card template): Deletes a card template; tasks made from it stay. Needs confirm: true; without it the result is a preview. - edit_comment (Edit comment): Edits a comment's text (the user's own, or any on a board the user owns). It shows as edited. - delete_comment (Delete comment): Deletes a comment (the user's own, or any on a board the user owns). Needs confirm: true; without it the result is a preview. - react_to_comment (React to comment): Adds or removes the user's emoji reaction on a comment. Emojis: 👍 ❤️ 🎉 😄 👀 🚀. - add_checklist (Add checklist): Adds a checklist with its items to a task, in addition to its other checklists. - update_checklist (Update checklist): Renames a checklist or moves it among the task's checklists (index 0 = top). - delete_checklist (Delete checklist): Deletes a checklist with all its items. Needs confirm: true; without it the result is a preview. - add_checklist_items (Add checklist items): Adds items at the end of a checklist. - update_checklist_item (Update checklist item): Checks or unchecks a checklist item, or changes its text. - delete_checklist_item (Delete checklist item): Deletes one checklist item. A checklist keeps at least one item, so its last item only goes away with the whole checklist. Needs confirm: true; without it the result is a preview. - add_attachment (Add attachment): Attaches a link (url) or a file (contentBase64 + filename) to a task. Files follow the board owner's plan: 5 MB each and 100 MB per board on Free, 25 MB and 2 GB on Pro. Photos are optimized, as in the app. - rename_attachment (Rename attachment): Renames an attachment; a file keeps its extension. - delete_attachment (Delete attachment): Deletes an attachment from a task (and the task's cover, if it was the cover image). Needs confirm: true; without it the result is a preview. - list_my_tasks (List my tasks): Lists the user's tasks across every board, like the app's My tasks page: open cards assigned to the user plus dated cards on the user's own boards that nobody is assigned to, grouped as overdue, today, next 7 days, later and no date. - list_notifications (List notifications): Lists the user's notifications (mentions, assignments, comments on watched cards, due-date digests), newest first, with the unread count. - mark_notifications_read (Mark notifications read): Marks notifications as read: one (notificationId, which also marks the others about the same card, as opening it in the app does), every one about a card (cardId), or all of them (all: true). - get_account (Get account): Reads the user's account and settings: name, email, language, time zone, notification preferences, plan with its limits and usage, upgrade prices, API tokens and connected apps (names and dates only; secrets are not included). - update_account (Update account settings): Changes the user's settings: display name, language (en, es, fr), time zone (IANA, e.g. America/Argentina/Buenos_Aires; the daily digest goes out in the user's morning) and which notifications they get (mention, assigned, comment, due; email turns emails on or off). - revoke_access (Revoke access): Revokes one of the user's API tokens (apiTokenId) or disconnects a connected app (appClientId), as listed in the account. Whatever used it stops working at once, including this connection if it is the one in use. Needs confirm: true; without it the result is a preview. New tokens are only created by the user, in Settings. - export_data (Export data): Exports everything the user can read in Decknote as one JSON document (boards, lists, cards, checklists, comments, attachment metadata), the same export as Settings → Your data. Up to 5 per hour. - start_pro_checkout (Start Pro checkout): Starts an upgrade to Decknote Pro (14-day free trial, then US$9/month or US$90/year) by creating a Stripe Checkout link where the user pays; this tool charges nothing. Without confirm: true it returns the exact price and changes nothing; with confirm: true, amount has to equal that price. Accounts billed through Shopify are upgraded from the Shopify admin, not here. - open_billing_portal (Open billing portal): Creates a link to Stripe's billing portal, where the user manages their Pro subscription: payment card, invoices, monthly or yearly billing, cancellation. Changes happen there, made by the user. - api_read (Read from Decknote API): Reads from Decknote's HTTP API (reference: https://decknote.app/api-docs#mcp-http-api) as the signed-in user, with GET; it doesn't change anything. Covers what no dedicated tool returns, such as the contents of an uploaded text file or a link preview. Reachable: GET /api/v1/me: the user (id, name, email); GET /api/v1/boards: the user's boards and their lists; GET /api/v1/boards/{boardId}/embeds: a board's live embeds (owner); GET /api/export: everything the user can read, as one JSON document; GET /api/link-preview?url=…: the title and description of a web page; GET /api/attachments/{attachmentId}: an uploaded file (text files come back as text; others as type and size). Takes a path on Decknote itself (not a full URL) and optional query parameters. Authentication, token, session, admin, payment and internal endpoints are not reachable, and secrets are removed from responses. - api_create (Create via Decknote API): Creates something through Decknote's HTTP API (reference: https://decknote.app/api-docs#mcp-http-api) as the signed-in user, with POST. Reachable: POST /api/v1/boards: a board: { title, template? }; POST /api/v1/cards: a card: { listId | boardId, title, description?, dueDate?, checklist?, reminders? }; POST /api/v1/boards/{boardId}/embeds: an embed of a board: { name, origins[], canEdit? } (owner, Pro). Takes a path on Decknote itself (not a full URL) and a JSON object body as documented there. Needs confirm: true; without it nothing is sent and the result is a preview of the request. Authentication, token, session, admin, payment and internal endpoints are not reachable, and secrets are removed from responses. - show_board (Show board): Shows a board as an interactive kanban that updates live while the conversation is open: lists and cards with labels, due dates, checklist progress and assignees, where the user can drag cards between lists, complete them and add new ones. Without boardId it shows the board the user changed most recently. Clients that can't display it get the same board as JSON. - get_board_live_url (Get board live updates address): Returns a short-lived address (2 minutes to connect) of a board's live event stream: a Server-Sent Events URL that announces every change to the board and who is viewing it. Used by the board view to update itself. - start_timer (Start timer): Starts the user's time tracker on a project, optionally on one of its tasks. There is one timer per person: a timer already running is stopped and its time kept first (a timer stopped within 30 seconds is dropped as an accidental click). The hours are the time elapsed when it stops, rounded to the minute and capped at 16 hours. Needs the editor role on the project. - stop_timer (Stop timer): Stops the user's running timer and keeps the elapsed time as a time entry. A timer stopped within 30 seconds is dropped as an accidental click. Says so when no timer was running. - get_running_timer (Get running timer): Returns the user's running timer, if any: the project, the task, the note, when it started and how long it has run. - log_time (Log time): Adds hours by hand to a project, or to one of its tasks. The entry takes the project's hourly rate (or the client's) and is billable according to the task's setting, else the project's, unless billable is given. Needs the editor role on the project. - list_time_entries (List time entries): Lists the time entries of a project, newest first, with who logged each, the task, the day, the minutes and whether it is billable. The project owner reads everyone's entries, with their hourly rates in cents; any other member reads only their own, without rates. Also returns the total minutes of everything the filters match. - update_time_entry (Update time entry): Changes a finished time entry: its duration, day, note, whether it is billable, or the task it is on (null takes it off any task). A person edits their own entries and the project owner edits anyone's. Time already billed to a client, and a timer still running, cannot be edited. - delete_time_entry (Delete time entry): Permanently deletes a time entry, or a running timer. A person deletes their own entries and the project owner deletes anyone's; time already billed to a client cannot be deleted. Needs confirm: true; without it the result is a preview of what would be lost. - set_task_estimate (Set task estimate): Sets how long a task is expected to take, or clears it with null. Written with a unit: 4h, 1h30, 90m, 1.5h (a bare number is minutes); up to 10,000 hours. Needs the editor role on the project. - set_task_billable (Set task billable): Sets whether time logged on a task is billable to the client (true or false), or makes it follow the project's default (null). Applies to time logged from then on; entries already logged keep their setting. Needs the editor role on the project. - get_task_time (Get task time): Reads the time of one task: its estimate, the time tracked so far, how close that is to the estimate (ok, warning from 80%, over), whether its time is billable, and its time entries. The project owner reads everyone's entries; any other member only their own. - list_clients (List clients): Lists the user's clients (the companies or people projects are done for) with their contact details, currency, default hourly rate in cents and how many projects use each. The free plan includes 2 active clients. - create_client (Create client): Adds a client. Projects are linked to a client in their settings; the client's currency and default hourly rate apply to their time. The free plan includes 2 active clients; Pro has no limit. - update_client (Update client): Changes a client's name, contact details, currency, default hourly rate or notes; null clears an optional field. A new rate applies to time logged from then on: entries already logged keep the rate they were logged with. - archive_client (Archive client): Archives a client: it leaves the active list and stops counting toward the plan's client limit. Its projects keep the link and all the time stays. Needs confirm: true; without it the result is a preview. - restore_client (Restore client): Brings an archived client back to the active list. The free plan's limit of 2 active clients applies. - get_project_settings (Get project settings): Reads a board's project settings: client, status (active, on hold, completed, cancelled), budget (none, hours or money), default hourly rate in cents, whether time is billable by default, and start and due dates. A board without settings is not a project yet. Only the project owner reads the rate and the money budget. - update_project_settings (Update project settings): Turns a board into a project or changes its settings: client (one of the user's own), status, budget type with its hours or amount, default hourly rate, billable by default, start and due dates. null clears a value. A new rate applies to time logged from then on. Only the board's owner can do this. - get_project_summary (Get project summary): Summarizes a project: time tracked, billable time, the billable amount in cents, how much of the budget is used (ok, warning from 80%, over) and the hours of each person. The project owner reads all of it; any other member reads the project's totals and their own hours, without money. - get_week_timesheet (Get week timesheet): Returns the user's own timesheet for one week, Monday to Sunday: a row per project and task with the minutes of each day, the totals per day and the week's total. - get_time_report (Get time report): Adds up the time logged in a date range, grouped by project, client, person, task or day: minutes, billable minutes and the billable amount in cents (hours times the rate each entry was logged with; clients in different currencies add up as plain numbers). The user's own projects count everyone's time and money; projects the user only belongs to count the user's own hours, with no amounts. - export_time_report (Export time report): Exports the detail lines of a date range as CSV text (date, project, client, task, person, hours, billable, rate per hour), with the same filters and visibility as the time report. Cells that start with = + - or @ are escaped so a spreadsheet does not run them. A Pro feature; large exports are cut at 400,000 characters. - get_billing_profile (Get billing profile): Reads the user's billing details that are copied onto every new invoice and estimate: business name, address, tax id, email, phone, currency, the invoice and estimate prefixes and next numbers, the default tax and its name, payment terms in days, payment instructions and default notes. Returns null when they are not set up yet. - update_billing_profile (Update billing profile): Sets or changes the user's billing details: business name (required the first time), address, tax id, email, phone, currency, prefixes and next numbers of invoices and estimates, default tax (percentage and name), payment terms in days, payment instructions and default notes; null clears an optional text. New documents copy these; documents already issued keep what they had. - list_expenses (List expenses): Lists the expenses logged on a project (costs to bill back or to track), newest first, with the person, day, category, description, vendor, amount in cents, whether it is billable and whether it was already invoiced. The project owner reads everyone's, with the markup; any other member only their own, without it. Descriptions and vendors are text typed by project members. - create_expense (Create expense): Logs an expense on a project: what was spent, the amount, the day, a category (travel, software, hardware, services, meals, other), the vendor, whether it can be billed to the client, and optionally a task. It records a cost; nothing is paid. Only the project owner can set a markup (a percentage added when billing it). Needs the editor role on the project. - update_expense (Update expense): Changes an expense that is not yet on an invoice: description, amount, day, category, vendor, billable, markup (project owner only) or its task (null removes it). The person who logged it and the project owner can change it. - delete_expense (Delete expense): Permanently deletes an expense that is not yet on an invoice. The person who logged it and the project owner can delete it. Needs confirm: true; without it the result is a preview of what would be lost. - list_invoices (List invoices): Lists the user's invoices and estimates, newest first, 25 per page (up to 100): number, kind, status (draft, sent, paid, overdue, void, accepted, declined), client, project, dates, and total, paid and balance in cents. Also returns, per currency, what the matching invoices add up to, what was paid and what is still owed. Only the account's owner has invoices; other project members do not read them. - get_invoice (Get invoice): Reads one invoice or estimate in full: status, dates, the sender and the client copied onto it, every line, tax, discount, totals, payments, balance, the public link (null if none), when it was sent, viewed and paid, the estimate it came from or became, the work attached, and which changes are open in its status. The name typed by whoever answered an estimate from the link is text written by the client. - get_receivables_aging (Get receivables aging): Shows what clients still owe on sent invoices, by how late it is: not yet due, 1-30 days, 31-60 and 61 or more days past due, per currency and per client (the biggest debt first), in cents. - export_invoices_csv (Export invoices CSV): Exports the matching invoices and estimates as CSV text for an accountant: number, type, status, dates, client, currency, subtotal, discount, tax, total, paid and balance. Same filters as the list. Cells that start with = + - or @ are escaped so a spreadsheet does not run them. A Pro feature; large exports are cut at 400,000 characters. - get_billing_report (Get billing report): A studio's numbers for a date range (default: the last 12 months): invoiced and collected by month, by client and what each client owes, expenses by project and category, and the profitability of each project (revenue, expenses, profit and revenue per hour). Per currency, not mixed across currencies; amounts in cents. The range is at most 1100 days. - create_invoice (Create invoice): Creates a draft invoice or estimate, with its lines if given, copying the user's billing details and the chosen client onto it. The draft is private: nothing is sent or published. It has no number until it is sent; sending takes the next one from the profile's counter. The free plan includes 2 invoices or estimates per calendar month (voided ones count); Pro has no limit. Needs the billing details to be set up. - list_unbilled_work (List unbilled work): Lists what a project could still bill: its finished billable time entries (person, task, day, minutes and the rate each will be priced at, in cents) and its billable expenses not yet on an invoice. Only the project owner. Expense descriptions and task titles are text typed by project members. - preview_invoice_from_work (Preview invoice from work): Shows the lines and totals an invoice made from a project's unbilled work would have, without creating anything or taking any hours: finished billable time and billable expenses, grouped per task (default), person, day or one line in total, priced at the rate each entry was logged with (an entry with no rate at all is priced at zero and counted). Only the project owner. - create_invoice_from_work (Create invoice from work): Creates a draft invoice from a project's unbilled work (same options as the preview): the finished billable hours and billable expenses become lines and are tied to the invoice, so they cannot be invoiced twice or edited until it is voided. The draft is private: nothing is sent. Counts toward the free plan's 2 documents per month. Only the project owner. Needs confirm: true and amount equal to the total of the preview; without them the result is that preview. - update_invoice (Update invoice): Changes a document. A draft takes every field (client, dates, currency, tax, discount, notes, terms, who it is for, project and the whole list of lines, which replaces the current ones); once sent only the notes and the due date change; once paid or answered, only the notes. Totals are recomputed on the server. null clears an optional field. - send_invoice (Send invoice): Marks a draft as sent, gives it the next number and publishes its link: anyone who has the link can read the document (lines, amounts, the user's business details), and for an estimate answer it. Nothing is emailed. After that only the notes and the due date change. The draft needs a client name, at least one line and a total above zero. Needs confirm: true and amount equal to the total; without them the result is a preview. - get_invoice_email_draft (Get invoice email draft): Shows the email that would go to the client for a draft or sent document: the address, the subject and the text, with the personal message and the language if given; a reminder reads differently for a sent invoice with a balance. Sends nothing and changes nothing; says whether this server can send email at all. - email_invoice (Email invoice): Emails the document to the client from Decknote on the user's behalf (replies go to the user), with a link to it; a draft takes the next number, becomes sent and its link is published. One plain address: the document's or `to`. Limited to 20 emails an hour per person and 5 per document. Needs confirm: true and amount equal to the total; without them the result is a preview with the exact email. - regenerate_invoice_link (Regenerate invoice link): Replaces the public link of a document with a new one: the old link stops working at once for anyone who has it, and the new one lets anyone who holds it read the document. Not for a voided document. Needs confirm: true; without it the result is a preview. - revoke_invoice_link (Revoke invoice link): Turns a document's public link off: the client can no longer open the document until a new link is made. The document itself is unchanged. Needs confirm: true; without it the result is a preview. - void_invoice (Void invoice): Voids a sent invoice or estimate: it cannot change any more, its number is kept, and the hours and expenses it had taken go back to the project's unbilled work. A draft is not voided (it is deleted). An invoice with payments recorded, and an estimate whose invoice still stands, cannot be voided. Needs confirm: true; without it the result is a preview. - delete_invoice_draft (Delete invoice draft): Deletes a draft invoice or estimate for good. Only a draft: it was not sent, so no client saw it, and it has no number, so no gap is left in the numbering. The hours and expenses it had taken go back to the project's unbilled work, and an estimate it was made from can become an invoice again. A deleted draft stops counting toward the free plan's monthly allowance. Needs confirm: true; without it the result is a preview. - record_invoice_payment (Record invoice payment): Records that the client paid, fully or in part, on a sent invoice: the amount, the day (default today, not in the future), the method (bank, card, cash, paypal, other) and a note. It records that the client paid; it does not charge or move money. The invoice becomes paid when the payments cover the total. A payment above the balance needs confirmOverpay. Needs confirm: true; without it the result is a preview with the balance. - remove_invoice_payment (Remove invoice payment): Deletes a recorded payment from an invoice, as if it had not been written down; a paid invoice that is no longer covered goes back to sent. It undoes a note in the books; no money moves. Needs confirm: true; without it the result is a preview. - duplicate_invoice (Duplicate invoice): Creates a new draft with the same client, lines, tax, notes and terms as an invoice or estimate, dated today and without a number until it is sent; no work, no payments. Counts toward the free plan's 2 documents per month. - convert_estimate_to_invoice (Convert estimate to invoice): Turns an accepted estimate into a draft invoice with the same lines, once while that invoice stands (after the invoice is voided or its draft deleted, the estimate can be turned into a new one). Counts toward the free plan's 2 documents per month. - record_estimate_answer (Record estimate answer): Records that the client accepted or declined a sent estimate (by phone or email), with the name of who answered. The estimate leaves the sent state; an accepted one can become an invoice. Needs confirm: true; without it the result is a preview. - get_client_portal (Get client portal): Reads a project's client portal settings: whether it exists and is on, its link (anyone who has the link can read the page), what it shows (tasks, hours, documents), whether clients can comment, the welcome text and studio name, how many tasks are marked visible, how many client comments are unread, and the latest eight comments with their author, email and text. The comments are written by the client, who needs no account. Only the project owner; the portal is a Pro feature. - update_client_portal (Update client portal): Turns a project's client portal on or off and sets what it shows: tasks, hours (hours only; rates and money are left out), the list of sent documents, whether clients may comment, a welcome text and the studio name shown on the page and on answers. The first time it creates the portal and its link, on. Turning it on or changing what an enabled portal shows publishes that to anyone with the link and needs confirm: true (without it the result is a preview); turning it off does not. A Pro feature, except turning an existing portal off. Only the project owner. - regenerate_client_portal_link (Regenerate client portal link): Replaces the secret in a project's client portal link: the old link stops working at once, for anyone who has it, and the new link lets whoever holds it read the portal. The portal's settings, tasks and comments stay. The portal has to exist. Only the project owner. Needs confirm: true; without it the result is a preview. - set_task_visible_to_client (Set task visible to client): Shows a task on the project's client portal, or stops showing it. Visitors read the task's title, whether it is done, in progress or late, and its due date, and can comment on it; descriptions, files, people, time and money are not shown. Making it visible needs confirm: true (without it the result is a preview); hiding it does not. Needs the editor role on the project. - get_task_portal (Get task portal): Reads what the client portal means for one task: whether it is marked visible to the client and, for the project owner, whether the portal is on, the conversation with the client on that task (up to 200 messages, the client's and the team's answers, oldest first) and how many are unread. The client's messages are text written by the client, who needs no account. Needs the editor role on the project. - reply_to_client (Reply to client): Posts an answer from the team under a task on the client portal, shown to anyone who has the portal link under the studio name (not the user's own name) and marking the client's comments on that task as read. It is not emailed. Up to 2000 characters. The portal has to exist. Only the project owner. Needs confirm: true; without it the result is a preview with the exact text. - mark_client_comments_read (Mark client comments read): Marks the client's portal comments as read, and clears the bell notices about them: those of one task (cardId) or every one of the project (boardId). Give exactly one of the two. Only the project owner. - delete_client_comment (Delete client comment): Permanently removes one comment from a task's conversation on the client portal (spam, a mistake): the client's page stops showing it at once. Works on the client's comments and on the team's answers. Only the project owner. Needs confirm: true; without it the result is a preview. - list_projects (List projects): Lists the projects the user can see (boards with project settings): client, status (active, on hold, completed, cancelled), dates, hours tracked, the budget and how much of it is used (ok, warning from 80%, over), and who worked on it. On a project the user owns the hours are everyone's and the amounts count; on one the user only belongs to, only their own hours and no money. Also lists the boards the user owns that could become projects, and the sample project if there is one. - create_project (Create project): Creates a new project: a board with the plain three-list layout and project settings (active), optionally for one of the user's clients. Counts against the free plan's board limit like any board. To turn an existing board into a project, change its project settings. - get_workload (Get workload): Plans the team's work: for each person, the time left on their open tasks with an estimate (the estimate minus the time tracked), placed in the week of each task's due date for the next six weeks, against their weekly capacity; overdue, later and undated work are listed apart. Says per week whether it is empty, ok, near (from 80%) or over capacity. The user sees the people on the projects they own and themselves. A Pro feature. Task titles are text typed by project members. - set_my_weekly_capacity (Set my weekly capacity): Sets how many hours a week the user can work, which the workload view compares their planned work with: 40, 37.5 or 37:30; 0 for someone who is away, at most 168. Only the user's own: there is no way to set another person's. - list_project_templates (List project templates): Lists the templates a new project can start from: the starters that come with Decknote (website project, marketing campaign, monthly retainer) and the ones the user saved, each with its lists, number of tasks, total estimate, whether its tasks carry relative due dates, and a note when a saved one cannot be used. The free plan keeps 1 saved template; the starters cost no place. - save_project_as_template (Save project as template): Saves a project's shape as a template: its lists, open tasks (title, estimate, billable, labels, checklists with the items unticked, due dates as days from the start), labels and billable default. Its people, comments, logged time, descriptions, attachments and client are left out. The budget and the hourly rate are saved only with includeMoney. Only the project owner. The free plan keeps 1 saved template; Pro has no limit. - create_project_from_template (Create project from template): Creates a new project from a starter or saved template: its lists, labels, tasks with estimates and checklists, and settings, with due dates shifted onto the start date (default today). The template is untouched. Optionally for one of the user's clients. Counts against the free plan's board limit like any board. - rename_project_template (Rename project template): Changes the name and description of a saved template (also one that is damaged and cannot be used). The description is cleared when not given. - delete_project_template (Delete project template): Permanently deletes a saved template of the user (projects already made from it are untouched; the starters cannot be deleted). Needs confirm: true; without it the result is a preview. - list_pages (List pages): Lists a project's notes or discussions, pinned first and then the most recently touched (a reply counts), up to 200: title, a snippet, who started it, comment count, pinned and archived. Searches titles and bodies. Titles and snippets are written by project members. Any role on the project reads. - get_page (Get page): Reads one note or discussion in full: its title, its body as Markdown (up to 100,000 characters; bodyTruncated says it was cut), who started it, whether it is pinned or archived, its comments oldest first (the newest ones that fit, at most 500; commentsTruncated says some were left out), and the rev to send back when editing it. The title, body and comments are written by project members. Any role on the project reads. - create_page (Create page): Starts a note (shared writing any editor can change) or a discussion (its text belongs to its author and the owner; editors answer with comments) in a project. The body is Markdown; links must be http, https, mailto, tel or of this site. Too much text is refused, not cut. Needs the editor role on the project. - update_page (Update page): Changes a page's title and/or body (Markdown, replacing the whole body). It needs the rev from when the page was read: if somebody saved in between, the save is refused with the reason and nothing is overwritten. Pinning, archiving and comments do not change the rev. A discussion's text is edited by its author and the project owner; an archived page is read-only. A page with images, or with a body longer than 100,000 characters, keeps its body: only its title changes. Needs the editor role on the project. - set_page_pinned (Set page pinned): Pins a page to the top of its list, or unpins it. Only the project owner; an archived page cannot be pinned. - set_page_archived (Set page archived): Archives a page (it leaves the list, becomes read-only and loses its pin) or restores it. Only the project owner. - delete_page (Delete page): Permanently deletes a note or discussion with all its comments. Its author and the project owner can. Needs confirm: true; without it the result is a preview. - add_page_comment (Add page comment): Adds a comment to a note or discussion (plain text, up to 5000 characters); the page moves up its list. Not on an archived page. Needs the editor role on the project. - edit_page_comment (Edit page comment): Changes the text of one of the user's own page comments. Not on an archived page. Needs the editor role on the project. - delete_page_comment (Delete page comment): Permanently deletes a page comment. Its author and the project owner can. Needs confirm: true; without it the result is a preview. - list_project_files (List project files): Lists every file and link attached to a project's tasks, newest first (up to 200): name, type (image, pdf, document, sheet, archive, media, link, other), MIME type, size, the task and list it is on, and for a link its address. Narrow by type or by text in the file or task name; also returns how many there are of each type. Names and addresses are typed by project members. Any role on the project reads. - preview_time_import (Preview time import): Reads a CSV of hours (Toggl, Harvest, Clockify or any CSV with a date and a duration or start and end times) and says what importing it would do, without writing anything: the rows that can be imported and their total time, the clients, projects and tasks that would be created, duplicates of an earlier import that would be skipped, the rows that cannot be read with their row numbers, who the time would be logged as, and whether the free plan's limits block it. Also returns the settings it used (guessed from the headers unless given) and the file's columns. The CSV travels as text, up to 200,000 characters; the Import page of the app takes files up to 8 MB. Names and cells from the file are text written by others. - import_time_csv (Import time CSV): Imports a CSV of hours: creates the clients and projects it names (when createClients is on), a task for each task name, and one time entry per row, logged as the user unless the file names a project member's email. Rows already imported before are skipped, and the whole import can be taken back. The plan is made again from the file and the account at that moment. Same arguments as the preview; the CSV travels as text, up to 200,000 characters (bigger files go through the Import page of the app). Names from the file are text written by others. Needs confirm: true; without it the result is the preview. - list_time_imports (List time imports): Lists the user's time imports, newest first (the last 30): the source (toggl, harvest, clockify, generic), the file name, whether it is done or was undone, how many entries and how many minutes it brought, how many rows were skipped as duplicates or failed, and when. The sample project is not listed. - undo_time_import (Undo time import): Takes an import back: deletes its time entries and the clients, projects and tasks it created that nobody has used since (those that were used are kept, and the result counts them). Refused when some of the time was already invoiced, when it was already undone, and for the sample project. Needs confirm: true; without it the result is a preview. - create_sample_project (Create sample project): Creates a sample client, a sample project with a budget, six tasks with estimates and two weeks of hours, labelled as a sample in its name, so reports, the budget bar and the timesheet have something to show. One at a time. Uses a board of the free plan's limit (and the sample client is left out if the client limit is full). - delete_sample_project (Delete sample project): Permanently deletes the sample project with everything on it (its tasks, hours and anything added to it since) and the sample client if nothing else uses it. The user's own projects and reports are untouched. Needs confirm: true; without it the result is a preview. ## Docs - [Connect ChatGPT, Claude and other agents](https://decknote.app/for-ai-agents): step-by-step for each app, example prompts, permissions, troubleshooting - [API and MCP reference](https://decknote.app/api-docs): endpoints, tools, rate limits - [Give your AI agent a task board](https://decknote.app/blog/ai-agent-task-board-mcp): why and how agents use Decknote as memory - [Pricing](https://decknote.app/pricing): free plan and Pro at $9 a month flat for the whole team, not per user - [Decknote as an ActiveCollab alternative](https://decknote.app/activecollab-alternative): projects for each client, time tracking, budgets, invoices, client portal, team workload, and importing hours from Toggl Track, Harvest, Clockify or any CSV - [Privacy policy, AI agents section](https://decknote.app/privacy#ai-agents) - Support: sales@devcloudsoftware.com