Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,544Letters: 14Defects: 1,324counted just now
teppi

Server definition

Hash
sha256:65d8011e3e92d7368425ed9edd02754e33b1203fddba71b0aa8f52f37d7f0dc4
What it is
What a remote MCP server returned when asked what it offers: 9 tools

The blob, as servednamed by its sha256

{ "instructions": "Moltline's Personal Suite: 20 personal-assistant persona-skill products (inbox, calendar, travel, meals, fitness admin, finance admin, family logistics and more). Free: list_products, get_free_skill, budget_split, spaced_repetition_plan. Premium: get_full_product, get_full_skill.", "tools": [ { "description": "Split monthly income into needs/wants/savings buckets with weekly equivalents. FREE.\n\nDefaults to the 50/30/20 rule, fully customizable. Typical input\n{\"monthly_income\": 4000} returns {\"needs\": {\"pct\": 50, \"monthly\":\n2000.0, \"weekly\": 461.54}, \"wants\": {...}, \"savings\": {...},\n\"note\": \"...\"}.\n\nUse when monthly income needs allocating across buckets. Not for how long\na target takes to reach (savings_goal). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"monthly_income must be > 0\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "monthly_income": { "description": "Take-home monthly income; must be greater than 0.", "exclusiveMinimum": 0, "type": "number" }, "needs_pct": { "default": 50, "description": "Percentage for needs; all three percentages must sum to\n100. Default 50.", "type": "number" }, "savings_pct": { "default": 20, "description": "Percentage for savings. Default 20.", "type": "number" }, "wants_pct": { "default": 30, "description": "Percentage for wants. Default 30.", "type": "number" } }, "required": [ "monthly_income" ], "type": "object" }, "name": "budget_split", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Count the days until each named event, soonest first. FREE.\n\nTypical input {\"events\": {\"Launch\": \"2026-10-01\", \"Trip\":\n\"2026-09-05\"}} returns {\"today\": \"YYYY-MM-DD\", \"events\": [{\"event\":\n\"Trip\", \"date\": \"2026-09-05\", \"days_away\": 20}, ...]}; a bad date gets\na per-event error entry instead of failing the whole call.\n\nUse to rank named dates by how soon they arrive. Not for working-day math,\nwhich the timeops server's business_days handles, and not for building a\nreview schedule (spaced_repetition_plan). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "events": { "additionalProperties": true, "description": "Mapping of event name to ISO date YYYY-MM-DD, e.g.\n{\"Launch\": \"2026-10-01\"}. The first 30 events are used.", "type": "object" } }, "required": [ "events" ], "type": "object" }, "name": "countdown_days", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Load a product's free gateway skill with its complete instructions. FREE.\n\nTypical input {\"slug\": \"inbox-assistant\"} returns {\"slug\": ...,\n\"skill\": \"<skill name>\", \"instructions\": \"<full skill text>\"}.\n\nReturns exactly one skill - the product's free gateway skill - chosen\nautomatically from the slug, with no plan required. Use when the caller\nwants usable instructions immediately. Not for the product's other skills:\nthose are named and need get_full_skill with a skill_name, which requires\na paid plan. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"unknown slug '<value>'. Use list_products.\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "slug": { "description": "Product slug exactly as returned by list_products,\ne.g. \"inbox-assistant\".", "type": "string" } }, "required": [ "slug" ], "type": "object" }, "name": "get_free_skill", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Load one product in full: its persona plus every paid skill. PREMIUM (license).\n\nTypical input {\"slug\": \"inbox-assistant\"} returns {\"slug\": ...,\n\"name\": ..., \"persona\": \"<persona text>\", \"skills\": [{\"name\": ...,\n\"instructions\": ...}, ...], \"free_skill\": {...}}.\n\nReturns persona plus every skill for one product. Use when the caller\nwants the whole product. Not for a single skill (get_full_skill) and not\nfor a free look, which list_products and get_free_skill provide with no\nplan. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"unknown slug '<value>'\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "slug": { "description": "Product slug exactly as returned by list_products,\ne.g. \"inbox-assistant\".", "type": "string" } }, "required": [ "slug" ], "type": "object" }, "name": "get_full_product", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Load one paid skill's complete instructions from a product. PREMIUM (license).\n\nTypical input {\"slug\": \"inbox-assistant\", \"skill_name\": \"Zero Sweep\"}\nreturns {\"slug\": ..., \"skill\": ..., \"instructions\": \"<full skill\ntext>\"}.\n\nReturns one named skill, selected by skill_name. Use when the caller wants\none specific paid skill. Not for the free gateway skill, which\nget_free_skill returns with no plan, and not for every skill at once\n(get_full_product). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"unknown slug '<value>'\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "skill_name": { "description": "Exact skill name as listed in that product's \"skills\"\narray from list_products.", "type": "string" }, "slug": { "description": "Product slug exactly as returned by list_products.", "type": "string" } }, "required": [ "slug", "skill_name" ], "type": "object" }, "name": "get_full_skill", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "List every product in the Personal Suite line with its included skills. FREE.\n\nTakes no arguments. Returns a list of 20 product objects, each {\"slug\":\n\"inbox-assistant\", \"name\": ..., \"tagline\": ..., \"skills\": [\"Skill A\",\n...], \"free_skill\": \"Gateway Skill Name\"}. Use the returned slug values\nwith get_free_skill, get_full_product, or get_full_skill.\n\nReturns metadata only - no persona text and no skill instructions. Use\nwhen the caller wants to see what this server covers. Not for keyword\nsearch across the whole 138-product catalog, which the catalog server's\nsearch_catalog does, and not for instructions the caller can act on\n(get_free_skill). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "list_products", "outputSchema": { "properties": { "result": { "items": { "additionalProperties": true, "type": "object" }, "type": "array" } }, "required": [ "result" ], "type": "object", "x-fastmcp-wrap-result": true } }, { "description": "Compute months to reach a savings target at a monthly contribution. FREE.\n\nOptionally compounds interest monthly. Administrative math only — not\nfinancial advice. Typical input {\"target\": 10000, \"monthly_saving\":\n400, \"annual_rate_pct\": 4} returns {\"months\": 24, \"years\": 2.0,\n\"final_balance\": 10021.94, \"interest_earned\": 421.94, \"note\": \"...\"}.\n\nUse when a target amount and a monthly contribution are known. Not for\nallocating income across categories (budget_split) and not for loan\nrepayment, which the business server's loan_payment computes. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"target and monthly_saving must be > 0\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "annual_rate_pct": { "default": 0, "description": "Annual interest rate percentage, 0 to 100,\ncompounded monthly. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "monthly_saving": { "description": "Contribution per month; must be greater than 0.", "exclusiveMinimum": 0, "type": "number" }, "target": { "description": "The savings goal; must be greater than 0.", "exclusiveMinimum": 0, "type": "number" } }, "required": [ "target", "monthly_saving" ], "type": "object" }, "name": "savings_goal", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Build a spaced-repetition review schedule with expanding intervals. FREE.\n\nIntervals follow 1, 3, 7, 14, 30, 60, 120, 240 days. Typical input\n{\"start_date\": \"2026-09-01\", \"sessions\": 4} returns {\"start\":\n\"2026-09-01\", \"reviews\": [{\"session\": 1, \"day_offset\": 1, \"date\":\n\"2026-09-02\"}, ...]}.\n\nUse when material must be reviewed on expanding intervals. Not for timing\na single session, which the educator server's lesson_timer handles. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"start_date must be YYYY-MM-DD\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "sessions": { "default": 6, "description": "Number of review sessions; values outside 1-8 are\nclamped. Default 6.", "type": "integer" }, "start_date": { "description": "The day you learned the material, ISO YYYY-MM-DD.", "type": "string" } }, "required": [ "start_date" ], "type": "object" }, "name": "spaced_repetition_plan", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Compute the tip and per-person split for a bill. FREE.\n\nTypical input {\"bill\": 86.40, \"tip_pct\": 20, \"people\": 4} returns\n{\"tip\": 17.28, \"total\": 103.68, \"per_person\": 25.92}.\n\nUse for one bill shared among a group. Not for recurring household\nbudgeting (budget_split). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"bill must be > 0 and people >= 1\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.", "inputSchema": { "additionalProperties": false, "properties": { "bill": { "description": "The pre-tip bill amount; must be greater than 0.", "exclusiveMinimum": 0, "type": "number" }, "people": { "default": 1, "description": "How many people split the total; at least 1. Default 1.", "minimum": 1, "type": "integer" }, "tip_pct": { "default": 18, "description": "Tip percentage, 0 to 100. Default 18.", "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "bill" ], "type": "object" }, "name": "tip_split", "outputSchema": { "additionalProperties": true, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:65d8011e3e92d7368425ed9edd02754e33b1203fddba71b0aa8f52f37d7f0dc4 | sha256sum