Concurrent web search & full-text research for agents, grounded in Amazon Bedrock AgentCore Web Search (CLI + MCP server, SigV4/IAM auth).
Four tools with complete input schemas and detailed descriptions. Naming is clear and verb-based (web_search, fetch_articles, research). Descriptions are comprehensive (194 - 450 chars), exceeding baseline averages. Parameters are well-typed with constraints (query ≤200 chars, max_results 1 - 25, concurrency bounds). Output schemas are documented in descriptions. However, no tool annotations (readOnlyHint, idempotentHint) are present, and error handling guidance is minimal, descriptions state what tools do but not how to recover from failures. Composition is strong: tools chain logically (search → fetch → research). No security issues detected (no secrets in params, read-only operations).
Concurrently fetch the FULL text of many web pages (from their origin servers). Unlike web_search (which returns short snippets), this retrieves and extracts the main article text of each URL. Polite by default: respects robots.txt, rate-limited, bounded, with per-URL error capture. Uses the server host's own network. Args: urls: List of http(s) URLs to fetch (may be large; throughput is rate-limited). max_chars: Truncate each article's extracted text to this many chars (default ~8000). concurrency: Max concurrent fetches (default: server's --fetch-concurrency). Returns: {"results": [{url, finalUrl, status, title, text, chars, error}], "total", "errorCount", "requested"}. Only fetch public pages you're permitted to read; cite sources; no bulk redistribution.
Research a topic end-to-end (open-source-Firecrawl style): search -> fetch -> merge. 1) Searches the topic via AgentCore Web Search (up to `max_results` sources). 2) If `fetch_full`, concurrently fetches each source's full text from origin. 3) Returns one structured corpus; each source keeps its search snippet, citation (url/title/publishedDate) and (when fetched) full `text`. Your agent/LLM then summarizes/analyzes the returned `sources`. This tool does not itself write the summary — it assembles grounded, cited material to reason over. Args: topic: Research topic / query (<=200 chars). max_results: How many sources to discover, 1-25 (default 10). fetch_full: Fetch each source's full text (default True). If False, returns search snippets only (no origin fetch). max_chars: Truncate each article's text to this many chars (default ~8000). concurrency: Max concurrent fetches (default: server's --fetch-concurrency). Returns: {"topic", "sourceCount", "fetched", "errorCount", "sources": [...]}.
No tool annotations (readOnlyHint, idempotentHint, destructiveHint) declared in tool definitions. All four tools are read-only and idempotent, but this is not formally signaled to clients.
Error handling descriptions lack recovery guidance. E.g., 'Per-query failures are reported, not fatal' but no guidance on how to interpret or retry. Missing pattern: 'If query fails, try with fewer results or simpler query.'
Output schema for 'research' tool is documented in description but not formally structured. Descriptions state 'Returns: {topic, sourceCount, fetched, errorCount, sources: [...]}' but no JSON Schema object is visible in code.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 79 | 2025-06-18+ | v2 |
Search the web for a single query via AgentCore Web Search. Args: query: Search query, 200 characters or fewer. max_results: How many results to return, 1-25 (default 10). Returns a dict: {"results": [{"title","url","publishedDate","text"}], "total": N}. `text` is a semantically-extracted snippet (not full page text). Cite url/title.
Run MANY web searches CONCURRENTLY and return one de-duplicated result set. Issues each query in parallel against AgentCore (bounded by `concurrency` and an internal token-bucket rate limiter sized to the service quota), then merges and de-duplicates results by URL. Per-query failures are reported, not fatal. Args: queries: List of search queries (each <=200 chars). May be large (100s); throughput is capped by the configured rate limit / quota. max_results: Results per query, 1-25 (default 10). concurrency: Max in-flight searches (default: server's --concurrency). Returns: { "results": [...deduped merged results...], "total": N, "queryCount": M, "errorCount": K, "queries": [{"query","count","error"}, ...] # per-query breakdown } Cite the returned url/title in any answer. Do not use for bulk extraction.
No pagination or result-limiting guidance for fetch_articles when given 100+ URLs. Description mentions 'throughput is rate-limited' but does not specify max batch size or recommend chunking strategy.
Parameter 'concurrency' defaults to null in web_search_batch and fetch_articles, requiring server-side resolution. Descriptions state 'default: server's --concurrency' but LLMs cannot infer this from null. Should document the actual default value (e.g., 10).