{"name":"moltline-merchant","description":"Merchant math over MCP. Free: processor_fees, charge_to_net, invoice_total. Premium (license): discount_stack, proration, installment_plan. Administrative math only — not financial advice.","url":"https://mcp.moltlinestudio.com/merchant","transport":"streamable-http","homepage":"https://moltlinestudio.com/servers.html","serverInfo":{"name":"moltline-merchant","version":"1.1.0"},"toolCounts":{"total":6,"free":3,"premium":3},"protocolVersion":"2025-11-25","protocolVersions":["2024-11-05","2025-03-26","2025-06-18","2025-11-25"],"pricing":{"freeTier":{"tools":3,"price":"0","currency":"USD","description":"Free forever. No account, no registration and no credentials are required to call them."},"details":"https://moltlinestudio.com/.well-known/pricing","terms":"https://moltlinestudio.com/terms.html","agentPayment":{"protocol":"x402","resource":"https://moltlinestudio.com/api","network":"eip155:8453","asset":"USDC","amount":"19000000","discovery":"https://moltlinestudio.com/.well-known/x402","description":"GET or POST the resource to receive an HTTP 402 carrying a machine-readable payment demand; retry with the transaction hash in the X-PAYMENT header and the licence key is returned in the response."},"premium":{"tools":3,"plan":"All-Access","price":"19.00","currency":"USD","period":"month","description":"One licence key unlocks the premium tools on every Moltline server. Billed monthly, cancellable at any time.","purchaseUrl":"https://moltlinestudio.com/#allaccess"}},"authentication":{"required":false},"tools":[{"name":"processor_fees","description":"Break down payment-processor fees: fee, net, and effective rate. FREE.\n\nUses editable presets for stripe/paypal/square/shopify (verify current\nrates) or your own custom_pct + custom_fixed. Typical input {\"amount\":\n1000, \"processor\": \"stripe\", \"transactions\": 10} returns {\"gross\":\n1000, \"fee\": 32.0, \"net\": 968.0, \"effective_rate_pct\": 3.2, \"note\":\n\"...\"}.\n\nUse when the charge amount is known and the net payout is the question.\nNot for the reverse: the gross needed to net a target is charge_to_net. 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\": \"amount must be > 0, transactions >= 1\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","tier":"free","inputSchema":{"additionalProperties":false,"properties":{"amount":{"exclusiveMinimum":0,"type":"number","description":"Total gross amount processed; must be greater than 0."},"processor":{"default":"stripe","enum":["stripe","paypal","square","shopify","custom"],"type":"string","description":"One of \"stripe\", \"paypal\", \"square\", \"shopify\", or\n\"custom\". Default \"stripe\"."},"custom_pct":{"default":0,"type":"number","description":"Percentage fee used when processor is \"custom\",\ne.g. 2.5 for 2.5%."},"custom_fixed":{"default":0,"type":"number","description":"Fixed per-transaction fee used when processor is\n\"custom\", e.g. 0.25."},"transactions":{"default":1,"minimum":1,"type":"integer","description":"How many transactions the amount is spread across;\nat least 1. Default 1."}},"required":["amount"],"type":"object"}},{"name":"charge_to_net","description":"Compute the gross price to charge so you net a target after fees. FREE.\n\n'Charge X to receive Y' after percentage + fixed processor fees.\nTypical input {\"net_target\": 100, \"pct_fee\": 2.9, \"fixed_fee\": 0.30}\nreturns {\"charge\": 103.4, \"fee\": 3.4, \"net\": 100.0}.\n\nThe inverse of processor_fees - solves for gross from a target net. Use\nwhen the payout is the fixed requirement. Not when the price is already\nset. 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\": \"net_target > 0 and pct_fee < 100 required\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","tier":"free","inputSchema":{"additionalProperties":false,"properties":{"net_target":{"exclusiveMinimum":0,"type":"number","description":"The amount you want to receive after fees; must be\ngreater than 0."},"pct_fee":{"default":2.9,"exclusiveMaximum":100,"type":"number","description":"Processor percentage fee, below 100, e.g. 2.9 for 2.9%.\nDefault 2.9."},"fixed_fee":{"default":0.3,"type":"number","description":"Processor fixed fee per charge. Default 0.30."}},"required":["net_target"],"type":"object"}},{"name":"invoice_total","description":"Total an invoice: per-line totals, subtotal, discount, tax, grand total. FREE.\n\nTypical input {\"line_items\": [{\"desc\": \"Design\", \"qty\": 2,\n\"unit_price\": 50}], \"tax_pct\": 8.5, \"discount_pct\": 10} returns\n{\"lines\": [{\"desc\": \"Design\", \"qty\": 2, \"unit_price\": 50,\n\"line_total\": 100.0}], \"subtotal\": 100.0, \"discount\": 10.0, \"tax\":\n7.65, \"total\": 97.65}.\n\nUse when several line items roll up with discount and tax. Not for one\ntransaction's fees (processor_fees) and not for spreading a total over\ntime (installment_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\": \"line_items must contain at least one item,\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","tier":"free","inputSchema":{"additionalProperties":false,"properties":{"line_items":{"items":{"additionalProperties":true,"type":"object"},"minItems":1,"type":"array","description":"At least one line item object {\"desc\": str, \"qty\":\nnumber, \"unit_price\": number}; the first 100 items are used."},"tax_pct":{"default":0,"type":"number","description":"Tax percentage applied after the discount, e.g. 8.5.\nDefault 0."},"discount_pct":{"default":0,"type":"number","description":"Discount percentage applied to the subtotal.\nDefault 0."}},"required":["line_items"],"type":"object"}},{"name":"discount_stack","description":"Stack discounts correctly: sequential vs additive comparison. PREMIUM (license).\n\nThe two methods differ — this shows both, the final price, and the true\ntotal discount. Typical input {\"price\": 200, \"discounts_pct\": [20, 10]}\nreturns {\"original\": 200, \"sequential_price\": 144.0,\n\"sequential_total_discount_pct\": 28.0, \"additive_price\": 140.0,\n\"difference\": 4.0, \"note\": \"...\"}.\n\nUse when more than one discount applies and the order changes the answer.\nNot for a single discount inside an invoice (invoice_total). 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\": \"price > 0 and at least one discount required\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","tier":"premium","inputSchema":{"additionalProperties":false,"properties":{"price":{"exclusiveMinimum":0,"type":"number","description":"Original price before discounts; must be greater than 0."},"discounts_pct":{"items":{"type":"number"},"minItems":1,"type":"array","description":"Discount percentages in the order applied, at least\none, e.g. [20, 10] for 20% then 10%."}},"required":["price","discounts_pct"],"type":"object"}},{"name":"proration","description":"Compute a prorated charge or refund for a partial billing period. PREMIUM (license).\n\nTypical input {\"amount_per_period\": 90, \"days_used\": 10,\n\"days_in_period\": 30} returns {\"days_used\": 10, \"days_in_period\": 30,\n\"prorated_charge\": 30.0, \"prorated_refund\": 60.0, \"answer\": 30.0}.\n\nUse when a plan starts, ends, or changes mid-period. Not for splitting a\nfull amount into scheduled payments (installment_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\": \"need amount > 0 and 0 <= days_used <= days_in_period\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","tier":"premium","inputSchema":{"additionalProperties":false,"properties":{"amount_per_period":{"exclusiveMinimum":0,"type":"number","description":"Full-period price; must be greater than 0."},"days_used":{"minimum":0,"type":"integer","description":"Days of the period consumed; 0 to days_in_period."},"days_in_period":{"default":30,"minimum":1,"type":"integer","description":"Length of the billing period in days; at least 1.\nDefault 30."},"refund_mode":{"default":false,"type":"boolean","description":"If true, \"answer\" is the refund amount instead of the\ncharge. Default false."}},"required":["amount_per_period","days_used"],"type":"object"}},{"name":"installment_plan","description":"Split a total into an installment schedule with optional deposit. PREMIUM (license).\n\nRounding remainders land on the final payment so the schedule always\nsums exactly. Typical input {\"total\": 1000, \"installments\": 3,\n\"deposit_pct\": 10} returns {\"deposit\": 100.0, \"payments\": [300.0,\n300.0, 300.0], \"check_sum\": 1000.0}.\n\nUse when one total is paid across scheduled dates. Not for partial-period\nadjustments (proration). 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\": \"total > 0 and 1-36 installments\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","tier":"premium","inputSchema":{"additionalProperties":false,"properties":{"total":{"exclusiveMinimum":0,"type":"number","description":"Full amount to split; must be greater than 0."},"installments":{"maximum":36,"minimum":1,"type":"integer","description":"Number of payments after the deposit; 1 to 36."},"deposit_pct":{"default":0,"type":"number","description":"Optional upfront deposit as a percentage of total,\ne.g. 10 for 10%. Default 0."}},"required":["total","installments"],"type":"object"}}],"resources":[],"prompts":[]}