MCP server for IncomeOS — ask your AI agent how much you made across every income stream (Stripe, affiliates, apps, ads, manual).
IncomeOS MCP has 4 tools with clear verb-noun naming (get_*, log_*) and reasonable descriptions (avg 120 chars). However, critical gaps undermine production readiness: 3 of 4 tools have empty input schemas ({}), violating the requirement that every parameter needs a description. The one tool with parameters (get_month, log_monthly_income) has proper Zod schemas with regex patterns and descriptions. Error handling is minimal, no recovery guidance, no categorization of retryable vs fatal errors. Output is unstructured text rather than typed JSON objects, forcing LLMs to parse free-form strings. No pagination, no per-item success/failure reporting. Security: credentials injected via env vars (correct), but no audit logging or permission gates documented.
Get a summary of total passive income: average per day, this month, this year, all-time, plus the top sources and goal progress.
Get the income breakdown for a specific month (YYYY-MM): total and per-source.
List all income sources with their amount this month, this year, and all-time.
Log (or overwrite) the income total for a source for a given month. Use 0 to clear it.
Three tools (get_income_summary, get_sources, get_month) declare empty input schemas ({}), violating the requirement that every parameter needs a description. Per HARD SCORING RULES, schema score for these tools MUST be 0.
All tools return unstructured text (plain strings) instead of typed JSON objects. LLMs must parse free-form output, wasting tokens and risking misinterpretation. No documented output schema.
Error handling is minimal. No recovery guidance (e.g., 'Try search_sources() first'), no error categorization (retryable vs fatal), no actionable error messages. A missing source returns 'No source matching...' but does not suggest next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
get_month and get_sources return potentially large lists (all sources, all months) with no pagination, limit, or offset parameters. Large results blow context window and degrade LLM reasoning.
log_monthly_income accepts 'source' as a free-form string with fuzzy matching (case-insensitive, substring search). No enum constraint. LLMs may hallucinate source names not in the system.