fetch-url-mcp
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., "@fetch-url-mcpUse fetch_url to get https://example.com and tell me what it says"
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.
fetch-url-mcp
Public demo for Vybe Collect: a tiny “fetch URL → text” MCP that builders can monetize two ways.
Path | What you do | Where agents pay |
D — Dashboard | Paste | Vybe Collect → invoke proxies your MCP (origin key stays private) |
C — SKU wrapper | Set env + gate | Unpaid → HTTP 402; retry with |
Same tools either way: fetch_url, fetch_json.
Product: vybe.finance/collect · Integrate: collect/integrate · Middleware: express-vybe-402
Quick start
git clone https://github.com/Vybe-Finance/Fetch-URL-MCP.git
cd Fetch-URL-MCP
npm install
cp .env.example .env
npm run buildLocal Cursor (stdio — free, no Collect)
npm startCursor mcp.json:
{
"mcpServers": {
"fetch-url": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/fetch-url-mcp/dist/index.js"]
}
}
}Live Collect demo (HTTP)
# edit .env — at least PORT; add VYBE_* for Path C
npm run start:httpExpose HTTPS (ngrok, Fly, Railway, …). Health check: GET /health.
Related MCP server: Web Scraper MCP Server
Env vars (what builders paste)
Variable | Required for | Meaning |
| HTTP | Listen port (default |
| HTTP | Bind address (default |
| Path C | Your Collect |
| Path C | Offering id from the desk, e.g. |
| Path C (optional) | Collect API origin — default |
| never in prod |
|
Path D does not need VYBE_USERNAME / VYBE_OFFERING_ID on this process — those live on the Collect offering in the Vybe dashboard. This server only needs a public URL.
.env maps into Path C like this:
requireVybePayment({
username: process.env.VYBE_USERNAME,
offeringId: process.env.VYBE_OFFERING_ID,
origin: process.env.VYBE_ORIGIN || "https://www.vybe.finance",
})Path D — paste MCP URL in the dashboard
Run
npm run start:httpon a public HTTPS host (Vybe invoke blocks localhost).In Vybe → Business → Products → create offering type MCP.
Set MCP server URL to
https://YOUR_HOST/mcp(trailing path/mcp).Enable Collect. Optional: trial free requests.
Agents: catalog → pay →
POST /api/agent/invoke/{username}/{offeringId}withX-Vybe-Public-Id.
They never see your upstream. You never paste an API key into Claude.
Path C — express-vybe-402 SKU wrapper
Create an API (or MCP) offering; copy
svc_….Set in
.env:
VYBE_USERNAME=yourname
VYBE_OFFERING_ID=svc_xxxxxxxx
VYBE_ORIGIN=https://www.vybe.financeRestart
npm run start:http.Smoke:
# unpaid → 402 + payment details
curl -i "http://localhost:8080/v1/fetch?url=https://example.com"
# after settle, retry with publicId
curl -i -H "X-Vybe-Public-Id: YOUR_PUBLIC_ID" \
"http://localhost:8080/v1/fetch?url=https://example.com"Human fallback: open the /r/{publicId} link from the 402 body and pay in Vybe.
Tools
Tool / route | What it does |
| GET URL → plain text (HTML stripped) |
| GET JSON URL → pretty-print |
| Same as |
Safety: http/https only. Localhost / private IPs blocked unless ALLOW_PRIVATE=1.
Try prompts
“Use fetch_url on https://example.com and summarise.”
“fetch_json https://api.open-meteo.com/v1/forecast?latitude=54.98&longitude=-1.61¤t=temperature_2m”
Deploy on Render (free)
New → Web Service → connect Vybe-Finance/Fetch-URL-MCP
Build:
npm install && npm run build· Start:npm run start:httpHealth check path:
/healthEnv:
HOST=0.0.0.0,VYBE_ORIGIN=https://www.vybe.finance
For Path C also setVYBE_USERNAME+VYBE_OFFERING_IDAfter deploy, Path D
mcpServerUrl=https://YOUR-SERVICE.onrender.com/mcp
Free tier sleeps when idle — first agent call after sleep may be slow.
Deploy notes
Prefer www Collect origin:
https://www.vybe.financeFor Path D, upstream must be reachable from Vybe’s servers (public HTTPS)
Do not commit
.envThis is a demo — add rate limits / auth before production traffic
License
MIT
Available Tools
2 toolsfetch_jsonA
Fetch a public http(s) URL that returns JSON and pretty-print it. Use for public APIs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http(s) URL that returns JSON |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool expects a public URL, requires JSON-returning endpoints, and pretty-prints the result. It does not mention error handling or non-JSON responses, but the core behavioral profile is clear and additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words: the first states the action and result, the second offers usage direction. The repetition of 'public' is minor and does not harm clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with full schema coverage and no output schema, the description covers purpose, usage scope, and observable behavior. It lacks explicit failure-mode details, but nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the 'url' parameter with 100% coverage, including its URI format and requirement to return JSON. The description adds no parameter-level meaning beyond this, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Fetch a public http(s) URL that returns JSON') and a concrete outcome ('pretty-print it'). The mention of JSON and pretty-printing clearly differentiates it from the sibling 'fetch_url, even though that tool is not explicitly referenced.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for public APIs' gives clear usage context and implies this tool is not intended for authenticated or private endpoints. However, it stops short of explicitly naming the alternative sibling or stating when to choose fetch_url instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_urlA
Fetch a public http(s) URL and return readable plain text (HTML stripped). Use for pages, docs, blog posts.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http(s) URL to fetch | |
| max_chars | No | Max characters to return (default 8000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description is the only behavioral disclosure. It does disclose that only public URLs are fetched and that HTML is stripped into plain text, but it omits behavior around HTTP errors, redirects, timeouts, or response failure cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences put the core behavior first and the intended use cases second, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter fetch tool, the description covers the main facts needed for selection and invocation: public URL input, plain-text output, and common use cases. It lacks error and redirect behavior, but the essential information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description's parameter contribution is minimal and the schema already documents url and max_chars adequately. The description adds no extra parameter-level detail beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a clear verb and resource with a specific transformation: fetch a public http(s) URL and return readable plain text with HTML stripped. The intended content types (pages, docs, blog posts) also help distinguish this from the fetch_json sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear positive context for when to use this tool: for pages, docs, and blog posts. However, it does not explicitly contrast it with fetch_json or state when NOT to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.2.0- First observed
fetch_json - First observed
fetch_url
TDQS
Scored across 2 tools
The two tools are clearly distinguished by output type and use case: one returns readable plain text, the other pretty-printed JSON. The names themselves signal the difference, so there is minimal risk of selecting the wrong tool.
Both tool names follow the same verb_noun snake_case pattern: fetch_url and fetch_json. The naming is predictable, concise, and exactly matches each tool's function.
Two tools is slightly below the typical 3-15 range, but for the narrow purpose of fetching public URLs, the count is reasonable. Each tool earns its place, and adding more would likely inflate the surface unnecessarily.
The tool set covers the two most common URL-fetching needs: human-readable content and JSON APIs. It lacks support for binary content or raw HTML, but that appears beyond the server's stated scope, so the coverage is adequate with only minor gaps.
Maintenance
Related MCP Connectors
Turn any URL into clean, structured, agent-ready content. $0.02/call via x402 on Base.
Fetch any URL as clean Markdown or metadata, and buy digital goods via x402 — for AI agents.
Read a URL as clean markdown, screenshot a website, url to PDF. Web access for agents, no signup.
Clean Markdown and AI-readability scoring for any URL. Built for AI agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables fetching content from any URL with support for different HTTP methods, custom headers, and request bodies. Designed to work with ChatGPT and other AI assistants for web scraping and API interactions.-
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to fetch, clean, and extract readable content from web pages, optionally including links and images, via the scrape_url tool.-
- AlicenseAqualityDmaintenanceEnables AI agents to fetch any web page as clean markdown or screenshot it, turning URLs into LLM-ready context.21 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables agents to crawl URLs and retrieve page content as fixed-shape structured JSON, including title, markdown, links, word count, and error status.MIT