0.5.1npm · octen-mcp · latest release
Observed 2026-09-01T08:39:14.323Z using mcpSecurity-inventory. Protocol 2025-06-18.
| Tool | Category | Risk |
|---|---|---|
broad_searchSearch the web across many angles in one call — for comparisons, research, surveys, and questions with several distinct parts. Expands your question into multiple sub-queries and runs them concurrently.
USE WHEN the question has multiple distinct parts or entities that one search cannot cover:
- comparing vendors / products / pricing across many sources
- literature reviews, market or landscape surveys
- open-ended "what are the options for X" / "how do people solve Y"
- a question that clearly decomposes into 3+ independent sub-questions
- multi-angle questions about recent events ("what shipped across the industry this month") — set topic=news, do NOT loop news_search
DO NOT USE for:
- a single fact, entity, or document → use `search`
- re-running a disappointing search → do NOT call broad_search twice; follow up with a targeted `search` or `extract` on the specific gaps
- reading a page you already have the URL for → use `extract`
- a straight A-vs-B comparison of two known entities → two targeted `search` calls are cheaper and more controllable
COST: fans out into `max_queries` concurrent searches — roughly Nx the cost and notably higher latency than a single `search`. When in doubt, prefer `search`.
QUERY: pass one natural-language question (max 500 chars). Resolve pronouns and references from the conversation first — "how does it compare to the other one" is a useless query. Do NOT pre-split into sub-queries; that is this tool's job. For broader coverage raise `max_queries` rather than calling repeatedly. Per-sub-query options (count, topic, `language` filter, domain / text filters, time window, highlight / full_content, media) match `search` and apply to every sub-query.
RESULTS are grouped per sub-query and NOT deduplicated — the same URL may appear under several sub-queries.
max_queries: 3-5 focused comparison (2-3 entities) | 5-10 multi-facet research | 10-20 landscape scan | 20-30 exhaustive survey
For a single focused lookup use `search`; to read a specific page use `extract`.
keywords: web search, search the web, look up, find information, research, compare, comparison, versus, alternatives, options, landscape, survey, market research, pricing, latest, current information, multi-part questionInput schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"description": "Search query. Max 500 chars."
},
"max_queries": {
"type": "integer",
"minimum": 1,
"maximum": 30,
"default": 5,
"description": "Upper bound on the number of sub-queries generated (1-30). Default 5 — raise toward 30 for surveys / deeper research, lower for a tighter search."
},
"topic": {
"type": "string",
"enum": [
"general",
"news"
],
"default": "general",
"description": "Search category: `general` for broad web search, `news` for news-focused results. Default general."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 5,
"description": "Number of results to return (1-100). Default 5."
},
"include_domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 1200,
"description": "Only return results from these domains (e.g. 'arxiv.org'). Max 1200, each ≤60 chars."
},
"exclude_domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 1200,
"description": "Drop results from these domains. Max 1200, each ≤60 chars."
},
"include_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 30
},
"maxItems": 5,
"description": "Only return results whose content contains all of these strings. Max 5, each ≤30 chars."
},
"exclude_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 30
},
"maxItems": 5,
"description": "Drop results whose content contains any of these strings. Max 5, each ≤30 chars."
},
"time_basis": {
"type": "string",
"enum": [
"auto",
"published",
"crawled"
],
"default": "auto",
"description": "Which timestamp the time window filters against: page `published` date, last `crawled` date, or `auto`. Default auto."
},
"time_range": {
"type": "string",
"enum": [
"day",
"week",
"month",
"year",
"d",
"w",
"m",
"y"
],
"description": "Relative time window (e.g. `week`, `month`). Mutually exclusive with `start_time`/`end_time` — if both are given, the absolute range wins."
},
"start_time": {
"type": "string",
"description": "Lower bound for the time window, ISO 8601 (e.g. '2025-01-01T00:00:00Z')."
},
"end_time": {
"type": "string",
"description": "Upper bound for the time window, ISO 8601."
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"default": "text",
"description": "Format of returned content. Default text."
},
"safesearch": {
"type": "string",
"enum": [
"off",
"strict"
],
"default": "strict",
"description": "Adult-content filter. Default strict."
},
"language": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ar",
"de",
"en",
"es",
"fr",
"hi",
"id",
"it",
"ja",
"ko",
"nl",
"pl",
"pt",
"ru",
"th",
"tr",
"vi",
"zh"
]
},
"default": [],
"description": "Languages to filter results by, as ISO 639-1 codes. Empty = no filter."
},
"highlight": {
"type": "object",
"description": "Return a ranked highlighted snippet per result. Omit to use the server default.",
"properties": {
"enable": {
"type": "boolean",
"default": true,
"description": "Whether to return highlights."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 20000,
"default": 512,
"description": "Max tokens per highlight snippet (100-20000)."
}
}
},
"full_content": {
"type": "object",
"description": "Return the cleaned full page body per result. Heavier than `highlight` — use only when the snippet isn't enough. Omit to use the server default (off).",
"properties": {
"enable": {
"type": "boolean",
"default": false,
"description": "Whether to return full content."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 100000,
"default": 2048,
"description": "Max tokens of full content per result (100-100000)."
}
}
},
"include_images": {
"type": "boolean",
"default": false,
"description": "Return image URLs (and a cover image) found on each result page."
},
"timeout": {
"type": "integer",
"minimum": 1,
"maximum": 300,
"description": "Request timeout in seconds (1-300). Defaults to 120s if unset. Raise it for large `max_queries` surveys, which legitimately take longer."
}
},
"required": [
"query"
]
}Annotations{
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
} | — | — |
extractRead one or more web pages by URL and return clean, LLM-ready content (markdown or text). By default (no `query`) it returns each page's full content — this is what you want in almost all cases. Only pass `query` when the user explicitly asks to fetch relevance-ranked snippets for a specific topic; doing so returns highlights INSTEAD of the full body, so the content will be partial. Every result also includes a `category` (topical) and `page_structure` (typology) classification. Bare hosts like 'octen.ai' are auto-normalized to https. Cached when fresh.
Use this when you already have the URL(s). To find pages first, use `search` or `broad_search`.
keywords: read page, fetch url, scrape, page content, article text, parse webpage, extract, read article, url content, open linkInput schema{
"type": "object",
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"minItems": 1,
"maxItems": 20,
"description": "URLs to extract. 1-20 per call, each ≤2048 chars. Bare hosts ok."
},
"query": {
"type": "string",
"maxLength": 500,
"description": "Optional — leave UNSET in the normal case. When unset, each result returns the page's `full_content` (the complete text). Only set this when the user explicitly wants relevance-ranked snippets for a specific query/topic: setting it makes each result return `highlights` (ranked excerpts) and OMIT `full_content`, so the page body will be incomplete. Do not pass it just to focus a normal fetch."
},
"max_age_seconds": {
"type": "integer",
"minimum": 300,
"maximum": 31536000,
"default": 86400,
"description": "Maximum age of cached content in seconds. Default 24h. Lower this for time-sensitive pages (news / prices)."
},
"format": {
"type": "string",
"enum": [
"markdown",
"text"
],
"default": "markdown",
"description": "Output format. Default markdown."
},
"timeout": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"default": 30,
"description": "Per-URL timeout in seconds (1-60)."
},
"include_images": {
"type": "boolean",
"default": false,
"description": "Return image resources found on each page (also enables `cover_image` when the page has one)."
},
"include_videos": {
"type": "boolean",
"default": false,
"description": "Return video URLs found on each page."
},
"include_audio": {
"type": "boolean",
"default": false,
"description": "Return audio URLs found on each page."
}
},
"required": [
"urls"
]
}Annotations{
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
} | — | — |
image_searchFind images on the web by text query OR by a reference image — returns ranked results (title, source page, dimensions, thumbnail, description, summary). In Beta; contact us to request beta access. Pass exactly one of: a text `query`, an `image_url` (a picture already on the web), or `image_data` (base64, for a picture you hold). Never more than one. Set `topic` to `design` for UI design references — each result then carries a structured style `summary` and an `html_snippet` for building/restyling frontends. Use this when the user wants pictures, photos, diagrams, screenshots, or visual references — not for general text web search.
keywords: find images, image search, photos, pictures, screenshots, visual reference, diagram, icon, illustration, UI design, reference imageInput schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"description": "Text query describing the images to find. Exactly one of `query`, `image_url` or `image_data` — never more than one."
},
"image_url": {
"type": "string",
"description": "Public image URL to search by visual similarity. Exactly one of `query`, `image_url` or `image_data` — never more than one."
},
"image_data": {
"type": "string",
"maxLength": 5242880,
"description": "Base64-encoded image to search by visual similarity, for an image you hold rather than one already on the web. At most 5MB encoded; JPEG, PNG, WEBP, BMP, TIFF, ICO, DIB, ICNS or SGI. A `data:` URI is accepted — its payload is used. Exactly one of `query`, `image_url` or `image_data` — never more than one."
},
"topic": {
"type": "string",
"enum": [
"general",
"design"
],
"default": "general",
"description": "Image category: `general` for broad image search, `design` for design / illustration oriented results. Default general."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"default": 5,
"description": "Number of results to return (1-10). Default 5."
},
"include_domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only return results from these domains (e.g. 'unsplash.com')."
},
"exclude_domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Drop results from these domains."
},
"safesearch": {
"type": "string",
"enum": [
"off",
"strict"
],
"default": "strict",
"description": "Adult-content filter. Default strict."
},
"html_snippet": {
"type": "object",
"description": "Return an HTML snippet of the source context per result. Omit to use the server default.",
"properties": {
"enable": {
"type": "boolean",
"description": "Whether to return HTML snippets."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 100000,
"default": 5000,
"description": "Max tokens per HTML snippet (100-100000). Default 5000."
}
}
},
"timeout": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Request timeout in seconds (1-60). Defaults to 30s if unset."
}
}
}Annotations{
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
} | — | — |
news_searchSearch recent news and return ranked articles (title, url, snippet) — current events, headlines, timely reporting. This is `search` locked to `topic: news`; same options as `search` (domain / text filters, `language` filter, time window, highlight / full_content, media) except `topic`, which is fixed to news.
For a single news lookup this is the right tool. For a multi-angle news question ("what shipped across the industry this month", "how are different outlets covering X"), use `broad_search` with topic=news instead of looping news_search.
keywords: news search, latest news, headlines, current events, breaking news, recent, today, this week, press coverageInput schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"description": "Search query. Max 500 chars."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 5,
"description": "Number of results to return (1-100). Default 5."
},
"include_domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 1200,
"description": "Only return results from these domains (e.g. 'arxiv.org'). Max 1200, each ≤60 chars."
},
"exclude_domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 1200,
"description": "Drop results from these domains. Max 1200, each ≤60 chars."
},
"include_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 30
},
"maxItems": 5,
"description": "Only return results whose content contains all of these strings. Max 5, each ≤30 chars."
},
"exclude_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 30
},
"maxItems": 5,
"description": "Drop results whose content contains any of these strings. Max 5, each ≤30 chars."
},
"time_basis": {
"type": "string",
"enum": [
"auto",
"published",
"crawled"
],
"default": "auto",
"description": "Which timestamp the time window filters against: page `published` date, last `crawled` date, or `auto`. Default auto."
},
"time_range": {
"type": "string",
"enum": [
"day",
"week",
"month",
"year",
"d",
"w",
"m",
"y"
],
"description": "Relative time window (e.g. `week`, `month`). Mutually exclusive with `start_time`/`end_time` — if both are given, the absolute range wins."
},
"start_time": {
"type": "string",
"description": "Lower bound for the time window, ISO 8601 (e.g. '2025-01-01T00:00:00Z')."
},
"end_time": {
"type": "string",
"description": "Upper bound for the time window, ISO 8601."
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"default": "text",
"description": "Format of returned content. Default text."
},
"safesearch": {
"type": "string",
"enum": [
"off",
"strict"
],
"default": "strict",
"description": "Adult-content filter. Default strict."
},
"language": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ar",
"de",
"en",
"es",
"fr",
"hi",
"id",
"it",
"ja",
"ko",
"nl",
"pl",
"pt",
"ru",
"th",
"tr",
"vi",
"zh"
]
},
"default": [],
"description": "Languages to filter results by, as ISO 639-1 codes. Empty = no filter."
},
"highlight": {
"type": "object",
"description": "Return a ranked highlighted snippet per result. Omit to use the server default.",
"properties": {
"enable": {
"type": "boolean",
"default": true,
"description": "Whether to return highlights."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 20000,
"default": 512,
"description": "Max tokens per highlight snippet (100-20000)."
}
}
},
"full_content": {
"type": "object",
"description": "Return the cleaned full page body per result. Heavier than `highlight` — use only when the snippet isn't enough. Omit to use the server default (off).",
"properties": {
"enable": {
"type": "boolean",
"default": false,
"description": "Whether to return full content."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 100000,
"default": 2048,
"description": "Max tokens of full content per result (100-100000)."
}
}
},
"include_images": {
"type": "boolean",
"default": false,
"description": "Return image URLs (and a cover image) found on each result page."
},
"timeout": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Request timeout in seconds (1-60). Defaults to 30s if unset."
}
},
"required": [
"query"
]
}Annotations{
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
} | — | — |
searchSearch the live web and return ranked results (title, url, snippet) — fast, fresh, real-time web search for one focused lookup. Set `topic` to `news` for news-focused results. Pass `highlight` to get a ranked snippet per result, or `full_content` to pull the cleaned page body inline (heavier — costs more context). Narrow with domain / text include-exclude filters, a `language` filter (ISO 639-1 codes), and a time window (published/crawled `start_time`/`end_time`, or a relative `time_range`). Set `include_images` to return image URLs per result.
USE FOR a single focused lookup: one fact, one entity, one document. If the question spans several independent subtopics, load and use `broad_search` instead — a sequence of search calls is slower and gives worse coverage than one fan-out. To read a page you already have the URL for, use `extract`.
keywords: web search, search the web, look up, find, check, fact, current information, latest, news, source, url, real-timeInput schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"description": "Search query. Max 500 chars."
},
"topic": {
"type": "string",
"enum": [
"general",
"news"
],
"default": "general",
"description": "Search category: `general` for broad web search, `news` for news-focused results. Default general."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 5,
"description": "Number of results to return (1-100). Default 5."
},
"include_domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 1200,
"description": "Only return results from these domains (e.g. 'arxiv.org'). Max 1200, each ≤60 chars."
},
"exclude_domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 1200,
"description": "Drop results from these domains. Max 1200, each ≤60 chars."
},
"include_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 30
},
"maxItems": 5,
"description": "Only return results whose content contains all of these strings. Max 5, each ≤30 chars."
},
"exclude_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 30
},
"maxItems": 5,
"description": "Drop results whose content contains any of these strings. Max 5, each ≤30 chars."
},
"time_basis": {
"type": "string",
"enum": [
"auto",
"published",
"crawled"
],
"default": "auto",
"description": "Which timestamp the time window filters against: page `published` date, last `crawled` date, or `auto`. Default auto."
},
"time_range": {
"type": "string",
"enum": [
"day",
"week",
"month",
"year",
"d",
"w",
"m",
"y"
],
"description": "Relative time window (e.g. `week`, `month`). Mutually exclusive with `start_time`/`end_time` — if both are given, the absolute range wins."
},
"start_time": {
"type": "string",
"description": "Lower bound for the time window, ISO 8601 (e.g. '2025-01-01T00:00:00Z')."
},
"end_time": {
"type": "string",
"description": "Upper bound for the time window, ISO 8601."
},
"format": {
"type": "string",
"enum": [
"text",
"markdown"
],
"default": "text",
"description": "Format of returned content. Default text."
},
"safesearch": {
"type": "string",
"enum": [
"off",
"strict"
],
"default": "strict",
"description": "Adult-content filter. Default strict."
},
"language": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ar",
"de",
"en",
"es",
"fr",
"hi",
"id",
"it",
"ja",
"ko",
"nl",
"pl",
"pt",
"ru",
"th",
"tr",
"vi",
"zh"
]
},
"default": [],
"description": "Languages to filter results by, as ISO 639-1 codes. Empty = no filter."
},
"highlight": {
"type": "object",
"description": "Return a ranked highlighted snippet per result. Omit to use the server default.",
"properties": {
"enable": {
"type": "boolean",
"default": true,
"description": "Whether to return highlights."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 20000,
"default": 512,
"description": "Max tokens per highlight snippet (100-20000)."
}
}
},
"full_content": {
"type": "object",
"description": "Return the cleaned full page body per result. Heavier than `highlight` — use only when the snippet isn't enough. Omit to use the server default (off).",
"properties": {
"enable": {
"type": "boolean",
"default": false,
"description": "Whether to return full content."
},
"max_tokens": {
"type": "integer",
"minimum": 100,
"maximum": 100000,
"default": 2048,
"description": "Max tokens of full content per result (100-100000)."
}
}
},
"include_images": {
"type": "boolean",
"default": false,
"description": "Return image URLs (and a cover image) found on each result page."
},
"timeout": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Request timeout in seconds (1-60). Defaults to 30s if unset."
}
},
"required": [
"query"
]
}Annotations{
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
} | — | — |
video_searchFind videos on the web by text query — returns ranked results (title, source page, cover image, duration, matching segment, authors, description). In Beta; contact us to request beta access. Pass a text `query`. Use this when the user wants to find videos, clips, footage, tutorials, or a specific moment within a video — not for general text web search.
keywords: find videos, video search, clips, footage, youtube, tutorial video, watch, movie, video clipInput schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 500,
"description": "Text query describing the videos to find."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"default": 5,
"description": "Number of results to return (1-10). Default 5."
},
"time_range": {
"type": "string",
"enum": [
"day",
"week",
"month",
"year",
"d",
"w",
"m",
"y"
],
"description": "Relative time window (e.g. `week`, `month`). Mutually exclusive with `start_time`/`end_time` — if both are given, the absolute range wins."
},
"start_time": {
"type": "string",
"description": "Lower bound for the time window, ISO 8601 (e.g. '2025-01-01T00:00:00Z')."
},
"end_time": {
"type": "string",
"description": "Upper bound for the time window, ISO 8601."
},
"safesearch": {
"type": "string",
"enum": [
"off",
"strict"
],
"default": "strict",
"description": "Adult-content filter. Default strict."
},
"timeout": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Request timeout in seconds (1-60). Defaults to 30s if unset."
}
},
"required": [
"query"
]
}Annotations{
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
} | — | — |
No completed comparison is available.
| Risk | Change | Subject |
|---|---|---|
| No material changes recorded. | ||
| Severity | Finding | Advisory |
|---|---|---|
| No confirmed vulnerability is published for this version. | ||
Artifact SHA-256: 2abedab0a357abb3aeaf77cfd5706cea7ab7551c8b94e50e8c24ee1c35449066
Scanner: mcp-proof-engine 0.1.0.