Skip to main content
Glama

Server Details

RevRec schedules, renewals, credits, usage pricing, multi-currency, back-dated. Saves drafts.

Ownership verified
Status
Healthy
Uptime
97.6% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
Repository
defrr-com/defrr-mcp
GitHub Stars
0
ChatGPT
–
Claude
–

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct scopes, especially create vs. process vs. usage billing. The main possible confusion is between the contract/renewal pairs (cancel_contract vs. cancel_renewal, reprice_contract vs. reprice_renewal), but the descriptions make the boundaries clear.

Naming Consistency4/5

Almost all tools follow a consistent defrr_verb_noun pattern, e.g. defrr_cancel_contract, defrr_create_waterfall, defrr_get_credit_balance. The exception is defrr_usage_billing, which uses a noun phrase rather than an explicit verb, but the overall convention remains predictable.

Tool Count5/5

Nine tools is well-scoped for a revenue and billing calculation server. Each tool covers a distinct calculation or lifecycle operation, with no obvious filler tools.

Completeness3/5

The calculation surface is broad, covering contract creation, renewals, cancellations, repricing, waterfalls, usage billing, and credit balance. However, defrr_create_contract explicitly points to defrr_save_contract for recording a contract, and that tool is absent, leaving a notable persistence dead end; there is also no general list/get contract operation.

Available Tools

9 tools
defrr_cancel_contractCancel a contractAInspect

Use when a whole contract is voided and refunded. Reverses everything recognised in closed months and removes the rest. Costs 2 credits (refunded if it fails).

NameRequiredDescriptionDefault
scheduleYesThe contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false.
lockedThroughNoThe latest month already closed for changes, as YYYY-MM. Revenue in that month and earlier cannot be changed, so the correction is posted in the next month. Leave out or null if no month is closed.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the annotations by disclosing the credit cost (2 credits, refunded on failure) and the concrete accounting effect: closed-month revenue is reversed, open periods are removed. The only tension is that 'removes the rest' reads destructive while destructiveHint=false; this is plausibly an accounting reversal rather than a hard delete, so it is not a clear contradiction but leaves some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: usage trigger first, then effect, then cost. Every sentence carries distinct information with no repetition of the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter nested mutation with no output schema, the description covers trigger, reversibility scope and cost. It does not state what the call returns or how the closed-month correction appears afterwards, which is a minor remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter, including nested term fields and lockedThrough, is documented in the schema. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action and scope: voiding and refunding a whole contract, reversing recognised revenue and removing the remainder. It implicitly separates itself from defrr_cancel_renewal by specifying 'whole contract', but never names that sibling, so the differentiation requires inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use when a whole contract is voided and refunded' gives a clear triggering condition. However, it offers no explicit exclusion against defrr_cancel_renewal or defrr_reprice_contract, which are the closest alternatives an agent would weigh.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_cancel_renewalCancel a renewalBInspect

Use when the latest renewal is cancelled and refunded in full. Returns the credit note, the reversal for closed months and the revenue month by month. Costs 2 credits (refunded if it fails).

NameRequiredDescriptionDefault
scheduleYesThe contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false.
termIndexYesWhich term: 1 is the first renewal, 2 the second, and so on. Only the latest renewal can be corrected for now, so give the position of the last term.
lockedThroughNoThe latest month already closed for changes, as YYYY-MM. Revenue in that month and earlier cannot be changed, so the correction is posted in the next month. Leave out or null if no month is closed.

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavior beyond the annotations: it says the tool returns the credit note, reversal for closed months, and month-by-month revenue, and that the operation costs 2 credits with refund on failure. It does not fully explain the mutation's side effects or permissions, but the cost/refund and return-content disclosures are valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the usage condition, then follows with return contents and cost. It earns its space, though the first sentence is awkwardly phrased and could more directly state the action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation with nested contract terms and no output schema, the description helpfully explains what is returned and the credit cost. However, the ambiguity about whether the tool performs cancellation or reports an already-cancelled renewal leaves a notable contextual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the nested schedule, termIndex, and lockedThrough parameters are already well documented in the schema. The description does not add parameter-specific semantics beyond the schema's own detail, which is appropriate baseline behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource ('the latest renewal') and refund scope, but its opening phrase 'Use when the latest renewal is cancelled...' sounds like a condition rather than clearly stating that this tool performs the cancellation. The name and title help, yet the description alone leaves the action somewhat ambiguous, especially versus a query or the sibling defrr_cancel_contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one usage trigger ('when the latest renewal is cancelled and refunded in full') and implies only the latest renewal is eligible, but it does not name alternatives such as defrr_cancel_contract or defrr_reprice_renewal, nor does it state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_create_contractCreate a contractAInspect

