web2mcp

io.github.charleswei118由 GitHub 账号 charleswei118 发布v0.2.0更新于 Nov 7, 2026

Zero-dependency Cloudflare Worker gateway turning websites and REST APIs into MCP tools.

已验证Streamable HTTP可网页运行网页搜索与抓取开发者工具数据与分析

概览

AI 生成的概览

一个 Cloudflare Worker 网关,把维基百科、Hacker News、天气、地理编码、汇率和 GitHub 等公开网络数据源封装为 MCP 工具。

可以做什么
  • 搜索并阅读维基百科条目(全文搜索、导语摘要)
  • 浏览和搜索 Hacker News 故事(首页、关键词搜索)
  • 查询地点坐标、国家、时区,以及当前天气和每日预报
  • 获取以指定货币为基准的最新汇率
  • 按限定条件搜索 GitHub 仓库并查看单个仓库详情
  • 自建部署还可通过连接器接入任意 REST API 或网页,支持 OpenAPI 导入和目录模式
适用场景
适合需要免密钥快速获取通用公开数据的场景,例如百科查询、科技资讯、天气、地点坐标、汇率或 GitHub 仓库检索,无需为每个来源单独搭建集成。
运行要求
远程 Streamable HTTP 端点;公开演示未声明账号、API 密钥或请求头。自建需要 Cloudflare 账号和 Wrangler,或本地 stdio 方式使用 Node.js 20+,也可用 Docker。可选配置包括 AUTH_TOKEN、GITHUB_TOKEN、ENABLED_CONNECTORS、CONNECTORS_JSON、MAX_OUTPUT_CHARS 和 TOOL_MODE。
安装前请注意
公开演示受免费套餐限流,且网页读取工具被禁用,README 建议实际使用请自行部署。共享 IP 调用 GitHub 可能触发匿名限额,除非设置 GITHUB_TOKEN。自建端点若未配置 AUTH_TOKEN 则无访问保护。请求会发往维基百科、Hacker News、Open-Meteo、Frankfurter、GitHub 等第三方服务,自行添加的 API 密钥应保存在服务端密钥中。

安装

在 SourceWeft 中

  1. 打开 控制台中的 web2mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.charleswei118%2Fweb2mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "web2mcp": {
      "type": "http",
      "url": "https://web2mcp.cwei59969.workers.dev/mcp"
    }
  }
}

README

web2mcp

Turn any website or REST API into MCP tools — one tiny Cloudflare Worker, zero dependencies.

English · 简体中文

[CI] [License: MIT] [Runtime deps: 0] [MCP]

[Deploy to Cloudflare]

GitHub's 665 REST endpoints → 2 MCP tools, ~147,000 tokens of tool definitions → ~300 (catalog mode)

