Moltline Merchant Maths

Processor fees, charge-to-net, invoice totals and proration. 3 of 6 tools free.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
83%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,515Tokens (tool definitions)
~1.8 KBTypical response size
Moderate attention impact (1.96% of 128k context)

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-http

What it can do

Tool inventory

Tools (6)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools
verifiedversion not recorded6 tools