Skip to main content
Glama

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:

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.

Related MCP server: Remote MCP Server Authless

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)

Tool

What it does

wikipedia_search, wikipedia_summary

Search Wikipedia, read article summaries

hackernews_front_page, hackernews_search

Hacker News stories

geocode_search

Place name → coordinates (Open-Meteo)

weather_forecast

Current weather + daily forecast (Open-Meteo)

currency_latest

ECB exchange rates (Frankfurter)

github_search_repos, github_repo

Public GitHub repositories (set GITHUB_TOKEN on Workers: shared IPs hit GitHub's anonymous limit)

reader_read

Any web page → clean Markdown (Jina Reader)

npm_package, npmstats_downloads

npm package info and weekly downloads

arxiv_search

Search arXiv research papers

holidaycn_year

Mainland China holidays and make-up workdays (调休) for a year

baiduhot_realtime

Baidu real-time hot search (百度热搜)

shici_random

A random line of classical Chinese poetry (今日诗词)

bilibili_popular, bilibili_ranking

Bilibili 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

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

Optional: protect your endpoint

npx wrangler secret put AUTH_TOKEN

Connect an AI client

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

{
  "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):

{
  "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:

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

Write a connector

Create connectors/myapi.js and add it to connectors/index.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:

Syntax

Meaning

"{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: 10

Truncate 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

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):

Mode

Tools in tools/list

Approx. context

Default (one tool per endpoint)

665

~147,000 tokens

Catalog

2

~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 /mcp

MCP Streamable HTTP endpoint (JSON responses, batch supported)

POST /mcp?mode=catalog

Same, in catalog mode (search_api + call_api)

GET /

Human-readable list of tools

GET /tools

Tool list as JSON

GET /health

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

Available Tools

13 tools
currency_latestFrankfurter exchange rates: latestA
Read-only
Inspect

[currency] Get the latest European Central Bank reference exchange rates (updated once per working day) from a base currency. Omit symbols to get all ~30 currencies. Returns an object with base, date and a rates map, e.g. rates.CNY.

NameRequiredDescriptionDefault
baseNoBase currency, e.g. USDUSD
symbolsNoComma-separated targets, e.g. CNY,EUR (optional)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly and openWorld, so the description usefully adds that rates are ECB reference rates updated once per working day - important context that the data may be stale within a day. It also discloses the return shape (base, date, rates map). Missing only exotics like rate limits or error behavior, which matters less for an open public API.

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?

Three short sentences, front-loaded with the domain tag and the core action; the omission rule and return example are each one clause. Nothing waste-like or redundant with the schema.

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?

No output schema exists, but the description compensates by sketching the response object (base, date, rates, rates.CNY). For a two-optional-parameter read tool this is nearly complete; only auth/error behavior is unstated.

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 both parameters are already documented in structured form. The description only adds the default-full-set behavior for omitting symbols and the ~30 currency count, which is a modest increment over the schema rather than new semantics for base.

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?

Names a specific verb and resource ("Get the latest European Central Bank reference exchange rates") plus the source and update cadence. No sibling tool overlaps with currency rates, so no differentiation is needed, and the tag prefix makes its domain obvious at a glance.

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?

Gives concrete operational guidance: base currency selects the pivot, and "Omit symbols to get all ~30 currencies" tells the agent exactly how to get the full set. It stops short of when-not-to-use or alternative-source guidance, but the sibling list contains no competing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

github_repoGitHub: repoA
Read-only
Inspect

[github] Get metadata for one public repository you already know by owner and name: description, stars, forks, language, license, topics, url and last push time. Use github_search_repos first if you only have keywords. Returns an error if the repo does not exist or is private.

NameRequiredDescriptionDefault
repoYesRepository name only, without the owner, e.g. 'workers-sdk'
ownerYesUser or organization that owns the repo, e.g. 'cloudflare'

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint; the description adds real context beyond them: the tool fails on nonexistent or private repos, and it enumerates exactly which metadata fields come back. That failure-mode disclosure is the kind of behavior an agent can't infer from the annotations.

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 compact sentences: capability plus return fields first, then the routing rule, then the error condition. No filler, and every clause carries actionable information.

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?

With no output schema, the description compensates by listing the returned fields, and it covers the main failure case. A slightly richer statement of scope (public-only, no auth/rate-limit implications given openWorldHint) would fully close the gap, but nothing essential is missing for correct invocation.

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% and both params carry their own descriptions with examples, so the schema does the heavy lifting. The description only restates "owner and name" at a high level without adding format or edge-case detail (e.g., case sensitivity, URL vs. name), which is the expected 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?

States a specific verb and resource ("Get metadata for one public repository"), specifies the keying (owner + name), and enumerates the returned fields. It is clearly distinct from github_search_repos, which is named and framed as the keyword-based alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to prefer the sibling: "Use github_search_repos first if you only have keywords." It also gives a usability precondition by implying you must already know owner and repo, so an agent can route correctly without reading either schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

github_search_reposGitHub: search_reposA
Read-only
Inspect

[github] Find public GitHub repositories matching a query. Use this when you don't know the exact repo; use github_repo when you already have owner and name. Supports GitHub qualifiers like 'mcp language:rust stars:>100'. Returns up to limit repos (full_name, description, stars, language, url, updated_at). Unauthenticated calls share a low rate limit.

NameRequiredDescriptionDefault
sortNoSort order: most stars, most recently updated, or most forksstars
limitNoMax repositories to return (1-30)
queryYesSearch text with optional GitHub qualifiers, e.g. 'mcp server language:typescript'

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: discloses qualifier syntax support, the exact returned fields (full_name, description, stars, language, url, updated_at), the limit bound, and a rate-limit caveat for unauthenticated calls. This is exactly the operational context annotations cannot carry.

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?

Four short sentences, front-loaded with purpose and routing, then capabilities, then return shape, then the rate-limit caveat. Every sentence carries distinct information with no repetition of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by enumerating the returned fields. Combined with routing guidance and the rate-limit warning, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns an uplift by explaining that the query string accepts GitHub search qualifiers and giving a concrete example with stars:>100, which the schema only hints at.

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 verb and resource ("Find public GitHub repositories matching a query") and immediately contrasts with the sibling github_repo. An agent can distinguish it from every other sibling without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the when-to-use rule ("when you don't know the exact repo") and names the alternative (github_repo) with the condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hackernews_front_pageHacker News: front_pageA
Read-only
Inspect

[hackernews] List the stories currently on the Hacker News front page, ranked as on the site. Use this to see what is trending now; use hackernews_search to find stories on a topic. Returns title, url, points, comment count and story id.

NameRequiredDescriptionDefault
limitNoMax stories (1-30)

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and data-source profile is covered. The description adds the ranking guarantee and enumerates the returned fields, which is useful. It does not mention rate limits, whether results are cached, or freshness of 'currently', so it adds only moderate context beyond the structured fields.

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, front-loaded with the primary action, then the routing rule, then the return fields. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A zero-required-parameter list tool needs little more: the description covers scope, ranking, the sibling alternative, and the return shape, while the schema handles the one optional input. Nothing an agent needs to call it correctly is missing.

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 description coverage is 100% for the single 'limit' parameter (1-30, default 10), so the schema fully documents the input. The description never mentions the limit, so it adds no meaning beyond the schema; baseline 3 applies.

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 verb and resource ('List the stories currently on the Hacker News front page') with the ranking semantics ('ranked as on the site'), and explicitly contrasts itself with hackernews_search. An agent can distinguish it from the search sibling without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both sides of the routing decision: 'Use this to see what is trending now' versus 'use hackernews_search to find stories on a topic.' The alternative is named and the selecting condition is explicit, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

npm_packagenpm: packageA
Read-only
Inspect

[npm] Get the latest version, description, license and homepage of an npm package. For download counts use npmstats_downloads instead. Returns an error if the package does not exist.

NameRequiredDescriptionDefault
nameYesPackage name, e.g. 'express' or '@types/node'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds two pieces of non-obvious behavior beyond the annotations: it enumerates the returned fields (useful since there is no output schema) and discloses the error case when the package does not exist. It doesn't mention rate limits or whether scoped/private packages are supported.

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?

Three short sentences, front-loaded with what is returned, then the alternative, then the failure mode. No filler and no restatement of the tool name.

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?

With no output schema, the description compensates by naming the returned fields and the error condition, which is enough for an agent to call this correctly. Minor gap: it doesn't clarify whether version history or dist-tags are included, but nothing essential is missing.

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% and the single 'name' parameter already documents its own format with examples ('express', '@types/node'). The description adds no syntax, casing, or scoped-package guidance beyond what the schema provides, so the baseline 3 applies.

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 verb (Get) and resource (npm package) and enumerates exactly which fields come back: latest version, description, license, homepage. It also explicitly names the sibling it is not (npmstats_downloads), so an agent can route between the two without opening either schema.

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?

Gives explicit routing guidance: 'For download counts use npmstats_downloads instead,' which resolves the most plausible sibling confusion in this tool set. It does not cover other alternatives (e.g. github_repo for source metadata), but for a single-purpose registry lookup the main exclusion is handled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

npmstats_downloadsnpm stats: downloadsA
Read-only
Inspect

[npmstats] Get how many times an npm package was downloaded in the last 7 days, as a popularity signal. For version or license info use npm_package instead. Returns package, downloads, start and end dates.

NameRequiredDescriptionDefault
nameYesPackage name, e.g. 'express' or '@types/node'

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds the important behavioral constraint that the window is fixed at 7 days (no range parameter) and previews the returned fields. It doesn't mention caching, rate limits, or how missing packages are reported.

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?

Three short sentences, front-loaded with the core action and window, followed by the disambiguation and the return shape. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly describes the return fields (package, downloads, start and end dates), and the single required parameter is covered by the schema. Nothing an agent needs in order to call it and interpret results is missing.

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 single `name` parameter is fully documented in the schema, including scoped-package examples like '@types/node'. The description adds nothing beyond 'npm package' — which is adequate but purely baseline given 100% schema coverage.

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 verb (get download counts) and resource (npm package) with a scoped window (last 7 days) and frames the metric's meaning as a popularity signal. It also names the sibling npm_package and what that one is for, so an agent can distinguish the two without opening schemas.

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?

Explicitly routes version/license lookups to npm_package, giving a clear alternative with the condition that selects it. It lacks guidance on when download counts are or aren't the right popularity signal versus other sources, but the core alternative is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reader_readWeb reader: readA
Read-only
Inspect

[reader] Fetch any public web page and return its main content as Markdown, with navigation and ads stripped. Use it as a fallback for sites without a dedicated tool (prefer wikipedia_summary, github_repo etc. when they fit). Pages behind logins or paywalls may come back empty; long pages are truncated.

NameRequiredDescriptionDefault
urlYesFull URL starting with http(s)://

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description's added value is the failure modes it discloses: empty results behind logins/paywalls and truncation on long pages. That is real behavioral context beyond the structured fields, though it omits rate limits or JS-rendering behavior.

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?

Three compact sentences: purpose first, routing second, limitations last. No filler and every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool, the description covers intent, return format (Markdown), sibling routing, and known failure modes, while annotations carry the safety profile. Nothing needed to invoke it correctly is missing despite there being no output schema.

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% and the single 'url' parameter is fully documented in the schema, including the http(s):// pattern. The description's phrase 'any public web page' adds only marginal meaning, so the baseline 3 applies.

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 verb (Fetch), resource (any public web page), and the return transformation (main content as Markdown, nav/ads stripped). This makes it clearly distinct from every sibling, which are all domain-specific lookup tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as a fallback and names the alternatives ('prefer wikipedia_summary, github_repo etc. when they fit'), which directly routes the agent among siblings. The when-to-use condition is stated, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

weather_forecastOpen-Meteo Weather: forecastA
Read-only
Inspect

[weather] Get current conditions and a daily forecast for a location given by coordinates. If you only have a place name, call geocode_search first. Returns temperature (°C), humidity, wind (km/h), WMO weather code, and per-day max/min temperature and precipitation (mm) in the location's local timezone.

NameRequiredDescriptionDefault
daysNoNumber of forecast days including today (1-16)
latitudeYesLatitude in decimal degrees, e.g. 31.23
longitudeYesLongitude in decimal degrees, e.g. 121.47

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real context beyond that: the returned fields (temperature °C, humidity, wind km/h, WMO code, per-day max/min and precipitation mm) and that values are in the location's local timezone. It doesn't discuss rate limits or error behavior for invalid coordinates, keeping it short of a 5.

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?

Three tight sentences: purpose first, routing prerequisite second, return shape third. No filler and no repetition of schema bounds.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so by naming the metric set, units, and timezone behavior. Combined with full schema coverage and read-only annotations, an agent has everything needed 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?

Schema coverage is 100%, so latitude, longitude, and days are fully documented with ranges and defaults. The description reinforces the coordinate-based input and the units of the returned values but adds no syntax or format detail about the parameters themselves, so the baseline 3 applies.

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 verb and resource ('Get current conditions and a daily forecast') plus the input mode ('a location given by coordinates'). It also implicitly excludes the reverse geocoding case by pointing at geocode_search, so an agent can separate it from siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the prerequisite case: if you only have a place name, call geocode_search first. That is a concrete when-to-use/when-to-route-elsewhere instruction, exactly the kind of routing guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wikipedia_summaryWikipedia: summaryA
Read-only
Inspect

[wikipedia] Get the lead summary of an English Wikipedia article by its exact title (redirects are followed). If you are unsure of the title, use wikipedia_search first. Returns title, short description, the lead extract and the article url.

NameRequiredDescriptionDefault
titleYesExact article title, e.g. 'Cloudflare'

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, openWorldHint), and the description adds genuinely useful context: redirects are followed, only English Wikipedia is served, and only the lead extract is returned rather than the full article. It does not mention failure behavior for nonexistent/ambiguous titles, keeping it short of a 5.

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?

A single tight sentence pair: the capability and its scope come first, the fallback routing second. Every clause carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description supplies the return fields (title, short description, lead extract, url) and the language scope — everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by clarifying that the title must be exact and that redirects are silently resolved — semantics the schema's 'exact article title' example does not convey.

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 verb and resource ('Get the lead summary of an English Wikipedia article') scoped by exact title. It is clearly distinguished from the sibling wikipedia_search, which handles lookup rather than retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to the alternative: 'If you are unsure of the title, use wikipedia_search first.' The condition that selects the alternative is spelled out, leaving nothing to inference.

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. 5 tool updatesv0.2.1
    • Changedgeocode_search1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Max candidate places to return (1-10)"
    • Changedgithub_repo2 fields changed
      • addedInput schema / properties / owner / description
        Added value: +"User or organization that owns the repo, e.g. 'cloudflare'"
      • addedInput schema / properties / repo / description
        Added value: +"Repository name only, without the owner, e.g. 'workers-sdk'"
    • Changedgithub_search_repos3 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Max repositories to return (1-30)"
      • addedInput schema / properties / query / description
        Added value: +"Search text with optional GitHub qualifiers, e.g. 'mcp server language:typescript'"
      • addedInput schema / properties / sort / description
        Added value: +"Sort order: most stars, most recently updated, or most forks"
    • Changedhackernews_search1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Keywords"New value: +"Keywords to match in story titles and text, e.g. 'model context protocol'"
    • Changedweather_forecast3 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Number of forecast days including today (1-16)"
      • addedInput schema / properties / latitude / description
        Added value: +"Latitude in decimal degrees, e.g. 31.23"
      • addedInput schema / properties / longitude / description
        Added value: +"Longitude in decimal degrees, e.g. 121.47"
  2. 13 tool updatesv0.2.0
    • First observedarxiv_search
    • First observedcurrency_latest
    • First observedgeocode_search
    • First observedgithub_repo
    • First observedgithub_search_repos
    • First observedhackernews_front_page
    • First observedhackernews_search
    • First observednpm_package
    • First observednpmstats_downloads
    • First observedreader_read
    • First observedweather_forecast
    • First observedwikipedia_search
    • First observedwikipedia_summary

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation5/5

Each tool is tied to a distinct source and operation, with clear distinctions between search vs retrieval tools such as wikipedia_search/wikipedia_summary, hackernews_front_page/hackernews_search, and github_search_repos/github_repo. reader_read is explicitly positioned as a fallback, so it does not create meaningful ambiguity.

Naming Consistency4/5

Tool names consistently use snake_case with service/source prefixes, making the set easy to scan. There are minor deviations such as noun-only names like npm_package and github_repo, plus the separate npmstats namespace, but the convention remains predictable.

Tool Count5/5

With 13 tools spanning several lightweight web data sources, the count is well within a reasonable range and each tool has a clear role. There is no obvious bloat or duplicate operation.

Completeness4/5

The surface covers the core read paths for each included source and provides a generic reader_read fallback for arbitrary pages. Some gaps exist, such as HN item/comment retrieval, GitHub code/issues/PRs, currency conversion/history, npm search, and a general web search tool, but agents can often work around them via the reader or dedicated tools where provided.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers