mcpField
L
Linkwarden

Linkwarden

本地服务
linkwarden-mcp.ni-c.de生产力01 天前更新

关于 Linkwarden

Linkwarden 是用于管理 Linkwarden 书签的 MCP 服务;Linkwarden 是可自托管且会保存网页副本的书签管理器。它能读取归档文章正文,并在更新时合并数据,避免覆盖无关字段。

主要功能

  1. 01搜索和整理书签
  2. 02读取已保存的文章正文
  3. 03管理集合和标签
  4. 04合并更新并保留现有数据
  5. 05筛选工具并启用只读访问

适用场景

  1. 01查找和查看已保存链接
  2. 02总结或引用归档网页
  3. 03用集合和标签整理书签

MCP 相关

向 MCP 客户端提供 Linkwarden 的搜索、阅读和书签管理操作。可禁用写入或筛选工具,部分破坏性操作需通过 MCP elicitation 或一次性确认令牌。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"ni-c-linkwarden": {
"command": "npx",
"args": [
"-y",
"linkwarden-mcp"
],
"env": {
"LINKWARDEN_URL": "<LINKWARDEN_URL>",
"LINKWARDEN_TOKEN": "<LINKWARDEN_TOKEN>",
"LINKWARDEN_READ_ONLY": "<LINKWARDEN_READ_ONLY>",
"LINKWARDEN_ALLOW_TOOLS": "<LINKWARDEN_ALLOW_TOOLS>",
"LINKWARDEN_DENY_TOOLS": "<LINKWARDEN_DENY_TOOLS>",
"LINKWARDEN_INSECURE_TLS": "<LINKWARDEN_INSECURE_TLS>"
}
}
}
}
启动命令npx -y linkwarden-mcp
需要配置的环境变量
LINKWARDEN_URLBase URL of the Linkwarden instance, e.g. https://links.example.net (without /api/v1)
LINKWARDEN_TOKEN密钥Access token from Settings -> Access Tokens
LINKWARDEN_READ_ONLYSet to true to register only the 11 read tools and no write tools
LINKWARDEN_ALLOW_TOOLSComma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)
LINKWARDEN_DENY_TOOLSComma-separated tool names or list_* prefixes to remove from whatever LINKWARDEN_ALLOW_TOOLS left
LINKWARDEN_INSECURE_TLSSet to true to accept self-signed certificates for this connection only

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmlinkwarden-mcp0.4.0
ocighcr.io/ni-c/linkwarden-mcp:0.4.0

工具

28

收录的工具列表 · 更新于 3 周前

参数类型必填说明
sortenum否排序方式,默认为 date_newestdate_newest | date_oldest | name_az | name_za
querystring否搜索查询,语法见上文。省略则列出链接。
cursorinteger否不透明的分页游标。将先前结果中的 "next_cursor" 值原样传回;不要计算或递增它——根据实例是否运行 Meilisearch,它可能是行偏移量,也可能是最后看到的 ID。
tag_idinteger否将结果限制为此标签
pinned_onlyboolean否仅返回已认证账户置顶的链接
collection_idinteger否将结果限制为此集合

详细介绍

linkwarden-mcp

CI OpenSSF Scorecard Socket Badge Glama score
npm version container image HTTP via mcp-hub
docs sponsor

这是一个面向 Linkwarden 的模型上下文协议(MCP)服务。Linkwarden 是一款可自托管的书签管理器,会永久保存它收录的每个页面副本。

它允许 Claude Code、Claude Desktop 或 Codex 等 MCP 客户端搜索书签集、将书签整理到不同集合和标签中,并读取已保存页面中保留的文章文本,这样就能对已归档的链接进行摘要或引用,而无需再次获取实时网站内容。

二十八个工具是上限,而不是最低要求:设置 LINKWARDEN_ALLOW_TOOLS=essential 即可只注册精选的八个工具。相比二十八个工具,模型从八个工具中更容易可靠地选出合适的工具——请参阅选择要加载的工具。

