Tusk MCP tools server - a minimal-dependency MCP server exposing web_fetch, web_search, feed_discover, feed_fetch, sitemap_fetch, and url_metadata tools
Tusk provides 6 well-named, read-only web tools with complete input schemas and solid descriptions. All tools follow verb_noun naming (web_fetch, feed_discover, etc.) and descriptions range 80 - 250 chars, meeting the 10 - 1024 baseline. Input schemas are properly typed with required fields. However, output schemas are not documented, responses are JSON-encoded text blobs without declared field structures. Error handling is minimal (basic validation only, no recovery guidance). No tool annotations (readOnlyHint, etc.) despite all being read-only. Parameter descriptions are adequate but lack format constraints (e.g., max_length and max_items lack min/max bounds). Missing: pagination guidance, per-item error reporting for batch operations, and structured output documentation.
Fetch a web page and return the RSS/Atom feed URLs it advertises (via <link rel="alternate"> tags).
Fetch an RSS or Atom feed URL and return its items as JSON (title, link, published date, summary).
Fetch a sitemap.xml URL and return its entries as JSON (url, lastmod, changefreq, priority). If the URL is a sitemap index instead, returns the list of sub-sitemap URLs (url, lastmod) — call sitemap_fetch again on one of those to get its entries.
Fetch a web page and return its metadata: title, description, Open Graph / Twitter Card tags, favicon, and canonical URL — without fetching the full body text.
Fetch a web page over HTTP(S) and return its content. For HTML pages, extracts the main article/content (via Readability) instead of the full page including navigation, ads, and boilerplate, and returns it as Markdown (headings, lists, links, code blocks preserved) — falling back to plain text of the raw page if no clear article content is found. Sends a browser-like default header set (Accept, Accept-Language, User-Agent, etc.) already; use headers/cookies to override them or to replay a session/consent cookie from your own browser for sites that need one. This cannot solve a JS-executed challenge (e.g. a Cloudflare interstitial) — only a real browser can — but it does get past sites that merely check for a normal-looking request or a specific cookie.
Output schemas not documented. Tools return JSON text blobs without declared field structures. LLMs cannot plan downstream operations or extract specific fields reliably.
No tool annotations despite all tools being read-only. Missing readOnlyHint declarations that would signal safety to agents.
Numeric parameters (max_length, max_items, max_urls, max_results) lack min/max bounds in schema. Unbounded integers invite absurd values (e.g., max_items=999999).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Search the web (via Brave Search API or DuckDuckGo, depending on server config) and return a list of results (title, url, snippet).
Error handling is minimal. Invalid arguments throw generic InvalidArgumentException with no recovery guidance. LLMs receive no actionable next steps.
web_search description is vague ('Search the web'). Does not explain which search engine is used, how results are ranked, or when to prefer it over web_fetch.