Skip to main content

工具概览

Linkly AI 通过 MCP(Model Context Protocol)向 AI 助理暴露九个工具;云端网关(mcp.linkly.ai,以及 linkly mcp --remote)另外多出两个仅云端的工具——library_search 与 library_link——在那里共十一个。核心是一条渐进式的文档访问工作流:
围绕它另有三个发现类辅助工具——list_libraries(列出知识库)、explore(概览文档集合)、find_paths(按关键词定位文件夹路径,配合 search 的 path_glob 使用),加上 list(列举一个容器:某个目录下的文件、某个知识库,或你的笔记),以及唯一的笔记写入工具 note_save(创建 / 编辑笔记)。

search

搜索文档,找到相关结果

outline

查看文档大纲,了解结构

grep

正则匹配,精确定位文本模式

read

阅读文档内容,获取详情

list_libraries

列出知识库及其文档数量

explore

概览文档集合的主题和结构

find_paths

按关键词定位文件夹路径,给 search 的 path_glob 提供候选

list

列举容器内的条目——目录、知识库,或你的笔记

note_save

创建或编辑笔记,会写入(本地连接上唯一的写入工具)

library_search

搜索云端知识库目录,包括你还没连接的库——仅云端网关

library_link

连接一个云端知识库让它可检索,或断开你点名的库(action: "unlink")——仅云端网关,会写入
library_search 与 library_link 只存在于云端网关。library_link 是那里会写入的工具:把云端库加入你账号的已连接集合,或用 action: "unlink" 移除你点名的那一个。下面其余工具全部只读。
除 note_save(以及云端网关上的 library_link)外全部是只读工具——它们只读取你的文档,不会修改任何内容。note_save 只能写入笔记目录,且没有删除工具,删笔记只能你自己在应用里做。

检索(search)

搜索已索引的本地文档,返回最相关的结果列表。

参数

如果向量模型尚在下载中,搜索会自动降级为纯关键词模式,不影响使用。
关于时间过滤和排序:
  • 当用户给出明确的时间窗口(「上个月」、「在 2024 年」、「近三个月」)时,用 modified_after / modified_before。
  • 当用户只是说「最近的」、「最新的」、「最早的」,没有具体范围时,用 time_sort=newest 或 oldest。
  • 两者可以组合:「2024 年里最早的」等于 modified_after=2024-01-01 + modified_before=2024-12-31 + time_sort=oldest。
  • 计算「上个月」等相对时间时,先从任何工具响应末尾的 [meta] now=... 字段读取当前 UTC 时间,再做日期推算(详见下方响应元数据)。

返回字段

每条搜索结果包含以下信息:
word_count 不是字符数,它和 char_count 差多少取决于内容(标点、空格、Markdown 的占比)。char_count 统计的是当前已提取出的正文:OCR 或转写尚未完成、或提取被截断时,它只代表部分内容。各编辑器对换行、组合字符、emoji 的计法不一,和编辑器字数比较前,先确认比的是同一份文本、同一种口径,再判断是否缺了内容。char_count 需要 Linkly AI Desktop v0.14.1 及以上:旧版本索引过的文档在重新提取或重建索引之前返回 null(read 总会现算),云端库的文档暂不返回该字段。

使用示例

大纲(outline)

获取一个或多个文档的结构化大纲和元数据,帮助快速了解文档结构并定位目标章节。

参数

何时使用大纲

大纲功能对有书签的 PDF、 Markdown、DOCX、DOC、PowerPoint (PPTX)、XLSX、CSV、EPUB 和 RTF 文档效果最好,在阅读大部头的文档、书籍的时候会获得事半功倍的效果。表格类文件的大纲列的是表而不是标题:XLSX 每张工作表一个条目(带行列数、表头和几行预览),CSV 是一个整表摘要条目。 纯文本和无书签的 PDF 将在后续迭代中提供大纲支持。

使用示例

正则匹配(grep)

在单个文档内通过正则表达式定位具体行。最适合 has_outline=false 的文档(无法使用 outline 浏览结构时)。在 search 之后使用,用于精确定位特定文本(人名、日期、术语、标识符等),然后用 read 跳转到匹配位置深入阅读。适用于所有文档类型(PDF、Markdown、DOCX、DOC、PPTX、XLSX、CSV、EPUB、RTF、TXT、HTML)。如需跨多个文档搜索,请对每个文档分别调用 grep。

参数

何时使用 grep 而非 outline

使用示例

阅读(read)

读取文档内容,支持行号定位和分页,适合阅读长文档的特定部分。Read 工具行为与 Claude AI SDK 的行为一致,因此能够在各种 Agentic AI 模型中获得最佳效果。

