quote-template
Quotes and estimates: VAT line items, a validity date, an A4 PDF, accept makes an invoice.
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": {
"quote-template": {
"command": "uvx",
"args": [
"https://github.com/theluckystrike/mcp-servers/releases/download/v0.21.0/quotes.mcpb"
]
}
}
}Runnable packages
0.21.0stdioRemote endpoints
https://mcp.zovo.one/mcp/quote-templatestreamable-httpWhat it can do
Tool inventory
Tools (12)
🟡quote_create(client, items, currency, validity_days, valid_until, ...)
Store a quote for client from items and return its Q number, VAT and totals. unit_price is in MAJOR units; currency, VAT and issuer come from the shared profile. A duplicate of an open quote is refused. Free: 5 open.
Input Schema
{
"type": "object",
"properties": {
"client": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Client name or id. A name the invoice server already knows brings its address, email and VAT id onto the quote"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "every line needs a description, 500 characters or fewer"
},
"quantity": {
"type": "number",
"minimum": -1000000000000,
"maximum": 1000000000000,
"exclusiveMinimum": 0,
"description": "Hours or units, must be greater than zero"
},
"unit_price_minor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000000,
"description": "Price per unit in MINOR units: 9000 = 90.00 EUR, 90 = JPY 90. Never a decimal"
},
"tax_rate": {
"type": "number",
"minimum": 0,
"maximum": 1000,
"description": "VAT percent for this line, overrides the business default"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Only to state the line's currency; every line on one quote must agree"
}
},
"required": [
"description",
"quantity",
"unit_price_minor"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 200,
"description": "The line items being quoted"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Defaults to your business default currency"
},
"validity_days": {
"type": "integer",
"minimum": 1,
"maximum": 3650,
"description": "Days the quote stays valid, counted from the quote date and inclusive. Default 30"
},
"valid_until": {
"type": "string",
"description": "YYYY-MM-DD, an explicit last valid day. Wins over validity_days"
},
"issue_date": {
"type": "string",
"description": "YYYY-MM-DD, defaults to today in your business profile's timezone"
},
"discount_percent": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Discount applied to every line, in percent"
},
"tax_rate": {
"type": "number",
"minimum": 0,
"maximum": 1000,
"description": "VAT percent for lines with no rate of their own. Defaults to the business default"
},
"notes": {
"type": "string",
"maxLength": 10000,
"description": "Free text printed under the totals, e.g. scope or exclusions. 10000 characters or fewer"
},
"client_email": {
"type": "string",
"maxLength": 320,
"description": "Only if the user gave it; otherwise the stored client's email is used"
},
"client_address": {
"type": "string",
"maxLength": 2000,
"description": "Postal address for the QUOTE FOR block, newlines allowed"
},
"client_vat_id": {
"type": "string",
"maxLength": 64,
"description": "Client VAT / tax registration id"
}
},
"required": [
"client",
"items"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢quote_list(state, client, from, to)
List quotes newest first: id, client, dates, state, days left while open, currency, total and the invoice number once accepted. State is read against today, so a lapsed quote shows as expired.
Input Schema
{
"type": "object",
"properties": {
"state": {
"type": "string",
"enum": [
"open",
"expired",
"accepted",
"declined",
"all"
],
"description": "Default \"all\". \"open\" excludes quotes whose validity has run out; \"expired\" is only those"
},
"client": {
"type": "string",
"description": "Only quotes for clients whose name contains this text"
},
"from": {
"type": "string",
"description": "YYYY-MM-DD, earliest quote date"
},
"to": {
"type": "string",
"description": "YYYY-MM-DD, latest quote date"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢quote_get(id)
Return one quote in full by Q number or exact client name: lines with unit price and VAT, totals, dates, the state today with days left, notes, and the invoice it became once accepted. Reads only.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001, or an exact client name"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡quote_update(id, items, currency, discount_percent, tax_rate, ...)
Revise a quote that is still open: line items, currency, discount, VAT default, validity or notes. Totals are recomputed. An accepted or declined quote is never edited.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "every line needs a description, 500 characters or fewer"
},
"quantity": {
"type": "number",
"minimum": -1000000000000,
"maximum": 1000000000000,
"exclusiveMinimum": 0,
"description": "Hours or units, must be greater than zero"
},
"unit_price_minor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000000,
"description": "Price per unit in MINOR units: 9000 = 90.00 EUR, 90 = JPY 90. Never a decimal"
},
"tax_rate": {
"type": "number",
"minimum": 0,
"maximum": 1000,
"description": "VAT percent for this line, overrides the business default"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Only to state the line's currency; every line on one quote must agree"
}
},
"required": [
"description",
"quantity",
"unit_price_minor"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 200,
"description": "Replaces every line item"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"discount_percent": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"tax_rate": {
"type": "number",
"minimum": 0,
"maximum": 1000,
"description": "VAT percent for lines with no rate of their own"
},
"validity_days": {
"type": "integer",
"minimum": 1,
"maximum": 3650,
"description": "Recomputes valid_until from the quote date"
},
"valid_until": {
"type": "string",
"description": "YYYY-MM-DD. Wins over validity_days, and is how an expired quote is extended"
},
"notes": {
"type": "string",
"maxLength": 10000
},
"client_email": {
"type": "string",
"maxLength": 320
},
"client_address": {
"type": "string",
"maxLength": 2000
},
"client_vat_id": {
"type": "string",
"maxLength": 64
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡quote_send_text(id, greeting, sign_off)
Turn a quote into a plain-text summary to paste into an email: the line table, VAT lines, total and validity date. Also a .txt download link valid one hour. Free; quote_pdf writes the A4 document.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001"
},
"greeting": {
"type": "string",
"description": "Opening line, default \"Hello\" plus the client name"
},
"sign_off": {
"type": "string",
"description": "Closing line, default your business name from the shared profile"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡quote_accept(id, create_invoice, issue_date, due_days, allow_expired)
Mark a quote accepted and turn it into an invoice: created directly in the invoice server when its store is present, otherwise returned as invoice_create-ready line items. The numbers are copied, never recomputed.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001"
},
"create_invoice": {
"type": "string",
"enum": [
"auto",
"always",
"never"
],
"description": "Default \"auto\": create the invoice when the invoice store exists, otherwise hand back the items. \"never\" only marks it accepted"
},
"issue_date": {
"type": "string",
"description": "YYYY-MM-DD for the invoice, defaults to today"
},
"due_days": {
"type": "integer",
"minimum": 0,
"maximum": 3650,
"description": "Days until the invoice is due, defaults to your payment terms"
},
"allow_expired": {
"type": "boolean",
"description": "Accept a quote whose validity has run out. Default false: an expired quote is refused so the price is re-confirmed first"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}⚪quote_decline(id, reason, date)
Mark a quote lost, with a reason kept on the record, freeing a free-tier open slot and counting in the win rate. An accepted quote is refused, naming the invoice it became. Free on every tier.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001"
},
"reason": {
"type": "string",
"maxLength": 10000,
"description": "Why it was lost, e.g. \"price\" or \"went in-house\". Kept on the record"
},
"date": {
"type": "string",
"description": "YYYY-MM-DD, defaults to today"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴quote_delete(id)
Delete a draft quote that was never sent, accepted, invoiced or exported, and give its free open-quote slot back. A quote with any of those is refused with the dependent named. The id is never reissued.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢quote_pdf(id, out_path)
Call this tool to render one quote as an A4 print-ready document and return a download link valid for one hour: the invoice layout with the validity date and an acceptance block. Pro.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Quote id such as Q-2026-0001"
},
"out_path": {
"type": "string",
"description": "Name for the downloaded file, e.g. acme-quote. Defaults to the quote id; the document comes back as a download link valid for one hour"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢quote_report(from, to)
Totals per currency for open, accepted, declined and expired quotes, with counts, the value still open and the win rate. Free covers the current calendar year to date; Pro reports over any date range.
Input Schema
{
"type": "object",
"properties": {
"from": {
"type": "string",
"description": "YYYY-MM-DD, earliest quote date to count"
},
"to": {
"type": "string",
"description": "YYYY-MM-DD, latest quote date to count"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢license_status
Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}⚪license_activate(key)
Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
Input Schema
{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "License key from checkout, MCPL1.<payload>.<signature>"
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence