{"name":"com.moltlinestudio/merchant","slug":"moltlinestudio-merchant","title":"Moltline Merchant Maths","description":"Processor fees, charge-to-net, invoice totals and proration. 3 of 6 tools free.","url":"https://mcp.market/server/moltlinestudio-merchant","rating":null,"grade":"B","score":77,"certified":false,"status":"active","category":"finance","tags":["finance"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-19T15:00:29.000Z","license":"MIT"},"uptime":{"percent":100,"checks":3,"ok":3,"last_checked_at":"2026-09-20T03:21:09.034Z","last_ok_at":"2026-09-20T03:21:09.034Z","latency_ms":134},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/GarphenGate/moltline-mcp","website":"https://moltlinestudio.com/servers.html#merchant","version":"1.2.0","remotes":[{"type":"streamable-http","url":"https://mcp.moltlinestudio.com/merchant"}],"packages":[],"tools":[{"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","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"],"additionalProperties":false}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","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"],"additionalProperties":false}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","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"],"additionalProperties":false}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","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"],"additionalProperties":false}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","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"],"additionalProperties":false}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","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"],"additionalProperties":false}}],"scan":{"score":77,"grade":"B","scanned_at":"2026-09-20T00:23:54.140Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T00:23:54.148Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 309ms"]},"poisoning":{"score":15,"max":15,"notes":["6 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":5,"max":10,"notes":["namespace and repository owner differ","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.moltlinestudio.com/merchant","reachable":true,"authRequired":false,"latencyMs":309,"serverInfo":{"name":"moltline-merchant","version":"1.1.0"}}],"packages":[],"repo":{"found":true,"owner":"GarphenGate","repo":"moltline-mcp","archived":false,"pushedAt":"2026-09-19T15:00:29Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/316633241?v=4","ownerCreatedAt":"2026-08-13T15:17:26Z","license":"MIT"},"icon":{"url":"https://moltlinestudio.com/icon-192.png","source":"registry","width":192,"height":192},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-19T15:00:29.000Z","score":23}}}},"grade_history":[],"reviews":[]}