linkding-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@linkding-mcp find my bookmarks tagged rust from the past month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
linkding-mcp
An MCP (Model Context Protocol) server that connects AI assistants to a self-hosted Linkding bookmark manager through its REST API. It has 26 tools for bookmarks, tags, bundles, assets, and the user profile. Writes are dry-run previews unless you confirm them and enable writes. It runs over stdio, or over stateless Streamable HTTP on localhost.
Connects to: your own Linkding instance, using a Linkding API token.
By Issah Abubakari (@si-essence). Also listed on Bot Essentials.
Linkding is MIT software. There is no hosted service and no separate terms of use. This connector does not grant any right to Linkding's name or to imply that the Linkding project endorses it.
Works with Linkding, not affiliated with or endorsed by the Linkding project.
Requirements
Node.js 20 or newer (CI uses Node.js 22)
npm
Related MCP server: bookmark-lens
What this covers
This connector covers the bookmark, tag, bundle, asset, and profile resources in the Linkding API, including archive, update, delete, URL check, bundles, asset upload and download, and a changes-since sync. Writes stay as a dry-run until you pass confirm: true, and they stay off unless LINKDING_ALLOW_WRITES is the literal true.
POST /api/bookmarks/singlefile/ is the browser extension snapshot upload. It is not a tool here. Use linkding_upload_asset for a file you already have, and linkding_create_bookmark for the URL.
Setup
From a clone of this repository:
npm ci
npm run ci
npm start
npm run start:httpnpm start speaks stdio. npm run start:http serves Streamable HTTP at http://127.0.0.1:3000/mcp and GET /health. HTTP mode has no authentication. Keep it on localhost.
{
"mcpServers": {
"linkding": {
"command": "node",
"args": ["/path/to/linkding-mcp/dist/index.js"],
"env": {
"LINKDING_URL": "http://127.0.0.1:9090",
"LINKDING_API_TOKEN": "...",
"LINKDING_ALLOW_WRITES": "false",
"LINKDING_CONTACT": "you@example.com"
}
}
}
}Create the API token in Linkding under Settings, Integrations. The connector sends it as Authorization: Token <token> and never prints it.
Docker (HTTP, no authentication, localhost only):
docker build -t linkding-mcp .
docker run -p 3000:3000 \
-e LINKDING_URL=http://host.docker.internal:9090 \
-e LINKDING_API_TOKEN=... \
linkding-mcpDo not put the token in the image.
Tools
Tool | Call |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Active and archived lists filtered by |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Download. Small text is returned. Binary and large files return metadata only |
|
|
|
|
|
|
List tools return count, results, and next and previous as { path, offset, limit }. The origin is removed so a next link cannot be followed off LINKDING_URL.
linkding_changes_since does not report deletions. Linkding has no deletion feed.
Environment
Variable | Default | Role |
|
| Linkding origin. No userinfo, query, or hash |
| unset | Required for an upstream call. At least 8 characters. Never printed |
| off | The literal |
|
| Contact inside the User-Agent. Must not contain the token |
|
| Local sliding-window cap |
|
| TTL for successful reads. |
|
| Upstream timeout |
|
|
|
|
| HTTP listen port |
Invalid values are reported by field name and issue code. The rejected value is not included.
Safety
A write tool returns a dry-run preview when confirm is omitted. The preview is the method, path, query, and body that would be sent.
confirm must be the boolean true. false and the string "true" are rejected.
When confirm is true and LINKDING_ALLOW_WRITES is not true, the tool still returns the preview, sets blocked to true, and does not call Linkding.
Creating a bookmark silently updates an existing bookmark with the same URL. Linkding may change that later. Check the URL first with linkding_check_bookmark_url when you need to know.
Linkding merges auto-tagging rules into tag_names on every bookmark update, including when the request omits tag_names. Creating a tag returns the existing tag when the name is already there.
The token is removed from tool results, error text, and logs, including its URL-encoded form. It is refused in the query string, the base URL, the User-Agent, and a JSON request body.
Limits
A cache hit does not spend the local rate limit. The cache is dropped when the process exits, and a successful write clears it.
When the local window is full, the tool returns
isErrorwith a[rate-limited]message. Cached results are still served.HTTP 401 and 403 are
[unauthorized]. HTTP 404 is[not-found]. HTTP 400 and 422 are[invalid-input]. HTTP 429 is[rate-limited]. Timeouts are[timeout]. Other upstream failures are[upstream-unavailable].Response bodies larger than 1,000,000 characters are rejected.
Asset downloads include text only when the content type is textual and the body is at most 32,000 bytes. Otherwise the tool returns content type, length, and filename.
Uploads read a local file up to 8 MB.
Requests send
linkding-mcp/0.1.0 (<LINKDING_CONTACT>).
TypeScript 6 is intentional. typescript-eslint strict type-aware rules need the JavaScript compiler API, which TypeScript 7 does not ship.
Running the tests
The tests use mocked upstream responses. They need no API key and make no network calls to Linkding.
npm ci
npm test # unit and tool tests (vitest)
npm run ci # typecheck, lint, tests, and buildAt the time of this commit, npm test reports 41 passing tests.
node scripts/live-check.mjs (after npm run build) runs the tools against a real instance set in LINKDING_URL and LINKDING_API_TOKEN. It creates and deletes test bookmarks, so use a test instance.
Author
Issah Abubakari (@si-essence).
This connector is also listed on Bot Essentials.
Licence
MIT. See LICENSE.
Available Tools
26 toolslinkding_archive_bookmarkAIdempotent
Archive a bookmark. POST /api/bookmarks//archive/. Omit confirm for a dry-run.
Inputs: id (required), confirm.
linkding_changes_sinceARead-only
List bookmarks added or modified after a timestamp. Follows next offsets up to max_pages across active bookmarks, archived bookmarks, or both. Deleted bookmarks are not included.
Inputs: since (required), field, limit, scope, +1 more.
linkding_check_bookmark_urlARead-only
Check whether a URL is already bookmarked. GET /api/bookmarks/check/. Also returns scraped metadata and auto_tags that Linkding would add.
Inputs: url (required), ignore_cache.
linkding_create_bookmarkA
Create a bookmark. POST /api/bookmarks/. Linkding silently updates an existing bookmark when the URL already exists, and it merges auto-tagging rules into tag_names. Omit confirm for a dry-run. confirm true sends the write only when LINKDING_ALLOW_WRITES is true.
Inputs: url (required), notes, title, shared, +7 more.
linkding_create_bundleA
Create a bundle. POST /api/bundles/. Omit confirm for a dry-run.
Inputs: name (required), order, search, confirm, +5 more.
linkding_create_tagAIdempotent
Create a tag. POST /api/tags/. Linkding returns the existing tag when the name already exists. Omit confirm for a dry-run.
Inputs: name (required), confirm.
linkding_delete_assetADestructiveIdempotent
Delete a bookmark asset. DELETE /api/bookmarks/<bookmark_id>/assets//. Omit confirm for a dry-run.
Inputs: asset_id (required), bookmark_id (required), confirm.
linkding_delete_bookmarkADestructiveIdempotent
Delete a bookmark. DELETE /api/bookmarks//. Omit confirm for a dry-run.
Inputs: id (required), confirm.
linkding_delete_bundleADestructiveIdempotent
Delete a bundle. DELETE /api/bundles//. Bookmarks are not deleted. Omit confirm for a dry-run.
Inputs: id (required), confirm.
linkding_delete_tagADestructiveIdempotent
Delete a tag. DELETE /api/tags//. Omit confirm for a dry-run.
Inputs: id (required), confirm.
linkding_download_assetARead-only
Download a bookmark asset. Returns the text when the file is small and textual. Otherwise returns content type, length, and filename only.
Inputs: asset_id (required), bookmark_id (required).
linkding_get_assetARead-only
Get one bookmark asset. GET /api/bookmarks/<bookmark_id>/assets//.
Inputs: asset_id (required), bookmark_id (required).
linkding_get_bookmarkARead-only
Get one bookmark by id. GET /api/bookmarks//.
Inputs: id (required).
linkding_get_bundleBRead-only
Get one bundle by id. GET /api/bundles//.
Inputs: id (required).
linkding_get_profileARead-only
Get the authenticated user's profile. GET /api/user/profile/.
Inputs: no named parameters.
linkding_get_tagARead-only
Get one tag by id. GET /api/tags//.
Inputs: id (required).
linkding_list_archived_bookmarksBRead-only
List archived bookmarks. GET /api/bookmarks/archived/. Filters match linkding_list_bookmarks.
Inputs: q, sort, limit, bundle, +5 more.
linkding_list_assetsCRead-only
List assets for one bookmark. GET /api/bookmarks/<bookmark_id>/assets/.
Inputs: bookmark_id (required), limit, offset.
linkding_list_bookmarksARead-only
List active bookmarks. GET /api/bookmarks/ with q, limit, offset, modified_since, added_since, and bundle. Returns count plus next and previous offsets.
Inputs: q, sort, limit, bundle, +5 more.
linkding_list_bundlesARead-only
List bundles. GET /api/bundles/ with limit and offset. A bundle is a saved search, not a manual list of bookmarks.
Inputs: limit, offset.
linkding_list_tagsBRead-only
List tags. GET /api/tags/ with limit and offset.
Inputs: limit, offset.
linkding_unarchive_bookmarkAIdempotent
Move a bookmark out of the archive. POST /api/bookmarks//unarchive/. Omit confirm for a dry-run.
Inputs: id (required), confirm.
linkding_update_bookmarkAIdempotent
Update a bookmark. PATCH by default, or PUT when replace is true. Omitted fields stay unchanged. Auto-tagging rules are merged into tag_names on every update. Omit confirm for a dry-run.
Inputs: id (required), url, notes, title, +7 more.
linkding_update_bundleAIdempotent
Update a bundle. PATCH by default, or PUT when replace is true. Omit confirm for a dry-run.
Inputs: id (required), name, order, search, +7 more.
linkding_upload_assetA
Upload a local file as a bookmark asset. POST multipart field file to /api/bookmarks/<bookmark_id>/assets/upload/. Omit confirm for a dry-run that names the file and its size.
Inputs: file_path (required), bookmark_id (required), confirm.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 26 tools
Each tool targets a distinct resource and operation: bookmarks, tags, bundles, assets, profile, and specialized queries like URL checks or change feeds are clearly separated. Overlaps such as create_bookmark updating an existing URL versus update_bookmark by id are explained in the descriptions, so an agent can select correctly.
Nearly all tools follow a predictable linkding_<verb>_<resource> snake_case pattern, making the surface easy to scan. Minor deviations like linkding_changes_since and the longer linkding_check_bookmark_url are still readable but break the verb-first convention slightly.
The 26 tools map to a broad but real API surface across bookmarks, tags, bundles, assets, and profile operations. The count is on the heavy side for an MCP server, and some list variants could potentially be consolidated, but each tool corresponds to a meaningful endpoint.
Bookmark lifecycle coverage is strong: create, read, list, update, archive, unarchive, delete, URL checking, and change tracking are all present. Bundles and assets also have solid CRUD coverage; minor gaps include no tag update operation and no explicit recovery path for deleted bookmarks.
Maintenance
Related MCP Connectors
Save, search, read, tag, and organize your bookmarks from AI assistants with OAuth sign-in.
All your bookmarks in one library. Share them with your AI agents. Read-only search over your saves.
Search, save, tag, and summarize the links in your Link Crypt bookmark library.
Read-it-later for AI agents. Save links, bookmarks, notes, and videos as Markdown and search them.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables to manage Raindrop.io bookmarks programmatically—add, search, and organize bookmarks from LLM apps.414-
- AlicenseAqualityDmaintenanceEnables AI assistants to save, search, and manage bookmarks with semantic search, automatic metadata extraction, and optional LLM-powered enrichment, all running locally.86MIT
- AlicenseBqualityFmaintenanceEnables AI assistants to interact with a Shlink URL shortening instance, allowing creation, listing, retrieval, and deletion of short URLs, as well as tag management.54Apache 2.0
- FlicenseAqualityDmaintenanceEnables managing bookmarks via the Linkwarden API with token-frugal tools for listing collections and links, adding/moving/deleting links, and creating collections.7-