Use when a new deal is signed and you need its revenue and billing schedule worked out from the terms, without saving it anywhere. Returns every month's billing, revenue and deferred balance, and the contract's totals. For a deal priced in a foreign currency, send currency and exchangeRate and the term prices in that currency. For a contract that started in months that are already closed (a back-dated contract), pass lockedThrough: the months from its start through that month are caught up as one lump of revenue in the first open month, the way defrr's app does, and the result says how much (foreign currency works; a single-term contract needs a quantity of 1, renewals are fine). Nothing is corrected, credited or saved: to record the contract in the user's defrr organization, use defrr_save_contract instead, if you have it. Costs 1 credit (refunded if it fails).

NameRequiredDescriptionDefault
currencyNoOnly when the deal is priced in a foreign currency: its three-letter code, such as EUR. Then every term's price is in that currency.
scheduleYesThe contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false.
exchangeRateNoRequired with currency: how much of the organization's base currency ONE unit of that currency is worth (1 EUR = 1.8 NZD is 1.8). The schedule and totals come back in the base currency, with the foreign prices beside them.
lockedThroughNoOnly for a back-dated contract: the latest closed month, as YYYY-MM (it must be on or after the contract's start month and before its last month). Revenue for the months through it is recognised together in the next month.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: states nothing is corrected, credited or saved, that the call costs 1 credit (refunded on failure), and describes the returned monthly billing/revenue/deferred balance and totals. The non-read-only annotation is explained indirectly by the credit charge, though the 'create' name versus 'nothing saved' framing creates mild framing tension rather than a true contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the triggering condition and the no-persistence scope before any edge cases, and virtually every sentence carries operational content. It is dense, however, and the parenthetical about foreign currency / single-term quantity of 1 / renewals packs three caveats into one hard-to-parse clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter tool with a nested terms array and no output schema, the description covers trigger, side effects, cost, currency handling, back-dated behaviour, and return values. An agent has enough to decide whether to call it and how, and to reason about the response shape without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns credit by adding relational meaning the schema cannot, notably that exchangeRate is required with currency and quoted as base-currency-per-one-unit, and by spelling out the lockedThrough catch-up effect on the schedule. It does not add much on the nested term fields themselves, which the schema already documents fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource ('work out revenue and billing schedule from the terms') plus a crucial scope qualifier ('without saving it anywhere'). It also names the sibling it is not (defrr_save_contract), so an agent can separate this from cancel/reprice/process_renewal tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger ('Use when a new deal is signed...'), explicit exclusion of persistence, and a named alternative ('to record the contract in the user's defrr organization, use defrr_save_contract instead'). It additionally gives conditional guidance for foreign-currency deals and back-dated contracts, which is exactly the when-to-use detail an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_create_waterfallCreate a revenue waterfall for several contractsAInspect

Use when you need the deferred revenue roll-forward for a set of contracts: send up to 50 contracts' terms and get back, for each contract and for all of them together, every month's billing, revenue and ending deferred balance (opening deferred balance + billing - revenue = ending). Each contract is built like defrr_create_contract. Everything or nothing: if one contract is rejected the call fails and nothing is charged. Costs 1 credit per contract (refunded if it fails). Nothing you send is stored. For more than 50 contracts, send them in batches of up to 50, each saying which batch it is (batch: number and of) and passing in the carry returned by the batch before; the last batch returns grandTotal for all of them. For a very large set, call the REST API from a script instead of through the model.

