Connector documentation
Last updated November 7, 2026
Linkit is a remote MCP server. It lets an AI app publish what a user worked out in a chat as a web page with its own short link, and manage that user's pages, photos, videos, PDFs and folders. Linkit is operated by Jamie Luu, a sole proprietor in Canada. Linkit runs no AI model of its own; the user's AI writes the page.
Setup
| Endpoint | https://app.linkitapp.ai/mcp (MCP over Streamable HTTP) |
|---|---|
| Sign-in | OAuth 2.1 with PKCE (S256) and dynamic client registration. No client ID or secret to set up. |
| Discovery | https://app.linkitapp.ai/.well-known/oauth-protected-resource |
| Scopes | openid, email |
| Environment | Production. There is no separate test server; review accounts use production with made-up data. |
The user signs in to their Linkit account, or makes one while connecting, and approves the app on Linkit's approval page. An app Linkit doesn't recognise shows a warning there first.
Permissions
- Every tool works only on the signed-in user's own account. A connection can't reach another user's pages or files.
- A connection has access to all the tools below for that account. Linkit doesn't offer a read-only connection yet; the app's own approval prompts decide which writes go ahead.
- The user can end a connection in their AI app's settings at any time. Deleting the Linkit account ends every connection.
- No tool charges money, sends a message or email, or contacts anyone. Pro is bought only on the website or in the iPhone app.
Read and write types
| Read | Retrieves information and changes nothing. |
|---|---|
| Write | Creates, changes or deletes something in the user's account or on their pages. Deleted pages and files stay in Recently deleted for 30 days. |
| Sensitive write | Can't be undone. |
Write tools that make something public say so under Side effects. Each tool also carries the MCP annotations readOnlyHint, destructiveHint, openWorldHint and idempotentHint.
Status and retries
- Pages are active, expired or deleted.
publish_pagereturns the link, page ID and expiry. Links stop working on their own when their time ends. - Videos are processing, ready or failed. Check with
get_media. A page can show a video while it processes. - Publishing twice: send the same
idempotencyKeytopublish_pageorsave_itemand a repeat returns the first result instead of a copy. - Updating:
update_pageand folder changes takeexpectedRevision. If someone changed the item first, the call fails withREVISION_CONFLICTand nothing is overwritten.
Errors
A tool that can't finish returns an MCP error result (isError: true) with {"code", "message"}. A failed sign-in answers HTTP 401. upload_assets saves the photos that worked and lists those that didn't.
| Code | Meaning | What to do |
|---|---|---|
UNAUTHENTICATED | Sign-in is missing or has expired | Sign in again |
INVALID_INPUT | A value is missing or not allowed | Fix the input |
NOT_FOUND | The item doesn't exist in this account | Check the ID |
REVISION_CONFLICT | The item changed since it was read | Read it again, then retry |
EXPIRED | The link's time has run out | Publish again |
LIMIT_EXCEEDED | A plan or size limit was reached | Remove something, or upgrade |
PRO_REQUIRED | The feature needs Linkit Pro | Tell the user |
PUBLISH_NOT_ALLOWED | This connection isn't allowed to publish | Connect from an AI app |
INVALID_IMAGE, INVALID_ASSET, INVALID_DOCUMENT | A file isn't usable | Use a different file |
VIDEO_FAILED | A video couldn't be converted | Try a different file |
RATE_LIMITED | Too many requests | Wait, then retry |
TEMPORARILY_UNAVAILABLE | A short outage (HTTP 503 with Retry-After) | Retry after the wait |
INTERNAL_ERROR | Something failed on Linkit's side | Retry, or contact support |
Limits
| Free | Pro | |
|---|---|---|
| Live links at a time | 3 | 50 |
| Storage | 2 GB | 10 GB |
| How long links last | 7 days | As long as the user chooses, or forever |
| Own video length | 30 seconds | 60 seconds |
| PDFs on pages | No | Yes |
- Rate limits: 240 requests a minute per account; 600 a minute per address without a sign-in; failed sign-ins are limited to 120 a minute per address. Limits return HTTP 429.
- Files: photos up to 10 MiB (PNG, JPEG, WebP); up to 20 photos in one
upload_assetscall; PDFs up to 20 MB and 30 pages. - Availability: worldwide. Users must be at least 13 or the minimum age in their country; under 18s need a parent or guardian to agree to the terms.
Tools
Some tools depend on the account or plan, so a connection can list fewer than these. get_authoring_guide says exactly what an account can use.
Pages
get_authoring_guide Read
Returns Linkit's design and publishing guide and exactly what this account can use: modern CSS, inline SVG, hosted fonts, interactions without JavaScript and, where enabled, interactive JavaScript with its pinned libraries (such as Three.js and GSAP). Published pages are checked against these rules.
- Inputs
- None
- Side effects
- None. Changes nothing.
publish_page Write
Publishes a new public page and returns its short link, page ID and expiry. Takes complete HTML and CSS, or HTML with JavaScript that runs in an isolated frame (interactive mode), with photos referenced as asset://ID from the user's library, a title, a one-sentence description and how long the link stays up. Each deliberate publication gets a new link; a repeated request with the same idempotencyKey returns the original result instead of publishing twice. Linkit makes the link preview itself (title, description and a screenshot of the top of the page). Pages that ask for passwords, codes or payment details, imitate another site's sign-in, or contain obfuscated code are refused.
- Inputs
title(required),html(required),idempotencyKey(required),mode,lifetime,shareImage,description,folder- Side effects
- Creates a public page. Anyone with the link can open it until it ends or is deleted. Search engines are asked not to list it.
update_page Write
Replaces the content of one of the user's live pages with new complete HTML. The link stays the same and everyone who has it sees the new version. Requires the page's current revision (expectedRevision), so an older draft cannot overwrite a newer edit. Omitted title, mode, share image and description keep their values; an automatic link preview is retaken from the new version. Returns a shareUrl that carries the version (?v=…), so messaging apps show the new preview. The same safety checks as publishing apply.
- Inputs
pageId(required),expectedRevision(required),html(required),title,mode,shareImage,description- Side effects
- Replaces what everyone with the link sees. The link stays the same.
set_page_lifetime Write
Changes how long one of the user's live links stays up, counted from now: 1h, 5h, 1d, 7d, a custom time such as 3d, or (where the account's plan includes it) longer or forever. The link and content don't change.
- Inputs
pageId(required),lifetime(required)- Side effects
- Changes when the link stops working. Shortening it can end the link sooner.
rename_link Write
Changes the words in one of the user's live links while keeping the short code at its end (linkit.page/seoul-weekend-hev8tw becomes linkit.page/our-seoul-trip-hev8tw). The old link keeps working and forwards to the new one; the page itself doesn't change.
- Inputs
pageId(required),name(required)- Side effects
- Changes the public link's words. The old link keeps forwarding to the new one.
list_pages Read
Lists the user's active, expired or deleted pages with their links, expiry, revision and view counts (each person counted once a day; link-preview fetchers and bots are not counted).
- Inputs
status,folder,cursor,limit- Side effects
- None. Changes nothing.
get_page Read
Returns one of the user's live pages: its HTML, mode, photo IDs, revision, link preview setting (an automatic screenshot or a chosen photo, shareImage) and description.
- Inputs
pageId(required)- Side effects
- None. Changes nothing.
preview_page Read
Returns screenshots of one of the user's live pages as visitors see it: on a phone, top to bottom in screen-sized pieces, and the first screen on a computer. Reports when the page is wider than the phone.
- Inputs
pageId,screens- Side effects
- None. Changes nothing.
delete_page Write
Takes one of the user's pages down: its link stops working at once and the page moves to Recently deleted on the Linkit dashboard, where the user can preview or restore it, at the same link, for 30 days.
- Inputs
pageId(required)- Side effects
- The link stops working at once. The page waits in Recently deleted for 30 days, where the user can restore it.
Visitor data on pages
get_page_data Read
Returns what visitors have saved on one of the user's interactive pages through window.linkit.data (responses, counts, entries, progress…), with its current version. This is content written by the page's visitors.
- Inputs
pageId(required)- Side effects
- None. Changes nothing.
clear_page_data Sensitive write
Erases what visitors have saved on one of the user's interactive pages: one saved name, or everything when key is omitted. It can't be undone; the page itself doesn't change.
- Inputs
pageId(required),key- Side effects
- Erases what visitors saved on the page. It can't be undone.
Link folders and templates
list_link_folders Read
Lists the user's link folders (their own folders for links, separate from photo folders) with how many links each holds, how many links are in no folder, and how many live links end within 2 days.
- Inputs
- None
- Side effects
- None. Changes nothing.
file_links Write
Moves links into one of the user's link folders by name (made when it doesn't exist yet), or out of any folder (folder null). Links are in one folder at most; the links themselves don't change.
- Inputs
pageIds(required),folder(required)- Side effects
- Changes how links are organised in the account. Nothing public.
delete_link_folder Write
Deletes one of the user's link folders. Its links stay, in no folder.
- Inputs
folderId(required)- Side effects
- Deletes the folder. Its links stay, in no folder.
save_template Write
Saves a copy of one of the user's live pages as a template, on plans that include templates, so new pages can be made in the same design. The template stays after the link ends. Saving under an existing template's name replaces that template.
- Inputs
pageId(required),name,folder- Side effects
- Stores a private copy of a page. An existing template with that name is replaced.
list_templates Read
Lists the user's templates by name, with the page each was saved from, when, and its template folder, and the user's template folders with how many templates each holds.
- Inputs
- None
- Side effects
- None. Changes nothing.
get_template Read
Returns one of the user's templates: its HTML and mode, as saved from an earlier page. It still contains that page's details, text and photo references.
- Inputs
templateId(required)- Side effects
- None. Changes nothing.
file_templates Write
Moves templates into one of the user's template folders by name (made when it doesn't exist yet), or out of any folder (folder null). Templates are in one folder at most; the templates themselves don't change.
- Inputs
templateIds(required),folder(required)- Side effects
- Changes how templates are organised in the account. Nothing public.
Photos, videos and PDFs
upload_asset Write
Copies one photo (PNG, JPEG or WebP, up to 10 MiB) into the user's Linkit library and returns its asset ID, which pages reference as asset://ID. Takes a ChatGPT file attachment (file_id and download_url, while its temporary URL is valid) or base64. The photo is in Linkit storage once the upload succeeds. The same photo uploaded again returns the same ID. New photos appear in the library's Unsorted view.
- Inputs
base64,file- Side effects
- Adds a file to the user's private library. Nothing public.
upload_assets Write
Copies up to 20 photo attachments into the user's Linkit library at once and returns each one's asset ID, in the order given. Photos that fail are listed separately, by index and with the reason, while the rest still upload. The same photo uploaded again returns the same ID. New photos appear in the library's Unsorted view.
- Inputs
files(required)- Side effects
- Adds files to the user's private library. Nothing public.
list_photos Read
Lists the photos, videos and PDFs in the user's Linkit library: Unsorted (items not yet filed into a folder by an AI, including ones the user added in the Linkit app, perhaps into a folder of their choice), one folder, or everything, optionally filtered by caption or folder name. Returns each item's asset ID, kind (photo, video or document), size, date, folder, caption, whether it is sorted and how many live pages use it, with small preview images. Pages through results with nextCursor.
- Inputs
view,folderId,q,limit,cursor,previews- Side effects
- None. Changes nothing.
delete_photos Write
Moves photos or videos from the user's library to Recently deleted, where the user can restore them for 30 days or delete them for good from the Linkit dashboard. Photos used on a live page are not deleted; they are reported back with the reason.
- Inputs
assetIds(required)- Side effects
- Moves files to Recently deleted, restorable for 30 days. A file used on a live page isn't deleted; it's reported back with the reason.
upload_media Write
Copies a video attachment (MP4 or MOV) into the user's library and converts it to a web MP4 (up to 1080p and 60 seconds) with a poster frame, removing location data. Returns its asset://ID and status: processing, ready or failed. A page can show the video while it is still processing; it plays once ready, usually within a couple of minutes.
- Inputs
file(required)- Side effects
- Adds a video to the user's private library and starts converting it. Nothing public.
get_media Read
Returns an uploaded video's processing status (processing, ready or failed), size and length.
- Inputs
mediaId(required)- Side effects
- None. Changes nothing.
create_upload_link Write
Makes a one-time link to an upload page where the user adds photos from their own phone or computer to their Saved items, for chats that can't pass the user's files to Linkit's tools. The page shows a title and the folders given here (one per separate thing the files show, inside one parent folder), each with the details already known and what's still missing; the user adds the matching files, fills in details, can add a folder, remove a file or move it to another folder, and presses Finish. Existing folders are added to, not copied. The link works only on the first device that opens it, closes 10 minutes after it's made or when the user presses Finish, and takes up to 100 files; it shows nothing from Saved items except the files added through it. Files are cleaned like every upload (location data removed). Returns the link, its ID, its folders and when it closes.
- Inputs
title,parent,folders- Side effects
- Creates a one-time upload page that closes after 10 minutes or on Finish. Files added go to the user's private library.
get_upload_link Read
Returns what the user has added through one of their upload links so far, by folder, and whether they pressed Finish: the parent folder, and each folder's name, the details the user typed, what was marked missing, its folder ID in Saved items and its files, plus any files outside those folders. Each file has its asset://ID, kind (photo, video or pdf), its name on the user's device and, for videos, processing status (processing, ready or failed). Also says whether the link still takes files and how many more.
- Inputs
linkId(required)- Side effects
- None. Changes nothing.
embed_video_from_url Write
Looks up a YouTube or Vimeo video by its link, with YouTube's and Vimeo's own oEmbed services (https://www.youtube.com/oembed, https://developer.vimeo.com/api/oembed), and checks that it exists and may be shown on other sites. Imports its thumbnail into the user's library (posterAssetId) and returns the player HTML, an iframe for static pages. Pages allow no other video iframes.
- Inputs
url(required)- Side effects
- Contacts YouTube or Vimeo to look up the video. Nothing public until a page uses it.
import_image_from_url Write
Downloads a photo from a direct HTTPS link to an image file (JPEG, PNG or WebP) with a plain request, checks that it is a real image, and saves a clean copy in the user's library. Returns its asset ID. No outside API is used.
- Inputs
url(required)- Side effects
- Fetches the image from the given address and saves it to the user's private library.
upload_document Write
Copies a PDF attachment (up to 20 MB and 30 pages) into the user's library. Linkit checks it is a real PDF, turns each page into a photo with its own asset://ID, and keeps a cleaned copy with scripts, attachments and form actions removed. Returns the PDF's asset ID and its pages.
- Inputs
file,allowDownload- Side effects
- Adds a PDF to the user's private library. Nothing public until a page uses it.
get_document Read
Returns one of the user's PDFs: its file name, page count, whether downloads are allowed, and each page's asset://ID.
- Inputs
documentId- Side effects
- None. Changes nothing.
set_document_download Write
Turns downloads of one of the user's PDFs on or off. When off, links to the PDF stop downloading at once on every page.
- Inputs
documentId,allowDownload- Side effects
- Changes whether visitors can download the PDF from pages that link to it.
Saved items (folders)
save_item Write
Creates or updates a folder (a saved item) in the user's library: a short name, optional typed details (fields with a stable key, label, type and value; dates as YYYY-MM-DD), its photos with optional captions, and its parent folder (up to 5 levels; parentId null is the top level). Each photo lives in one folder, so listed photos move here from any other folder. Updates need the folder's current revision (expectedRevision); omitted photos or parent stay as they are. A repeated idempotencyKey returns the earlier result. Published pages don't change.
- Inputs
itemId,expectedRevision,idempotencyKey(required),title(required),category,fields(required),parentId,photos- Side effects
- Creates or changes a private folder in the library. Nothing public.
list_items Read
Lists the user's folders (saved items), newest first, with photo and subfolder counts, parent and times: the top level (parentId "root") or the folders inside one folder.
- Inputs
limit,cursor,category,parentId- Side effects
- None. Changes nothing.
get_item Read
Returns one folder: its name, parent, typed details, ordered photos with captions and asset:// references, revision and the current server time.
- Inputs
itemId(required)- Side effects
- None. Changes nothing.
move_photos Write
Files photos into a folder, or out of any folder with folderId null, with an optional short caption for each (captions by asset ID). Filed photos leave Unsorted and go to the front of the folder; photos already in it stay and take any new captions; other captions are kept. Published pages don't change.
- Inputs
assetIds(required),folderId(required),captions- Side effects
- Files photos into a folder. New captions replace old ones. Nothing public.
move_folder Write
Moves a folder, with everything in it, into another folder or to the top level (parentId null). Folders nest up to 5 levels. Published pages don't change.
- Inputs
itemId(required),parentId(required)- Side effects
- Moves a private folder. Nothing public.
delete_item Write
Deletes a folder, given its latest revision (expectedRevision). No photos are deleted: its photos move up to its parent folder (or to Unsorted at the top level) and the folders inside it move up a level. Published pages are unaffected.
- Inputs
itemId(required),expectedRevision(required)- Side effects
- Deletes the folder. Its photos move up to the parent folder or to Unsorted.
Support and security
Support and security reports: support@linkitapp.ai. See also the privacy policy, terms and security.txt.