Web-curl MCP Server
The Web-curl MCP Server is a versatile tool for fetching web content, interacting with APIs, and performing searches, usable as both a CLI and MCP server.
• Fetch Webpage Content (fetch_webpage): Retrieve text, HTML, and main article content from web pages with support for multi-page crawling, resource blocking, custom headers, basic authentication, and configurable timeouts
• Make REST API Requests (fetch_api): Execute HTTP requests (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) to any API endpoint with custom headers, request bodies, and timeouts
• Google Custom Search (google_search): Search the web using Google's API with advanced filters for language, region, site, date restrictions, and configurable result parameters (requires API key and CX ID)
• Smart Commands (smart_command): Process free-form user instructions with automatic detection—fetching content from links or performing web searches with query enrichment and language detection
Inspired by curl, provides web request functionality for fetching content from websites and making REST API requests with custom methods, headers, and bodies.
Provides Google Custom Search functionality, allowing web searches with configurable result limits through Google's search API, requiring an API key and Custom Search Engine ID.
Leverages Puppeteer for robust web scraping capabilities, including resource blocking, content extraction, and headless browsing of websites.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Web-curl MCP Serverfetch the latest tech news from Hacker News homepage"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Custom Search API
Google Custom Search API is free with usage limits (e.g., 100 queries per day for free, with additional queries requiring payment). For full details on quotas, pricing, and restrictions, see the official documentation.
Web-curl