NameRequiredDescriptionDefault
batchNoOnly when sending more than 50 contracts in several calls: which call this is. Send batch 1 first, then 2, and so on, in order.
carryNoFrom batch 2 on: the carry returned by the previous batch, passed back exactly as it was given. Not used on batch 1.
shapeNo'wide' (the default) gives each contract's months as lists. 'rows' gives one row per contract per month, ready for a spreadsheet or a database.
contractsYesThe contracts to include, up to 50. Each is charged 1 credit.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say non-readOnly, non-idempotent, non-destructive; the description adds the materially important traits: all-or-nothing atomicity ('if one contract is rejected the call fails and nothing is charged'), cost of 1 credit per contract with refund on failure, and that nothing sent is stored. It also spells out the arithmetic identity of each month's output and the carry/grandTotal handoff across batches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return value, then constraints, then batching. It is a single dense block with several clauses per sentence, but nearly every clause carries non-obvious information (atomicity, credits, no storage, batch carry), so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates fully by describing the per-month billing/revenue/ending-deferred fields and the grandTotal, plus the batch carry protocol. Combined with the deep nested schema, an agent has everything needed to call this correctly on both small and large sets.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description goes further by explaining the ordered batch protocol and the exactly-as-given carry contract across calls, which the schema alone only hints at. It does not cover the 'shape' enum (wide vs rows) in prose, leaving that entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('deferred revenue roll-forward for a set of contracts') and states exactly what comes back. It also anchors itself to the sibling defrr_create_contract ('Each contract is built like defrr_create_contract'), so an agent can distinguish the batch case from the single-contract case immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger ('Use when you need the deferred revenue roll-forward for a set of contracts'), an explicit alternative for very large sets (call the REST API from a script instead of through the model), and the batching protocol when exceeding 50. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_get_credit_balanceCheck your credit balanceA
Read-only
Inspect

Use to see how many credits the account has left before running a calculation. Free.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful behavioral context by noting the operation is 'Free' and should be used before a calculation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the purpose and followed by the key cost detail. Every sentence adds useful information with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter, read-only balance check with no output schema, the description gives enough context: what it returns, when to use it, and that it is free.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so schema coverage is complete by default and the description does not need to explain parameter meanings. Baseline 4 applies for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'see how many credits the account has left.' It is easy to distinguish from the contract/renewal siblings, though it does not explicitly name alternatives or exclusions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context: check before running a calculation. No when-not-to-use guidance or alternatives are provided, but the intended timing is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_process_renewalProcess renewalsAInspect

Use when customers renew and you need the renewal worked out: send each contract's terms as they stand, and the renewal's end date and the price for the renewal term. Returns the renewal term and how its price compares with the term before it (in total and per month, since a renewal can be a different length), the billing entry to post, the revised month-by-month schedule, and the total to post by month. With the latest closed month, a renewal processed after it started has its billing and catch-up revenue posted in the first open month instead. The renewal is recognised on the contract's own basis: a different basis is a new contract (defrr_create_contract). Up to 50 renewals per call, each with your own id. Costs 1 credit per renewal (refunded if the call fails). Nothing you send is stored.

