Example MCP SSE Server for fetching URLs and searching the web
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation, output schema clarity, and error handling guidance. fetchUrls has a well-formed input schema (urls array with URL format), but search lacks parameter constraints. Neither tool documents output structure for LLM consumption. Descriptions are present but generic (194 chars baseline; these are 89 and 108 chars respectively). No error recovery guidance, no pagination support despite potentially large result sets, no idempotency hints. Tool composition is reasonable (separate concerns), but parameter naming could be more explicit (e.g., 'search_query' vs 'query'). Missing per-parameter descriptions in schema definitions.
Fetch multiple URLs and convert their content to markdown
Search and retrieve content from web pages. Returns SERP results (url, title, description) .
search tool lacks input validation and constraints. 'query' parameter is a free-form string with no length limits, format guidance, or enum constraints. LLMs may pass empty strings, extremely long queries, or special characters that break Google search.
Output schemas are not documented. fetchUrls returns {content: [{type, text}]} and search returns {content: [{type, text}]} with JSON-stringified results, but LLMs have no schema definition to parse these structures. Responses should declare field types and meanings.
No error recovery guidance. Both tools throw raw errors ('触发验证码, 搜索失败' in Chinese; generic 'Error processing URL') without actionable next steps. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
fetchUrls processes multiple URLs but returns all results in a single response without per-item success/failure tracking. If one URL fails, the LLM cannot distinguish which succeeded and which failed.
search tool has no pagination support. Google SERP results can be large; returning all results in one call risks context window exhaustion. No limit parameter, no next_cursor, no total count documented.