参数

读取图文混排文档

很多文档(尤其是 Markdown 笔记和技术文档)的关键信息在插图里。read 会把你正在读的这段行范围内出现的图片引用,解析成对应的已索引图片文档,附在结果末尾。image_text 控制附多少: full 有预算限制:单张图最多 2000 字符,整次调用总计 20000 字符。超预算的图片会自动降级成 abstract,并给出可以单独读取它的指引。
先用默认的 abstract 判断哪张图有用,再对那一张单独 read 它的 doc_id,比一上来就 full 省得多。

内容格式

Read 工具将返回带有行号的内容,方便引用和定位:

分页策略

对于长文档,建议分块读取:
结合大纲使用效果更佳 — 通过大纲定位到目标章节的行范围,然后用 read 精确读取该区间的内容。

使用示例

知识库列表(list_libraries)

列出用户配置的所有知识库及其描述和文档数量。

参数

无需参数。

使用场景

  • 用户询问「我有哪些知识库」时调用
  • 在使用 search 的 library 参数前,确认知识库名称

搜索知识库(library_search)

仅云端网关——linkly-ai-cloud MCP server 与 linkly mcp --remote 提供;本地与局域网连接没有这个工具。
按标题、描述或库主用户名搜索云端知识库目录,包括你还没连接的库。它找的是知识库;要搜文档用 search;要看当前已可检索的库用 list_libraries。

参数

响应

每条结果带可直接传给其他工具的 cloud://<owner>/<slug>,以及标题、描述、库主、分类、可见性、文档 / Star / 连接数、is_owner、is_linked(已可检索,不必再连接)和 can_link(对未受邀的 Showcase 库为 cannot_link_reason: invite_required)。Public 与 Showcase 库总会列出;Private 库只对库主和已受邀的读者可见。结果按最近更新时间倒序。此工具不会连接、收藏或修改任何东西。

使用场景

  • 「找一个 Rust 相关的知识库并用它」→ library_search(query="Rust") → 选一条 → library_link → search(query=…, library="cloud://…")
  • 「我自己有哪些云端库?」→ library_search(owner="<你的用户名>")

连接知识库(library_link)

仅云端网关;两个会写入的工具之一(另一个是 note_save)。同一个工具用 action: "unlink" 断开,见下。
把一个云端知识库连接到你的账号,让它可以通过 MCP 检索:它会立即出现在 list_libraries 里,search / explore / list 也立即接受它的 cloud://<owner>/<slug>。规则与网站上的「连接」按钮完全一致。

参数

规则

  • Public 库:任何已登录用户都能连接。Showcase 与 Private 库:只有库主和已受邀的读者能连(工具会返回 invite_required;对你看不到的私有库返回「not found」)。
  • 重复连接同一个库无副作用——返回 already_linked,不多占 Slot。
  • 每次连接占一个 Slot(Free 1 个,Pro 99 个)。配额满时工具返回 slot_exhausted,附当前数量、上限和升级链接。AI 助理不会自作主张挑一个库断开:它会列出你已连接的库、问你释放哪一个,再用 action: "unlink" 调 library_link,然后重新连接。你也可以到网站上腾位置。

断开(action: "unlink")

把一个云端知识库从你账号的已连接集合里移除:它从 list_libraries 里消失,通过 MCP 不再可检索(你账号的所有客户端都一样),占的 Slot 随之释放。其他都不变——你的 reader 身份、邀请和 star 都保留,之后可以再连回来。library 参数同上,与 list_libraries 列出的一致。
  • AI 助理只会断开你点名的库——典型场景是 Slot 满时你说「把 A 换成 B」。你没点名时,它会列出已连接的库来问你,绝不自己挑。
  • 断开一个本来就没连接的库无副作用——返回 already_unlinked。not_found 表示你的账号看不到这个库。
  • 响应里会写明还占着多少 Slot,助理可以紧接着连上你真正想要的那个库。

概览(explore)

获取全部已索引文档或特定知识库的鸟瞰概览。返回文档类型分布、目录结构(含文件数和中位字数)以及高频关键词(标注集中来源)。

参数

使用场景

  • 用户想了解知识库或文档集合中大概有什么内容
  • 用户没有明确的搜索主题,想先发现可用的主题和方向
  • AI 助理需要了解文档集合的规模和主题分布,以便制定有效的搜索策略
概览返回后,可利用其中的关键词和目录名称作为后续 search 查询的线索。

路径定位(find_paths)