NameRequiredDescriptionDefault
renewalsYesThe renewals to process, up to 50. Each is charged 1 credit.
lockedThroughNoThe latest month already closed for changes, as YYYY-MM. Revenue in that month and earlier cannot be changed, so the correction is posted in the next month. Leave out or null if no month is closed.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing batch limits (50 per call), per-call credit cost with refund on failure, that supplied data is not retained, and the posting rule when lockedThrough is set (billing and catch-up revenue move to the first open month). These are non-obvious operational traits an agent cannot infer from readOnly/destructive/idempotent hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trigger and the required inputs, then the return shape, then edge-case behavior — a sensible ordering with little waste. The return-value sentence is a long multi-clause run (price comparison total and per month, billing entry, schedule, monthly totals) that would read better as a list, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only two top-level parameters, the description carries the burden well: it enumerates what comes back (renewal term, price comparison total and per month, billing entry, revised schedule, monthly totals) and explains the locked-month posting rule. An agent has enough to call it and interpret the result without opening anything else.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the nested field descriptions (endDateIncluded, priceForRenewalTerm vs. term price, exchangeRate) are already detailed in the schema. The description restates the input contract at a high level ("send each contract's terms as they stand") without adding semantics beyond what the schema documents, so the baseline 3 applies. The lockedThrough behavior it describes is genuinely added value, but it is framed as posting behavior rather than parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource up front ("Use when customers renew and you need the renewal worked out") and immediately names the inputs (contract terms, renewal end date, renewal price) and outputs. It also differentiates from a sibling by routing contracts on a different recognition basis to defrr_create_contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear activation trigger ("when customers renew and you need the renewal worked out") and an explicit exclusion with the alternative tool ("a different basis is a new contract (defrr_create_contract)"). It does not distinguish itself from defrr_reprice_renewal or defrr_cancel_renewal, which are the closest-sounding siblings an agent might confuse it with.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_reprice_contractReprice the original term of a contractAInspect

Use when the contract's ORIGINAL term (its first term, before any renewal) was priced too high and needs a credit. Renewals keep their own prices; to correct a renewal use defrr_reprice_renewal. Returns the credit note, the revenue to reverse for months already closed, and the corrected revenue month by month. Costs 2 credits (refunded if it fails).

NameRequiredDescriptionDefault
scheduleYesThe contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false.
lockedThroughNoThe latest month already closed for changes, as YYYY-MM. Revenue in that month and earlier cannot be changed, so the correction is posted in the next month. Leave out or null if no month is closed.
correctedPriceYesWhat the original term should have cost, in the schedule's currency. Must be lower than its current price.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: it discloses outputs (credit note, revenue to reverse for closed months, corrected revenue by month) and a cost model ('2 credits, refunded if it fails'). What it omits is that idempotentHint=false means repeat calls compound credits, and there is no statement about whether the credit can be undone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences with no filler: scope first, exclusion second, return values third, cost last. Every sentence carries information an agent needs before invoking.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description names what comes back, and it hints at the lockedThrough posting mechanism. The remaining gap is the non-idempotent mutation risk, which matters for a tool that issues credits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters including the nested schedule are already fully documented, and the description adds only the framing that renewals carry their own prices. That is the baseline-3 case where the schema does the semantic work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (reprice the contract's ORIGINAL term for a credit) and explicitly bounds the scope: renewals keep their own prices. An agent can distinguish it from defrr_reprice_renewal without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both the when ('original term was priced too high and needs a credit') and the when-not with a named alternative ('to correct a renewal use defrr_reprice_renewal'). The routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_reprice_renewalReprice a renewalAInspect

Use when a renewal was priced too high and needs a credit. Returns the credit note, the revenue to reverse for months already closed, and the corrected revenue month by month. Costs 2 credits (refunded if it fails).

NameRequiredDescriptionDefault
scheduleYesThe contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false.
termIndexYesWhich term: 1 is the first renewal, 2 the second, and so on. Only the latest renewal can be corrected for now, so give the position of the last term.
lockedThroughNoThe latest month already closed for changes, as YYYY-MM. Revenue in that month and earlier cannot be changed, so the correction is posted in the next month. Leave out or null if no month is closed.
correctedPriceYesWhat the renewal should have cost, in the schedule's currency. Must be lower than its current price.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description provides critical behavioral context beyond the annotations or schema. It discloses the operational cost (2 credits) and a recovery mechanism (refund if it fails), which are essential for risk-aware agent behavior. It also details the multi-part return structure (credit note, reversals, corrected revenue).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is highly concise. The most critical information—the use case, output, and transaction cost—is packed into two sentences, front-loading the utility and risks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the input schedule and the transactional nature of the tool, the description is remarkably complete. It addresses the required inputs, the cost/risk (2 credits), and the detailed output, making it robust even without a specific output schema provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description confirms the necessity of a reduced price but does not add semantic meaning to the parameters themselves that isn't already documented in the detailed input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The purpose is extremely clear, defining the specific scenario: when a renewal was priced too high and requires a credit. By focusing on 'renewal' and the 'credit' necessity, it effectively differentiates itself from sibling tools like defrr_reprice_contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage criteria by stating the exact problem it solves ('priced too high and needs a credit'). This eliminates ambiguity and directs the agent immediately to this tool over general repricing or cancellation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defrr_usage_billingPrice usageAInspect

