mcpField
S
squiggles

squiggles

本地服务
github.com/carldaws开发工具65 周前更新

关于 squiggles

squiggles 是连接编码 Agent 与 Language Server Protocol 服务的 MCP 服务,可提供代码分析和语言服务器扩展工具,并按需启动服务器。

主要功能

  1. 01LSP 诊断与代码导航
  2. 02重构与格式化
  3. 03语言服务器专属工具
  4. 04按需启动服务器
  5. 05配置多种语言

适用场景

  1. 01编辑代码时检查诊断
  2. 02跳转到定义或查找引用
  3. 03执行重命名和格式化
  4. 04调用 Rust、Ruby、Go 等扩展

MCP 相关

它将配置的 LSP 能力作为 MCP 工具提供给编码 Agent,包括诊断、导航、重构和语言服务器专属扩展。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"carldaws-squiggles": {
"command": "npx",
"args": [
"-y",
"squiggles"
]
}
}
}
启动命令npx -y squiggles

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

安装包
npmsquiggles1.0.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

squiggles

让你的 Agent 看到你在 IDE 中会看到的波浪线。

squiggles 是一个连接编码 Agent 与语言服务器协议(LSP)服务的 MCP 服务。配置一个或多个 LSP 服务后,squiggles 会将它们的功能——诊断、跳转到定义、查找引用、重命名、格式化等——作为 MCP 工具提供。服务会在首次使用工具时按需启动,因此不会为你不使用的语言产生启动开销。

除了标准协议,squiggles 还解锁了各语言服务器自带的定制超能力:编辑器很少展示这些功能,Agent 通常也无从得知。例如展开 Rust 宏、发现 Ruby 测试、在 C++ 源文件与头文件之间切换、移动 TypeScript 文件后修复所有导入,以及通过 gopls 运行 govulncheck。

快速开始

claude mcp add squiggles -- npx -y squiggles

然后,在项目根目录中运行:

npx squiggles init

这会为检测到的语言写入一个 squiggles.yaml(例如,tsconfig.json 表示 TypeScript,Cargo.toml 表示 Rust,依此类推)。也可以自行指定服务名称:npx squiggles init typescript ruby。typescript、rust、ruby、go、python、cpp 和 lua 均有预设;每种语言都需要将对应的语言服务器添加到 PATH 中,init 会为写入的每个配置打印安装命令。

TypeScript 项目的生成结果:

servers:
  typescript:
    command: ["typescript-language-server", "--stdio"]
    filePatterns: ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"]

配置

squiggles 会在项目根目录中查找 squiggles.yaml、squiggles.yml、.squiggles.yaml 或 .squiggles.yml(旧版 mclsp.yaml 名称仍然有效)。每个服务条目支持:

字段必填描述
command是用于启动 LSP 服务的命令(字符串数组)
filePatterns是此服务处理的文件 glob 模式
initializationOptions否初始化时传递给 LSP 服务的选项
rootUri否覆盖工作区根 URI
env否LSP 服务进程的环境变量

可以为不同语言配置多个服务:

servers:
  typescript:
    command: ["typescript-language-server", "--stdio"]
    filePatterns: ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"]
  rust:
    command: ["rust-analyzer"]
    filePatterns: ["**/*.rs"]
  ruby:
    command: ["ruby-lsp"]
    filePatterns: ["**/*.rb"]
  go:
    command: ["gopls"]
    filePatterns: ["**/*.go", "go.mod", "go.sum"]
  cpp:
    command: ["clangd"]
    filePatterns: ["**/*.c", "**/*.h", "**/*.cpp", "**/*.hpp"]

工具

配置匹配的服务后,所有标准 LSP 工具都会注册并可用。

导航: goto_definition、goto_type_definition、goto_implementation、goto_declaration、find_references

检查: hover、signature_help、document_symbols、workspace_symbols

重构: code_actions、rename_prepare、rename、format

层级结构: call_hierarchy_incoming、call_hierarchy_outgoing、type_hierarchy

始终可用: open_file、diagnostics

基于位置的工具接受 file(相对路径)、line(从 1 开始计数)和 col(从 1 开始计数)。rename 接受 apply: true,可将编辑写入磁盘,而非返回编辑内容;format 始终会写入磁盘。code_actions 会自动传入与请求范围重叠的诊断信息,因此会显示快速修复选项。

服务端扩展

最优秀的语言服务远不止实现标准协议,而 squiggles 正是在此发挥作用:它会订阅 IDE 插件使用、但 Agent 框架忽略的自定义方法和命令。配置匹配的服务端后,扩展工具会自动注册。

Ruby(ruby-lsp)

工具功能
ruby_discover_tests在文件中发现测试用例(Minitest、RSpec)
ruby_go_to_relevant_file在实现文件和测试文件之间跳转
ruby_show_syntax_tree显示文件的 Prism AST
ruby_dependencies列出项目的 gem 依赖项

TypeScript(typescript-language-server)

工具功能
ts_go_to_source_definition跳转到实现,而不是 .d.ts 声明
ts_organize_imports对导入进行排序和清理,并写入磁盘
ts_rename_file文件移动后修复所有导入——先移动文件,再调用此工具

typescript-language-server 需要能找到 typescript 安装(通常是工作区自己的安装)。TypeScript 7 不再提供 tsserver.js,因此目前请在工作区中保留 typescript@5。

Rust(rust-analyzer)

工具功能
rust_expand_macro显示宏调用生成的代码
rust_parent_module导航到父模块
rust_open_cargo_toml查找所属 crate 的 Cargo.toml
rust_external_docs获取符号对应的 docs.rs / rustdoc URL
rust_related_tests查找覆盖某个位置的测试
rust_view_syntax_tree显示文件的语法树
rust_runnables列出可运行的目标(测试、二进制文件、文档测试)
rust_reload_workspace编辑 Cargo.toml 后重新加载 Cargo 元数据
rust_dependencies列出依赖关系图中的所有 crate

Go(gopls)

工具功能
go_list_known_packages列出可从文件导入的包
go_list_imports列出文件的导入项及其所属包
go_add_import添加导入项,并写入磁盘
go_mod_tidy运行 go mod tidy
go_vulncheck对模块运行 govulncheck
go_modules列出目录下的模块

C/C++(clangd)

工具功能
clangd_switch_source_header在源文件和头文件之间跳转
clangd_symbol_info获取 USR 和符号详情
clangd_ast显示指定范围的 Clang AST

当服务端自行应用更改(整理导入、添加导入、重命名文件)时,squiggles 会接收工作区编辑并将其写入磁盘,使服务端看到的文件保持同步。

扩展贡献

要为新的语言服务端添加扩展,请在 src/extensions/ 中创建文件(例如 src/extensions/zig.ts):

import { executeCommand, type ServerExtension } from "./index.js";

const extensions: ServerExtension[] = [
  {
    name: "zls_something",
    description: "What this does",
    input: "position", // "none" | "file" | "position" | "custom"
    request: ({ uri, position }) => ({
      method: "zls/customMethod",
      params: { textDocument: { uri }, position },
    }),
  },
];

export default extensions;

request 接收已打开文件的 URI、绝对路径和从 0 开始的索引位置,并返回要发送的 LSP 请求——对于将功能作为 workspace/executeCommand 命令公开的服务端,请使用 executeCommand 辅助函数。在 src/extensions/index.ts 中,按服务端的二进制名称注册该模块。

从 mclsp 迁移

squiggles 是此前以 mclsp 名义发布的项目。将 MCP 配置指向 npx -y squiggles,并将 mclsp.yaml 重命名为 squiggles.yaml——旧配置名称仍可使用,工具名称保持不变。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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