按关键词在已索引文档的文件路径上做模糊匹配,聚合到文件夹粒度,返回最匹配的若干候选目录。其定位是 search 的辅助工具:当用户描述容器名(如「在我的微信里」、「在 Notion 笔记里」)但你不知道这个容器在磁盘上的真实路径时,先用 find_paths 探测真实路径,再把它作为 search 的 path_glob 参数。 实际目录名往往和用户的口语不一致(「微信」对应 xinWeChat、「Notion 笔记」对应 notion 笔记 等),盲填 path_glob 容易失败。

参数

返回字段(JSON 模式)

聚合行为

  • 关键词只匹配到文件名段(不是任何目录段)的文件会被静默丢弃 —— 这是「找文件夹」工具,不是「找文件」工具。如果某个查询返回 0 个候选目录但你确认有匹配文件,应回退到直接用 search。
  • 每条匹配按其路径中最浅的关键词出现位置做截断聚合:例如 local:///Users/me/Library/.../com.tencent.xinWeChat/Data/... 被关键词 WeChat 命中后,聚合 key 是 .../com.tencent.xinWeChat,无论文件本身嵌得多深。

何时使用

  • 用户用模糊或跨语言词描述容器(「在我微信里」、「在 Notion 笔记里」、「在我的工作备份里」),且你不知道真实路径
  • 在调用 search 之前先确定 path_glob 的值

何时不使用

  • 单纯按内容/主题搜索(「找简历」、「找 AI 论文」)—— 直接调 search,其混合检索本身已覆盖标题、文件名、内容、路径
  • 仅按文件类型过滤(「所有 PDF」)—— 直接调 search 加 path_glob="*.pdf"
  • 没有容器意图的笼统查询(「找最近的东西」)—— 直接调 search

使用示例

列举(list)

列举某个容器里的条目,不做全文匹配——要按关键词或语义找内容请用 search。支持三种容器:folder(某个磁盘目录下的已索引文件)、library(某个知识库的文件)、notes(本地的卡片笔记)。 工具边界:explore = 全局概览 → find_paths = 找到目录 → list = 列出已知容器里的文件 → outline / read = 读内容。列举是对整个子树的扁平递归扫描——不返回目录树;要下钻就沿着条目里的绝对路径走,或用 find_paths。

参数

返回字段

folder / library 条目带:doc_id、title、绝对 path、doc_type、word_count、char_count、total_lines、has_outline、modified_at(Unix 毫秒,即文件系统 mtime)、keywords、snippet(未开启摘录时为 null),以及 skip_reason——skip_reason 非空表示内容不可读,别再对它 read / grep。用 total_lines + has_outline 决定走 outline 还是 read。本地 scope 的 total 统计的是整个过滤后集合;云端库在总数未知时可能返回 total: null——无论哪种,都配合 offset + has_more 分页。 notes 条目带:doc_id(可交给 read / grep / outline)、note_id 与实时的 version(这两个是 note_save 编辑时的乐观锁凭证)、title、绝对路径、created_at / modified_at(Unix 毫秒)、tags、来源信息,以及默认附带的 snippet。响应还会带一个 available_tags——当前全部笔记标签中按使用频次排前 50 的,可以直接拿来做下一次的 tags 过滤。
README 指针:只有显式传了 path(scope 为 folder 或本地 library)、且 README 类文件直接位于该目录下(不在子目录里)时,响应才会带一个顶层 readme 指针。云端库不会返回它。它存在、且你需要弄清这个文件夹是干什么的时,先读它。
文件系统优先(notes):刚写下的笔记会立刻出现在列表里,但此时 doc_id 是 null、indexed 是 false(字数、行数也还是空),要等索引跑完才补齐。所以「刚记的笔记列得出来但搜不到」是正常现象,不是丢了。title 也可能是 null——文件名是机器生成的那种笔记没有可用标题,这时靠摘录、标签和时间来辨认。

云端知识库

folder 只认本地磁盘路径。要列举云端库,用 scope="library" 配 library="cloud://<owner>/<slug>"(--remote 下可用),path 传相对目录前缀——正是云端 find_paths 返回的形态。前缀作用于该库全部来源的并集;「前缀不存在」和「目录为空」无法区分——在首页(offset=0)两者都返回 total: 0,传了 path 时还会附一条提示。 云端列举和本地有几处不同:不支持 sort="name";skip_reason 恒为 null;摘录截断在约 120 字符;首页之后 total 可能是 null——用 has_more 分页。

使用示例

保存笔记(note_save)