Use when customers are billed on what they use and you need the usage turned into what it costs, month by month. Send each customer-and-product's pricing (flat or volume tiers, a prepaid credit balance, or a hybrid: a fixed monthly fee with included units and a price per unit above them) and the quantity used in each month; get back each month's revenue, the total across all of them, and any prepaid overage (units beyond the balance, flagged and not priced). A hybrid line returns revenue (the fixed fee, which excludes overage), overage (units over the allowance, priced) and revenueInclOverage for each month. Without a startDate the allowance starts again each month you list. With a startDate (and dated usage entries) the cycles follow the contract's anniversary: the fee is booked in full in the month each cycle starts, whether or not anything was used, and the overage in the month the cycle ends; the response also lists each cycle. Quantities are what was used in that month, not a running total. Tiers price band by band, and the bands start again each month. Costs 1 credit per line (refunded if it fails). Nothing you send is stored.

NameRequiredDescriptionDefault
linesYesThe customer-and-product lines to price, up to 50. Each is charged 1 credit.
breakdownNoTrue to list, for each flat or volume month, the units and amount in each band. Defaults to false.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description details critical behavioral traits not found in the schema or standard annotations, such as the credit cost per line ('Costs 1 credit per line'), the data retention policy ('Nothing you send is stored'), and the specific calculation methodology for hybrid lines.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long due to the inherent complexity of the tool's logic, but it is well-structured. Every sentence provides necessary functional context rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition is exhaustively complete for such a complex financial tool. It covers input expectations, calculation cycles, credit usage, and output behavior, leaving almost no ambiguity for the AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given the complexity, the description goes beyond the schema by explaining the logic of the inputs. It clarifies concepts like how tiers function ('Tiers price band by band') and the difference between usage quantities (not running totals).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool's purpose: to convert customer usage into monetary costs month by month. It also identifies the four specific pricing models it supports (flat, volume, prepaid, hybrid).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides detailed instructions on when and how to use the tool based on the billing cycle. It contrasts standard monthly usage (without startDate) against contract-based, anniversary cycles (with startDate), which is crucial for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changeddefrr_create_contract1 field changed
      • addedInput schema / properties / lockedThrough
        Added value: +{
        +  "description": "Only for a back-dated contract: the latest closed month, as YYYY-MM (it must be on or after the contract's start month and before its last month). Revenue for the months through it is recognised together in the next month.",
        +  "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
        +  "type": "string"
        +}
  2. 7 tool updates
    • Changeddefrr_cancel_contract2 fields changed
      • changedInput schema / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddefrr_cancel_renewal2 fields changed
      • changedInput schema / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddefrr_create_contract2 fields changed
      • changedInput schema / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddefrr_create_waterfall2 fields changed
      • changedInput schema / properties / contracts / items / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / contracts / items / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddefrr_process_renewal2 fields changed
      • changedInput schema / properties / renewals / items / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / renewals / items / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddefrr_reprice_contract2 fields changed
      • changedInput schema / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddefrr_reprice_renewal2 fields changed
      • changedInput schema / properties / schedule / properties / terms / items / properties / price / description
        Previous value: -"The term's total price."New value: +"The term's total price: for all its units, not per unit."
      • addedInput schema / properties / schedule / properties / terms / items / properties / quantity
        Added value: +{
        +  "description": "Optional: how many units (seats) the term's total price covers, 1 if you leave it out. It doesn't change the schedule, which follows the total; it is recorded with the contract so its unit price can be seen.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
  3. 5 tool updates
    • Changeddefrr_cancel_contract3 fields changed
      • addedInput schema / properties / schedule / properties / currency
        Added value: +{
        +  "description": "Only for a contract priced in a foreign currency: its code, such as EUR. Every term's price is then in that currency, and each term needs an exchangeRate.",
        +  "pattern": "^[A-Za-z]{3}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / schedule / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: the rate for every term that has none of its own.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / schedule / properties / terms / items / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: how much of your base currency ONE unit of the foreign currency was worth when this term was booked. Corrections use it, so they agree with what was billed.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
    • Changeddefrr_cancel_renewal3 fields changed
      • addedInput schema / properties / schedule / properties / currency
        Added value: +{
        +  "description": "Only for a contract priced in a foreign currency: its code, such as EUR. Every term's price is then in that currency, and each term needs an exchangeRate.",
        +  "pattern": "^[A-Za-z]{3}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / schedule / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: the rate for every term that has none of its own.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / schedule / properties / terms / items / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: how much of your base currency ONE unit of the foreign currency was worth when this term was booked. Corrections use it, so they agree with what was billed.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
    • Changeddefrr_process_renewal4 fields changed
      • addedInput schema / properties / renewals / items / properties / renewal / properties / exchangeRate
        Added value: +{
        +  "description": "Required when the schedule has a currency: how much of your base currency one unit of it is worth on the renewal's start date. priceForRenewalTerm is then in that currency.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / renewals / items / properties / schedule / properties / currency
        Added value: +{
        +  "description": "Only for a contract priced in a foreign currency: its code, such as EUR. Every term's price is then in that currency, and each term needs an exchangeRate.",
        +  "pattern": "^[A-Za-z]{3}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / renewals / items / properties / schedule / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: the rate for every term that has none of its own.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / renewals / items / properties / schedule / properties / terms / items / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: how much of your base currency ONE unit of the foreign currency was worth when this term was booked. Corrections use it, so they agree with what was billed.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
    • Changeddefrr_reprice_contract4 fields changed
      • changedInput schema / properties / correctedPrice / description
        Previous value: -"What the original term should have cost. Must be lower than its current price."New value: +"What the original term should have cost, in the schedule's currency. Must be lower than its current price."
      • addedInput schema / properties / schedule / properties / currency
        Added value: +{
        +  "description": "Only for a contract priced in a foreign currency: its code, such as EUR. Every term's price is then in that currency, and each term needs an exchangeRate.",
        +  "pattern": "^[A-Za-z]{3}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / schedule / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: the rate for every term that has none of its own.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / schedule / properties / terms / items / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: how much of your base currency ONE unit of the foreign currency was worth when this term was booked. Corrections use it, so they agree with what was billed.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
    • Changeddefrr_reprice_renewal4 fields changed
      • changedInput schema / properties / correctedPrice / description
        Previous value: -"What the renewal should have cost. Must be lower than its current price."New value: +"What the renewal should have cost, in the schedule's currency. Must be lower than its current price."
      • addedInput schema / properties / schedule / properties / currency
        Added value: +{
        +  "description": "Only for a contract priced in a foreign currency: its code, such as EUR. Every term's price is then in that currency, and each term needs an exchangeRate.",
        +  "pattern": "^[A-Za-z]{3}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / schedule / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: the rate for every term that has none of its own.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / schedule / properties / terms / items / properties / exchangeRate
        Added value: +{
        +  "description": "With currency: how much of your base currency ONE unit of the foreign currency was worth when this term was booked. Corrections use it, so they agree with what was billed.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
  4. 7 tool updates
    • Changeddefrr_cancel_contract2 fields changed
      • changedInput schema / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
    • Changeddefrr_cancel_renewal2 fields changed
      • changedInput schema / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
    • Changeddefrr_create_contract2 fields changed
      • changedInput schema / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
    • Changeddefrr_create_waterfall2 fields changed
      • changedInput schema / properties / contracts / items / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / contracts / items / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
    • Changeddefrr_process_renewal2 fields changed
      • changedInput schema / properties / renewals / items / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / renewals / items / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
    • Changeddefrr_reprice_contract2 fields changed
      • changedInput schema / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
    • Changeddefrr_reprice_renewal2 fields changed
      • changedInput schema / properties / schedule / description
        Previous value: -"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true, or on the day the previous one ends when it is false."New value: +"The contract's terms. The first term needs a startDate; each later term (a renewal) starts the day after the previous one ends when endDateIncluded is true (the default), or on the day the previous one ends when it is false."
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."New value: +"Always send it. True if a term's end date is its last day (a year from 1 Mar 2026 ends 2027-02-28): use true unless the user's own dates show otherwise. False if the end date is the first day of the next term, as when the user gives the same calendar day a whole number of months later (10 Feb 2027 to 10 Feb 2028, so the last covered day is 9 Feb 2028). Defaults to true if left out."
  5. 7 tool updates
    • Changeddefrr_cancel_contract1 field changed
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
    • Changeddefrr_cancel_renewal1 field changed
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
    • Changeddefrr_create_contract1 field changed
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
    • Changeddefrr_create_waterfall1 field changed
      • changedInput schema / properties / contracts / items / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
    • Changeddefrr_process_renewal1 field changed
      • changedInput schema / properties / renewals / items / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
    • Changeddefrr_reprice_contract1 field changed
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
    • Changeddefrr_reprice_renewal1 field changed
      • changedInput schema / properties / schedule / properties / endDateIncluded / description
        Previous value: -"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false."New value: +"True if a term's end date is its last day (a 1 Jan to 31 Dec term). False if the end date is the first day of the next term. Defaults to false, so for a new contract send true with the last day the customer is covered (a year from 1 Mar 2026 is endDate 2027-02-28)."
  6. 1 tool update
    • Changeddefrr_create_contract2 fields changed
      • addedInput schema / properties / currency
        Added value: +{
        +  "description": "Only when the deal is priced in a foreign currency: its three-letter code, such as EUR. Then every term's price is in that currency.",
        +  "pattern": "^[A-Za-z]{3}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / exchangeRate
        Added value: +{
        +  "description": "Required with currency: how much of the organization's base currency ONE unit of that currency is worth (1 EUR = 1.8 NZD is 1.8). The schedule and totals come back in the base currency, with the foreign prices beside them.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
  7. 1 tool update
    • Changeddefrr_usage_billing15 fields changed
      • changedInput schema / properties / lines / items / properties / pricing / description
        Previous value: -"How the usage is priced. flat and volume use tiers; prepaid_credit uses unitPrice and openingBalance."New value: +"How the usage is priced. flat and volume use tiers; prepaid_credit uses unitPrice and openingBalance; hybrid uses baseFee, includedUnits and overageUnitPrice."
      • addedInput schema / properties / lines / items / properties / pricing / properties / baseFee
        Added value: +{
        +  "description": "For hybrid: the fixed fee for each month listed. It is the month's revenue and excludes overage.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / lines / items / properties / pricing / properties / cycle
        Added value: +{
        +  "description": "For hybrid: the cycle length. Only monthly is supported, and it is the default.",
        +  "enum": [
        +    "monthly"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / lines / items / properties / pricing / properties / includedUnits
        Added value: +{
        +  "description": "For hybrid: the units each month's fee includes.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / lines / items / properties / pricing / properties / model / enum
        Previous value: -[
        -  "flat",
        -  "volume",
        -  "prepaid_credit"
        -]New value: +[
        +  "flat",
        +  "volume",
        +  "prepaid_credit",
        +  "hybrid"
        +]
      • addedInput schema / properties / lines / items / properties / pricing / properties / overageUnitPrice
        Added value: +{
        +  "description": "For hybrid: the price of each unit above includedUnits in a month.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / lines / items / properties / startDate
        Added value: +{
        +  "description": "Hybrid only: the date the contract starts, YYYY-MM-DD. The cycles then follow the contract: each starts on the anniversary of this date (the same day each month, or the month's last day when it has no such day). The fee is the revenue of the month a cycle starts in, in full and whether or not anything was used; the overage of a cycle falls in the month it ends in. With a startDate, usage entries carry a date instead of a period.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / lines / items / properties / through
        Added value: +{
        +  "description": "Hybrid with a startDate only: price every cycle that starts on or before this date, YYYY-MM-DD, including cycles with no usage. Defaults to the date of the last usage entry. To stop a subscription that has ended or isn't being paid, set it to the date it stopped or to the start of the last paid cycle.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / lines / items / properties / usage / description
        Previous value: -"The units used in each month, up to 24 months. A month listed twice is refused."New value: +"Without a startDate: the units used in each month, up to 24 months, one entry per month (a month listed twice is refused). With a startDate (hybrid): dated entries, up to 1000, each assigned to the contract cycle its date falls in; the same date may appear more than once and is added up."
      • addedInput schema / properties / lines / items / properties / usage / items / properties / date
        Added value: +{
        +  "description": "The day the units were used, YYYY-MM-DD. Only with a startDate, on or after it.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / lines / items / properties / usage / items / properties / period / description
        Previous value: -"The month, YYYY-MM."New value: +"The month, YYYY-MM. Not used with a startDate."
      • changedInput schema / properties / lines / items / properties / usage / items / properties / quantity / description
        Previous value: -"Units used in that month: not a running total."New value: +"Units used in that month (or on that day): not a running total."
      • changedInput schema / properties / lines / items / properties / usage / items / required
        Previous value: -[
        -  "period",
        -  "quantity"
        -]New value: +[
        +  "quantity"
        +]
      • changedInput schema / properties / lines / items / properties / usage / maxItems
        Previous value: -24New value: +1000
      • changedInput schema / properties / lines / items / properties / usage / minItems
        Previous value: -1New value: +0
  8. 1 tool update
    • Addeddefrr_process_renewal
  9. 1 tool update
    • Addeddefrr_usage_billing
  10. 1 tool update
    • Changeddefrr_create_waterfall1 field changed
      • changedInput schema / properties / batch / properties / of / maximum
        Previous value: -100New value: +400
  11. 1 tool update
    • Changeddefrr_create_waterfall3 fields changed
      • addedInput schema / properties / batch
        Added value: +{
        +  "description": "Only when sending more than 50 contracts in several calls: which call this is. Send batch 1 first, then 2, and so on, in order.",
        +  "properties": {
        +    "number": {
        +      "description": "This batch's position, starting at 1.",
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "of": {
        +      "description": "How many batches there are in all.",
        +      "maximum": 100,
        +      "minimum": 1,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "number",
        +    "of"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / carry
        Added value: +{
        +  "description": "From batch 2 on: the carry returned by the previous batch, passed back exactly as it was given. Not used on batch 1.",
        +  "type": "string"
        +}
      • addedInput schema / properties / shape
        Added value: +{
        +  "description": "'wide' (the default) gives each contract's months as lists. 'rows' gives one row per contract per month, ready for a spreadsheet or a database.",
        +  "enum": [
        +    "wide",
        +    "rows"
        +  ],
        +  "type": "string"
        +}
  12. 1 tool update
    • Addeddefrr_create_waterfall
  13. 6 tool updates
    • First observeddefrr_cancel_contract
    • First observeddefrr_cancel_renewal
    • First observeddefrr_create_contract
    • First observeddefrr_get_credit_balance
    • First observeddefrr_reprice_contract
    • First observeddefrr_reprice_renewal

Publisher details

Operator
Defrr Limited · Publisher source
Operator website
https://defrr.com
Vendor relationship
Not applicable
Trust center
Not available
Restrictions
Not applicable

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage subscriptions, usage-based billing, payments, refunds, tax compliance, and invoicing to drive revenue growth.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Double-entry books an agent keeps as the user, on your own Postgres or Supabase: invoices, VAT returns, bank reconciliation, financial statements and 130 country packs.
    41
    AGPL 3.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Tracks subscriptions and recurring bills with flexible billing cycles, and provides upcoming renewals and spending summaries.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Finance OS for bootstrapped SaaS, providing MCP tools for transaction recording, projections, alerts, and more through natural language interfaces.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.