URLs-LE について
URLs-LE は、文書、コード、設定から URL を集めたい開発者向けの抽出ツールです。プロトコルと位置を報告し、単一文書とワークスペースを走査できます。対応形式では特定のコメントやコード領域を除外します。
主な機能
- 01URL、プロトコル、行・列位置の抽出
- 02Markdown、HTML、コード、設定形式への対応
- 03形式に応じたコメントやコード領域の除外
- 04フォルダーやワークスペースの走査と重複集計
- 05重複除去と並べ替えのコマンド
活用シーン
- 01文書内のリンクの一覧化
- 02ソースコード内の URL の確認
- 03設定ファイル内のサービスアドレスの集約
- 04抽出したリンクを別の検査ツールに渡す
MCP 対応
MCP サーバーは `extract_urls` ツールを公開し、テキストを受け取って URL、プロトコル、位置を返します。結果は既定で 500 件に制限され、切り詰め情報も含みます。ファイル読み込みやネットワーク要求は行いません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| dedupe | boolean | いいえ | 重複する URL は最初の出現のみを残します。 |
| format | enum | いいえ | ドキュメントの形式です。このパラメーターまたは `filename` を指定してください。一般的な拡張子と別名を受け付けます。それ以外は拒否せず、プレーンテキストとしてスキャンします。markdown | html | css | javascript | typescript | json | yaml | properties | toml | ini | xml | csv | plaintext |
| content | string | はい | スキャンするドキュメントのテキスト。 |
| filename | string | いいえ | `format` が指定されていない場合に形式を推定するためのファイル名です(例:"README.md")。 |
| maxResults | integer | いいえ | 返される URL の上限(デフォルトは 500)。meta.truncated は、破棄された URL があるかどうかを示します。 |
詳細
URLs-LE:手間なくURLを抽出
キーを1回押すだけで、現在のファイルからすべてのURLを抽出
あらゆるテキストファイルに対応 — Markdown、HTML、CSS、JavaScript、TypeScript、JSON、YAML、Properties、TOML、INI、XMLのそれぞれに応じて除外対象を判別します
役に立ちましたか? 星や評価を付けると、ほかの開発者がこのツールを見つけやすくなります — ★ GitHub · ★ Open VSX · ★ Marketplace
機能
ファイルを開き、URLs-LE: Extract URLsを実行すると、ドキュメント内のすべてのURLが新しいエディターに表示されます。そこから重複を削除して並べ替えられます。VS Code、およびCursorやVSCodiumなどのVS Codeベースのエディターで動作します(Open VSXからインストール可能です)。
- リンクの監査 — MarkdownとHTMLのリンク、オートリンク、通常のURLをすべて抽出します(Markdownではコードブロック、HTMLではコメントを除外)
- ソースのレビュー — JS/TS全体の文字列リテラル、テンプレートリテラル、コメント内のURLを抽出します
- 設定ファイルの一括確認 — JSON文字列、YAML値、Javaプロパティ、TOML/INI値、XML(Maven POM、フィード)内のURLを抽出します
インストール
| 場所 | 利用できる機能 | インストール |
|---|---|---|
| VS Code | エディター内でキーを押すだけでURLを抽出 | Marketplace |
| Cursor、VSCodium、Windsurf | 同じ拡張機能 | Open VSX |
| ターミナルまたはCIステップ | ディレクトリーツリー全体で同じ処理を実行し、終了コードを取得 | npx url-le · npm または cargo install urls-le · crates.io |
| Node経由で利用する任意のMCPエージェント | stdio経由のextract_urls | npx urls-le-mcp · npm |
AI エージェントから使用する
同じ抽出エンジンがMCPサーバーとして動作するため、コマンドを実行する代わりに、エージェントから直接呼び出せます。
| エディター | 方法 |
|---|---|
| VS Code 1.101+ | インストール不要です。拡張機能がエージェントモードに extract_urls を登録します |
| Claude Code | claude mcp add urls-le -- npx -y urls-le-mcp |
| Cursor、Windsurf、その他すべて | npx urls-le-mcp を指定してください |
extract_urls(content, format?, filename?, dedupe?, maxResults?)
すべての URL をプロトコルと1始まりの行番号・列番号とともに返します。デフォルトでは最大500件に制限され、大きなファイルでエージェントのコンテキストウィンドウがあふれないよう、meta.truncated も返します。
サーバーはコンテンツを受け取ってデータを返します。ファイルを読み込まず、独自にネットワークリクエストを行うこともありません。npm では urls-le-mcp として、MCP レジストリでは io.github.nolindnaidoo/urls-le として公開されています。
手動で設定する — MCP 設定ファイルがあるホストならどれでも使用できます
ほとんどのホストは JSON 設定ファイルを読み込みます。エントリーを1つ追加してください。
{
"mcpServers": {
"urls-le": {
"command": "npx",
"args": ["-y", "urls-le-mcp"]
}
}
}
初回実行時に -y を指定すると、インストールの確認を省略できます。リリースを追跡したくない場合は、[email protected] のようにバージョンを固定してください。
起動のたびに npx を使いたくない場合は、一度インストールして、代わりにバイナリを指定してください。
npm install -g urls-le-mcp
{
"mcpServers": {
"urls-le": { "command": "urls-le-mcp" }
}
}
stdio 経由で MCP として通信し、環境変数、API キー、独自の設定は必要ありません。組み込む前に動作を確認するには、次のコマンドを実行してください。
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y urls-le-mcp
ツールの一覧が出力されて終了します。extract_urls が表示されれば、サーバーは動作しています。
Extract は、現在開いているドキュメントを読み取ります。スキャンではディスク上の多くのファイルを読み取り、レポートを1つ作成します。
- ワークスペース全体:コマンドパレットから
URLs-LE: Extract URLs from Workspaceを実行します。 - 1つのフォルダー:エクスプローラーでフォルダーを右クリックして
Extract URLs from Folderを選ぶか、URLs-LE: Extract URLs from Folderを実行してフォルダーを選択します。
プロジェクト内では同じ URL が何か所にも記載されるため、レポートには重複のない URL が使用頻度の高い順に表示され、それぞれの記載回数と記載場所も示されます。
# URLs-LE workspace report
`my-project` · 3 file(s) read · 2 distinct URL(s), 5 occurrence(s) in 3 file(s)
| URL | Occurrences | Files |
|---|---|---|
| `https://example.com/docs` | 3 | 2 |
| `https://api.example.com/v1` | 2 | 2 |
## `https://example.com/docs` (3)
- `config.json` · **2:12**
- `docs/a.md` · **1:5**, **1:34**
## `https://api.example.com/v1` (2)
- `docs/a.md` · **2:6**
- `src/b.ts` · **1:14**
これは urls-le.showPositions がオンの場合です。デフォルトではオフになっており、その場合、各行にはファイル名と、そのファイル内での URL の出現回数が表示されます:docs/a.md (2)。クリップボードへのコピー内容は、Extract と同様に urls-le.clipboardIncludesPositions に従います。
スキャンで読み取る内容。 ファイルはディスクから読み取られるため、保存されていない編集内容は反映されません。安全上のサイズ制限を超えるファイルや、UTF-8 テキストではないファイルは読み取られません。スキャンは5,000ファイルまたは一覧表示された10,000件の出現箇所で停止します。レポートの末尾には、読み取られなかった項目ごとに1行が追加されるため、短いレポートを、問題のないプロジェクトの結果と誤認することはありません。
スキップする対象と変更方法。 3つのスイッチはデフォルトでオンになっており、設定でそれぞれ個別にオフにできます。
| スイッチ | スキップする対象 |
|---|---|
scanUseDefaultExcludes | 依存関係フォルダー、ビルド出力、ツールキャッシュ、ロックファイル。全リストは以下を参照してください |
scanRespectGitignore | プロジェクトの .gitignore ファイルでスキップされるもの |
scanSkipBinaryFiles | 画像、フォント、アーカイブなどのテキストではないファイル |
スイッチをオフにせずに結果を調整できるリストが2つあります。さらにスキップするには、scanExcludes にパターンを追加します。スイッチによってスキップされるものを読み取るには、scanAlwaysInclude に追加します。
{
// Also skip the test fixtures.
"urls-le.workspace.scanExcludes": ["**/fixtures/**"],
// Read the vendored code, though the built-in list skips it.
"urls-le.workspace.scanAlwaysInclude": ["**/vendor/**"]
}
URLs-LE: Open Settings を実行すると、これらの設定がすべて設定エディターで開きます。
組み込みのリスト
場所を問わず対象となるフォルダー:
.git、.hg、.svn、node_modules、bower_components、jspm_packages、.pnpm-store、.yarn、vendor、site-packages、Pods、Carthage、dist、build、out、target、_build、_site、dist-newstyle、zig-out、storybook-static、cdk.out、DerivedData、CMakeFiles、.next、.nuxt、.output、.svelte-kit、.angular、.astro、.docusaurus、.vuepress、.expo、.turbo、.parcel-cache、.cache、.sass-cache、.jekyll-cache、.dart_tool、.pub-cache、.gradle、.kotlin、.cxx、.externalNativeBuild、captures、ephemeral、.symlinks、.swiftpm、.build、.bundle、.stack-work、.zig-cache、.godot、elm-stuff、.vercel、.netlify、.serverless、.aws-sam、.terraform、.venv、venv、__pycache__、.tox、.nox、.mypy_cache、.pytest_cache、.ruff_cache、.ipynb_checkpoints、.eggs、coverage、htmlcov、.nyc_output、.vscode-test、.idea、.vs、xcuserdata、*.egg-info
場所を問わず対象となるファイル:
*.min.js、*.min.css、*.map、*.snap、*.lock、package-lock.json、pnpm-lock.yaml、npm-shrinkwrap.json、go.sum、*.pbxproj、*.iml、local.properties、output-metadata.json、.flutter-plugins、.flutter-plugins-dependencies、.packages、Generated.xcconfig、flutter_export_environment.sh、GeneratedPluginRegistrant.*、fastlane/report.xml、fastlane/test_output/**、doc/api/**
多くのプロジェクトで通常のフォルダーとして使われているため、リストに含まれていないもの:bin、obj、tmp、logs、public、generated。これらのフォルダーを生成するプロジェクトでは、git で除外されるため、スキャンは .gitignore を読み取ります。
スキャンに影響する設定は、設定にあります。
CLI
同じ抽出処理を、ターミナルやシェルのパイプラインから実行できます。Rust 製の CLI は crate/ にあり、拡張機能と同じコーパス — crate/fixtures/ — を共有しているため、両者でドキュメントの読み取り方が異なることはありません。npm から npm install -g url-le でインストールするか(または npx url-le で実行)、crates.io から cargo install urls-le でインストールできます。どちらも同じ urls-le コマンドをインストールし、出力がバイト単位で一致することが保証されています。npm パッケージ名が url-le なのは、urls-le がすでに使われていたためです。
urls-le . # every URL in the tree; JSON on stdout when piped
urls-le --dedupe docs/ # one line per distinct URL
urls-le mcp # the same extraction over MCP on stdio
# the point of the whole thing:
urls-le . | jq -r '.urls[].value' | sort -u | lychee -
npm (url-le) または crates.io (urls-le) からインストールできます。どちらも同じ urls-le コマンドをインストールします。
npm install -g url-le # or run it once: npx url-le
cargo install urls-le
終了コードは grep に準拠しています — URL が見つかった場合は 0、見つからない場合は 1、質問の形式が不正な場合は 2 — そのため if urls-le src/; then … のように使えます。何も見つからないこともエラーではなく結果として扱われます。
意図的に、特定の判断をしません。 リンクチェックも、安全でないスキームを示すフラグも、フィルタリングもありません。本番環境の設定で http:// の URL は誤りでも、テスト用フィクスチャでは正しい場合があります。代わりに判断するツールは、設定して、反論して、最後にはミュートすることになり、そのミュートと一緒に抽出処理まで止まってしまいます。lychee に渡して、そちらに判断を任せてください。
対応フォーマット
| フォーマット | 言語 ID | 備考 |
|---|---|---|
| Markdown | markdown | フェンス付きコードブロックとインラインコードを除外 |
| HTML | html | `` コメントを除外(複数行に対応) |
| CSS | css | 引用符付きまたは引用符なしの url(...)、@import |
| JavaScript / TypeScript | javascript、typescript | 文字列、テンプレートリテラル、コメント |
| JSON | json | jsonc-parser のトークンオフセットを使って文字列リテラルのみを抽出。コメントはトリビアとして扱います |
| YAML | yaml | コメントを含むコンテンツ全体 |
| Properties | properties | #/! で始まるコメント行を除外 |
| TOML | toml | 解析された値のみ。コメントは除外 |
| INI | ini | コンテンツ全体。ただし ;/# で始まるコメント行は除外 |
| XML | xml | 属性とテキストコンテンツ |
| その他すべて | any | ドキュメント全体をスキャン。fileType は unknown を返します |
ドキュメントを拒否することはありません。 上記の 11 種類では除外対象を把握しています。それ以外の言語 ID — python、go、shellscript、csv、plaintext、log など、エディターが何と呼んでいても — は全体をスキャンします。どのテキストでも URL は明確に判別でき、除外すべきものが含まれていないためです。
抽出されるプロトコル:http、https、ftp、file、mailto(@ が必要)、tel。出現箇所はすべて、実際の行番号と列番号とともに報告されます。TOML の位置はソース内で順方向に特定されるため、同じ値が繰り返される場合は概算になることがあります。URL は空白または引用符・括弧の区切り文字で終わるため、相対リンク(/docs)やベアドメイン(example.com)は抽出されません。また、URL に生の空白が含まれている場合は、空白までの部分文字列が抽出されます。末尾の ./, は有効な URL 文字のため保持されます。
コマンド
| コマンド | 説明 |
|---|---|
URLs-LE: Extract URLs | アクティブなドキュメントからすべての URL を抽出します |
URLs-LE: Extract URLs from Workspace | ワークスペース内のすべてのファイルにある重複のない URL と、それぞれの場所を表示します |
URLs-LE: Extract URLs from Folder | 1 つのフォルダーを対象に同じ処理を行います。エクスプローラーでフォルダーを右クリックしても実行できます |
URLs-LE: Deduplicate URLs | 結果から重複する行を削除します |
URLs-LE: Sort URLs | 結果をアルファベット順、ドメイン順、または長さ順に並べ替えます |
URLs-LE: Open Settings | URLs-LE の設定を開きます |
URLs-LE: Help | 組み込みのドキュメントを表示します |
既定では、どのコマンドにもキーは割り当てられていません。エディターの Keyboard Shortcuts で、任意のコマンドにキーを割り当ててください。
設定
| 設定 | 既定値 | 説明 |
|---|---|---|
urls-le.openResultsSideBySide | true | 現在のエディターの横に結果を開きます |
urls-le.postProcess.openInNewFile | true | 結果を新しいファイルで開きます(横に並べて表示しない場合) |
urls-le.showPositions | false | 各 URL の行と列を表示します |
urls-le.copyToClipboardEnabled | false | 結果をクリップボードにもコピーします |
urls-le.clipboardIncludesPositions | false | コピーに行と列を含めます |
urls-le.dedupeEnabled | false | 抽出結果の重複を自動的に除去します |
urls-le.notificationsLevel | silent | all = すべての通知、important = 警告とエラー、silent = エラーのみ |
urls-le.workspace.scanPatterns | ["**/*"] | フォルダーまたはワークスペースのスキャン対象となるファイル |
urls-le.workspace.scanUseDefaultExcludes | true | 依存関係のフォルダー、ビルド出力、キャッシュ、ロックファイルをスキップします |
urls-le.workspace.scanRespectGitignore | true | プロジェクトの .gitignore ファイルで除外されるものをスキップします |
urls-le.workspace.scanSkipBinaryFiles | true | 画像、フォント、アーカイブなどのテキスト以外のファイルをスキップします |
urls-le.workspace.scanExcludes | [] | グロブパターンで、スキップするファイルを追加します |
urls-le.workspace.scanAlwaysInclude | [] | 上記 3 つの設定でスキップされる場合でも読み込むファイル |
urls-le.workspace.scanMaxFiles | 5000 | 1 回のスキャンで読み込むファイルの最大数 |
urls-le.workspace.scanMaxResults | 10000 | 読み込みを停止するまでに 1 回のスキャンで一覧表示する出現箇所の最大数 |
urls-le.safety.enabled | true | 非常に大きなファイルに対する安全対策を有効にします |
urls-le.safety.fileSizeWarnBytes | 1000000 | このファイルサイズを超える場合は抽出を拒否します |
urls-le.safety.largeOutputLinesThreshold | 50000 | この行数を超える場合は警告します |
urls-le.statusBar.enabled | true | ステータスバー項目を表示します |
urls-le.telemetryEnabled | false | ローカルのみのイベントログ(プライバシーを参照) |
言語
英語以外に 12 言語に対応しています。
ドイツ語 · スペイン語 · フランス語 · インドネシア語 · イタリア語 · 日本語 · 韓国語 · ポルトガル語(ブラジル) · ロシア語 · ウクライナ語 · ベトナム語 · 中国語(簡体字)
マニフェスト(コマンドのタイトル、設定名、説明)と、拡張機能の実行中に表示されるすべての項目(通知、ステータスバー、並べ替えのクイックピック)の両方が翻訳されています。拡張機能は VS Code の表示言語に従うため、エディターに設定されている言語がそのまま適用されます。独自の設定はありません。
プライバシーとセキュリティ
- ネットワークアクセスはありません。 この拡張機能は、抽出した URL を取得、検証、または ping することはありません。アクティブなドキュメントのテキストを読み取るだけです。
telemetryEnabled設定はイベントをローカルの出力チャネルに書き込み、確認できます(URLs-LE Telemetry)。マシンの外部にデータが送信されることはありません。 - MCP サーバーも同じ方針を守ります。 引数としてコンテンツを受け取り、データを返すだけで、ファイルシステムへのアクセス、ネットワーク呼び出し、テレメトリーはありません。エージェントにはすでにファイル読み取りツールがあるため、サーバー内でそれらを重複させても機能は増えず、パストラバーサルの攻撃対象領域が広がるだけです。サーバーがいずれかにアクセスできるものをインポートすると、
check:mcp-bundleによってビルドが失敗します。 - エラー通知では、ホームディレクトリと認証情報のような文字列が伏せられます。
- 評価を促すメッセージは最大 2 回です。 3 回目の正常な使用時に、評価するかどうかを一度だけ尋ねます。Later を選択した場合、またはメッセージを閉じた場合は、20 回目にもう一度だけ尋ねます。Don't Ask Again を選択すると、以後表示されません。
notificationsLevelを自分でimportantまたはsilentに設定すると、この機能は無効になります。回数は VS Code の拡張機能ストレージに保存され、どこにも送信されません。Rate を選択すると、ブラウザーでインストール元のマーケットプレイス(VS Code Marketplace または Open VSX)が開きます。
ドキュメント
| 内容 | 場所 |
|---|---|
| ツールが出力できる内容 — 対象範囲、出力契約、拒否、対象外 | crate/SPEC.md |
| 拡張機能の構築方法と構成 — アーキテクチャ、不変条件、ツールチェーン、リリース | AGENTS.md |
| CLI の構築方法と構成 | crate/AGENTS.md |
| 変更内容 | CHANGELOG.md · crate/CHANGELOG.md |
| このツールのページと、ほかの 15 個 | letools.dev/tools/urls-le |
パフォーマンス
| 入力 | サイズ | 検出数 | 時間 | 速度 | スキャン速度 |
|---|---|---|---|---|---|
| Markdown ドキュメント | 2.63 MB | 50,000 | 61.14 ms | 817,802/sec | 43 MB/s |
| HTML ページ | 1.25 MB | 30,000 | 21.88 ms | 1,370,972/sec | 57 MB/s |
| JSON 設定 | 1.52 MB | 40,000 | 39.01 ms | 1,025,358/sec | 38.8 MB/s |
Apple M5 Pro、24 GB RAM、Node 24.3.0 で、ウォームアップ後に 7 回実行した中央値です。入力はチェックインされているのではなく、scripts/benchmark.ts によって生成されるため、上記のサイズは測定時のものと正確に一致します。bun run benchmark で再現できます。
これらの値はマシン固有であり、CI では保証されません。ビルドをブロックするベンチマークでわかるのは、ランナーの負荷だけです。
テスト
| 指標 | カバレッジ |
|---|---|
| ステートメント | 77.59% |
| 分岐 | 67.64% |
| 関数 | 84.73% |
| 行 | 79.13% |
35 ファイルにわたる 475 件のテストケースに加え、実際の VS Code 拡張機能ホストで実行する統合テストスイートと、ビルド済みの .vsix をクリーンなプロファイルにインストールするエンドツーエンドテストがあります。
実際の実行結果である coverage/coverage-summary.json と coverage/test-results.json から scripts/coverage-readme.js が生成します。このセクションに差異があると CI は失敗します。bun run test:coverage で再現でき、ケース数は vitest の出力に表示される値です。
LE ファミリーのその他のツール
あらゆるモデルが直面する作業に対応する、単機能ツールが16個あります。それぞれに Rust CLI と MCP サーバーが付属します。詳細はこちら:letools.dev
取り出す
- String-LE — コードベース内のすべての文字列を抽出し、人が読めるようにします
- Numbers-LE — コードベース内のすべてのハードコードされた数値を抽出し、人が確認できるようにします
- Units-LE — 単位付きの数量をすべて抽出して正規化し、曖昧なものは名前を示して対象外にします
- Dates-LE — すべての日付とタイムスタンプ、およびそれぞれが解決される正確な時点を抽出します
- IDs-LE — UUID、ULID、NanoID、ObjectId、Snowflakeをすべて抽出し、内部に含まれる時刻をデコードします
- IPs-LE — IPアドレス、CIDRブロック、MACアドレスをすべて抽出し、正規化してスコープ別に分類します
- URLs-LE — コードベース内のすべてのURLを、プロトコルと正確な位置情報とともに抽出します
- Paths-LE — コードベース内のすべてのファイルパスを抽出し、現在も何かを指しているかどうかを示します
- Colors-LE — コードベース内のすべての色を抽出し、パレットにない色を示します
チェックする
- Regex-LE — コードベース内のすべての正規表現を検出し、壊滅的なバックトラッキングを引き起こす可能性があるものを報告します
- Versions-LE — リポジトリ内のマニフェスト間で、同じ依存関係のバージョン制約が異なる箇所を検出します
- i18n-LE — プロジェクトで使用している i18n ライブラリを特定し、そのライブラリのルールに基づいてカタログを監査します
- Scrape-LE — スクレイパーを書く前にページをスクレイピングできるか確認し、判定できない場合はその旨を示します
保護する
- Secrets-LE — コードベース内のハードコードされた認証情報を検出し、レポートに表示することはありません
- EnvSync-LE — ディレクトリツリー内の dotenv ファイルを比較し、どのファイルにどのキーがないかを示します
- Unicode-LE — 意味を隠す Unicode を検出します。双方向制御文字、不可視文字、ホモグリフ、混在スクリプトが対象です
それぞれが独立しています。共有クレートも、公開されたコアもありません。2つのツールが同じ答えにたどり着くとすれば、それはその答えが2度正しかったからです。
お問い合わせ — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo によるその他のプロジェクト
Rust — pixelcoords と pixelactions は一連のループを構成します。pixelcoords が 場所 に答え、pixelactions がそこで 操作 します。それぞれ独自のツールと独自の方針を持ち、LE ファミリーには属しません。
- pixelcoords — 画面を固定し、領域を指定して、ピクセル単位で正確な座標と切り抜きを取得します pixelcoords.dev · crates.io · docs.rs
- pixelactions — 人が検証した座標を受け取り、操作を実行して、反映されたことを確認します pixelactions.dev · crates.io · docs.rs
ライセンス
MIT © nolindnaidoo
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。