创建或编辑一条本地 Markdown 卡片笔记。这与 library_link(仅云端网关)是仅有的两个会写入的工具,且它只能写到笔记目录;YAML 元数据全部由服务端生成,调用方不用管。

参数

两条必须知道的规则

这条路径只接受界面工具栏能做到的那部分 Markdown:段落与换行、加粗、删除线、有序/无序列表、纯文本。标题、斜体、引用、代码、链接、表格、任务列表、图片和裸 HTML 会被拒绝,返回 NOTE_INVALID_INPUT。你自己在应用界面里手写不受这个限制。正文里(代码之外)的 #标签 就是笔记的标签——正文是标签的唯一事实来源,和你在应用编辑器里手写完全一致。删标签就删掉对应的 #标签;tags 参数只能追加。旧版本写的、标签只存在 YAML 里的笔记会自愈:AI 第一次编辑时会自动把缺的 #标签 补进正文。
正确的编辑顺序是:
  1. list(scope="notes")拿到 note_id 和 version
  2. 用 read(doc_id) 读到当前完整正文
  3. note_save 传 mode="edit"、note_id、base_version=<刚才那个 version>,以及修改后的完整正文——想保留的 #标签 留着,想删的删掉
如果 base_version 过期(期间笔记被改过),会返回 NOTE_VERSION_CONFLICT 并附上真实版本号——应当重读、合并、重试,不要盲目覆盖。每次成功响应都会回传笔记的有效 content(服务端可能补写了 #标签)和新的 version——后续编辑一律以返回的 content 为基础,不要用你自己发出去的那份。还没被索引的笔记 doc_id 是 null,编辑自己刚建的笔记靠的正是这份返回值。绝不要只凭摘录就重写整条笔记。
**没有删除工具。**删除笔记只能由用户在应用界面里操作。

响应元数据(Response Metadata)

每次成功的工具响应都会附带一个当前 UTC 时间字段,方便调用方推算「上个月」、「今年」、「过去 30 天」等相对日期,避免依赖模型训练截止时间瞎猜。
  • Markdown 输出:响应末尾追加一行分隔块,形如:
  • JSON 输出:在响应顶层添加 _meta 对象:
错误响应(isError: true)不附加这个元数据 —— 错误体本身已经传达了失败原因,再附加时间戳反而会稀释信号。 当用户使用相对日期(「上个月」、「近三个月」)时,应当从最近一次工具响应中读取 now 字段,以此为基准换算出具体的 ISO 8601 日期,再传给 search 的 modified_after / modified_before。

调用示例

完整工作流:CLI 方式

以下示例演示如何通过 CLI 完成一次完整的文档检索:

完整工作流:MCP 方式

AI 助理通过 MCP 协议调用工具时,请求格式如下:

常见问题

Linkly AI 目前支持以下格式:Excel 和 CSV 会被解析成 GitHub 风格的 Markdown 表格,并按单元格文本建立索引——所以 search 和 grep 能命中单元格里的字。大纲形态因格式而异:.xlsx 每张工作表一个条目(带行列数、表头和几行预览),.csv 则是一个整表摘要条目。只支持 .xlsx 和 .csv,旧版 .xls 以及 .xlsm、.xlsb、.ods 都不支持。非 UTF-8 编码的 CSV,只有能从文件自身或同目录的相邻文件判定出编码时才会解码;判定不出来的会直接跳过,而不是索引成乱码。两种格式的单文件上限都是 16 MiB。音视频的语音转写默认是关闭的——这类文件仍会被登记进索引、能按文件名搜到,但要搜到「里面说了什么」,需要先在主窗口「索引管理」页「管理」区的「解析增强」里打开「音频转写」和「视频转写」。详见索引设置。
如果文档没有可用的大纲(has_outline: false),你可以:
  1. 直接使用 read 工具分页浏览文档内容
  2. 先读取文档开头(默认 200 行),了解大致内容后再决定是否继续阅读
推荐流程:
  1. 先通过 outline 了解文档结构(如果有大纲)
  2. 根据大纲中的行范围,使用 read 的 offset 和 limit 参数精确读取目标章节
  3. 每次最多读取 500 行,通过调整 offset 分页读取
默认端口为 60606。如果该端口被占用,应用会自动尝试其他端口。你可以在 Linkly AI Desktop 主窗口的「Agent 使用」页点「查看 MCP 接入配置」,查看实际使用的地址和端口。
你可以尝试:
  • 使用更精确的关键词
  • 使用自然语言描述(利用向量语义匹配)
  • 混合使用关键词和同义词,如 "认证 auth 登录 sign-in"
  • 使用 --type 过滤特定文档类型,缩小搜索范围