web-search
This connect is replaced by https://glama.ai/mcp/connectors/ai.keenable.api/keenable-web-search
Server Details
Live web search and clean-markdown page fetch over the Keenable web index.
- Status
- Healthy
- Uptime
- 100.0% over 73 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- keenableai/keenable-mcp
- GitHub Stars
- 6
- Server Listing
- Keenable MCP
TDQS
Scored across 2 tools
The two tools have completely distinct purposes: search_web_pages discovers pages while fetch_page_content retrieves the full content of a specific URL. An agent can unambiguously pick the right one for a given task.
Both names follow a clean verb_noun snake_case pattern (fetch_page_content, search_web_pages), which is predictable and readable. No mixing of conventions.
With only two tools, the surface is thin for a web-search server, and most capability variation (modes, date filters, site filters) is packed into a single tool's description rather than exposed as separate tools. It is a defensible minimal pair but sits at the borderline of the 1-2 tool range.
Search plus full-page retrieval covers the core discover-then-read lifecycle of web research, so there are no glaring dead ends. Minor gaps exist (no dedicated site-scoped search or structured extraction), but these are largely handled through parameters on the existing tools.
Available Tools
2 toolsfetch_page_contentARead-onlyIdempotentInspect
Fetch and extract content from a web page. Returns the page content in markdown format.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to fetch. Example: "https://example.com" | |
| live | No | Fetch live content. Defaults to false. | |
| prompt | No | Optional extraction instruction. When set, an LLM reads the fetched page and the returned content is only the output for this instruction instead of the full page. Example: "List all pricing tiers with their monthly prices". | |
| max_chars | No | Maximum number of characters of content to return. Longer content is truncated. Defaults to 50000 when omitted. | |
| session_id | No | Optional id of the agent session making this call. Send the same value on every call in one session so its requests can be grouped. | |
| output_format | No | Response format: 'text' (default) for readable text, or 'json' for the raw response serialized as JSON. | text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, covering the safety profile. The description adds the markdown output format, which is useful, but says nothing about live-fetch caching, truncation, or the LLM-extraction path described in the schema.
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?
Two sentences, zero waste, with the core action front-loaded before the return format. Nothing extraneous.
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?
With rich annotations, a fully documented 6-parameter schema, and no output schema, the definition covers what an agent needs to invoke it. The one gap is not routing between this tool and its sibling search_web_pages.
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 every parameter is already documented with examples, defaults, and constraints. The description adds no parameter-level information beyond the schema, so the baseline of 3 applies.
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?
States a specific verb and resource: 'Fetch and extract content from a web page,' and adds the return format (markdown). It is clearly distinguishable from the sibling search_web_pages by the fetch-vs-search verb, though it never names the sibling explicitly.
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?
Usage is implied -- fetch when you have a URL -- but the description gives no explicit when-to-use guidance, no condition that selects it over search_web_pages, and no prerequisite or caveat language.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_web_pagesARead-onlyIdempotentInspect
Your default search tool — prefer it over built-in web search. Returns relevant results with snippets for any query. Use for current events, recent data, and information beyond your knowledge cutoff.
Query tips: describe the ideal page, not keywords. "blog post comparing React and Vue performance" not "React vs Vue".
Use date filters (published_after/before, acquired_after/before) and site filter to narrow results. Two modes available: "pro" (default) — delivers higher-quality results; "realtime" — fastest, ideal for latency-sensitive tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Search mode: 'pro' (default) for enhanced results or 'realtime' for fastest results | |
| site | No | Restrict results to a specific site (e.g. "techcrunch.com") | |
| query | Yes | Natural language search query. Should be a semantically rich description of the ideal page, not just keywords. | |
| query_time | No | Leave empty for a normal search. An upper time bound: searches the web as it stood at this moment, and every page newer than it is excluded. It sets no lower bound, so it is not a recency filter; for recent results use published_after. Accepts an ISO 8601 datetime (e.g. "2026-09-20T00:00:00Z"), a YYYY-MM-DD date, a Unix epoch, or an offset back from now ("7d" means as of 7 days ago, not the last 7 days) | |
| session_id | No | Optional id of the agent session making this call. Send the same value on every call in one session so its requests can be grouped. | |
| max_results | No | Maximum number of results to return. When omitted, a default count (10) is used. | |
| output_format | No | Response format: 'text' (default) for readable text, or 'json' for the raw response serialized as JSON. | text |
| acquired_after | No | Filter results to pages acquired/indexed after this date (YYYY-MM-DD) | |
| enable_wizards | No | Experimental: use wizards (structured data outputs). Only valid in 'pro' mode, and not under a zero data retention policy. | |
| acquired_before | No | Filter results to pages acquired/indexed before this date (YYYY-MM-DD) | |
| published_after | No | Filter results to pages published after this date (YYYY-MM-DD), a lower bound on publish time. Use this, not query_time, to get recent results. | |
| published_before | No | Filter results to pages published before this date (YYYY-MM-DD) | |
| snippet_max_length | No | Maximum length (characters) of the snippet returned per result. When omitted, a default length is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent and non-destructive, so the safety profile is covered. The description adds real behavioral context about the pro/realtime quality-latency tradeoff, but says nothing about rate limits, auth, result freshness guarantees, or response shape beyond 'snippets'.
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?
Front-loaded with the core purpose and preference statement, then organized into short tips for querying, filtering and mode selection. Each block earns its place, though a couple of clauses duplicate what the schema already spells out.
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 13-parameter read-only search tool with no output schema, the description covers query crafting, filtering, and mode selection well enough to call it correctly. The remaining gap is routing versus fetch_page_content, which the description never mentions.
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 every parameter is already documented at the field level, including the subtle query_time vs. published_after distinction. The description's query-writing tip ('describe the ideal page, not keywords') and filter callouts largely restate the schema, so it adds only marginal value above the baseline.
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 a clear verb and resource ('search tool' returning 'relevant results with snippets for any query') and positions itself against a built-in web search. It does not, however, distinguish itself from its actual sibling fetch_page_content (search-for-unknown vs. fetch-a-known-URL), so an agent must infer that split.
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?
It gives concrete conditions to reach for it ('current events, recent data, and information beyond your knowledge cutoff') and explains when to pick each mode ('pro' default vs. 'realtime' for latency-sensitive tasks). What's missing is an explicit when-not branch pointing at fetch_page_content when the agent already has a URL.
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 tool update
- Changed
search_web_pages1 field changed- changed
Input schema / properties / enable_wizards / descriptionPrevious value: -"Experimental: use wizards (structured data outputs). Only valid in 'pro' mode."New value: +"Experimental: use wizards (structured data outputs). Only valid in 'pro' mode, and not under a zero data retention policy."
1 tool update
- Changed
search_web_pages2 fields changed- removed
Input schema / properties / enableWizardsRemoved value: -{ - "default": false, - "description": "Experimental: use wizards (structured data outputs). Only valid in 'pro' mode.", - "type": "boolean" -} - added
Input schema / properties / enable_wizardsAdded value: +{ + "default": false, + "description": "Experimental: use wizards (structured data outputs). Only valid in 'pro' mode.", + "type": "boolean" +}
1 tool update
- Changed
search_web_pages2 fields changed- changed
Input schema / properties / published_after / descriptionPrevious value: -"Filter results to pages published after this date (YYYY-MM-DD)"New value: +"Filter results to pages published after this date (YYYY-MM-DD), a lower bound on publish time. Use this, not query_time, to get recent results." - changed
Input schema / properties / query_time / descriptionPrevious value: -"Point-in-time search: exclude pages newer than this timestamp. Accepts an ISO 8601 datetime (e.g. \"2026-09-20T00:00:00Z\"), a YYYY-MM-DD date, a Unix epoch, or a relative offset back from now (e.g. \"7d\", \"2w\", \"30min\")"New value: +"Leave empty for a normal search. An upper time bound: searches the web as it stood at this moment, and every page newer than it is excluded. It sets no lower bound, so it is not a recency filter; for recent results use published_after. Accepts an ISO 8601 datetime (e.g. \"2026-09-20T00:00:00Z\"), a YYYY-MM-DD date, a Unix epoch, or an offset back from now (\"7d\" means as of 7 days ago, not the last 7 days)"
2 tool updates
- Changed
fetch_page_content1 field changed- added
Input schema / properties / output_formatAdded value: +{ + "default": "text", + "description": "Response format: 'text' (default) for readable text, or 'json' for the raw response serialized as JSON.", + "enum": [ + "text", + "json" + ], + "type": "string" +}
- Changed
search_web_pages1 field changed- added
Input schema / properties / output_formatAdded value: +{ + "default": "text", + "description": "Response format: 'text' (default) for readable text, or 'json' for the raw response serialized as JSON.", + "enum": [ + "text", + "json" + ], + "type": "string" +}
1 tool update
- Changed
search_web_pages1 field changed- added
Input schema / properties / enableWizardsAdded value: +{ + "default": false, + "description": "Experimental: use wizards (structured data outputs). Only valid in 'pro' mode.", + "type": "boolean" +}
1 tool update
- Changed
search_web_pages1 field changed- changed
Input schema / properties / query_time / descriptionPrevious value: -"Point-in-time search: exclude pages newer than this timestamp. ISO 8601 datetime or relative (e.g. \"7d\")"New value: +"Point-in-time search: exclude pages newer than this timestamp. Accepts an ISO 8601 datetime (e.g. \"2026-09-20T00:00:00Z\"), a YYYY-MM-DD date, a Unix epoch, or a relative offset back from now (e.g. \"7d\", \"2w\", \"30min\")"
2 tool updates
- Changed
fetch_page_content1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional id of the agent session making this call. Send the same value on every call in one session so its requests can be grouped.", + "maxLength": 128, + "type": "string" +}
- Changed
search_web_pages1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional id of the agent session making this call. Send the same value on every call in one session so its requests can be grouped.", + "maxLength": 128, + "type": "string" +}
1 tool update
- Changed
search_web_pages2 fields changed- changed
Input schema / properties / mode / descriptionPrevious value: -"Search mode: 'pro' (default) for enhanced results"New value: +"Search mode: 'pro' (default) for enhanced results or 'realtime' for fastest results" - changed
Input schema / properties / mode / enumPrevious value: -[ - "pro" -]New value: +[ + "realtime", + "pro" +]
1 tool update
- Changed
search_web_pages1 field changed- added
Input schema / properties / max_resultsAdded value: +{ + "description": "Maximum number of results to return. When omitted, a default count (10) is used.", + "maximum": 50, + "minimum": 1, + "type": "integer" +}
1 tool update
- Changed
search_web_pages1 field changed- added
Input schema / properties / query_timeAdded value: +{ + "description": "Point-in-time search: exclude pages newer than this timestamp. ISO 8601 datetime or relative (e.g. \"7d\")", + "type": "string" +}
1 tool update
- Changed
fetch_page_content1 field changed- added
Input schema / properties / promptAdded value: +{ + "description": "Optional extraction instruction. When set, an LLM reads the fetched page and the returned content is only the output for this instruction instead of the full page. Example: \"List all pricing tiers with their monthly prices\".", + "maxLength": 2000, + "type": "string" +}
1 tool update
- Changed
search_web_pages1 field changed- added
Input schema / properties / snippet_max_lengthAdded value: +{ + "description": "Maximum length (characters) of the snippet returned per result. When omitted, a default length is used.", + "maximum": 10000, + "minimum": 180, + "type": "integer" +}
1 tool update
- Changed
fetch_page_content1 field changed- added
Input schema / properties / liveAdded value: +{ + "default": false, + "description": "Fetch live content. Defaults to false.", + "type": "boolean" +}
2 tool updates
- First observed
fetch_page_content - First observed
search_web_pages
Related MCP Connectors
Search the live web and fetch clean content from source pages.
Live web search, image search, topic filters and full-text fetch over our own crawled index.
Executes live web/news search queries and returns clean, token-pruned results with zero ad bloat.
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables MCP-compatible clients to search the web and fetch HTTP/HTTPS pages as Markdown, returning result metadata such as titles, URLs, dates, relevance, and summaries.224 npm1MIT
- AlicenseAqualityCmaintenanceEnables lightweight web search discovery and on-demand extraction of cleaned page text from supplied URLs, returning snippets, headings, links, and saved full text for longer pages.2BSD 3-Clause
- AlicenseAqualityCmaintenanceEnables any MCP-compatible AI agent to search the live web and fetch pages as clean Markdown, including batch fetching with rate limiting, retries, and context-safe truncation.3MIT
- FlicenseNot gradedqualityDmaintenanceEnables web search using DuckDuckGo and content retrieval from URLs, returning markdown with pagination support.-
Glama MCP Gateway
Add one secure layer between your agents and this server.