A lightweight MCP server for LLM orchestration with DuckDuckGo search and content extraction
Three research tools with generally good naming and descriptions, but schemas lack output documentation and parameter descriptions are inconsistent. All tools are explicitly registered in src/mcp-server.ts with name, description, and inputSchema. Tool names follow verb_noun pattern (github_code_search, duckduckgo_web_search, extract_content). Descriptions are substantive (150-200 chars) and contextual. However, parameter 'next' lacks description in both search tools, 'locale' default is declared but not explained in the description text. No output schemas are documented, LLMs cannot predict return structure. Error handling returns isError flag but lacks recovery guidance. Parameter validation rules are mentioned in descriptions but not formally constrained (e.g., 'Must include search terms' is advisory, not enforced by schema constraints).
Search the web to research frameworks, libraries, and technologies. Useful for checking if approaches are current, finding documentation, and broad research on development topics. Supports operators: "exact phrase", -exclude, +include, site:domain.com, filetype:pdf, intitle:term, inurl:term
Extract detailed content from a URL. IMPORTANT: This tool must ONLY be used with URLs obtained from the search results of github_code_search or duckduckgo_web_search tools in this MCP server. Do not use with arbitrary external URLs.
Search GitHub source code files to research implementation approaches before writing code. Restrictions: Must include search terms (not just "language:js"), only source files <384KB, active repos only. Supports qualifiers: language:LANG, extension:EXT, filename:NAME, path:DIR, user:USER, org:ORG, repo:USER/REPO
No output schemas documented. Tools return JSON-stringified responses with pagination metadata, but LLMs have no schema to predict structure. Forces agents to parse unstructured text. Baseline: 100% of A+ tools document return types.
'next' parameter in github_code_search and duckduckgo_web_search has no description. Parameter descriptions are mandatory, LLMs cannot infer what a 'next' token is or how to obtain it. Baseline: 100% of A+ tools have parameter descriptions.
extract_content name is ambiguous verb. 'extract' + unqualified 'content' does not clarify what type of content or from where. 'extract_url_content' or 'extract_webpage_content' would be clearer. Current name conflicts with generic 'extract' patterns.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 47 | - | v1 |
No parameter constraints via enums or patterns. 'query' accepts free-form strings with advisory restrictions ('Must include search terms') that are not machine-enforced. Schema validation happens at runtime, not schema-time.
Error responses lack recovery guidance. Code returns isError=true + generic message like 'GitHub search failed: <error message>'. No guidance on whether to retry, which lookup tool to call next, or what caused the failure. Baseline: error responses must tell the LLM what to do next.
extract_content description warns against arbitrary URLs but does not document how the tool validates or enforces this. No schema constraint prevents passing external URLs. Trust-based guardrails are not machine-checkable.