Moltline Merchant Maths
Processor fees, charge-to-net, invoice totals and proration. 3 of 6 tools free.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"merchant": {
"url": "https://mcp.moltlinestudio.com/merchant"
}
}
}Remote endpoints
https://mcp.moltlinestudio.com/merchantstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢processor_fees(amount, processor, custom_pct, custom_fixed, transactions)
Break down payment-processor fees: fee, net, and effective rate. FREE. Uses editable presets for stripe/paypal/square/shopify (verify current rates) or your own custom_pct + custom_fixed. Typical input {"amount": 1000, "processor": "stripe", "transactions": 10} returns {"gross": 1000, "fee": 32.0, "net": 968.0, "effective_rate_pct": 3.2, "note": "..."}. Use when the charge amount is known and the net payout is the question. Not 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.
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
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢charge_to_net(net_target, pct_fee, fixed_fee)
Compute the gross price to charge so you net a target after fees. FREE. 'Charge X to receive Y' after percentage + fixed processor fees. Typical input {"net_target": 100, "pct_fee": 2.9, "fixed_fee": 0.30} returns {"charge": 103.4, "fee": 3.4, "net": 100.0}. The inverse of processor_fees - solves for gross from a target net. Use when the payout is the fixed requirement. Not when the price is already set. 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.
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
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢invoice_total(line_items, tax_pct, discount_pct)
Total an invoice: per-line totals, subtotal, discount, tax, grand total. FREE. Typical input {"line_items": [{"desc": "Design", "qty": 2, "unit_price": 50}], "tax_pct": 8.5, "discount_pct": 10} returns {"lines": [{"desc": "Design", "qty": 2, "unit_price": 50, "line_total": 100.0}], "subtotal": 100.0, "discount": 10.0, "tax": 7.65, "total": 97.65}. Use when several line items roll up with discount and tax. Not for one transaction's fees (processor_fees) and not for spreading a total over time (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.
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
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢discount_stack(price, discounts_pct)
Stack discounts correctly: sequential vs additive comparison. PREMIUM (license). The two methods differ — this shows both, the final price, and the true total discount. Typical input {"price": 200, "discounts_pct": [20, 10]} returns {"original": 200, "sequential_price": 144.0, "sequential_total_discount_pct": 28.0, "additive_price": 140.0, "difference": 4.0, "note": "..."}. Use when more than one discount applies and the order changes the answer. Not 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.
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
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢proration(amount_per_period, days_used, days_in_period, refund_mode)
Compute a prorated charge or refund for a partial billing period. PREMIUM (license). Typical input {"amount_per_period": 90, "days_used": 10, "days_in_period": 30} returns {"days_used": 10, "days_in_period": 30, "prorated_charge": 30.0, "prorated_refund": 60.0, "answer": 30.0}. Use when a plan starts, ends, or changes mid-period. Not for splitting a full 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.
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
}Output Schema
{
"type": "object",
"additionalProperties": true
}🟢installment_plan(total, installments, deposit_pct)
Split a total into an installment schedule with optional deposit. PREMIUM (license). Rounding remainders land on the final payment so the schedule always sums exactly. Typical input {"total": 1000, "installments": 3, "deposit_pct": 10} returns {"deposit": 100.0, "payments": [300.0, 300.0, 300.0], "check_sum": 1000.0}. Use when one total is paid across scheduled dates. Not for partial-period adjustments (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.
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
}Output Schema
{
"type": "object",
"additionalProperties": true
}Community
Evidence