Developed by Rayss
🚀 Open Source Project
🛠️ Built with Node.js & TypeScript (Node.js v18+ required)
🎬 Demo Video
Click here to watch the demo video directly in your browser.
If your platform supports it, you can also download and play demo/demo_1.mp4 directly.
Related MCP server: Fetch MCP Server
📚 Table of Contents
📝 Changelog / Update History
See CHANGELOG.md for a complete history of updates and new features.
📝 Overview
Web-curl is a powerful tool for fetching and extracting text content from web pages and APIs. Use it as a standalone CLI or as an MCP (Model Context Protocol) server. Web-curl leverages Puppeteer for robust web scraping and supports advanced features such as resource blocking, custom headers, authentication, and Google Custom Search.
✨ Features
🚀 Deep Research & Automation (v1.4.2)
Advanced Browser Automation: Full control over Chromium via Puppeteer (click, type, scroll, hover, key presses).
Always-On Session Persistence: Browser profiles are now always persistent. Login sessions, cookies, and cache are automatically saved in a local
user_data/directory.Token-Efficient Snapshots:
Accessibility Tree: Clean, structured snapshots instead of messy HTML.
HTML Slice Mode: Raw HTML with
startIndex/endIndexfor safe chunking when needed.Viewport Filtering: Automatically filters out elements not visible on screen, saving up to 90% of context tokens on long pages.
Chrome DevTools Integration (implemented, but hidden from
list_tools):Network Monitoring (
browser_network_requests)Console Logs (
browser_console_messages)
Parallel Search:
multi_search: Run multiple Google searches at once (only exposed search tool).
Intelligent Resource Management:
Idle Auto-Close: Browser automatically shuts down after 15 minutes of inactivity to save RAM/CPU.
Tab Rotation: Automatically replaces the oldest tab when the 10-tab limit is reached.
Media & Documents:
Full-Page Screenshots: Capture high-quality screenshots with a 5-day auto-cleanup lifecycle and custom destination support.
Document Parsing: Extract text from PDF and DOCX files directly from URLs.
Storage & Download Details
🗂️ Error log rotation:
logs/error-log.txtis rotated when it exceeds ~1MB (renamed toerror-log.txt.bak) to prevent unbounded growth.🧹 Logs & temp cleanup: old temporary files in the
logs/directory are cleaned up at startup.🛑 Browser lifecycle: Puppeteer browser instances are closed in finally blocks to avoid Chromium temp file leaks.
🔎 Content extraction:
Returns raw text, HTML, and Readability "main article" when available. Readability attempts to extract the primary content of a webpage, removing headers, footers, sidebars, and other non-essential elements, providing a cleaner, more focused text.
Readability output is subject to
startIndex/maxLength/chunkSizeslicing when requested.
🚫 Resource blocking:
blockResourcesis now always forced tofalse, meaning resources are never blocked for faster page loads.⏱️ Timeout control: navigation and API request timeouts are configurable via tool arguments.
💾 Output: results can be printed to stdout or written to a file via CLI options.
⬇️ Download behavior (
download_file):destinationFolderaccepts relative paths (resolved against the project root) or absolute paths.The server creates
destinationFolderif it does not exist.Downloads are streamed using Node streams +
pipelineto minimize memory use and ensure robust writes.Filenames are derived from the URL path (e.g.,
https://.../path/file.jpg->file.jpg). If no filename is present, the fallback name isdownloaded_file.Overwrite semantics: by default the implementation will overwrite an existing file with the same name.
🖥️ Usage modes: CLI and MCP server (stdin/stdout transport).
🌐 REST client:
fetch_apireturns JSON/text when appropriate and base64 for binary responses.🔍 Google Custom Search: requires
APIKEY_GOOGLE_SEARCHandCX_GOOGLE_SEARCH.🤖 Smart command:
Auto language detection (franc-min) and optional translation (dynamic
translateimport).Query enrichment is heuristic-based; results depend on the detected intent.
🏗️ Architecture
This section outlines the high-level architecture of Web-curl.
graph TD
A[User/MCP Host] --> B(CLI / MCP Server)
B --> C{Tool Handlers}
C -- browser_flow --> D["Puppeteer (Web Scraping)"]
C -- fetch_api --> E["REST Client"]
C -- multi_search --> F["Google Custom Search API"]
C -- parse_document --> G["Document Parser (PDF/DOCX)"]
C -- download_file --> H["File System (Downloads)"]
D --> I["Web Content"]
E --> J["External APIs"]
F --> K["Google Search Results"]
H --> L["Local Storage"]CLI & MCP Server:
src/index.tsImplements both the CLI entry point and the MCP server.Web Scraping: Uses Puppeteer for headless browsing and content extraction.
REST Client:
src/rest-client.tsProvides a flexible HTTP client for API requests.
⚙️ MCP Server Configuration Example
To integrate web-curl as an MCP server, add the following configuration to your mcp_settings.json:
{
"mcpServers": {
"web-curl": {
"command": "node",
"args": [
"build/index.js"
],
"disabled": false,
"alwaysAllow": [
"browser_flow",
"browser_configure",
"browser_close",
"multi_search",
"fetch_api",
"download_file",
"parse_document"
],
"env": {
"APIKEY_GOOGLE_SEARCH": "YOUR_GOOGLE_API_KEY",
"CX_GOOGLE_SEARCH": "YOUR_CX_ID"
}
}
}
}🔑 How to Obtain Google API Key and CX
Get a Google API Key:
Go to Google Cloud Console.
Create/select a project, then go to APIs & Services > Credentials.
Click Create Credentials > API key and copy it.
Get a Custom Search Engine (CX) ID:
Go to Google Custom Search Engine.
Create/select a search engine, then copy the Search engine ID (CX).
Enable Custom Search API:
In Google Cloud Console, go to APIs & Services > Library.
Search for Custom Search API and enable it.
Replace YOUR_GOOGLE_API_KEY and YOUR_CX_ID in the config above.
🛠️ Installation
# Clone the repository
git clone https://github.com/rayss868/MCP-Web-Curl
cd web-curl
# Install dependencies
npm install
# Build the project
npm run buildPrerequisites: Ensure you have Node.js (v18+) and Git installed on your system.
Puppeteer installation notes
Windows: Just run
npm install.Linux / Ubuntu Server: You must install extra dependencies for Chromium to handle rendering and screenshots in a headless environment. Run:
sudo apt-get update && sudo apt-get install -y \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libc6 \ libcairo2 \ libcups2 \ libdbus-1-3 \ libexpat1 \ libfontconfig1 \ libgbm1 \ libgcc1 \ libglib2.0-0 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libpango-1-0-0 \ libpangocairo-1.0-0 \ libstdc++6 \ libx11-6 \ libx11-xcb1 \ libxcb1 \ libxcomposite1 \ libxcursor1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxi6 \ libxrandr2 \ libxrender1 \ libxss1 \ libxtst6 \ lsb-release \ wget \ xdg-utils
For more details, see the Puppeteer troubleshooting guide.
🚀 Usage
CLI Usage
The CLI supports fetching and extracting text content from web pages.
# Basic usage
node build/index.js https://example.com
# With options
node build/index.js --timeout 30000 https://example.com
# Save output to a file
node build/index.js -o result.json https://example.comCommand Line Options
--timeout <ms>: Set navigation timeout (default: 60000)-o <file>: Output result to specified file
MCP Server Usage
Web-curl can be run as an MCP server for integration with Roo Context or other MCP-compatible environments.
Exposed Tools (v1.4.2)
Only the tools below are exposed via list_tools to reduce tool-chaining in agent clients.
browser_flow: One-call browser workflow (optional navigate → optional actions → return ONE result).
browser_configure: Set proxy/user-agent/viewport (session persistence is always on via
user_data/).browser_close: Close browser and tabs (also auto-closes after 15 minutes of inactivity).
multi_search: Run multiple Google searches in parallel (the only exposed search entrypoint).
fetch_api: REST API request with response truncation (
limit).download_file: Download a file from a URL.
parse_document: Extract text from PDF/DOCX URLs.
Running as MCP Server
npm run startThe server will communicate via stdin/stdout and expose the tools as defined in src/index.ts.
🚦 HTML Slicing Example (Recommended for Large Pages)
Use browser_flow with result: { type: "snapshot", mode: "html" } when you need raw HTML but want to keep the response small.
Client request for first slice:
{
"name": "browser_flow",
"arguments": {
"result": {
"type": "snapshot",
"mode": "html",
"startIndex": 0,
"endIndex": 20000
}
}
}Response (example):
{
"mode": "html",
"totalLength": 123456,
"startIndex": 0,
"endIndex": 20000,
"remainingCharacters": 103456,
"content": "<html>...first slice...</html>"
}🧩 Configuration
Session Persistence: Always enabled. Logins and cookies are automatically reused across restarts.
Timeout: Set navigation and API request timeouts.
Environment Variables: Used for Google Search API integration (used by
multi_search).
💡 Examples {#examples}
{
"name": "fetch_api",
"arguments": {
"url": "https://api.github.com/repos/nodejs/node",
"method": "GET",
"headers": {
"Accept": "application/vnd.github.v3+json"
},
"limit": 10000
}
}{
"name": "download_file",
"arguments": {
"url": "https://example.com/image.jpg",
"destinationFolder": "downloads"
}
}Note: destinationFolder can be either a relative path (resolved against the project root) or an absolute path. The server will create the destination folder if it does not exist.
{
"name": "browser_configure",
"arguments": {
"proxy": "http://proxy.example.com:8080",
"viewport": { "width": 1920, "height": 1080 }
}
}Note: Session persistence is always enabled. Cookies and login sessions are automatically stored in the user_data/ directory.
🛠️ Troubleshooting {#troubleshooting}
Timeout Errors: Increase the
timeoutparameter if requests are timing out.Google Search Fails: Ensure
APIKEY_GOOGLE_SEARCHandCX_GOOGLE_SEARCHare set in your environment.Error Logs: Check the
logs/error-log.txtfile for detailed error messages.
🧠 Tips & Best Practices {#tips--best-practices}
For large pages, use
maxLengthandstartIndexto fetch content in slices.Always validate your tool arguments to avoid errors.
Secure your API keys and sensitive data using environment variables.
Review the MCP tool schemas in
src/index.tsfor all available options.
🤝 Contributing & Issues {#contributing--issues}
Contributions are welcome! If you want to contribute, fork this repository and submit a pull request.
If you find any issues or have suggestions, please open an issue on the repository page.
📄 License & Attribution {#license--attribution}
This project was developed by Rayss.
For questions, improvements, or contributions, please contact the author or open an issue in the repository.
Note: Google Search API is free with usage limits. For details, see: Google Custom Search API Overview
Available Tools
5 toolsdownload_fileC
Download a file from a given URL to a specified folder.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL of the file to download. | |
| destinationFolder | Yes | The destination folder (relative to the workspace directory) to save the file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions downloading a file but fails to address critical aspects like authentication needs, rate limits, error handling, file size constraints, or network behavior. This leaves significant gaps in understanding the tool's operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without any unnecessary words. It is front-loaded and appropriately sized, making it easy to understand at a glance while avoiding redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a download operation with no annotations and no output schema, the description is insufficient. It lacks details on return values, error conditions, security considerations, and performance implications, which are crucial for effective tool invocation in an AI agent context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, clearly documenting both parameters ('url' and 'destinationFolder'). The description adds minimal value beyond the schema, as it only reiterates the purpose without providing additional syntax, format details, or constraints. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Download a file') and the target resource ('from a given URL to a specified folder'), which is specific and unambiguous. However, it does not explicitly differentiate from sibling tools like 'fetch_api' or 'fetch_webpage', which might have overlapping functionality, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as 'fetch_api' or 'fetch_webpage'. It lacks context about prerequisites, exclusions, or specific use cases, offering only a basic functional statement without comparative or situational advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_apiC
Make a REST API request with various methods, headers, and body.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL for the API endpoint. | |
| method | Yes | HTTP method for the request. | |
| headers | No | Request headers (e.g., for authorization). | |
| body | No | Request body (JSON object, string, etc.). | |
| timeout | No | Request timeout in milliseconds (default: 60000). | |
| limit | Yes | Maximum number of characters to return in the response body (required). | |
| redirect | No | Redirect mode for the request (default: follow). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions making requests with 'various methods, headers, and body' but lacks critical details: it doesn't specify authentication requirements, rate limits, error handling, response format, or side effects. For a general-purpose API tool with 7 parameters, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core functionality. Every word earns its place without redundancy or fluff, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no annotations, no output schema), the description is insufficient. It doesn't explain what the tool returns, how errors are handled, or practical constraints like authentication. For a versatile API tool, more context is needed to use it effectively beyond the parameter definitions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds minimal value beyond the schema—it mentions 'various methods, headers, and body' which are covered in the schema's enum and descriptions. No additional parameter semantics are provided, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as making REST API requests with various methods, headers, and body. It specifies the verb ('Make a REST API request') and resource ('API endpoint'), but doesn't explicitly differentiate from sibling tools like fetch_webpage or download_file, which might have overlapping functionality for HTTP requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like fetch_webpage or download_file, nor does it specify use cases, prerequisites, or exclusions. The agent must infer usage from the tool name and parameters alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_webpageC
Retrieve text content from a web page
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL of the webpage to fetch | |
| blockResources | No | Whether to block images, stylesheets, and fonts to improve performance (default: true) | |
| resourceTypesToBlock | No | List of resource types to block (e.g., "image", "stylesheet", "font") | |
| timeout | No | Navigation timeout in milliseconds (default: 120000) | |
| maxLength | No | Maximum number of characters to return (default: 10000). | |
| startIndex | Yes | Start character index for content extraction (required; default: 0). | |
| headers | No | Custom headers to include in the request | |
| username | No | Username for basic authentication | |
| password | No | Password for basic authentication | |
| nextPageSelector | No | CSS selector for next page button/link (for auto-pagination, optional) | |
| maxPages | No | Maximum number of pages to crawl (for auto-pagination, optional, default: 1) | |
| evaluateScript | No | JavaScript code to execute on the page after loading. The result of the script will be returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the basic operation. It doesn't disclose important behavioral traits like whether this makes network requests, has rate limits, requires authentication for certain sites, handles errors, returns structured data, or supports pagination beyond what's implied in parameters. The description is minimal compared to the tool's complexity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's appropriately sized and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 12 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain what 'text content' means (HTML, plain text, structured data?), doesn't mention error handling, doesn't describe return format, and provides no context about the tool's capabilities beyond the minimal purpose statement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly. The description adds no additional parameter semantics beyond what's in the schema descriptions. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as 'Retrieve text content from a web page' with a specific verb ('Retrieve') and resource ('text content from a web page'). It distinguishes from siblings like 'download_file' (which likely downloads files) and 'fetch_api' (which likely calls APIs), but doesn't explicitly differentiate from 'google_search' or 'smart_command'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'fetch_api' or 'google_search'. There's no mention of prerequisites, limitations, or typical use cases beyond the basic purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_searchC
Search the web using Google Custom Search API. Requires google_search_config resource.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query, including any operators like site:, filetype:, etc. | |
| num | No | Number of results to return (1-10, optional) | |
| start | No | Index of the first result to return (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the API dependency but lacks critical details: it doesn't specify rate limits, authentication needs beyond the config resource, error handling, or the format/scope of search results. For a web search tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two sentences) and front-loaded with the core purpose. The second sentence adds necessary context about the config requirement. There's no wasted verbiage, though it could be slightly more structured (e.g., separating prerequisites from usage notes).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (web search with API integration), lack of annotations, and no output schema, the description is incomplete. It misses key contextual details: what the search results look like (format, fields), limitations (e.g., commercial vs. academic use), error cases, or how it differs from sibling tools. The config requirement is noted, but overall coverage is insufficient for effective agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all three parameters thoroughly. The description adds no additional parameter semantics beyond what's in the schema (e.g., it doesn't explain how 'query' operators work in practice or typical use cases for 'start'). The baseline score of 3 reflects adequate but minimal value added over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search the web using Google Custom Search API.' It specifies the verb ('Search') and resource ('the web'), and mentions the specific API used. However, it doesn't differentiate this tool from potential siblings like 'fetch_webpage' or 'smart_command' that might also retrieve web content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal usage guidance: it mentions a prerequisite ('Requires google_search_config resource.') but offers no explicit advice on when to use this tool versus alternatives like 'fetch_webpage' or 'smart_command'. There's no mention of scenarios where this tool is preferred or when it should be avoided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smart_commandC
Free-form command: automatically fetch if a link is detected, automatically search if a search query is detected.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | Free-form user instruction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions automatic detection and actions (fetching links, searching queries), but lacks details on error handling, rate limits, authentication needs, or what constitutes a 'link' or 'search query'. This leaves significant gaps in understanding the tool's behavior and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, consisting of a single sentence that directly states the tool's function. It avoids unnecessary words, but could be more structured by explicitly separating the link and query cases or adding brief examples to enhance clarity without sacrificing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a tool that handles multiple actions (fetching and searching) and lacks annotations and an output schema, the description is incomplete. It does not explain return values, error conditions, or how the detection logic works, leaving the AI agent with insufficient context to use the tool effectively compared to its more specific siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with the parameter 'command' documented as a 'free-form user instruction'. The description adds marginal value by reiterating the auto-fetch and auto-search behavior, but does not provide additional semantics beyond what the schema already states, such as examples or format details. Baseline 3 is appropriate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's purpose as a 'free-form command' that automatically fetches links or searches queries, which is clear but vague. It specifies the verb ('fetch', 'search') and resource types ('link', 'query'), but does not distinguish it from sibling tools like 'fetch_webpage' or 'google_search', leaving ambiguity about when to use this versus those specific tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal guidance by stating it triggers based on detecting links or search queries, but it does not specify when to use this tool versus the sibling tools (e.g., 'fetch_webpage' for links, 'google_search' for queries). There are no explicit alternatives, exclusions, or context for usage, offering little help for an AI agent in tool selection.
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. Dates show when Glama detected each change.
5 tool updates
v1.0.0- Added
download_file - Changed
fetch_api5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / descriptionAdded value: +"HTTP API request (GET/POST/etc), custom header/body, timeout, debug mode for verbose output/logging." - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum number of characters to return in the response body (required).", + "type": "number" +} - added
Input schema / properties / redirectAdded value: +{ + "description": "Redirect mode for the request (default: follow).", + "enum": [ + "follow", + "error", + "manual" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "url", - "method" -]New value: +[ + "url", + "method", + "limit" +]
- Changed
fetch_webpage9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / descriptionAdded value: +"Fetch web content (text, html, mainContent, metadata, supports multi-page crawling, and AI-friendly regex extraction). Debug option for verbose output/logging." - added
Input schema / properties / evaluateScriptAdded value: +{ + "description": "JavaScript code to execute on the page after loading. The result of the script will be returned.", + "type": "string" +} - changed
Input schema / properties / maxLength / descriptionPrevious value: -"Maximum number of characters to return for content extraction (default: 2000 if not provided)"New value: +"Maximum number of characters to return (default: 10000)." - added
Input schema / properties / maxPagesAdded value: +{ + "description": "Maximum number of pages to crawl (for auto-pagination, optional, default: 1)", + "type": "number" +} - added
Input schema / properties / nextPageSelectorAdded value: +{ + "description": "CSS selector for next page button/link (for auto-pagination, optional)", + "type": "string" +} - changed
Input schema / properties / startIndex / descriptionPrevious value: -"Start character index for content extraction (default: 0)"New value: +"Start character index for content extraction (required; default: 0)." - changed
Input schema / properties / timeout / descriptionPrevious value: -"Navigation timeout in milliseconds (default: 60000)"New value: +"Navigation timeout in milliseconds (default: 120000)" - changed
Input schema / requiredPrevious value: -[ - "url" -]New value: +[ + "url", + "startIndex" +]
- Changed
google_search3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / descriptionAdded value: +"Search the web using Google Custom Search API." - changed
Input schema / properties / query / descriptionPrevious value: -"Search query"New value: +"Search query, including any operators like site:, filetype:, etc."
- Changed
smart_command3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / descriptionAdded value: +"Free-form command: auto fetch if link detected, auto search if query. Debug option for verbose output/logging." - changed
Input schema / properties / command / descriptionPrevious value: -"Instruksi bebas dari user"New value: +"Free-form user instruction"
4 tool updates
- First observed
fetch_api - First observed
fetch_webpage - First observed
google_search - First observed
smart_command
TDQS
There is significant overlap between fetch_api, fetch_webpage, and download_file, as all three involve retrieving content from URLs, with fetch_api being a general-purpose tool that could subsume the others. Smart_command further blurs boundaries by automatically choosing between fetching and searching, potentially causing confusion about when to use the dedicated tools. However, google_search is clearly distinct for search operations.
The naming is inconsistent with mixed conventions: fetch_api and fetch_webpage use a verb_noun pattern, download_file uses verb_noun but with a different verb style, google_search is a compound noun, and smart_command uses an adjective_noun pattern. This lack of a predictable naming scheme makes the tool set harder to navigate and remember.
With 5 tools, the count is well-scoped for a web/curl server, covering key operations like downloading files, making API requests, fetching web content, searching, and a smart utility. Each tool appears to serve a purpose without obvious bloat or thinness, fitting the server's domain appropriately.
The tool set covers core web interaction tasks: downloading files, API requests, webpage fetching, and web searching, with smart_command adding flexibility. Minor gaps might include more advanced operations like handling cookies or sessions, but the surface is largely complete for basic web utilities, allowing agents to perform common workflows without major dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Extract data from any website with this web scraper tool.
Fetch web pages and extract exactly the content you need. Select elements with CSS and retrieve co…
Search the web and extract clean, readable text from webpages. Process multiple URLs at once to sp…
Turn any URL into clean Markdown and structured data. Scrape, crawl, search and extract.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables web content scanning and analysis by fetching, analyzing, and extracting information from web pages using tools like page fetching, link extraction, site crawling, and more.613MIT
- AlicenseNot gradedqualityCmaintenanceProvides functionality to fetch and transform web content in various formats (HTML, JSON, plain text, and Markdown) through simple API calls.102,8561MIT
- AlicenseNot gradedqualityDmaintenanceEnables web scraping and document processing with JavaScript execution, anti-detection measures, batch processing, and structured data extraction. Supports multiple formats including markdown, HTML, screenshots, and handles PDFs with OCR capabilities.4MIT
- FlicenseBqualityDmaintenanceEnables web searching and content scraping through Google Custom Search API. Provides tools to search the internet, extract webpage content, and automatically scrape search results for comprehensive information gathering.3-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rayss868/MCP-Web-Curl'
If you have feedback or need assistance with the MCP directory API, please join our Discord server