MCP server providing tools for calendar events, email, weather, stock information, Spotify, timezone, and web search via DuckDuckGo
Home-MCP presents 31 tools across stock market, weather, email, calendar, and Spotify domains. While tool names follow verb-noun conventions and all tools have descriptions, significant quality gaps emerge across parameters, schemas, and error handling. Most tools lack input parameter descriptions, critical per the rubric baseline (100% of A+ tools have described params). Output schemas are not documented. Error handling is generic ('Tool X failed: ...') with no recovery guidance. The server uses fastmcp with HTTP transport, which is current. However, the tool definitions appear to be auto-generated from method signatures without explicit schema validation or constraint documentation, and many parameters lack type hints beyond basic inference.
Summarize basic financial metrics like P/E ratio, profit margins, and 52-week high/low.
List similar companies operating in the same sector and industry.
Get general stock profile of a company including name, industry, market cap, country, and more.
Retrieve the current weather conditions for a specific location.
Retrieve and print details of an email using its Gmail ID. Returns: It prints the email details including the eamil body:
Retrieve emails received today. Returns: For each email we print subject, sender, date and gmail id:
Missing or incomplete parameter descriptions across all tools. The rubric baseline requires 100% of A+ tool parameters to have descriptions. Most parameters (e.g., 'query', 'exchange', 'unit', 'calendarId') have only terse descriptions or none at all. Example: get_timezone's 'lat' and 'lng' parameters lack descriptions explaining coordinate format or required precision.
No output schemas documented for any tool. Rubric requires 100% of A+ tools to have documented return types. LLMs cannot know what fields to expect in responses, forcing them to parse unstructured text or fail on chaining calls. Example: company_profile2 response structure is unknown, does it return sector, market_cap, country as separate fields or nested?
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Retrieve emails received yesterday. Returns: For each email we print subject, sender, date and gmail id:
Retrieves a list of events that fall within a specific time range from the specified Google Calendar.
Retrieves a list of events that occurred 'n' days ago from the specified Google Calendar.
Retrieves a list of events scheduled 'n' days later from the specified Google Calendar.
Retrieves a list of events scheduled for today from the specified Google Calendar.
Retrieves a list of events scheduled for tomorrow from the specified Google Calendar.
Retrieves a list of events that occurred yesterday from the specified Google Calendar.
Retrieve the 5-day weather forecast in 3-hour intervals for a specific city.
Retrieve the hourly weather forecast for the next 48 hours for a given city.
Retrieves saved playlists based on a given query.
Retrieves details for saved tracks based on a given query.
Retrieves saved tracks based on a given query.
Retrieve the current local time, GMT offset, zone name, DST, etc. for a given location.
Retrieves a list of upcoming events from the specified Google Calendar.
List available time zones.
List upcoming or recent market holidays for a given exchange.
Check if the specified market exchange is currently open or closed.
Get current analyst recommendation trends for a company.
Searches for albums based on a given query.
Searches for artists based on a given query.
Searches for songs based on a given query.
Show recent insider trading activity for a company, including executives buying or selling shares.
List supported stock symbols for a given exchange and optional currency filter.
Search for best-matching company symbols.
Perform a web search using DuckDuckGo and return a summary of results. Use this tool for general knowledge or financial facts not known internally.
Generic error responses with no recovery guidance. Errors return 'Tool X failed: ...' with no actionable next step. Rubric requires errors to tell the LLM what to do: 'User not found. Try search_users() first.' Example in generate_tools.py: all exceptions caught and returned as f'Tool {name} failed: {str(e)}', no guidance for retry vs user-fixable vs fatal classification.
No input parameter type definitions or constraints visible in tool schemas. The rubric flags schemas with missing types as capped at 30. Example: stock_symbols max_items parameter is described as integer but no min/max bounds documented. company_basic_financials metric parameter accepts free-form strings ('valuation', 'margin', 'all') with no enum constraint, LLMs will hallucinate invalid values.
Many calendar tools are near-duplicates (get_events_today, get_events_yesterday, get_events_tomorrow, get_events_n_days_ago, get_events_n_days_later, get_events_in_time_range). Rubric warns against multiple tools doing the same thing differently, these waste LLM reasoning cycles. Consider consolidating to a single get_events(start_date, end_date, calendarId, max_results, exclude_birthdays).
Tools with no parameters (get_emails_today, get_emails_yesterday) have schema score of 30. These lack pagination parameters (limit, offset) and return structure documentation. Rubric requires paginated tools to accept page/offset and return total count. Gmail responses can be large; without pagination, results will blow context window.
No tool annotations present (readOnlyHint, destructiveHint, idempotentHint). Current MCP spec (2026-07-28) rewards tool annotations as part of spec alignment. All tools in this server are read-only per the Risk field, but this metadata is not encoded in the tool definitions, annotations must be explicit in the tool schema.
tool name 'company_profile2' is ambiguous, why '2'? Suggests legacy naming or multiple versions. Rubric warns against ambiguous names; 'company_profile2' does not clearly distinguish from a hypothetical 'company_profile'. Rename to 'get_company_profile' for clarity.