Skip to main content
Glama

Server Details

Docs: https://docs.keenable.ai/mcp-server

Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.

Ownership verified
Status
Healthy
Uptime
100.0% over 63 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.9/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have entirely distinct purposes: search_web_pages discovers pages and fetch_page_content retrieves a single page's content. There is no realistic scenario where an agent would confuse the two.

Naming Consistency5/5

Both names follow a clean verb_noun snake_case pattern (search_web_pages, fetch_page_content) with the shared noun 'page/content' reinforcing the domain. Fully predictable.

Tool Count4/5

Two tools is on the thin side for a general web-access surface, but search + fetch is the minimal complete pair for this purpose and neither tool is redundant. Slightly under-scoped rather than bloated.

Completeness4/5

Search-with-filters plus full page fetch covers the core read-only web workflow end to end, with modes and date/site filters adding depth. Minor gaps only, such as no explicit link/related-page traversal or structured result extraction, which agents can work around.

Available Tools

2 tools
fetch_page_contentA
Read-onlyIdempotent
Inspect

Fetch and extract content from a web page. Returns the page content in markdown format.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to fetch. Example: "https://example.com"
liveNoFetch live content. Defaults to false.
promptNoOptional 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_charsNoMaximum number of characters of content to return. Longer content is truncated. Defaults to 50000 when omitted.
session_idNoOptional 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_formatNoResponse format: 'text' (default) for readable text, or 'json' for the raw response serialized as JSON.text

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_pagesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoSearch mode: 'pro' (default) for enhanced results or 'realtime' for fastest results
siteNoRestrict results to a specific site (e.g. "techcrunch.com")
queryYesNatural language search query. Should be a semantically rich description of the ideal page, not just keywords.
query_timeNoLeave 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_idNoOptional 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_resultsNoMaximum number of results to return. When omitted, a default count (10) is used.
output_formatNoResponse format: 'text' (default) for readable text, or 'json' for the raw response serialized as JSON.text
acquired_afterNoFilter results to pages acquired/indexed after this date (YYYY-MM-DD)
enable_wizardsNoExperimental: use wizards (structured data outputs). Only valid in 'pro' mode, and not under a zero data retention policy.
acquired_beforeNoFilter results to pages acquired/indexed before this date (YYYY-MM-DD)
published_afterNoFilter 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_beforeNoFilter results to pages published before this date (YYYY-MM-DD)
snippet_max_lengthNoMaximum length (characters) of the snippet returned per result. When omitted, a default length is used.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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. 1 tool update
    • Changedsearch_web_pages1 field changed
      • changedInput schema / properties / enable_wizards / description
        Previous 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."
  2. 1 tool update
    • Changedsearch_web_pages2 fields changed
      • removedInput schema / properties / enableWizards
        Removed value: -{
        -  "default": false,
        -  "description": "Experimental: use wizards (structured data outputs). Only valid in 'pro' mode.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / enable_wizards
        Added value: +{
        +  "default": false,
        +  "description": "Experimental: use wizards (structured data outputs). Only valid in 'pro' mode.",
        +  "type": "boolean"
        +}
  3. 1 tool update
    • Changedsearch_web_pages2 fields changed
      • changedInput schema / properties / published_after / description
        Previous 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."
      • changedInput schema / properties / query_time / description
        Previous 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)"
  4. 2 tool updates
    • Changedfetch_page_content1 field changed
      • addedInput schema / properties / output_format
        Added 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"
        +}
    • Changedsearch_web_pages1 field changed
      • addedInput schema / properties / output_format
        Added 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"
        +}
  5. 1 tool update
    • Changedsearch_web_pages1 field changed
      • addedInput schema / properties / enableWizards
        Added value: +{
        +  "default": false,
        +  "description": "Experimental: use wizards (structured data outputs). Only valid in 'pro' mode.",
        +  "type": "boolean"
        +}
  6. 1 tool update
    • Changedsearch_web_pages1 field changed
      • changedInput schema / properties / query_time / description
        Previous 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\")"
  7. 2 tool updates
    • Changedfetch_page_content1 field changed
      • addedInput schema / properties / session_id
        Added 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"
        +}
    • Changedsearch_web_pages1 field changed
      • addedInput schema / properties / session_id
        Added 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"
        +}
  8. 1 tool update
    • Changedsearch_web_pages2 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"Search mode: 'pro' (default) for enhanced results"New value: +"Search mode: 'pro' (default) for enhanced results or 'realtime' for fastest results"
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "pro"
        -]New value: +[
        +  "realtime",
        +  "pro"
        +]
  9. 1 tool update
    • Changedsearch_web_pages1 field changed
      • addedInput schema / properties / max_results
        Added value: +{
        +  "description": "Maximum number of results to return. When omitted, a default count (10) is used.",
        +  "maximum": 50,
        +  "minimum": 1,
        +  "type": "integer"
        +}
  10. 1 tool update
    • Changedsearch_web_pages1 field changed
      • addedInput schema / properties / query_time
        Added value: +{
        +  "description": "Point-in-time search: exclude pages newer than this timestamp. ISO 8601 datetime or relative (e.g. \"7d\")",
        +  "type": "string"
        +}
  11. 1 tool update
    • Changedfetch_page_content1 field changed
      • addedInput schema / properties / prompt
        Added 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"
        +}
  12. 1 tool update
    • Changedsearch_web_pages1 field changed
      • addedInput schema / properties / snippet_max_length
        Added value: +{
        +  "description": "Maximum length (characters) of the snippet returned per result. When omitted, a default length is used.",
        +  "maximum": 10000,
        +  "minimum": 180,
        +  "type": "integer"
        +}
  13. 1 tool update
    • Changedfetch_page_content1 field changed
      • addedInput schema / properties / live
        Added value: +{
        +  "default": false,
        +  "description": "Fetch live content. Defaults to false.",
        +  "type": "boolean"
        +}
  14. 2 tool updates
    • First observedfetch_page_content
    • First observedsearch_web_pages

Related MCP Connectors

  • Free web search for AI agents. No API key required. Hosted MCP in active development.

  • Your agent needs the open web — searched by more than one engine, and read as clean markdown rather than raw HTML. **What you can ask for** • "Search this question with two providers and tell me where they disagree." • "Scrape these 40 URLs into markdown, in one batch." • "Crawl this documentation site and give me every page." • "Do deep research on this topic and cite the sources." • "Find the academic papers behind this claim." **How to use it** Point any MCP client at https://mcp.aisa.one/search/mcp and sign in with OAuth — there is no key to create or paste. 30 tools across several independent providers: Tavily and Exa search, answers, contents and agent runs; Firecrawl scrape, batch scrape, crawl, map and search; Perplexity Sonar, Sonar Pro, reasoning and deep research; Oxylabs AI search and LLM jobs; OpenAI and Anthropic web search; and scholarly search. **Why this rather than the source** Several independent indexes behind one account, because one engine's blind spot is not visible from inside it. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find the page here, then ask the same agent who links to it or how much traffic it gets — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo-serp/mcp for the Google results page itself, https://mcp.aisa.one/seo-serp-other-engines/mcp for Bing, Baidu and Naver.

  • Turn any public website into an MCP server for agents to search, read and navigate.

  • Scrape, crawl and search the web for AI agents via MCP.

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that enables web search and page content retrieval via the Keenable API, supporting search with filters and fetching clean markdown content from indexed URLs.
    2
    374 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for live web search and clean-markdown page fetch over the Keenable web index.
    2
    46 npm
    6
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    MCP server for web search powered by Google AI Mode (Gemini). Enables any AI agent to search the web in real-time for free and without rate limits.
    2
    184
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources