{
  "id": "keenable.v1.fetch",
  "object": "tool",
  "name": "Keenable Fetch",
  "summary": "Fetch a URL as clean, LLM-ready markdown.",
  "description": "Retrieve a page as clean markdown, with title, description, and author when available. By default this returns Keenable's indexed copy — a URL that is not in the index is an error; set 'live' to fetch it from the source instead. Cap returned content with 'max_chars', or pass 'prompt' (at most 2000 characters) so an LLM reads the page and `content` is only the instruction's output instead of the full text. Use this when you already know the URL; start from /search if you don't.\n\nRaw keenable#v1/fetch endpoint: input is { body, queryParams, pathParams } as the provider documents them (https://docs.keenable.ai/api-reference/fetch).",
  "category": "web",
  "hosted_by": "Keenable",
  "runtime": "partner",
  "side_effects": false,
  "status": "live",
  "credits": 0,
  "price": null,
  "providers": [
    {
      "id": "keenable",
      "name": "Keenable",
      "price": null,
      "own_key_only": true
    }
  ],
  "mcp_name": "keenable_v1_fetch",
  "input_schema": {
    "type": "object",
    "properties": {
      "queryParams": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL to fetch. Without `live`, Keenable's indexed copy; a URL not in the index is an error."
          },
          "max_chars": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991,
            "description": "Maximum number of characters of content to return. Longer content is truncated and a notice is appended after the cut, so the response runs slightly past this number. Vendor default 50000."
          },
          "live": {
            "type": "boolean",
            "description": "Fetch the page live from the source instead of Keenable's indexed copy (default false). Same price; slower (a few seconds)."
          },
          "prompt": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "Optional extraction instruction, at most 2000 characters. When set, an LLM reads the fetched page and `content` contains only the output for this instruction instead of the full page. Example: 'List all pricing tiers with their monthly prices'."
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "queryParams"
    ],
    "additionalProperties": false
  },
  "kind": "endpoint"
}