Website MCP Server

Download website to a local directory (including all css, images, js, etc.)

Local serverstdio

What is the Website MCP server?

Most search and retrieval work still happens through a UI a human drives. Website MCP server moves it into the conversation instead. Download website to a local directory (including all css, images, js, etc.).

Getting it running

Installation goes through your MCP client rather than a global install: point it at website-scraper on npm and it is fetched when the client starts. The copy-paste blocks for Claude Desktop, Claude Code and Cursor are further down this page.

The tools it exposes

The server publishes 14 tools. What each one is for:

  • urls — Array of objects which contain urls to download and filenames for them. Required. javascript scrape({ urls: [ 'http://nodejs.org/', // Will be
  • directory — String, absolute path to directory where downloaded files will be saved. Directory should not exist. It will be created by scraper. Required
  • sources — Array of objects to download, specifies selectors and attribute values to select files for downloading. By default scraper tries to download all
  • recursive — Boolean, if true scraper will follow hyperlinks in html files. Don't forget to set maxRecursiveDepth to avoid infinite downloading. Defaults to false
  • maxRecursiveDepth — Positive number, maximum allowed depth for hyperlinks. Other dependencies will be saved regardless of their depth. Defaults to null - no maximum
  • maxDepth — Positive number, maximum allowed depth for all dependencies. Defaults to null - no maximum depth set. In most of cases you need
  • request — Object, custom options for http module got which is used inside website-scraper. Allows to set
  • subdirectories — Array of objects, specifies subdirectories for file extensions. If null all files will be saved to directory. javascript /* Separate files into
  • defaultFilename — The defaultFilename tool exposed by this server
  • prettifyUrls — Boolean, whether urls should be 'prettified', by having the defaultFilename removed. Defaults to false
  • ignoreErrors — Boolean, if true scraper will continue downloading resources after error occurred, if false - scraper will finish process and return error. Defaults
  • urlFilter — Function which is called for each url to check whether it should be scraped. Defaults to null - no url filter will be applied. javascript // Links to

What it needs from you

Configuration is passed through the environment: DEBUG. Treat anything key-shaped as a real credential — scope it to the minimum the server needs, and rotate it if it ever lands in a shared config.

Things to watch

  • It runs with your machine's permissions. That is convenient and also the reason to think about what you point it at before you approve a tool call.
  • With 14 tools registered it takes up a noticeable share of the context window; turn it off in projects that never touch Website.
  • Keep per-call confirmation enabled while you learn its behaviour; it is the cheapest safeguard you have.

How it compares

Among the search and retrieval options, the useful question is rarely "what can it do" but "what does it cost you to run" — permissions, credentials, and how much of your context its toolset consumes. Website's toolset — urls, directory, sources and 11 more — is a fair guide to whether it matches your workflow. It is maintained by GitHub Actions; worth a glance at recent repository activity before you build anything load-bearing on it.

This entry was verified against Website's own documentation before publication; SyncDev keeps the directory reviewed rather than auto-generated.

Available tools

ToolWhat it does
urlsArray of objects which contain urls to download and filenames for them. **_Required_**. javascript scrape({ urls: [ 'http://nodejs.org/', // Will be saved with default filename 'index.html' {url: 'http://nodejs.org/about
directoryString, absolute path to directory where downloaded files will be saved. Directory should not exist. It will be created by scraper. **_Required_**. How to download website to existing directory and why it's not supported
sourcesArray of objects to download, specifies selectors and attribute values to select files for downloading. By default scraper tries to download all possible resources. Scraper uses cheerio to select html elements so selecto
recursiveBoolean, if true scraper will follow hyperlinks in html files. Don't forget to set maxRecursiveDepth to avoid infinite downloading. Defaults to false.
maxRecursiveDepthPositive number, maximum allowed depth for hyperlinks. Other dependencies will be saved regardless of their depth. Defaults to null - no maximum recursive depth set.
maxDepthPositive number, maximum allowed depth for all dependencies. Defaults to null - no maximum depth set. In most of cases you need [maxRecursiveDepth](#maxRecursiveDepth) instead of this option.
requestObject, custom options for http module [got](https://github.com/sindresorhus/got#options) which is used inside website-scraper. Allows to set retries, cookies, userAgent, encoding, etc. javascript // use same request opt
subdirectoriesArray of objects, specifies subdirectories for file extensions. If null all files will be saved to directory. javascript /* Separate files into directories: - img for .jpg, .png, .svg (full path /path/to/save/img) - js f
defaultFilenameThe defaultFilename tool exposed by this server.
prettifyUrlsBoolean, whether urls should be 'prettified', by having the defaultFilename removed. Defaults to false.
ignoreErrorsBoolean, if true scraper will continue downloading resources after error occurred, if false - scraper will finish process and return error. Defaults to false.
urlFilterFunction which is called for each url to check whether it should be scraped. Defaults to null - no url filter will be applied. javascript // Links to other websites are filtered out by the urlFilter scrape({ urls: ['http
filenameGeneratorString (name of the bundled filenameGenerator). Filename generator determines path in file system where the resource will be saved.
requestConcurrencyNumber, maximum amount of concurrent requests. Defaults to Infinity.

How to install the Website MCP server

{
  "mcpServers": {
    "website-scraper": {
      "command": "npx",
      "args": ["-y", "website-scraper"],
      "env": {
        "DEBUG": "your-value"
      }
    }
  }
}

Add to claude_desktop_config.json, then restart Claude Desktop.

Configuration

VariableDescriptionRequired
DEBUGConfiguration value read at startup.Optional

Example prompts to try

  • Use Website to urls.
  • Use Website to directory.
  • Use Website to sources.

Frequently asked questions

It connects Website to MCP-compatible AI assistants such as Claude and Cursor, exposing 14 tools (urls, directory, sources, and more) that the assistant can call on your behalf. Instead of copying data back and forth by hand, the assistant works with Website directly.