Milanote automation
Save links and images to a Milanote moodboard with AI
References arrive all week from a Slack thread, a client email, a folder of screenshots and forty browser tabs. On Friday you open the Brand refresh moodboard in Milanote and paste them in one Link card at a time, and half of them never make it.
Cotlet does it in your own Milanote account with list_boards, get_board, add_link and upload_image, called by your AI agent, an n8n workflow or a script.
Hosted · nothing to install or maintain
Official options
Can Milanote do this on its own?
Milanote has no API for adding links or images (checked 12 Oct 2026). Its own tools are the Link card, the Add Image button with multi-select, drag and drop, and the Web Clipper for Chrome, Safari and Firefox, all used by hand while the board is open. None of them takes a list of URLs from a chat or a document, and none checks the board for duplicates.
By hand
How you do it in Milanote today
- Open the board in Milanote, drag a Link card out of the left-hand toolbar, paste the URL and press Enter; Milanote then fetches a preview image and a description for that one card.
- Repeat the Link card for every reference, because a Milanote Link card holds a single URL and the help center describes no way to paste a list of them at once.
- For screenshots, click Add Image in the Milanote toolbar and select several files; they land in the board's Unsorted column, and you drag each one onto the canvas from there.
- The Milanote Web Clipper saves an image through the Save button on that image, or highlighted text through Save to Milanote, and the arrow next to Save to Home only offers your ten most recently viewed boards.
- Nothing in Milanote warns you that a link is already on the board, so repeated references pile up, and the leftovers in a chat thread are the ones that get lost.
With an agent
How to save links and images to a Milanote moodboard with AI
Prompt
Here are the references from this week: 12 links from our Slack thread and the screenshots in ./refs. Put them on the Moodboard sub-board of Brand refresh, skip anything already there, and tell me what did not fit. - 01
Find the exact board, not just the name
The agent walks list_boards from the top level and passes parent_board_id to reach a sub-board such as Brand refresh > Moodboard. When two boards share a title, it shows both parents and asks which one you mean before adding anything.
- 02
Read the board first
get_board lists the cards already on the moodboard. The agent compares URLs after dropping tracking parameters such as utm_source, and skips any reference that is already there instead of adding a second copy.
- 03
Link or picture
Web pages, YouTube or Vimeo videos and Dribbble shots go in with add_link, since Milanote builds a preview for them. Local screenshots go in with upload_image, one card each, under their own file names so they stay recognizable.
- 04
Check sizes before uploading
Screenshots over 10 MB, the free-plan image limit, are listed before anything is sent, and the agent asks whether your account is on Pro, where the limit is 100 MB. File types Milanote does not accept as images are reported, not converted.
- 05
Stop cleanly at the cap
If Milanote stops accepting new cards, as it does on a free account at 100 cards, the agent stops at that card and returns the references that did not get in, so nothing is silently dropped.
What you get back
Example data
Board: Brand refresh > Moodboard (b_7Kq2Lm).
Added 9 link cards, including the Pentagram case study and 2 Vimeo reels.
Uploaded 6 screenshots from ./refs as image cards.
Skipped 3 links already on the board (same URL without utm tags).
Held back hero-final.tif, 14 MB, over the 10 MB image limit of a free account. Other ways to ask
- Every Friday at 5 pm, take the links I starred in the #inspiration channel this week and add them to my Moodboard board.
- Make a new board called Packaging refs inside Client A and put these 20 product links and the images in ./packaging on it.
- Add only the Vimeo and YouTube links from this doc to the Motion references board, and leave the rest out.
Before you automate it
What Milanote allows, and what to know first
- Milanote caps a free account at 100 cards and 10 file uploads in total, and notes and images count as cards.
- Milanote accepts images up to 10 MB each on the free plan and up to 100 MB each on Pro.
- Milanote builds rich previews for links from YouTube, Vimeo, TED, SoundCloud, Google Maps, Dribbble, Instagram, Airtable and a few other services named in its help center.
add_link and upload_image change only your own Milanote data and reach no one else, so they run without asking first.
Sources: Milanote Help: Links · Milanote Help: Images · Milanote Help: File upload limits on Free and Pro · Milanote Help: Web Clipper for Chrome
REST
Call add_link from a script
curl
curl https://cotlet.dev/api/v1/milanote/add_link \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"board_id":"b_7Kq2Lm","url":"https://example.com/type-specimen"}' Example response
{
"card_id": "c_77sW",
"board_id": "b_7Kq2Lm",
"type": "link",
"title": "Type specimen",
"url": "https://example.com/type-specimen",
"board_url": "https://app.milanote.com/b_7Kq2Lm"
} MCP: add https://cotlet.dev/mcp/v1 with the same key; the tool is milanote_add_link. Example data.
Schedule it in n8n, Make, Zapier or cronTools
Milanote tools this automation uses
| Tool | Parameters |
|---|---|
| list_boards | parent_board_id, limit |
| get_board | board_id, include_comments |
| add_link | board_id, url |
| upload_image | board_id, file_base64, file_name |
Frequently asked questions
Give your agent access to Milanote.
Free 7-day trial with 5,000 credits, no card needed. Cotlet is independent and not affiliated with Milanote.