Extract URLs from documentation, configuration and code, with their protocol and position.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Pull every URL out of the current file in one keystroke
Any text file β Markdown, HTML, CSS, JavaScript, TypeScript, JSON, YAML, Properties, TOML, INI and XML know what to exclude
Useful? A star or rating is how other developers find it β β GitHub Β· β Open VSX Β· β Marketplace
Open a file, press Ctrl+Alt+U (Cmd+Alt+U on Mac), and every URL in the document lands in a new editor β deduplicate and sort it from there. Works in VS Code and in VS Codeβbased editors like Cursor and VSCodium (installable from Open VSX).
| Where | What you get | Install |
|---|---|---|
| VS Code | The extraction, in your editor, on a keystroke | Marketplace |
| Cursor, VSCodium, Windsurf | The same extension | Open VSX |
| A terminal or a CI step | The same run over a whole tree, with exit codes | cargo install urls-le Β· crates.io |
| Any MCP agent, via Node | extract_urls over stdio | npx urls-le-mcp Β· npm |
| Zed | The MCP server as a context server | zed-industries/extensions#7077 (pending review) |
The same extraction engine runs as an MCP server, so an agent can call it directly instead of you running a command.
| Editor | How |
|---|---|
| VS Code 1.101+ | Nothing to install β the extension registers extract_urls with agent mode |
| Zed | URLs-LE β pending review |
| Claude Code | claude mcp add urls-le -- npx -y urls-le-mcp |
| Cursor, Windsurf, anything else | point it at npx urls-le-mcp |
Returns every URL with its protocol and 1-based line and column, capped at 500 by default with meta.truncated so a large file cannot flood the agent's context window.
The server takes content and returns data β it reads no files and makes no network requests of its own. Published as urls-le-mcp on npm and as io.github.nolindnaidoo/urls-le in the MCP registry.
Most hosts read a JSON config. Add one entry:
-y skips the install prompt on first run. Pin a version if you would rather not track releases β urls-le-mcp@2.3.1.
Prefer not to go through npx on every launch? Install it once and point at the binary instead:
It speaks MCP over stdio and needs no environment variables, no API key and no configuration of its own. To check it before wiring it into anything:
That prints the tool list and exits β if you see extract_urls, the server works.
The same extraction runs from a terminal or a shell pipeline: a Rust CLI
in crate/, sharing one corpus with the extension β
crate/fixtures/ β so the two can never read a
document differently.
Exit codes follow grep β 0 URLs found, 1 none found, 2 the question
was malformed β so if urls-le src/; then β¦ works and finding nothing
is an answer rather than an error.
It has no opinions, deliberately. No link checking, no
insecure-scheme flag, no filtering. An http:// URL is wrong in a
production config and right in a test fixture; a tool that decides for
you is one you configure, then argue with, then mute β and the muting
takes the extraction with it. Pipe it to lychee and let that have the
opinions.
| Format | Language IDs | Notes |
|---|---|---|
| Markdown | markdown | Fenced code blocks and inline code excluded |
| HTML | html | <!-- --> comments excluded (multi-line supported) |
| CSS | css | Quoted or bare url(...), @import |
| JavaScript / TypeScript | javascript, typescript | Strings, template literals, comments |
| JSON | json | String literals only, via jsonc-parser token offsets; comments are trivia |
| YAML | yaml | Whole content, comments included |
| Properties | properties | #/! comment lines excluded |
| TOML | toml | Parsed values only; comments excluded |
| INI | ini | Whole content; ;/# comment lines excluded |
| XML | xml | Attributes and text content |
| Anything else | any | Whole document scanned; fileType reports unknown |
No document is refused. The eleven above know what to exclude; every
other language id β python, go, shellscript, csv, plaintext,
log, whatever your editor calls it β is scanned whole, because a URL is
unambiguous in any text and there is nothing in those worth excluding.
Extracted protocols: http, https, ftp, file, mailto (requires an @), tel. Every occurrence is reported with its real line and column β TOML positions are forward-located in the source and can be approximate for repeated identical values. A URL ends at whitespace or a quote/bracket delimiter, so relative links (/docs) and bare domains (example.com) are never extracted, and URLs containing raw spaces extract as space-terminated partials. Trailing ./, are kept β they are legal URL characters.
| Command | Description |
|---|---|
URLs-LE: Extract URLs (Ctrl+Alt+U / Cmd+Alt+U) | Extract all URLs from the active document |
URLs-LE: Deduplicate URLs | Remove duplicate lines from the results |
URLs-LE: Sort URLs | Sort results alphabetically, by domain, or by length |
URLs-LE: Open Settings | Open URLs-LE settings |
URLs-LE: Help | Built-in documentation |
| Setting | Default | Description |
|---|---|---|
urls-le.openResultsSideBySide | true | Open results beside the current editor |
urls-le.postProcess.openInNewFile | true | Open results in a new file (when not side-by-side) |
urls-le.copyToClipboardEnabled | false | Also copy results to the clipboard |
urls-le.dedupeEnabled | false | Deduplicate extraction results automatically |
urls-le.notificationsLevel | silent | all = every notification, important = warnings + errors, silent = errors only |
urls-le.safety.enabled | true | Guardrails for very large files |
urls-le.safety.fileSizeWarnBytes | 1000000 | Refuse extraction above this file size |
urls-le.safety.largeOutputLinesThreshold | 50000 | Warn above this line count |
urls-le.statusBar.enabled | true | Show the status bar item |
urls-le.telemetryEnabled | false | Local-only event log (see Privacy) |
Twelve languages besides English:
German Β· Spanish Β· French Β· Indonesian Β· Italian Β· Japanese Β· Korean Β· Portuguese (Brazil) Β· Russian Β· Ukrainian Β· Vietnamese Β· Chinese (Simplified)
Both halves are covered β the manifest (command titles, setting names and descriptions) and everything shown while the extension runs (notifications, the status bar, the sort quick-pick). The extension follows VS Code's display language, so it matches whatever the editor is already set to; no setting of its own.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/urls-le)<a href="https://allmcps.com/mcp/urls-le"><img src="https://allmcps.com/api/badge/urls-le?style=directory" alt="Urls Le on AllMCPs" /></a>