streamable-httpMITupdated 22d ago
A public Model Context Protocol (MCP) server, running as a Cloudflare Worker, that lets any AI agent read the live web as clean Markdown. It builds on the same extraction pipeline as the sibling reader/ project (Mozilla Readability + Turndown), exposed over the MCP Streamable HTTP transport so agentic clients can plug straight in.
What can you do with vanshulgoyal101?
mcp.vanshul.com
A public Model Context Protocol (MCP) server, running as a Cloudflare
Worker, that lets any AI agent read the live web as clean Markdown. It builds on
the same extraction pipeline as the sibling reader/ project
(Mozilla Readability + Turndown), exposed over the MCP Streamable HTTP
transport so agentic clients can plug straight in.
Endpoint
POST https://mcp.vanshul.com/mcp # JSON-RPC 2.0 (MCP)
GET https://mcp.vanshul.com/health # { ok: true, tools: [...] }
Tools
| Tool | Input | Returns |
|---|---|---|
fetch_markdown |
{ url, max_chars? } |
The page's main content as clean Markdown (optionally truncated to max_chars) |
search_page |
{ url, query, max_matches?, context_chars? } |
Only the passages matching query, each with its heading breadcrumb, ranked by relevance ā token-efficient alternative to fetch_markdown |
fetch_metadata |
{ url } |
JSON: title, byline, siteName, excerpt, wordCount |
extract_links |
{ url, limit? } |
JSON: all outbound http(s) links + anchor text |
Connect from an MCP client
Remote/HTTP-capable clients (Claude Desktop, Cursor, Continue, ā¦):
{
"mcpServers": {
"web-reader": { "url": "https://mcp.vanshul.com/mcp" }
}
}
Stdio-only clients can bridge with mcp-remote:
npx mcp-remote https://mcp.vanshul.com/mcp
Add it to your client
- Cursor ā Settings ā MCP ā Add new server, or drop this into
~/.cursor/mcp.json:{ "mcpServers": { "web-reader": { "url": "https://mcp.vanshul.com/mcp" } } } - Claude Desktop ā add the same block to
claude_desktop_config.json(Settings ā Developer ā Edit Config). If your version is stdio-only, use:{ "mcpServers": { "web-reader": { "command": "npx", "args": ["mcp-remote", "https://mcp.vanshul.com/mcp"] } } } - Continue / VS Code ā add
web-readerwith URLhttps://mcp.vanshul.com/mcpto your MCP servers config.
Try it with curl
curl -s https://mcp.vanshul.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s https://mcp.vanshul.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"fetch_markdown","arguments":{"url":"https://example.com"}}}'
# Return only the passages matching a query (token-efficient):
curl -s https://mcp.vanshul.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"search_page","arguments":{"url":"https://example.com","query":"more information"}}}'
Layout
mcp/
āāā src/
ā āāā worker.ts # entry: routes /mcp, /health, rate limit, CORS
ā āāā mcp.ts # JSON-RPC dispatch + tool definitions
ā āāā extract.ts # HTML -> Markdown / links (Readability + Turndown)
ā āāā search.ts # query-focused passage search over extracted Markdown
ā āāā fetcher.ts # fetch with timeout, size cap, re-validated redirects
ā āāā security.ts # SSRF guard (block private/internal addresses)
āāā public/
ā āāā index.html # landing page (served for non-API paths)
ā āāā og.png # social share image (1200Ć630)
ā āāā og.svg # social image source
ā āāā robots.txt
ā āāā sitemap.xml
āāā tests/ # vitest: security, extract, search, mcp dispatch, fetcher, worker
āāā wrangler.toml
āāā package.json
āāā tsconfig.json
āāā README.md
Develop & deploy
cd mcp
npm install
npm run typecheck
npm test # vitest ā security, extraction, search, MCP dispatch, fetcher, worker
npm run dev # local worker at http://localhost:8787 (POST /mcp)
npm run deploy # wrangler deploy
After the first deploy, attach the custom domain mcp.vanshul.com in the
Cloudflare dashboard (Workers & Pages ā this worker ā Settings ā Domains), or
uncomment the [[routes]] block in wrangler.toml.
Security
- SSRF-safe: only public
http(s)URLs; localhost, private ranges, cloud metadata and every redirect hop are blocked/re-validated. - Bounded: 10s fetch timeout, ~3 MB page cap, max 5 redirects, per-IP rate limit.
- Stateless & private: no page content is stored; extraction is deterministic with no LLM in the loop.
MCP protocol
Implements initialize, ping, tools/list, tools/call and notifications
(protocol version 2025-06-18). Tool failures are returned as
{ content, isError: true } so the agent can read the message and recover;
malformed requests use standard JSON-RPC error codes.
Documentation
- docs/architecture.md ā modules, request lifecycle, extraction pipeline, limits
- docs/tools.md ā full tool & JSON-RPC API reference with examples
- docs/security.md ā SSRF threat model and mitigations
- docs/deployment.md ā Cloudflare Worker + custom-domain deploy guide
License
MIT Ā© Vanshul Goyal
Install
Add vanshulgoyal101 to your client. Pick the one you use.
claude mcp add --transport http vanshulgoyal101 https://mcp.vanshul.com/mcpcodex mcp add vanshulgoyal101 --url https://mcp.vanshul.com/mcp{
"mcpServers": {
"vanshulgoyal101": {
"url": "https://mcp.vanshul.com/mcp"
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
{
"servers": {
"vanshulgoyal101": {
"type": "http",
"url": "https://mcp.vanshul.com/mcp"
}
}
}Add to `.vscode/mcp.json` in your workspace.
{
"mcpServers": {
"vanshulgoyal101": {
"url": "https://mcp.vanshul.com/mcp"
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"vanshulgoyal101": {
"serverUrl": "https://mcp.vanshul.com/mcp"
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
4 tools
vanshulgoyal101 exposes 4 tools to a connected agent.
- fetch_markdown
- `{ url, max_chars? }`
- search_page
- `{ url, query, max_matches?, context_chars? }`
- fetch_metadata
- `{ url }`
- extract_links
- `{ url, limit? }`
Score
75 / 100
Good
- Documentation25/25
- Maintenance19/25
- Trust13/20
- Capability6/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 15 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 4 tool(s) documented
- Provides prompt templates
- Provides resources
- 6 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint ā no local install
Version history
| Versions | Published |
|---|---|
| 1.0.0Latest | Aug 6, 2026 |