linkwarden-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., "@linkwarden-mcplist my collections"
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.
linkwarden-mcp
An MCP server that wraps the
Linkwarden bookmark API in a small set of token-frugal
tools. Tool responses are compact plain text (#id name :: url) so listing
collections or links costs as few tokens as possible.
Tools
Tool | What it does |
| List collections as |
| List links as |
| Check if a URL already exists (tracking params stripped first). |
| Add a link: strips tracking params, skips duplicates, then moves it into a collection. |
| Move an existing link to another collection. |
| Delete a link by id. |
| Create a new collection. |
Behaviour baked in from experience
Tracking params are stripped on add (
utm_*,fbclid,gclid,gbraid,gad_source,gad_campaignid,rcm, …); meaningful params likevariantandmodelare kept.Two-step create. Linkwarden ignores
collectionIdon link creation, soadd_linkPOSTs the link then PUTs it into the target collection.Correct PUT shape. Updates always send
id,url,collection.{id,ownerId}andtags, which the API requires.Full-list dedup. Linkwarden caps page size at ~50, so dedup walks every page via cursor pagination rather than trusting a single
limit.
Related MCP server: rainkeeper
Configuration
Configuration comes from environment variables — no secret is ever hardcoded:
Variable | Required | Default | Notes |
| no |
| Base URL, no |
| yes | — | API token (Settings → Access Tokens). Secret. |
| no |
| Owner id used when moving links. |
How the token is stored: in production it is supplied by the MCP host via the
server config's env block (see below) — it is not read from disk. For local
development you may instead copy .env.example to .env and fill in the token;
.env is git-ignored and loaded automatically. Host-provided env vars take
precedence over .env.
Run
uv sync
uv run linkwarden-mcp # serves over stdioRegister with an MCP host
Claude Code:
claude mcp add linkwarden -e LINKWARDEN_URL=http://links.lan -e LINKWARDEN_TOKEN=your-token -- uv --directory C:/Users/olive/Github/linkwarden-mcp run linkwarden-mcpOr Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"linkwarden": {
"command": "uv",
"args": ["--directory", "C:/Users/olive/Github/linkwarden-mcp", "run", "linkwarden-mcp"],
"env": {
"LINKWARDEN_URL": "http://links.lan",
"LINKWARDEN_TOKEN": "your-token"
}
}
}
}Development
uv run ruff check . # lint
uv run ruff format . # format
uv run ty check # type checkAvailable Tools
7 toolsadd_linkA
Add a link. Tracking params are stripped; by default duplicates are skipped.
Creates the link then moves it into `collection_id` (the API ignores the collection on
creation, so a follow-up update is required). Pass collection_id=None to leave it in Unorganized.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| collection_id | No | ||
| name | No | ||
| tags | No | ||
| skip_if_exists | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully compensates by disclosing important behavioral details: tracking params are stripped, duplicates are skipped by default, and the creation-then-move workaround for collection assignment. These details go beyond a simple 'add' and help the agent understand side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action ('Add a link') and uses two concise paragraphs. It avoids unnecessary words and conveys essential details efficiently. Minor structure improvement could be made, but it is well-sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, behavioral nuance), the description covers the most critical aspects: duplicate handling, tracking stripping, and the collection workaround. The existence of an output schema relieves the need to describe return values. Omission of name and tags is acceptable as they are standard optional metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds meaning to some parameters: it explains collection_id's behavior (move to collection or leave unorganized) and skip_if_exists (duplicate default). However, it does not explain name or tags, and url is only indirectly mentioned via tracking stripping. Partial coverage compensates partially but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a link' as the primary action, specifying the resource (link) and the verb (add). It distinguishes from siblings like move_link and delete_link by describing specific behaviors such as tracking parameter stripping and duplicate skipping, which are unique to adding a link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for adding links and provides guidance on handling duplicates (skip_if_exists) and the collection parameter. However, it does not explicitly compare with sibling tools or state when not to use this tool, leaving usage context somewhat implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_collectionB
Create a new collection and return its #id name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| is_public | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits like side effects, permissions, or error behavior. It only states creation and return value, omitting important details such as whether duplicate names are allowed, access control implications, or response format consistency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief (one sentence) and front-loaded with the key verb and resource. It achieves conciseness but at the cost of missing information that could fit in the same space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no nested objects), the description provides a minimal but acceptable overview. However, it lacks details on error cases or parameter meanings. The presence of an output schema (not shown) might compensate, but the description itself is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds no meaning to the parameters 'name' or 'is_public' beyond their names. For example, it doesn't explain what 'is_public' does, or any constraints on 'name' like uniqueness or length.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Create a new collection') and the resource (collection), distinguishing it from sibling tools that deal with links or listing. The return value hint further clarifies purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for creating a collection but provides no explicit when-to-use, when-not-to-use, or comparison with siblings like list_collections. No guidance on prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_linkB
Permanently delete a link by id.
| Name | Required | Description | Default |
|---|---|---|---|
| link_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The word 'permanently' indicates irreversibility, which is a key behavioral trait. However, without annotations, the description lacks details on side effects, error conditions, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, succinct sentence with no unnecessary words. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple deletion tool with an output schema, the description covers the basic function but omits contextual details like error handling or post-conditions, which are not covered by the output schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the sole parameter link_id. The description merely says 'by id' without explaining what the id represents or how to obtain it, failing to compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete), resource (link), and identifier method (by id), distinguishing it from sibling tools like add_link, find_link, and move_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as move_link or list_links. Does not mention prerequisites or restrictions like link ownership or dependencies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_linkA
Check whether a URL already exists (tracking params stripped). Returns matches or (none).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that tracking parameters are stripped before checking, which is a key behavioral detail beyond a simple lookup. However, with no annotations provided, it does not explicitly state read-only behavior, authorization needs, or potential side effects, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that efficiently communicates the tool's purpose and a key behavior. Every word is necessary and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple existence-check tool with one parameter an output schema (which likely describes the match format), the description is complete. It covers the input handling (stripping params) and the return outcome (matches or '(none)'), satisfying contextual needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'url' is explained in the description as the URL to check, with the important nuance that tracking params are stripped. This adds meaning beyond the schema (which only defines the parameter as a string) and compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to check whether a URL already exists, with tracking parameters stripped. The verb 'Check' and resource 'URL' are specific and unambiguous. It distinguishes itself from sibling tools like add_link (which adds) and list_links (which lists all) by focusing on existence verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates usage for verifying URL existence, but it provides no explicit guidance on when to use this tool versus alternatives (e.g., list_links for retrieval or add_link for modification). It lacks when-not-to-use or context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionsA
List all collections as #id name (link count), one per line.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It describes the output format, which is helpful, but lacks information about ordering, pagination, performance, or any side effects. The tool appears to be a simple read operation, but this is not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that immediately states the purpose and output format. Every word earns its place, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no annotations, and an output schema exists), the description provides the essential output format and purpose. It could be improved by mentioning that it lists all collections without filtering, but it is mostly complete for its use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and the schema coverage is 100%. The description adds value by specifying the exact output format, which is not captured in the input schema. This is above the baseline of 3 for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool lists all collections with a specific format of '#id name (link count)', one per line. This distinguishes it from sibling tools like 'list_links' which list links, and 'create_collection' which creates collections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs alternatives, such as when to use 'list_links' or 'find_link' instead. There are no exclusions, prerequisites, or context about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linksB
List links as #id name :: url. Omit collection_id for the newest links across all collections.
| Name | Required | Description | Default |
|---|---|---|---|
| collection_id | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavior. It reveals the output format and the effect of omitting collection_id, but doesn't state read-only nature, pagination, or rate limits. The output schema exists but is not detailed in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence. It is front-loaded with the key action and format, no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters and an output schema, the description is partially complete. It explains the output format and a key behavior but omits details on limit parameter, default ordering, and potential edge cases. The output schema might compensate, but its content is not visible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It implicitly covers collection_id by describing its omission, but limit is completely unmentioned. This leaves parameter usage ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists links and specifies the output format. It distinguishes itself from sibling tools like find_link (search) and list_collections (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives like find_link. The description only hints at omitting collection_id for newest links, but lacks context about prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_linkC
Move an existing link into a different collection.
| Name | Required | Description | Default |
|---|---|---|---|
| link_id | Yes | ||
| collection_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It only says 'move', but does not clarify what happens to the original location, whether the operation is reversible, or any side effects for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence. It is front-loaded and efficient, but lacks structure to support additional needed details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description does not hint at return values or success/failure indicators. For a simple tool, the description should still set expectations for the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description adds no explanation for link_id or collection_id beyond the tool's purpose. The parameters are minimally self-explanatory but the description should compensate with details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'move', the object 'existing link', and the target 'different collection'. It distinguishes from sibling tools like add_link, delete_link, and list_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives, no prerequisites or conditions mentioned. Agents receive no context about appropriate usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
add_link - First observed
create_collection - First observed
delete_link - First observed
find_link - First observed
list_collections - First observed
list_links - First observed
move_link
TDQS
Scored across 7 tools
Each tool has a clear, distinct purpose: add, delete, find, move links; create and list collections; list links. There is no overlap or ambiguity.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., add_link, list_collections), making it easy for an agent to infer functionality.
With 7 tools, the set is well-scoped. It covers core operations for a link management service without being too sparse or bloated.
The set covers primary CRUD operations for links (add, delete, move, find) and collection management (create, list). Missing update operations for links/collections and deletion of collections are minor gaps.
Maintenance
Related MCP Connectors
Save, search and organize bookmarks, highlights, feeds and knowledge cards in a Linkflare library.
Search, label, and manage your X (Twitter) bookmarks from any MCP client via Tweetsmash
Save and organize web finds in persistent, user-controlled collections for AI assistants.
Search, read and create Linear issues, projects, teams and cycles.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables to manage Raindrop.io bookmarks programmatically—add, search, and organize bookmarks from LLM apps.413-
- AlicenseBqualityAmaintenanceExposes the Raindrop.io API as Claude tools for managing bookmarks, collections, tags, and bulk operations, with proper collection move support.191MIT
- AlicenseBqualityCmaintenanceEnables management of Raindrop.io bookmarks, collections, tags, and highlights via MCP tools, with support for search, bulk editing, and library auditing.17MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for Linkwarden bookmarks providing read-first search and preserved content access with opt-in write, delete, and collection-delete tools, plus heuristic triage workflows.103 npmMIT