Skip to main content
Glama
Vybe-Finance

fetch-url-mcp

by Vybe-Finance

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 https://YOUR_HOST/mcp as mcpServerUrl on an MCP offering

Vybe Collect → invoke proxies your MCP (origin key stays private)

C — SKU wrapper

Set env + gate GET /v1/fetch with express-vybe-402

Unpaid → HTTP 402; retry with X-Vybe-Public-Id

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 build

Local Cursor (stdio — free, no Collect)

npm start

Cursor 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:http

Expose HTTPS (ngrok, Fly, Railway, …). Health check: GET /health.


Related MCP server: Web Scraper MCP Server

Env vars (what builders paste)

Variable

Required for

Meaning

PORT

HTTP

Listen port (default 8080)

HOST

HTTP

Bind address (default 0.0.0.0)

VYBE_USERNAME

Path C

Your Collect @username without @

VYBE_OFFERING_ID

Path C

Offering id from the desk, e.g. svc_…

VYBE_ORIGIN

Path C (optional)

Collect API origin — default https://www.vybe.finance

ALLOW_PRIVATE

never in prod

1 = allow fetch of localhost/private IPs

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

  1. Run npm run start:http on a public HTTPS host (Vybe invoke blocks localhost).

  2. In Vybe → Business → Products → create offering type MCP.

  3. Set MCP server URL to https://YOUR_HOST/mcp (trailing path /mcp).

  4. Enable Collect. Optional: trial free requests.

  5. Agents: catalog → pay → POST /api/agent/invoke/{username}/{offeringId} with X-Vybe-Public-Id.

They never see your upstream. You never paste an API key into Claude.


Path C — express-vybe-402 SKU wrapper

  1. Create an API (or MCP) offering; copy svc_….

  2. Set in .env:

VYBE_USERNAME=yourname
VYBE_OFFERING_ID=svc_xxxxxxxx
VYBE_ORIGIN=https://www.vybe.finance
  1. Restart npm run start:http.

  2. 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

fetch_url

GET URL → plain text (HTML stripped)

fetch_json

GET JSON URL → pretty-print

GET /v1/fetch?url=

Same as fetch_url, gated when Path C env is set

Safety: http/https only. Localhost / private IPs blocked unless ALLOW_PRIVATE=1.


Try prompts


Deploy on Render (free)

  1. New → Web Service → connect Vybe-Finance/Fetch-URL-MCP

  2. Build: npm install && npm run build · Start: npm run start:http

  3. Health check path: /health

  4. Env: HOST=0.0.0.0, VYBE_ORIGIN=https://www.vybe.finance
    For Path C also set VYBE_USERNAME + VYBE_OFFERING_ID

  5. After 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.finance

  • For Path D, upstream must be reachable from Vybe’s servers (public HTTPS)

  • Do not commit .env

  • This is a demo — add rate limits / auth before production traffic


License

MIT

Available Tools

2 tools
fetch_jsonA

Fetch a public http(s) URL that returns JSON and pretty-print it. Use for public APIs.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL that returns JSON

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch
max_charsNoMax characters to return (default 8000)

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv0.2.0
    • First observedfetch_json
    • First observedfetch_url

TDQS

A4.2/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers