A collection of MCP servers providing math operations, web search, and weather data integration with LangChain
Four tools with basic schemas and minimal descriptions. All tools have input schemas with typed parameters (a, b, query, location), but descriptions are extremely short (10-50 chars, well below the 194-char baseline). No output schemas documented. No error handling guidance. Math tools (add, multiply) are trivial; search and weather tools call external APIs but lack retry logic, timeout handling, or actionable error messages. No parameter validation, no enum constraints, no pagination for list results. Security issue: OpenWeatherMap API key hardcoded in source code (weather_server.py line 11). No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Composition is reasonable (each tool does one thing), but descriptions are too terse for LLM selection.
Add two numbers
Get current weather data for a given location using OpenWeatherMap API.
Multiply two numbers
Search the web for a given query using SerpAPI.
Hardcoded API key in source code (weather_server.py:11). OpenWeatherMap API key 'a486f7d4cd0b4c5378d422b6ba9c107a' is exposed in the repository. This violates secret-injection pattern and risks API quota exhaustion or abuse.
Descriptions are too short (10-50 chars vs 194-char baseline). 'Add two numbers', 'Multiply two numbers', 'Search the web for a given query using SerpAPI' lack context on WHEN to use each tool, prerequisites, or what the LLM should expect. LLMs cannot reliably select tools with such terse descriptions.
No output schemas documented. Tools return strings or integers, but LLMs have no formal schema to understand structure. search() returns 'No relevant result found' (string), get_weather() returns formatted text, no structured fields for downstream tool chaining.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
No error handling guidance. search() returns 'Error: {data[error]}' and get_weather() catches exceptions but returns generic messages like 'An error occurred: {str(e)}'. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
No tool annotations. Tools lack readOnlyHint, destructiveHint, or idempotentHint metadata. Agents cannot determine which tools are safe to retry or have side effects. All four tools are read-only but this is not formally declared.