Every AI agent (Claude, ChatGPT, Cursor, your own bots…) now speaks the Model Context Protocol. But most websites and apps don't. web2mcp is the glue: describe an HTTP API in a few lines of config and it instantly becomes an MCP tool that any agent can call — hosted for free on Cloudflare's edge.

 Claude / Cursor / any MCP client              │  MCP (Streamable HTTP, JSON-RPC)              ▼   ┌──────────────────────────┐   │  web2mcp  (CF Worker)    │  connectors/*.js  or  CONNECTORS_JSON   └──────────────────────────┘      │        │        │   Wikipedia  GitHub  any REST API / web page …

Try it now

A public demo is running at https://web2mcp.cwei59969.workers.dev (tool list) with the MCP endpoint at:

https://web2mcp.cwei59969.workers.dev/mcp

Paste it into any client that supports remote MCP servers, or:

bash
curl -s https://web2mcp.cwei59969.workers.dev/mcp -H 'content-type: application/json' \  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"weather_forecast","arguments":{"latitude":35.68,"longitude":139.69}}}'

The demo is rate-limited by the free plan and has reader_read disabled. Deploy your own for real use.

Why

  • Config, not code. A connector is a plain object: base URL, path, query, params. No SDK to learn.
  • Zero runtime dependencies. ~500 lines of readable JavaScript. Audit it in 10 minutes.
  • Token-friendly output. pick and fields trim giant JSON responses down to what the model needs.
  • Free hosting. Runs on the Cloudflare Workers free plan. Deploy in one click.
  • Safe by default. Requests are locked to each connector's host, arguments are type-checked, secrets stay server-side, optional bearer auth.
  • OpenAPI import. Convert any OpenAPI 3 spec into a connector with one command.

Built-in connectors (no API keys)

ToolWhat it does
wikipedia_search, wikipedia_summarySearch Wikipedia, read article summaries
hackernews_front_page, hackernews_searchHacker News stories
geocode_searchPlace name → coordinates (Open-Meteo)
weather_forecastCurrent weather + daily forecast (Open-Meteo)
currency_latestECB exchange rates (Frankfurter)
github_search_repos, github_repoPublic GitHub repositories (set GITHUB_TOKEN on Workers: shared IPs hit GitHub's anonymous limit)
reader_readAny web page → clean Markdown (Jina Reader)
npm_package, npmstats_downloadsnpm package info and weekly downloads
arxiv_searchSearch arXiv research papers
holidays_listPublic holidays by country and year (Nager.Date)
holidaycn_yearMainland China holidays and make-up workdays (调休) for a year
baiduhot_realtimeBaidu real-time hot search (百度热搜)
shici_randomA random line of classical Chinese poetry (今日诗词)
bilibili_popular, bilibili_rankingBilibili trending / ranking videos (stdio & self-hosted only: Bilibili blocks Cloudflare IPs)

Deploy your own in one click

Click Deploy to Cloudflare above. Cloudflare copies this repo into your GitHub account, asks for an AUTH_TOKEN (any long random string, e.g. openssl rand -hex 32), then builds and deploys it. A minute later your server is live at https://web2mcp.<your-subdomain>.workers.dev/mcp, and every push to your copy redeploys it. The free Workers plan is enough.

Quick start

bash
git clone https://github.com/charleswei118/web2mcp && cd web2mcpnpm test                 # unit tests, no install needed (Node 20+)npm run smoke            # calls every built-in tool against the real APIsnpx wrangler dev         # local server at http://localhost:8787/mcpnpx wrangler deploy      # your own https://web2mcp.<you>.workers.dev/mcp

Optional: protect your endpoint

bash
npx wrangler secret put AUTH_TOKEN

Connect an AI client

Claude Desktop / Cursor / Windsurf (via mcp-remote):

json
{  "mcpServers": {    "web2mcp": {      "command": "npx",      "args": ["-y", "mcp-remote", "https://web2mcp.<you>.workers.dev/mcp",               "--header", "Authorization: Bearer ${WEB2MCP_TOKEN}"],      "env": { "WEB2MCP_TOKEN": "your-token" }    }  }}

Run locally over stdio (no Cloudflare account needed; same connectors):

json
{  "mcpServers": {    "web2mcp": {      "command": "npx",      "args": ["-y", "github:charleswei118/web2mcp"],      "env": { "ENABLED_CONNECTORS": "wikipedia,hackernews,weather" }    }  }}

Or with Docker: docker build -t web2mcp . && docker run -i --rm web2mcp. Environment variables work the same as Worker bindings (ENABLED_CONNECTORS, CONNECTORS_JSON, MAX_OUTPUT_CHARS, TOOL_MODE=catalog).

Clients that support remote MCP servers natively (Claude.ai custom connectors, ChatGPT connectors, the OpenAI Responses API, Cloudflare AI Playground…) can use the URL directly. Test with the official inspector:

bash
npx @modelcontextprotocol/inspector   # transport: Streamable HTTP, URL: .../mcp

Write a connector

Create connectors/myapi.js and add it to connectors/index.js:

js
export default {  name: "openlibrary",                       // tool names become openlibrary_<tool>  description: "Search books on Open Library.",  baseUrl: "https://openlibrary.org",  headers: { /* "authorization": "Bearer ${MY_API_KEY}" */ },  tools: [    {      name: "search",      description: "Search books by title or author.",      method: "GET",                          // GET | POST | PUT | PATCH | DELETE      path: "/search.json",                   // "{arg}" in the path is URL-encoded      query: { q: "{query}", limit: "{limit}" },      params: {        query: { type: "string", required: true, description: "Title or author" },        limit: { type: "integer", minimum: 1, maximum: 20, default: 5 },      },      pick: "docs",                           // dotted path into the JSON response      fields: ["title", "author=author_name", "year=first_publish_year"],    },  ],};

Template rules:

SyntaxMeaning
"{arg}"Tool argument. As a whole value it keeps its type; missing optional args are dropped.
"${SECRET}"Read from a Worker secret / var — never exposed to the model.
"${?SECRET}"Optional secret: the value is dropped when it is not set.
pick: "a.b.*.c"Select part of the response (* maps over arrays; a single value counts as a one-item list).
fields: ["x", "alias=deep.path"]Keep only these fields.
limit: 10Truncate arrays.
format: "public-url" (on a param)Reject localhost, private/intranet IPs, cloud metadata, embedded credentials and odd ports before any request is made (SSRF guard). Used by reader_read.
response: "xml"Parse an XML/Atom/RSS response into JSON first, so pick / fields work on it (attributes become @name, namespace prefixes are dropped, repeated elements become arrays). Also "json", "text" (raw body) or "auto" (default).

No-code option: put connectors in the CONNECTORS_JSON secret (a JSON array of the same objects) and they appear without touching the code. Use ENABLED_CONNECTORS="wikipedia,weather" to expose only some.

From an OpenAPI spec

bash
node scripts/openapi2connector.js https://petstore3.swagger.io/api/v3/openapi.json petstore --only GET > connectors/petstore.js

Catalog mode: 665 endpoints, 2 tools

Exposing every endpoint as its own tool floods the model's context. In catalog mode web2mcp exposes just two tools:

  • search_api — find operations by keywords; returns their names and argument schemas
  • call_api — run one operation by name with an arguments object

Measured with GitHub's full REST OpenAPI spec (GET operations only, converted with scripts/openapi2connector.js):

ModeTools in tools/listApprox. context
Default (one tool per endpoint)665~147,000 tokens
Catalog2~300 tokens

Turn it on per request with /mcp?mode=catalog, or for the whole deployment with the variable TOOL_MODE = "catalog" (?mode=tools switches back). Try it on the demo: https://web2mcp.cwei59969.workers.dev/mcp?mode=catalog.

Endpoints

Path
POST /mcpMCP Streamable HTTP endpoint (JSON responses, batch supported)
POST /mcp?mode=catalogSame, in catalog mode (search_api + call_api)
GET /Human-readable list of tools
GET /toolsTool list as JSON
GET /healthHealth check

Supported MCP methods: initialize, ping, tools/list, tools/call, plus empty resources/list and prompts/list. Protocol versions 2025-06-18, 2025-03-26, 2024-11-05.

Roadmap

  • Catalog mode (search_api + call_api) — v0.2
  • Load OpenAPI specs at runtime from a URL
  • One-click “Deploy to Cloudflare” — v0.2
  • HTML scraping connectors (CSS selectors via HTMLRewriter)
  • Per-tool rate limits and KV caching
  • OAuth for connectors that need user accounts
  • Connector registry: share connectors as JSON files
  • Agent-to-agent (A2A) chat rooms on Durable Objects

PRs with new connectors are very welcome — see CONTRIBUTING.md.

Responsible use

Only connect APIs and sites you are allowed to use. Respect each service's terms, robots rules and rate limits, and keep credentials in Worker secrets.

License

MIT

If web2mcp saves you time, please ⭐ the repo — it helps others find it.

来源:README.md,提交 76cbc3b

工具

9

wikipedia_summary

Wikipedia: summary

[wikipedia] Get the lead summary of a Wikipedia article by exact title.

输入参数title必填

hackernews_front_page

Hacker News: front_page

[hackernews] Stories currently on the Hacker News front page.

输入参数limit

weather_forecast

Open-Meteo Weather: forecast

[weather] Current conditions plus a daily forecast (max/min temperature, precipitation, weather code).

输入参数dayslatitude必填longitude必填

currency_latest

Frankfurter exchange rates: latest

[currency] Latest exchange rates from a base currency.

输入参数basesymbols

github_search_repos

GitHub: search_repos

[github] Search repositories. Supports GitHub qualifiers like 'mcp language:rust stars:>100'.

输入参数sortlimitquery必填

github_repo

GitHub: repo

[github] Get details of one repository.

输入参数repo必填owner必填

版本历史

1
  1. v0.2.0最新Oct 31, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分