演示

MCP 客户端通过 stdio 与 linkwarden-mcp 通信,后者通过 HTTPS 调用 Linkwarden REST API;Linkwarden 存储书签和页面的保留副本

注意: Linkwarden 发布的 API 参考文档并不完整。本服务依据 linkwarden/linkwarden 中 apps/web/pages/api/v1/** 的路由和 packages/lib/schemaValidation.ts 中的请求架构编写,并于 2026-08-17 针对 v2.16.0 验证。这两个文件是此处所有工具的权威依据。

有何不同

读取 Linkwarden 保留的内容。 Linkwarden 会永久保存它收录的每个页面副本。get_link_content 会提供文章文本,因此无需再次获取实时网站内容,就能对已保存的链接进行摘要或引用——长篇文章也会分段提供,而不会一次性全部输出。

整理内容而不覆盖数据。 Linkwarden 的更新路由会替换整个记录。本服务会先读取当前状态再合并,因此更改标题不会悄悄移除链接的标签或集合的协作者。

输出采用允许列表。 Linkwarden 会返回完整的 Prisma 行;此处结果中的每个字段都经过明确指定。文章文本不会出现在列表结果中,集合成员的姓名和电子邮件地址会被移除,未来版本新增的列也不会在模型不知情的情况下进入上下文。

要求

  • Node.js ≥ 22
  • 正在运行的 Linkwarden 实例
  • 访问令牌,可在 Settings → Access Tokens 下创建

Linkwarden 不支持为每个令牌设置权限范围:令牌拥有创建它的账户的全部权限。请创建一个仅可访问此服务应查看的集合的专用账户,而不要交给它管理员令牌。

配置

变量必需说明
LINKWARDEN_URL是基础 URL,例如 https://links.example.net(不含 /api/v1)
LINKWARDEN_TOKEN是从 Settings → Access Tokens 获取的访问令牌
LINKWARDEN_READ_ONLY否true 仅注册读取工具
LINKWARDEN_ALLOW_TOOLS否以逗号分隔的工具名称、list_* 前缀,或用于精选预设的 essential
LINKWARDEN_DENY_TOOLS否语法相同;从 LINKWARDEN_ALLOW_TOOLS 保留的工具中移除
ELICITATION否false 会将审批对话框替换为双调用令牌。不带前缀
LINKWARDEN_INSECURE_TLS否true 接受自签名证书(仅适用于此连接)

请使用 https://。 使用普通 http 时,令牌会以未加密形式传输;除非主机是本地地址,否则服务会打印警告。对于自签名证书,建议使用合适的内部 CA,而不是设置 LINKWARDEN_INSECURE_TLS。

读取令牌后,令牌会从进程环境中移除,因此子进程和 /proc/<pid>/environ 中都无法看到它。

即使没有凭据,服务仍会启动并列出其工具,因此注册表和检查器可以检查它;但每次调用都会显示设置说明并失败,而不会访问 API。

选择要加载的工具

LINKWARDEN_ALLOW_TOOLS 和 LINKWARDEN_DENY_TOOLS 接受以逗号分隔的工具名称;末尾的 * 可匹配整个工具系列。essential 是一个精选的八项预设,包含保存、查找和读取工具;工具参考中对此有标记。

LINKWARDEN_ALLOW_TOOLS=essential
LINKWARDEN_ALLOW_TOOLS=search_links,get_link_content,create_link
LINKWARDEN_DENY_TOOLS=bulk_*

如果某个条目未匹配任何工具,服务会中止启动并指出该条目,这样拼写错误就不会悄悄隐藏工具——否则没人能追查到某个工具缺失是由环境变量导致的。被筛选掉的工具不会注册,因此它既不会出现在 tools/list 中,也无法通过 tools/call 调用,与 LINKWARDEN_READ_ONLY 下的写入工具完全相同。

如果同时运行多个此类服务,mcp-hub 是另一种解决方案——其 /hub 端点会用六个元工具替换每个服务的所有工具。

安装

Claude Code
claude mcp add linkwarden -e LINKWARDEN_URL=https://links.example.net -e LINKWARDEN_TOKEN=… -- npx -y linkwarden-mcp
Claude Desktop
{
  "mcpServers": {
    "linkwarden": {
      "command": "npx",
      "args": ["-y", "linkwarden-mcp"],
      "env": {
        "LINKWARDEN_URL": "https://links.example.net",
        "LINKWARDEN_TOKEN": "…"
      }
    }
  }
}
Codex
[mcp_servers.linkwarden]
command = "npx"
args = ["-y", "linkwarden-mcp"]
env = { LINKWARDEN_URL = "https://links.example.net", LINKWARDEN_TOKEN = "…" }
从源代码安装
npm install && npm run build
LINKWARDEN_URL=https://links.example.net LINKWARDEN_TOKEN=… node dist/index.js
Docker
docker build -t linkwarden-mcp .
docker run --rm -i \
  -e LINKWARDEN_URL=https://links.example.net \
  -e LINKWARDEN_TOKEN=… \
  linkwarden-mcp
通过 mcp-hub

无法启动本地进程的客户端——ChatGPT connectors、网页端的 Claude、Cursor、LibreChat——可通过 mcp-hub 访问 linkwarden-mcp:一个容器通过 Streamable HTTP 为多个 stdio MCP 服务提供服务,并通过单个密码进行 OAuth 2.1 登录,还为无法使用 OAuth 的客户端提供长期令牌。它的 /hub 端点通过六个元工具接入所有服务,因此一个连接器即可访问全部服务,无需在模型上下文中包含 N× 个工具架构;它还同时支持两个协议版本——本服务提出的问题会经由它传递给另一端的人。

它的 /config/mcp.json 使用 Claude Code 的格式,因此配置项就是你已有的那一项:

{
  "mcpServers": {
    "linkwarden": {
      "command": "npx",
      "args": ["-y", "linkwarden-mcp"],
      "env": {
        "LINKWARDEN_URL": "https://links.example.net",
        "LINKWARDEN_TOKEN": "…",
        "LINKWARDEN_ALLOW_TOOLS": "essential"
      },
      "denyTools": ["bulk_*"]
    }
  }
}

其中的 allowTools 和 denyTools 是中心针对每个服务设置的自身过滤器,与 env 中的 *_ALLOW_TOOLS 并不相同——两者的区别以及容易因此犯下的错误,见客户端指南。

工具

每个工具都声明了 outputSchema,并在文本块之外通过 structuredContent 返回结果,因此客户端无需解析散文即可使用结果。之前只用一句话作答的七个工具——“已删除链接 42。”——现在也会返回相关字段,而这句话仍保留在文本块中。

十个读取工具都带有 untrusted: true 和 source: "linkwarden" 字段。书签标题、描述,尤其是保留的文章文本,都是由控制目标网站的人撰写的;本服务一直在 notes 中说明这一点,但那只是客户端可以读取、无法验证的文字,而字段则让这一点变得可验证。写入工具不带这些字段:它们报告本服务收到的 ID 和创建的数量。

超出预算的结果仍会丢弃列表项;超出大小限制的不可信封装仍会从最大字段中删减字符。如果两者都没有可删减的内容,现在会返回错误,而不是返回一个将超大文档作为字符串的封装:这种封装是有效的 JSON,却不是有效的答复,因为 SDK 会根据工具声明的架构检查结果。

读取
工具描述
search_links搜索或列出书签。支持 Linkwarden 的字段过滤器(tag:、collection:、before:、! 等)。
get_link获取一个书签及其标签、所属合集和现有的保留格式。
get_link_content获取已保存页面保留的文章文本;长文章会分段返回。
list_collections列出所有合集及其链接数量;通过 parentId 表示嵌套关系。
get_collection获取一个合集及其各成员的权限。
list_tags列出标签及其链接数量和各自的存档设置。
get_tag获取一个标签。
get_dashboard获取最近添加的链接和置顶链接,与 Linkwarden 控制面板中的显示一致。
list_rss_subscriptions列出此账户订阅的 RSS 源。
get_current_user查看令牌所属账户及其存档默认设置。适合用于检查连接状态。
get_worker_stats查看内容保留和搜索索引队列。仅限管理员账户——其他用户会收到 HTTP 403。
写作

当 LINKWARDEN_READ_ONLY=true 时,完全不会注册这些工具。标记为 👤 需询问人员 的工具会通过 MCP 征询机制进行确认——模型无法代替用户回答的对话框——如果客户端无法显示此类对话框,则会改用两次调用的 confirm_token。参见询问人员。

工具描述
create_link保存书签,可选择添加标签和集合(按需创建)。
update_link修改标题、描述、标签或集合。仅当 URL 发生变化时需 👤 确认。
set_link_pinned为此账户置顶或取消置顶链接。
delete_link 👤删除书签及其保存的副本。
bulk_update_links 👤为多个链接应用同一组标签和/或集合。
bulk_delete_links 👤一次删除多个书签。
represerve_link 👤删除现有存档,并重新保存页面。
delete_link_preservations 👤删除多个链接的存档,同时保留书签。
create_collection创建集合,可选择嵌套。
update_collection重命名、调整集合层级或发布集合。仅发布时需 👤 确认。
delete_collection 👤删除集合——其链接和子集合也会随之删除。
create_tags创建标签或更改其存档设置(按名称执行插入或更新)。
rename_tag 👤重命名标签——所有带有该标签的链接也会随之更新。
delete_tags 👤删除标签;链接会保留。
merge_tags 👤将多个标签合并为一个新标签。
create_rss_subscription订阅 RSS/Atom 源。
delete_rss_subscription 👤停止轮询源。

有意不提供的功能

  • 访问令牌管理(/tokens)。能够创建 API 凭据的工具会带来权限提升风险,而书签服务不应持有此类工具。
  • 用户管理(/users、删除账户)。不在范围内。
  • 备份导出与导入(/migration)。导出会将整个实例的内容倾倒到模型上下文中;导入则可能将其摧毁。
  • **高亮标记。**创建高亮标记需要在保存的文档中提供精确的字符偏移量,模型无法有意义地生成这些偏移量,而且 Linkwarden 没有提供列出现有高亮标记的路由。
  • 存档上传和签名的 preserved URL;这些功能需要配置 NEXT_PUBLIC_USER_CONTENT_DOMAIN。
  • 已弃用的 GET /links 列表路由——search_links 改用 GET /search,这也是 Linkwarden 自身推荐的方式。

安全

  • 破坏性工具需要征求用户确认。 如果客户端支持 MCP elicitation,这些工具会弹出一个模型无法代替用户回答的真实对话框。如果不支持,首次调用会返回一个短期令牌,该令牌绑定到确切的目标;只有第二次调用携带该令牌时,操作才会执行。这只能证明调用使用相同参数进行了两次,不代表其他任何内容,提示文本也会说明这一点。针对某个链接、标签集或更改签发的批准,不能用于其他对象。 ELICITATION=false 会有意采用这种回退方式,绝不会移除保护措施。
  • 丢失内容不只是删除。 发布收藏集、更改链接的 URL(这会删除旧页面所有已保存的副本),以及重命名标签(这会影响所有带有该标签的链接),都会要求确认。
  • 确认提示绝不会引用 Linkwarden 中的内容。 标题、URL、描述和收藏集名称来自已保存的页面以及该实例的其他用户;模型能读取的文本中只会显示数量和 ID。
  • Linkwarden 获取已收藏的 URL 前会先对其进行检查。 create_link、update_link 和 create_rss_subscription 会将 URL 交给一个在无头浏览器中打开它的服务端,而 get_link_content 会读取返回结果,这意味着未经检查的 URL 可以用来读取 Linkwarden 网络内部的内容。环回地址和链路本地地址(包括云元数据端点及其主机名)会被拒绝;地址会进行数值比较,因此像 [::ffff:169.254.169.254] 这样的 IPv4 映射字面量也会被拦截,主机名则会先解析再接受。私有 LAN 地址仍然允许使用——对于可自托管的书签管理器来说,将路由器的接口或内网页面加入书签是很常见的操作;这也意味着 Linkwarden 旁边的容器可以被访问。SECURITY.md 说明了这项检查的覆盖范围和不覆盖的内容,包括 RSS 源中的条目。
  • 返回的内容会标记为不可信数据,尤其是由目标网站控制者撰写的已保存文章文本。
  • 部分更新绝不会清空字段。 Linkwarden 的更新路由会替换整个记录,因此此服务会读取当前状态并进行合并;否则,更新可能会悄无声息地移除链接的标签或收藏集的协作者。
  • 不能仅凭 HTTP 200 就信任请求成功。 Linkwarden 的多个路由会在 HTTP 200 响应正文中用错误句子报告失败;而没有处理相应请求方法的路由则会返回空内容的 200 响应。这两种情况都会报告为错误,而不会被视为写入成功。
  • 错误正文会被截断,HTML 错误页面会被完全丢弃,不会跟随重定向(因此 bearer 令牌无法被重放到其他主机),并且每个请求都会设置超时。
  • LINKWARDEN_READ_ONLY=true 时,根本不会注册写入工具。
  • 剩余风险: 在你配置的令牌权限范围内,如果模型被要求执行破坏性操作且用户确认了该操作,它仍然可以执行。请限制账户权限,并保持主机级权限提示开启。

文档

完整指南、工具参考和安全说明见 linkwarden-mcp.ni-c.de(源文件位于 docs/)。

开发

npm install
npm run build
npm test
npm run test:coverage
npm run lint
npm run format
npm run docs:tools     # regenerate docs/reference/tools.md from the registered tools

docs/reference/tools.md 是生成的文件;如果已提交的副本与代码不再匹配,CI 会失败。文档站点位于 docs/,拥有自己的 package.json 和锁文件——VitePress 不能进入根目录安装,因为根目录安装会在 Docker 构建和整个测试矩阵中运行。

请参阅 CONTRIBUTING.md。

发布

所有操作都由标签驱动;无需手动发布。

  1. 将 CHANGELOG.md 中的 [Unreleased] 部分移至新版本下方 并添加日期。发布工作流会用 awk 提取该部分,因此 ## [x.y.z] 标题格式很重要。

  2. 更新 package.json 中的 version。

  3. 运行 npm run lint && npm run build && npm run test:coverage。

  4. 提交,然后创建一个签名的带注释标签:

    git tag -s v0.1.1 -m "v0.1.1"
    git push origin main v0.1.1
    

随后,release.yml 会验证标签与 package.json 中的版本一致,通过 Trusted Publishing(OIDC — 不存在可泄露的 npm 令牌)发布到 npm 并附带来源证明,将版本同步到 server.json 中的两个 package 条目,发布到 MCP registry,并根据变更日志部分创建 GitHub release。ci.yml 会并行将多架构容器映像推送到 GHCR。

如果 registry 步骤失败,请在 main 上修复,然后手动运行 mcp-registry.yml 工作流。 不能重新运行失败的作业:它会检出不可变标签,因此在 main 上的修复永远无法生效。

参与贡献

欢迎提交问题、参与讨论和发起拉取请求 — 请参阅 CONTRIBUTING.md。如需报告漏洞,请使用 私密报告渠道, 不要公开提交问题;相关政策见 SECURITY.md。

许可证

MIT © Willi Thiel

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。