URL Fetch MCP
Uses Pydantic for type validation of URL parameters and request configuration
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@URL Fetch MCP fetch the latest blog post from example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
URL Fetch MCP
A clean Model Context Protocol (MCP) implementation that enables Claude or any LLM to fetch content from URLs.
Features
Fetch content from any URL
Support for multiple content types (HTML, JSON, text, images)
Control over request parameters (headers, timeout)
Clean error handling
Works with both Claude Code and Claude Desktop
Related MCP server: @kazuph/mcp-fetch
Repository Structure
url-fetch-mcp/
├── examples/ # Example scripts and usage demos
├── scripts/ # Helper scripts (installation, etc.)
├── src/
│ └── url_fetch_mcp/ # Main package code
│ ├── __init__.py
│ ├── __main__.py
│ ├── cli.py # Command-line interface
│ ├── fetch.py # URL fetching utilities
│ ├── main.py # Core MCP server implementation
│ └── utils.py # Helper utilities
├── LICENSE
├── pyproject.toml # Project configuration
├── README.md
└── url_fetcher.py # Standalone launcher for Claude DesktopInstallation
# Install from source
pip install -e .
# Install with development dependencies
pip install -e ".[dev]"Usage
Running the Server
# Run with stdio transport (for Claude Code)
python -m url_fetch_mcp run
# Run with HTTP+SSE transport (for remote connections)
python -m url_fetch_mcp run --transport sse --port 8000Installing in Claude Desktop
There are three ways to install in Claude Desktop:
Method 1: Direct installation
# Install the package
pip install -e .
# Install in Claude Desktop using the included script
mcp install url_fetcher.py -n "URL Fetcher"The url_fetcher.py file contains:
#!/usr/bin/env python
"""
URL Fetcher MCP Server
This is a standalone script for launching the URL Fetch MCP server.
It's used for installing in Claude Desktop with the command:
mcp install url_fetcher.py -n "URL Fetcher"
"""
from url_fetch_mcp.main import app
if __name__ == "__main__":
app.run()Method 2: Use the installer script
# Install the package
pip install -e .
# Run the installer script
python scripts/install_desktop.pyThe scripts/install_desktop.py script:
#!/usr/bin/env python
import os
import sys
import tempfile
import subprocess
def install_desktop():
"""Install URL Fetch MCP in Claude Desktop."""
print("Installing URL Fetch MCP in Claude Desktop...")
# Create a temporary Python file that imports our module
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, "url_fetcher.py")
with open(temp_file, "w") as f:
f.write("""#!/usr/bin/env python
# URL Fetcher MCP Server
from url_fetch_mcp.main import app
if __name__ == "__main__":
app.run()
""")
# Make the file executable
os.chmod(temp_file, 0o755)
# Run the mcp install command with the file path
try:
cmd = ["mcp", "install", temp_file, "-n", "URL Fetcher"]
print(f"Running: {' '.join(cmd)}")
result = subprocess.run(cmd, check=True, text=True)
print("Installation successful!")
print("You can now use the URL Fetcher tool in Claude Desktop.")
return 0
except subprocess.CalledProcessError as e:
print(f"Error during installation: {str(e)}")
return 1
finally:
# Clean up temporary file
try:
os.unlink(temp_file)
os.rmdir(temp_dir)
except:
pass
if __name__ == "__main__":
sys.exit(install_desktop())Method 3: Use CLI command
# Install the package
pip install -e .
# Install using the built-in CLI command
python -m url_fetch_mcp install-desktopCore Implementation
The main MCP implementation is in src/url_fetch_mcp/main.py:
from typing import Annotated, Dict, Optional
import base64
import json
import httpx
from pydantic import AnyUrl, Field
from mcp.server.fastmcp import FastMCP, Context
# Create the MCP server
app = FastMCP(
name="URL Fetcher",
version="0.1.0",
description="A clean MCP implementation for fetching content from URLs",
)
@app.tool()
async def fetch_url(
url: Annotated[AnyUrl, Field(description="The URL to fetch")],
headers: Annotated[
Optional[Dict[str, str]], Field(description="Additional headers to send with the request")
] = None,
timeout: Annotated[int, Field(description="Request timeout in seconds")] = 10,
ctx: Context = None,
) -> str:
"""Fetch content from a URL and return it as text."""
# Implementation details...
@app.tool()
async def fetch_image(
url: Annotated[AnyUrl, Field(description="The URL to fetch the image from")],
timeout: Annotated[int, Field(description="Request timeout in seconds")] = 10,
ctx: Context = None,
) -> Dict:
"""Fetch an image from a URL and return it as an image."""
# Implementation details...
@app.tool()
async def fetch_json(
url: Annotated[AnyUrl, Field(description="The URL to fetch JSON from")],
headers: Annotated[
Optional[Dict[str, str]], Field(description="Additional headers to send with the request")
] = None,
timeout: Annotated[int, Field(description="Request timeout in seconds")] = 10,
ctx: Context = None,
) -> str:
"""Fetch JSON from a URL, parse it, and return it formatted."""
# Implementation details...Tool Capabilities
fetch_url
Fetches content from a URL and returns it as text.
Parameters:
url(required): The URL to fetchheaders(optional): Additional headers to send with the requesttimeout(optional): Request timeout in seconds (default: 10)
fetch_image
Fetches an image from a URL and returns it as an image.
Parameters:
url(required): The URL to fetch the image fromtimeout(optional): Request timeout in seconds (default: 10)
fetch_json
Fetches JSON from a URL, parses it, and returns it formatted.
Parameters:
url(required): The URL to fetch JSON fromheaders(optional): Additional headers to send with the requesttimeout(optional): Request timeout in seconds (default: 10)
Examples
The examples directory contains example scripts:
quick_test.py: Quick test of the MCP serversimple_usage.py: Example of using the client APIinteractive_client.py: Interactive CLI for testing
# Example of fetching a URL
result = await session.call_tool("fetch_url", {
"url": "https://example.com"
})
# Example of fetching JSON data
result = await session.call_tool("fetch_json", {
"url": "https://api.example.com/data",
"headers": {"Authorization": "Bearer token"}
})
# Example of fetching an image
result = await session.call_tool("fetch_image", {
"url": "https://example.com/image.jpg"
})Testing
To test basic functionality:
# Run a direct test of URL fetching
python direct_test.py
# Run a simplified test with the MCP server
python examples/quick_test.pyLicense
MIT
Available Tools
3 toolsfetch_imageC
Fetch an image from a URL and return it as an image.
This tool allows Claude to retrieve images from any accessible web URL.
The image is returned in a format that Claude can display.
Inputs: url (required), timeout. Returns: result
fetch_jsonA
Fetch JSON from a URL, parse it, and return it formatted.
This tool allows Claude to retrieve and parse JSON data from any accessible web URL.
The JSON is prettified for better readability.
Inputs: url (required), headers, timeout. Returns: result
fetch_urlC
Fetch content from a URL and return it as text.
This tool allows Claude to retrieve content from any accessible web URL.
The content is returned as text, making it suitable for HTML, plain text,
and other text-based content types.
Inputs: url (required), headers, timeout. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: fetch_image retrieves images, fetch_json retrieves and parses JSON, and fetch_url retrieves general text content. The descriptions reinforce these distinctions, making it easy for an agent to select the right tool based on the expected response format.
All tool names follow a consistent verb_noun pattern with 'fetch_' prefix and descriptive suffixes (image, json, url). This predictable naming scheme enhances usability and reduces cognitive load for agents.
Three tools is a reasonable count for a URL fetching server, covering the main content types (images, JSON, text). It's slightly lean but well-scoped; adding tools for other formats like XML or binary data could improve completeness without being excessive.
The tools cover the core use cases for fetching web content: images, JSON, and general text. A minor gap exists for other structured data formats like XML or raw binary files, but agents can work around this by using fetch_url for text-based alternatives or requesting enhancements.
Maintenance
Related MCP Connectors
MCP Server for Web2MD — convert URLs to Markdown from Claude Desktop, Cursor, etc.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Web scraping MCP server: any URL to Markdown or JSON, with JavaScript rendering and batch jobs.
Related MCP Servers
- AlicenseBqualityFmaintenanceA Model Context Protocol (MCP) server for web research. Bring real-time info into Claude and easily research any topic.3425 npm300MIT
- AlicenseAqualityDmaintenanceModel Context Protocol server for fetching web content and processing images. This allows Claude Desktop (or any MCP client) to fetch web content and handle images appropriately.1808 npm41MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables Claude and other LLMs to make HTTP requests with realistic browser fingerprinting, bypassing common anti-bot measures and interacting with websites more naturally.1234 PyPI47MIT
- AlicenseAqualityDmaintenanceModel Context Protocol server that enables Claude Desktop (or any MCP client) to fetch web content and process images appropriately.124 npmMIT