protogrid

Search / dev.cotlet/milanote

Milanote by Cotlet

R1· needs a key

Boards, notes and links in your Milanote workspace.

v1.0.2 · active · repository · website · descriptor JSON · versions

An agent can connect on its own if it already holds MILANOTE_TOKEN.Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.
Quality82good
Trust96of 100
Uptime, 30 days100%
Latency p50632 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "milanote": {
      "type": "http",
      "url": "https://cotlet.dev/mcp/v1/milanote",
      "headers": {
        "Authorization": "Bearer ${MILANOTE_TOKEN}"
      }
    }
  }
}
claude mcp add --transport http milanote https://cotlet.dev/mcp/v1/milanote --header "Authorization: Bearer ${MILANOTE_TOKEN}"
[mcp_servers.milanote]
url = "https://cotlet.dev/mcp/v1/milanote"
bearer_token_env_var = "MILANOTE_TOKEN"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "milanote": {
      "type": "remote",
      "url": "https://cotlet.dev/mcp/v1/milanote",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer {env:MILANOTE_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "milanote": {
      "type": "http",
      "url": "https://cotlet.dev/mcp/v1/milanote",
      "headers": {
        "Authorization": "Bearer ${MILANOTE_TOKEN}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=milanote&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vY290bGV0LmRldi9tY3AvdjEvbWlsYW5vdGUiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIgJHtNSUxBTk9URV9UT0tFTn0ifX0%3D"
}
{
  "servers": {
    "milanote": {
      "type": "http",
      "url": "https://cotlet.dev/mcp/v1/milanote",
      "headers": {
        "Authorization": "Bearer ${MILANOTE_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "milanote": {
      "httpUrl": "https://cotlet.dev/mcp/v1/milanote",
      "headers": {
        "Authorization": "Bearer ${MILANOTE_TOKEN}"
      }
    }
  }
}
extensions:
  "milanote":
    enabled: true
    name: "milanote"
    type: streamable_http
    uri: "https://cotlet.dev/mcp/v1/milanote"
    headers:
      "Authorization": "Bearer ${MILANOTE_TOKEN}"
    timeout: 300

Placeholders to fill from your own secret store: ${MILANOTE_TOKEN}. The registry never accepts secret values.

Quality 82 / 100good

protocol100 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • pass
    protocol.list_ttltool list is cacheable (ttlMs 300000)
authorization100 · weight 15
  • pass
    auth.prmProtected Resource Metadata (RFC 9728) published
  • pass
    auth.as_metadataauthorization server metadata reachable
  • pass
    auth.cimdClient ID Metadata Documents supported
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene86 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations60 of 60 tools declare readOnlyHint or destructiveHint
  • warn
    tools.directory_hints55 of 60 tools declare all four hints; missing: cotlet_request_apps (idempotentHint); cotlet_whoami (idempotentHint); cotlet_apps (idempotentHint); …
  • warn
    tools.token_costabout 13,104 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes102 tool changes in 30 days
  • fail
    stability.rug_pull44 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvabledeps.dev does not know [email protected]

60 tools, about 13,104 tokens to load them all · tool set c33b1711f473 · tools last changed 2026-11-07 · checked 2026-11-07 18:35 UTC

Tool changes

  • cotlet_browser_backremoved

    Goes back one page in the user's Milanote Cloud Browser, like the browser's Back button (with `forward`, forward again). Returns the URL and title. Run browser steps one at a time and wait for each answer; steps sent together run in no set order. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

  • cotlet_browser_closechangeddescription
    before

    Ends the session in the user's Milanote Cloud Browser: the browser keeps its cookies, goes to sleep and the per-minute charge stops. Returns the session's minutes and credits.

    after · 52% of words in common

    Ends the browser session when the task is done: the browser keeps its cookies and sleeps, and the per-minute charge stops. Answers the session's minutes and credits.

  • cotlet_browser_waitchangeddescriptionmeaning changed
    before

    Waits until `text` shows on the current page in the user's Milanote Cloud Browser (at most `seconds`, default 5, up to 20), or just `seconds` without text: for results, prices or a page that load slowly. Says whether the text appeared. Run browser steps one at a time and wait for each answer; steps sent together run in no set order. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

    after · 41% of words in common

    Waits until `text` shows on the page (at most `seconds`, default 5, up to 20), or just `seconds`: for results that load slowly. Says whether the text appeared. Answers the page after it: the elements and text in view, with the same numbers.

  • cotlet_browser_evaluateadded

    Runs a JavaScript function body on the page and answers what it returns, as JSON. Use it to extract data the page holds (a table, a list, attributes); act with the other tools. It cannot send requests, click, submit, or read cookies or storage; a filled field's value reads [hidden by Cotlet]. Example: return [...document.querySelectorAll('h2')].map(h => h.innerText)

  • cotlet_browser_downloadadded

    Gets the file that clicking `element` (a download link or button) or opening `url` starts: answers its name, type, size and a link valid 15 minutes; CSV, JSON and other text files also as text.

  • cotlet_browser_uploadchangeddescription, input schemameaning changed
    before

    Puts files into a file field of the current page in the user's Milanote Cloud Browser, or into the file picker that an upload button opens, by its number in the element list. A file is given as {"url": "https://..."} for a file online or {"file_id": "..."} for one uploaded to Cotlet first; up to 10 files, 20 MB each. Returns the URL and title after it. Run browser steps one at a time and wait for each answer; steps sent together run in no set order. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

    after · 35% of words in common

    Puts files into file field or upload button `element`: each file is {"url": "https://..."} or {"file_id": "..."} of a file uploaded to Cotlet; up to 10 files, 20 MB each. Answers the page after it: the elements and text in view, with the same numbers.

  • cotlet_browser_presschangeddescription, input schemameaning changed
    before

    Presses a key on the current page in the user's Milanote Cloud Browser, on the element that has focus: Tab to the next field, Enter to send, Escape to close a dialog or pop-up, arrows to move through a suggestion list or a slider, or one character (a site's shortcut). Returns the URL and title after it, and says when nothing changed. Enter on account pages and characters into password fields are refused. Run browser steps one at a time and wait for each answer; steps sent together run in no set order. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

    after · 33% of words in common

    Presses a key on the focused element: Enter to send, Tab to the next field, Escape to close a pop-up, arrows in a list or slider, or one character (a site's shortcut). Answers the page after it: the elements and text in view, with the same numbers.

  • cotlet_browser_selectchangeddescription, input schemameaning changed
    before

    Chooses an option of a drop-down list on the current page in the user's Milanote Cloud Browser, by the list's number in the element list and the option's label as read lists it (or its value). Returns the URL and title after it. Card fields and account pages are refused. Run browser steps one at a time and wait for each answer; steps sent together run in no set order. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

    after · 23% of words in common

    Chooses `option` (its label as listed, or its value) in drop-down `element`. For a home-made drop-down, click it, then click the option. Answers the page after it: the elements and text in view, with the same numbers.

  • cotlet_browser_fill_formadded

    Fills several fields in one step: text fields take text, drop-downs an option's label, checkboxes, radios and switches true or false. Stops at the first field that fails and names those filled. Does not send the form: click its button after. Answers the page after it: the elements and text in view, with the same numbers.

  • cotlet_browser_typechangeddescription, input schemameaning changed
    before

    Types text into a field of the current page in the user's Milanote Cloud Browser, by the field's number in the page's element list, and with `submit` presses Enter. Returns the URL and title after it. Password, card and one-time code fields and sign-in pages are refused: the user fills those in themselves. Run browser steps one at a time and wait for each answer; steps sent together run in no set order. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

    after · 31% of words in common

    Types `text` into field `element`, replacing what it held; `submit` presses Enter after it. For several fields use fill_form. Answers the page after it: the elements and text in view, with the same numbers. Password, card and one-time code fields are refused: the user types them.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 96 / 100

provenance85
liveness100
freshness100
hygiene100

+repository +dns-namespace +website +reachable +uptime-100% +updated-14d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

[email protected] PyPIthis version is not known to the dependency resolver

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://cotlet.dev/mcp/v1/milanote/connect streamable-httpoauth2 AS: https://cotlet.devyes100%632 ms–2026-11-07
https://cotlet.dev/mcp/v1/milanote streamable-httpapi_key ${MILANOTE_TOKEN}yes95%630 ms2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-052026-11-07
packageregistryversionruntimesecrets
milanote-api-mcppypi1.0.3uvx

Tools (60)

add_columndestructiveEmpty column on a board, to group cards in a stack. Adds a titled column on top of the board's Unsorted panel and returns its column_id; move_card with to_column_id puts cards into it. Editors of the board see it, nobody is notified.
add_commentdestructiveComment card on a board, or a reply in a comment thread, posted under your name. Without reply_to_id it adds a new comment card on top of the board's Unsorted panel; with it the comment joins that thread. Everyone who can open the board sees it under your name, and Milanote notifies people already in the thread. The text is plain: an @name stays text and tags nobody. Only you can edit or delete it afterwards, in Milanote. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.
add_labeldestructivePut a label on a card, creating the label when the name is new. Matches the name against your labels (list_labels) without regard to case; created is true when it made a new one. The card keeps its other labels. Editors of the board see the label on the card.
add_linkdestructiveLink card for a web address, with the page's title and preview, added to Unsorted. Adds one link card on top of the board's Unsorted panel. Milanote fetches the page itself and fills in the title, description and preview image, as when you paste a link; the answer returns what it found (title is null when the page gave none). On the free plan a link counts toward the 100 cards limit. Nobody is notified; move the card to the trash in Milanote to undo it.
add_notedestructiveNote card with plain text, added to a board's Unsorted panel. Adds one note card on top of the board's Unsorted panel and returns its card_id. The text is plain: line breaks become paragraphs, Markdown is not converted. On the free plan a note counts toward the 100 cards limit. Editors of the board see it, nobody is notified; move it to the trash in Milanote to undo it.
add_notesdestructiveUp to 15 note cards in one call, into Unsorted or a column, in the order given. Creates one note card per text, in the order given, on top of the board's Unsorted panel or of a column, and returns each card_id. The text is plain: line breaks become paragraphs, Markdown is not converted, any script (Chinese, Arabic, emoji) is kept. Each note counts toward the free plan's 100 cards limit; get_usage shows what is left. If Milanote stops partway, the answer is an error and the notes made before it stay on the board. Editors of the board see them, nobody is notified.
add_taskdestructiveAdd tasks to the end of an existing to-do list, each with an optional due date and time. Appends the tasks, unchecked, after the last task of the list and returns the whole list with the new task_ids. The tasks already there stay as they were. A due date without a time is due at 5 PM; Milanote reminds you at 9 AM the day it's due. Times are in the Cloud Browser's time zone. Nobody else is notified. To start a new list, use add_todo_list.
add_todo_listdestructiveTo-do list card with tasks, each with an optional due date and time, added to Unsorted. Creates one to-do list on top of the board's Unsorted panel with all its tasks, unchecked, and returns each task_id. A due date without a time is due at 5 PM; Milanote reminds you at 9 AM the day it's due, by the channels in your notification settings. Times are in the Cloud Browser's time zone. Nobody else is notified; move the list to the trash in Milanote to undo it.
cotlet_app_guideread-onlyHow to work in an app by clicking in the user's Cloud Browser with Cotlet's browser tools: which browser to use for this workspace and the sign-in link, the method step by step, the app's screens, menus and actions, notes, and the app's dedicated tools when Cotlet has them. Call it before the first browser step in an app. Works for any web app; one outside Cotlet's catalog gets the general method. Free, no browser session.
cotlet_appsread-onlyThe apps of the user's workspace and whether each works now: access granted or requested, the app account in the user's Cloud Browser (connected, signed out, signed in but not connected), and the one step the user has to take, with the console link. Free. Needs the user's Cotlet API key or sign-in.
cotlet_browser_clickdestructiveClicks element `element`, or point `x`, `y` of the screenshot; `double` double-clicks, `button: right` right-clicks. Answers the page after it: the elements and text in view, with the same numbers. Says when nothing changed. A link that would open a new tab opens in this one. Buttons that pay or buy, and sign-in and account pages, are refused.
cotlet_browser_closeEnds the browser session when the task is done: the browser keeps its cookies and sleeps, and the per-minute charge stops. Answers the session's minutes and credits.
cotlet_browser_downloaddestructiveGets the file that clicking `element` (a download link or button) or opening `url` starts: answers its name, type, size and a link valid 15 minutes; CSV, JSON and other text files also as text.
cotlet_browser_dragdestructiveDrags from one element or point to another: a card between columns, a piece on a board, a slider's handle. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_evaluatedestructiveRuns a JavaScript function body on the page and answers what it returns, as JSON. Use it to extract data the page holds (a table, a list, attributes); act with the other tools. It cannot send requests, click, submit, or read cookies or storage; a filled field's value reads [hidden by Cotlet]. Example: return [...document.querySelectorAll('h2')].map(h => h.innerText)
cotlet_browser_fill_formdestructiveFills several fields in one step: text fields take text, drop-downs an option's label, checkboxes, radios and switches true or false. Stops at the first field that fails and names those filled. Does not send the form: click its button after. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_findread-onlyFinds `text` on the whole current page, frames included: the elements whose label holds it, with their numbers, and each line of text that holds it. Use it instead of reading or scrolling a long page for one thing.
cotlet_browser_hoverread-onlyRests the pointer on an element or a point, to open a hover menu, a tooltip or a preview. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_navigateread-onlyOpens `url` in the current tab, or goes `history` back or forward. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_openread-onlyStarts the user's Milanote Cloud Browser (a real Chrome on Cotlet, signed in to Milanote as the user; use it for what the Milanote tools do not cover) and opens `url`. Call it first. Only Milanote pages open. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_pressdestructivePresses a key on the focused element: Enter to send, Tab to the next field, Escape to close a pop-up, arrows in a list or slider, or one character (a site's shortcut). Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_readread-onlyThe whole current page: its text (up to 20,000 characters) and a numbered list of its links, buttons, fields and other controls, open dialogs first. Use it on a new page or when a step's answer is not enough; `element` reads only inside one element (a dialog, a form, a list). Never returns field values, cookies or storage.
cotlet_browser_screenshotread-onlyA JPEG of the visible part of the page. Use it for boards, canvases, maps, charts and layout that the text does not show, then click or drag by `x`, `y` of the image.
cotlet_browser_scrollread-onlyScrolls with the mouse wheel: `down` or `up` by `screens`, to `top` or `bottom`, until `element` is in view, or inside a panel or list (`inside`). Content that loads on scroll appears. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_selectdestructiveChooses `option` (its label as listed, or its value) in drop-down `element`. For a home-made drop-down, click it, then click the option. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_typedestructiveTypes `text` into field `element`, replacing what it held; `submit` presses Enter after it. For several fields use fill_form. Answers the page after it: the elements and text in view, with the same numbers. Password, card and one-time code fields are refused: the user types them.
cotlet_browser_uploaddestructivePuts files into file field or upload button `element`: each file is {"url": "https://..."} or {"file_id": "..."} of a file uploaded to Cotlet; up to 10 files, 20 MB each. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_browser_waitread-onlyWaits until `text` shows on the page (at most `seconds`, default 5, up to 20), or just `seconds`: for results that load slowly. Says whether the text appeared. Answers the page after it: the elements and text in view, with the same numbers.
cotlet_get_callread-onlyStatus of an earlier Cotlet call, by its call_id: pending (waits for the owner's approval in the Cotlet console), approved, running, success, rejected, expired, blocked or failed. For a call that answered with status pending or running.
cotlet_report_issueSends a report to the Cotlet team: a tool that failed or returned wrong data, an error you could not get past, or a step the browser could not do, with the page, the step and what you saw. A missing dedicated tool is not a problem to report: do the task in the browser. A feature the user asks for goes as feature_request. A report promises nothing: tell the user it was sent, never that something will be built or fixed, or when. The report carries the error text and call_id when there is one, never passwords or tokens. Needs the user's Cotlet API key or sign-in.
cotlet_request_appsRequests access to apps for the user's workspace, as Request access in the console: every app is granted at once. Not needed to work in an app: the user's AI works in any web app in their Web browser with cotlet_app_guide. An app with dedicated tools gets them after the user signs in to it in their Cloud Browser. Access says nothing about whether a task works there: check that in the browser. Takes app slugs as listed at https://cotlet.dev/api/v1/apps. Free. Needs the user's Cotlet API key or sign-in.
cotlet_upload_fileReturns a one-time upload_url and a file_id for a local file (an image for a post, an attachment). The file is sent to upload_url with an HTTP PUT; an argument that takes a file accepts {"file_id": "..."}. Up to 25 MB, the URL works once. Free. Needs the user's Cotlet API key or sign-in.
cotlet_whoamiread-onlyThe Cotlet account this connection acts as: email, workspace, access status, the API key or OAuth client in use with its scope, the apps the workspace may call and its credit balance. Free. Needs the user's Cotlet API key or sign-in.
create_boarddestructiveNew board on your Home or nested inside another board. Creates an empty board and returns its board_id for the tools that add cards. It appears in the Unsorted panel of the parent board (your Home by default), where you can drag it onto the canvas. It is private unless the parent board is shared, in which case the parent's editors can open it; nobody is notified. Move it to the trash in Milanote to undo it.
delete_commentdestructiveDelete a comment you wrote, for everyone. Removes your own comment from its thread; the thread and other people's comments stay. There is no trash for comments, so it cannot be brought back. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.
duplicate_boarddestructiveCopy a board with everything on it, sub-boards included, as a template. Does what Duplicate in a board's menu does: Milanote copies every card, column, comment and sub-board into a new board and returns its board_id. The copy lands in the parent board's Unsorted panel, private to you unless that board is shared; the read-only link and editors are not copied. Every copied card counts toward the free plan's card limit (get_usage). card_count is what Milanote reports it copied.
edit_commentdestructiveReplace the text of a comment you wrote. Overwrites your own comment with plain text, as Edit then Save does in the thread. Others' comments cannot be changed. People who already read it get no new notification.
edit_notedestructiveReplace the text of a note card. Overwrites the whole note with plain text: line breaks become paragraphs, and bold, links or lists the note had are lost. Only note cards; to-do lists change with set_task_done. Editors of the board see the change at once; Milanote's undo in the app does not reach it.
export_boardread-onlyExport a board as Markdown, plain text, Word, PDF or PNG, as the Export menu does. Runs Milanote's own export of one board. markdown and plain_text return the text in content; word, pdf and png return only file_url. Text formats follow the board's reading order and leave out comments and sub-board contents; pdf and png are a picture of the canvas. Anyone with file_url can download the file, and Milanote deletes it after about a day.
get_boardread-onlyEvery card on a board: notes, links, images, files, to-do lists, columns and sub-boards. Returns one entry per card with its type, ID and content, so other tools can point at it. Order is the board's: the canvas top to bottom, then the Unsorted panel (section says which). Notes come back as plain text. To-do lists list each task with its done state and due date (due_time only when one was set). Cards inside a column carry column_id; color and labels (by name) appear when a card has them. Sub-boards appear as cards with their own board_id; call get_board again to open one. Drawings, lines and tables come back with their type and ID only. include_comments adds comment threads with author, text and time.
get_sharingread-onlyWho can open a board: owner, editors and the read-only link with its settings. Lists the board's owner and the editors invited to it; status is invited for someone who has not made a Milanote account yet. Editors of a parent board can open it too and are not listed here. read_only_link is null until publish_board turns the link on; comments_on_link and downloads_on_link say what viewers of that link may do.
get_usageread-onlyHow many cards your account uses against the free plan's limit, by card type. used is what Milanote counts toward the free plan's limit (100 cards, more with referral bonuses); once exceeded is true Milanote refuses new cards until you delete some or upgrade. On a paid plan unlimited is true and limit is null. by_type counts each kind of element you made, comments and lines included; Milanote decides which of them count toward used.
invite_editordestructiveInvite someone by email to edit a board and the boards inside it. Adds the address as an editor, as Share, Invite editors via email does, and Milanote emails them a link. status is invited when they have no Milanote account yet (a free one is enough to edit), active when they do. Milanote allows inviting only once your account's email is verified; the free plan limits how many boards you can share. Remove them in the Share dialog to undo it. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.
list_boardsread-onlyBoards inside one board, by default the boards on your Home, with title, ID and link. Lists the boards one level down: on your Home, or inside parent_board_id. Boards nest like folders, so pass a board's id as parent_board_id to walk down. Order is the board's own: the canvas top to bottom, then Unsorted. parent_board_id in the answer is the Home board's id when you left it out. Boards in the trash are left out.
list_labelsread-onlyThe labels you can put on cards, with name and colour. Labels are yours, not a board's: the same label can sit on cards across all your boards. add_label puts one on a card by name and creates it when it is new.
list_recent_boardsread-onlyBoards you opened lately, newest first, wherever they sit in your board tree. The list behind Milanote's search box before you type: every board you viewed, shared ones too, with when you last opened it and how many times. Home and Quick notes appear like any other board. Boards you have not opened since they were made are missing; list_boards walks the tree instead.
list_tasksread-onlyEvery task in the to-do lists of your boards and the boards inside them, with due dates. Walks down from Home, or from board_ids, through every board inside, and returns each task with its board, to-do list, text, done state and due date (due_time only when one was set). Reads up to 100 boards; boards_read says how many it read. Order is the boards' own: a board's lists top to bottom, then the boards inside it. done filters open or done tasks. Use set_task_done, set_due_date and add_task with the board_id and card_id it returns.
list_trashread-onlyCards and boards you moved to the trash, with the board each one came from. Lists your own trash, newest first: one entry per trashed card or board with its ID, content and board_id of the board it was on. restore_card puts one back where it was. Milanote keeps trashed items until you empty the trash in the app; has_more is true when it holds more than one page.
move_carddestructiveMove a card or a sub-board to another board, or into or out of a column. Moves it the way drag and drop does, keeping its ID, comments and content. With to_column_id it goes to the top of that column; without it, to the top of the target board's Unsorted panel. Moving a board moves everything inside it. Moving to a board shared with other people shows it to them.
publish_boarddestructiveTurn on a board's read-only link, which anyone can open without signing up. Does what Share, Enable read-only link does and returns the link. Anyone who has it sees the board and the boards inside it, without a Milanote account. A board keeps one link: publishing again, even after unpublish_board, brings back the same link with these settings. unpublish_board turns it off. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.
remove_editordestructiveTake away someone's access to a board, or cancel an invite they have not accepted. Removes one editor, by user_id or email, as the Share dialog's Remove does. They lose the board and the boards inside it unless a parent board is shared with them too; Milanote does not tell them. The owner cannot be removed. invite_editor adds them back. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.
rename_boarddestructiveChange a board's title. Renames the board everywhere it shows: its card on the parent board, the breadcrumb and search. The board_id and the links to it stay the same. Your Home cannot be renamed.
restore_carddestructiveTake a card or board out of the trash and put it back where it was. Puts it back on the board, and in the column, it was trashed from, at its old place; a restored board comes back with its contents. column_id is set when it went back into a column. Only items in your own trash, as list_trash shows them.
search_boardsread-onlyFind boards and cards by text across your boards, like the Search icon in Milanote. Runs Milanote's own search over every board you can open. Each result is a board, with the cards on it that matched (matches) and the boards above it (path). A board whose title matched has no matches. Sorted by when you last viewed the board, or last modified. Returns Milanote's first page of boards; use get_board on a result to read all its cards.
set_card_colordestructiveColour the bar on top of a note, to-do list, link, file or column, or clear it. Sets one of Milanote's eleven card colours, as the Color tool does; none removes it. Boards and images take no colour here. Editors of the board see the change at once.
set_due_datedestructiveSet, change or remove the due date of one task in a to-do list. Finds the task by task_id or by its exact text and sets its due date, or removes it when due_date is null. A date without a time is due at 5 PM; Milanote reminds you at 9 AM the day it's due. Times are in the Cloud Browser's time zone. The task's text and done state stay as they were. Returns the whole list after the change. When two tasks share the text, pass the task_id instead.
set_task_donedestructiveTick or untick one task in a to-do list. Finds the task by task_id or by its exact text and sets it done or not done, as clicking its checkbox does; the rest of the list stays as it was. Returns the whole list after the change. When two tasks share the text, pass the task_id instead.
trash_cardsdestructiveMove cards or sub-boards to the trash, as the Delete key does. The cards leave the board for everyone who can see it, and a trashed sub-board takes its contents with it. Nothing is gone for good: list_trash shows them and restore_card puts one back where it was, until the trash is emptied in Milanote. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.
unpublish_boarddestructiveTurn off a board's read-only link; people who had it can no longer open the board. Does what switching off Share, Enable read-only link does. Editors keep their access. publish_board turns the same link back on, so anyone who kept it can open the board again. was_published is false when the board had no link.
upload_imagedestructiveImage card from a PNG, JPEG, GIF or WebP file, added to a board's Unsorted panel. Uploads one image per call, as Upload in Milanote does, and returns its card_id and size. The file goes in as a file argument (a link, an upload or base64), up to 10 MB; the extension of the name follows the real file type. The image_url opens only for people signed in to Milanote who can see the board. On the free plan an image counts toward the 100 cards limit and uploads are limited too. Nobody is notified; move the card to the trash in Milanote to undo it.

Schemas: list_tools.

Similar MCP servers

More from dev.cotlet

And 5 more from this publisher.

Official server.json
{
  "name": "dev.cotlet/milanote",
  "icons": [
    {
      "src": "https://cotlet.dev/icon-512.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "Milanote by Cotlet",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://cotlet.dev/mcp/v1/milanote/connect",
      "type": "streamable-http"
    },
    {
      "url": "https://cotlet.dev/mcp/v1/milanote",
      "type": "streamable-http",
      "headers": [
        {
          "name": "Authorization",
          "isSecret": true,
          "isRequired": true,
          "description": "Bearer followed by your Cotlet API key (cotlet.dev → API keys)"
        }
      ]
    }
  ],
  "version": "1.0.2",
  "packages": [
    {
      "version": "1.0.3",
      "transport": {
        "type": "stdio"
      },
      "identifier": "milanote-api-mcp",
      "runtimeHint": "uvx",
      "registryType": "pypi",
      "packageArguments": [
        {
          "type": "positional",
          "value": "mcp"
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/cotletdev/milanote-api-mcp-server",
    "source": "github"
  },
  "websiteUrl": "https://cotlet.dev/integrations/milanote-api-mcp-server",
  "description": "Boards, notes and links in your Milanote workspace."
}