squiggles について
squigglesは、コーディングエージェントと設定済みのLanguage Server ProtocolサーバーをつなぐMCPサーバーです。標準的なコード解析に加え、言語サーバー固有の機能も提供し、必要になった時点でサーバーを起動します。
主な機能
- 01LSP診断とコードナビゲーション
- 02リファクタリングとフォーマット
- 03言語サーバー固有のツール
- 04必要時のサーバー起動
- 05複数言語の設定
活用シーン
- 01編集中のコードの診断確認
- 02定義への移動や参照検索
- 03名前変更やフォーマットの適用
- 04Rust、Ruby、Goなどの拡張機能の利用
MCP 対応
設定したLSPの機能をMCPツールとしてコーディングエージェントに公開します。診断、ナビゲーション、リファクタリング、言語サーバー固有の拡張機能を利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
squiggles
エージェントに、IDE で表示される波線を見せましょう。
squiggles は、コーディングエージェントと Language Server Protocol(LSP)サーバーをつなぐ MCP サーバーです。1 つ以上の LSP サーバーを設定すると、squiggles は診断、定義へ移動、参照の検索、名前の変更、フォーマットなどの機能を MCP ツールとして公開します。サーバーは最初のツール使用時に遅延起動するため、使わない言語のために起動コストがかかることはありません。
標準プロトコルに加えて、squiggles は各言語サーバーが備える独自の強力な機能も利用可能にします。こうした機能はエディターではめったに表示されず、エージェントが目にすることもありません。たとえば、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 プラグインが使用する一方で、エージェントのハーネスが無視するカスタムメソッドやコマンドを購読します。一致するサーバーが設定されると、拡張機能のツールが自動的に登録されます。
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 | import を並べ替えて不要なものを削除し、ディスクに書き込みます |
ts_rename_file | ファイル移動後、すべての import を修正します。ファイルを移動してから呼び出してください |
typescript-language-server が認識できる typescript のインストールが必要です(通常はワークスペース独自のものです)。TypeScript 7 には tsserver.js が含まれないため、現時点ではワークスペースに typescript@5 を保持してください。
Rust(rust-analyzer)
| ツール | 説明 |
|---|---|
rust_expand_macro | マクロ呼び出しによって生成されるコードを表示します |
rust_parent_module | 親モジュールに移動します |
rust_open_cargo_toml | 所有するクレートの 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 | 依存関係グラフ内のすべてのクレートを一覧表示します |
Go(gopls)
| ツール | 説明 |
|---|---|
go_list_known_packages | ファイルからインポート可能なパッケージを一覧表示します |
go_list_imports | ファイルの import とそのパッケージを一覧表示します |
go_add_import | 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 を表示します |
サーバーが変更を自ら適用する場合(import の整理、import の追加、ファイル名の変更)、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
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。