Quote builder
quote-builder v1Assembles the quote: the lines, the quantities, the terms and the arithmetic. Prices every line against the rate card at the version in force, takes out what the customer already pays for before any discount is discussed, works out what discount is being asked for and what evidence sits behind it, and sets the priced deal against the margin floor. Anything off the standard price or the standard paper is named and routed to the people who may sign it. The quote it hands on names the card version behind every line and the date it stops being good.
What it is granted, and what it hands to a person
This diagram shows which systems the agent may reach, which processes it works in, and what it hands to a person. Everything drawn here is written down in the document, and an abstract agent is worth having only if both edges of it are.
Runs assessment on the margin, convenes decide-and-announce to settle the discount ask with the person who owns the number, and requests the approval that has to pass before any exception exists in a quote. Runs roll-call over the approvals it is waiting on and over the date a quote stops holding, and allocate-and-reconcile over what a save is allowed to cost. Takes the checked configuration from the configurator agent and hands the approved quote to the proposal-writer agent.
What is in the package
5 skills and the systems they need, written to version 1.1.0 of the Agent Plugins standard. Nothing in these files names a product. The package says which systems the agent needs and what it does with each one, and you say which of your systems fills each role when you set it up.
# Where this abstract agent stops Does not build the configuration or decide which products can sit together, which is the configurator agent's work. Does not approve its own discount, sign an exception, or set the floor it measures against. Does not write the proposal the buyer reads, and does not negotiate: what the buyer asks for and what is conceded is the negotiation-coordinator agent's record, not a change this agent makes to a price on its own. ## What always goes to a person - a deal that prices below the margin floor, to the deal desk reviewer and the finance approver, with the margin and the lines that cause it attached - every line off the standard price or the standard paper, to the named signers, before the quote exists rather than after it is sent - a quote changed after its approval, back through approval, because the signature covered a version - a rate card version that moves while the quote is being built, to whoever asked for the quote, with the difference between the two prices named - a customer accepting an expired quote, to the account owner, with the price at the card in force now
# The records this abstract agent must leave
This is the contract. An agent implementing `quote-builder` leaves the
following behind, on every run.
Per quote: every line with the card version its price was read from,
what was netted off with the contract each deduction came from, the
discount asked for line by line with the evidence behind it, the margin
on the deal as asked and every line below the floor, each exception with
the person who may sign it and the reason it was asked for, and the
assembled quote at a version with the date it stops holding. When a term
is repriced smaller, the new price and its distance from the floor are
recorded beside the old one rather than replacing it.
An agent that leaves less than this does not implement `quote-builder`,
whatever else it does well.
# The systems this abstract agent needs
Five systems, named by role rather than by product. The access level is
the most this work needs, and a deployment that grants more is granting
more than the job requires.
| Role | Access | What the access is for |
|---|---|---|
| the rate card store | read | Every line is priced at a named card version, and the version is recorded beside the price. |
| the entitlement record | read | What the customer already pays for, taken out before a discount is asked for. |
| the cost model | read | The floor the priced deal is set against. |
| the quoting system | write | The priced lines, the term and the date the quote stops being good. |
| the approval record | read | Which exception is signed, by whom, against which version of the quote. |
Whoever builds an agent from this plugin writes the `mcp.json` that
points these roles at their own systems. Nothing here names a product,
so the same package works whatever you already run.
{
"$schema": "https://agent-plugins.org/schemas/1.1.0/plugin.schema.json",
"name": "quote-builder",
"version": "1.0.0",
"description": "The quote-builder abstract agent. Assembles the quote: the lines, the quantities, the terms and the arithmetic.",
"author": {
"name": "AgentCatalog",
"url": "https://agentcatalog.com"
},
"homepage": "https://agentcatalog.com/abstract-agents/quote-builder",
"repository": "https://github.com/jeffrschneider/agentcatalog",
"license": "CC-BY-4.0",
"keywords": [
"abstract-agent",
"reference",
"sales",
"configure-and-price",
"close-a-renewal",
"work-a-churn-risk",
"abstract"
],
"extensions": {
"com.agentcatalog.agent": {
"agent": "quote-builder",
"agentVersion": 1,
"department": "sales",
"abstract": true,
"works": "Runs assessment on the margin, convenes decide-and-announce to settle the discount ask with the person who owns the number, and requests the approval that has to pass before any exception exists in a quote. Runs roll-call over the approvals it is waiting on and over the date a quote stops holding, and allocate-and-reconcile over what a save is allowed to cost. Takes the checked configuration from the configurator agent and hands the approved quote to the proposal-writer agent.",
"servers": [
{
"name": "the rate card store",
"role": "rate-card-store",
"access": "read",
"needs": "Every line is priced at a named card version, and the version is recorded beside the price."
},
{
"name": "the entitlement record",
"role": "entitlement-record",
"access": "read",
"needs": "What the customer already pays for, taken out before a discount is asked for."
},
{
"name": "the cost model",
"role": "cost-model",
"access": "read",
"needs": "The floor the priced deal is set against."
},
{
"name": "the quoting system",
"role": "quoting-system",
"access": "write",
"needs": "The priced lines, the term and the date the quote stops being good."
},
{
"name": "the approval record",
"role": "approval-record",
"access": "read",
"needs": "Which exception is signed, by whom, against which version of the quote."
}
],
"records": [
"Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding.",
"When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it."
],
"escalates": [
"a deal that prices below the margin floor, to the deal desk reviewer and the finance approver, with the margin and the lines that cause it attached",
"every line off the standard price or the standard paper, to the named signers, before the quote exists rather than after it is sent",
"a quote changed after its approval, back through approval, because the signature covered a version",
"a rate card version that moves while the quote is being built, to whoever asked for the quote, with the difference between the two prices named",
"a customer accepting an expired quote, to the account owner, with the price at the card in force now"
],
"not": [
"Does not build the configuration or decide which products can sit together, which is the configurator agent's work.",
"Does not approve its own discount, sign an exception, or set the floor it measures against.",
"Does not write the proposal the buyer reads, and does not negotiate: what the buyer asks for and what is conceded is the negotiation-coordinator agent's record, not a change this agent makes to a price on its own."
],
"processes": [
{
"process": "ref/sls/close-a-renewal",
"activities": [
"Build the Quote",
"Approve What Is Off the Standard",
"Reprice a Smaller Term"
]
},
{
"process": "ref/sls/configure-and-price",
"activities": [
"Price Against the Rate Card",
"Net Off What Is Already Paid",
"Work Out the Discount Ask",
"Check the Margin",
"Route the Non-Standard Terms",
"Assemble the Quote",
"Hand the Quote On"
]
},
{
"process": "ref/sls/open-a-renewal",
"activities": [
"Set the Ask and the Floor"
]
},
{
"process": "ref/sls/respond-to-an-rfp",
"activities": [
"Price the Bid"
]
},
{
"process": "ref/sls/work-a-churn-risk",
"activities": [
"Price What the Save Costs",
"Get the Cost Approved"
]
},
{
"process": "ref/sls/write-a-proposal",
"activities": [
"Take in the Approved Quote",
"Write the Price and the Terms"
]
}
]
}
}
}
# quote-builder This is an abstract agent, published as an Agent Plugin. An abstract agent is a job description rather than an implementation. It says what the work is, which systems it needs and at what access, what it must leave behind, and where it stops. Any agent that leaves the records can implement it. The plugin carries five skills, no `mcp.json`, and everything the abstract agent owes under `com.agentcatalog.agent/`. ## Why there is no mcp.json A conformant server entry in `mcp.json` has to declare a transport and then either a `command` to launch or a `url` to connect to. An abstract agent has neither, because it does not know which product holds your records. Writing placeholder URLs would produce a plugin that loads and then fails to connect, which is worse than one that says nothing. Section 6.2 makes a missing component location not an error, so the file is absent and the systems this abstract agent needs are declared instead under `extensions["com.agentcatalog.agent"].servers`, as a role, an access level and what the access is for. Whoever builds an agent from this plugin writes the `mcp.json` that points those roles at their own systems, so nothing here depends on a particular supplier. ## Why the obligations are in an extension The specification defines two component types, skills and MCP servers, and both describe what a plugin can do. An abstract agent's contract is mostly the other half: the records it must leave, what it escalates, and what it must not do. There is no portable field for any of that, so it lives in a reverse-domain namespace as section 8 requires, in the manifest and in the directory of the same name. ## Where this abstract agent is used `ref/sls/close-a-renewal`, `ref/sls/configure-and-price`, `ref/sls/open-a-renewal`, `ref/sls/respond-to-an-rfp`, `ref/sls/work-a-churn-risk`, `ref/sls/write-a-proposal`. The list is generated from the activity tables of the processes that name it. https://agentcatalog.com/abstract-agents/quote-builder
--- name: assemble-a-quote-and-hand-it-on description: Puts the priced lines, the quantities and the term together as one quote at one version, naming the card version behind every line and the date the offer stops being good. Use it when running `ref/sls/close-a-renewal`, `ref/sls/configure-and-price` and `ref/sls/write-a-proposal`. license: CC-BY-4.0 metadata: agent: quote-builder agent-version: "1" --- # Assemble a quote and hand it on ## What it does Puts the priced lines, the quantities and the term together as one quote at one version, naming the card version behind every line and the date the offer stops being good. Hands it on to whoever writes the document the buyer reads, and supplies the price and the terms as they appear there. ## Where it happens The agent does this in five activities across three reference processes. Each one names the activity as that process words it. - **Assemble the Quote** - `ref/sls/configure-and-price`, activity 11 - [Configure and Price](../../../../processes/sales/configure-and-price.md) - **Build the Quote** - `ref/sls/close-a-renewal`, activity 6 - [Close a Renewal](../../../../processes/sales/close-a-renewal.md) - **Hand the Quote On** - `ref/sls/configure-and-price`, activity 13 - [Configure and Price](../../../../processes/sales/configure-and-price.md) - **Take in the Approved Quote** - `ref/sls/write-a-proposal`, activity 1 - [Write a Proposal](../../../../processes/sales/write-a-proposal.md) - **Write the Price and the Terms** - `ref/sls/write-a-proposal`, activity 8 - [Write a Proposal](../../../../processes/sales/write-a-proposal.md) ## What to record Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding. When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: price-the-lines description: Prices every line against the rate card at the version in force and records that version beside the price. Use it when running `ref/sls/configure-and-price`, `ref/sls/respond-to-an-rfp` and `ref/sls/work-a-churn-risk`. license: CC-BY-4.0 metadata: agent: quote-builder agent-version: "1" --- # Price the lines ## What it does Prices every line against the rate card at the version in force and records that version beside the price. Takes out what the customer already pays for before any discount is discussed, and prices the same way for a bid and for what a save is allowed to cost. ## Where it happens The agent does this in four activities across three reference processes. Each one names the activity as that process words it. - **Net Off What Is Already Paid** - `ref/sls/configure-and-price`, activity 6 - [Configure and Price](../../../../processes/sales/configure-and-price.md) - **Price Against the Rate Card** - `ref/sls/configure-and-price`, activity 5 - [Configure and Price](../../../../processes/sales/configure-and-price.md) - **Price What the Save Costs** - `ref/sls/work-a-churn-risk`, activity 9 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) - **Price the Bid** - `ref/sls/respond-to-an-rfp`, activity 9 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) ## What to record Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding. When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: reprice-when-the-deal-gets-smaller description: Prices a smaller term again and sends it back through approval. Use it when running `ref/sls/close-a-renewal`. license: CC-BY-4.0 metadata: agent: quote-builder agent-version: "1" --- # Reprice when the deal gets smaller ## What it does Prices a smaller term again and sends it back through approval. The new price and its distance from the floor are recorded beside the old one rather than in place of it. ## Where it happens The agent does this in one activity across one reference process. Each one names the activity as that process words it. - **Reprice a Smaller Term** - `ref/sls/close-a-renewal`, activity 10 - [Close a Renewal](../../../../processes/sales/close-a-renewal.md) ## What to record Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding. When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: route-what-is-off-the-standard description: Names anything off the standard price or the standard paper and puts it to the people who may sign it, before the quote exists rather than after it is sent. Use it when running `ref/sls/close-a-renewal`, `ref/sls/configure-and-price` and `ref/sls/work-a-churn-risk`. license: CC-BY-4.0 metadata: agent: quote-builder agent-version: "1" --- # Route what is off the standard ## What it does Names anything off the standard price or the standard paper and puts it to the people who may sign it, before the quote exists rather than after it is sent. A signature covers a version, so a quote changed afterwards goes back through. ## Where it happens The agent does this in three activities across three reference processes. Each one names the activity as that process words it. - **Approve What Is Off the Standard** - `ref/sls/close-a-renewal`, activity 7 - [Close a Renewal](../../../../processes/sales/close-a-renewal.md) - **Get the Cost Approved** - `ref/sls/work-a-churn-risk`, activity 10 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) - **Route the Non-Standard Terms** - `ref/sls/configure-and-price`, activity 9 - [Configure and Price](../../../../processes/sales/configure-and-price.md) ## What to record Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding. When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: work-out-the-ask-and-check-the-margin description: Works out what discount is being asked for, line by line, with the evidence that sits behind it. Use it when running `ref/sls/configure-and-price` and `ref/sls/open-a-renewal`. license: CC-BY-4.0 metadata: agent: quote-builder agent-version: "1" --- # Work out the ask and check the margin ## What it does Works out what discount is being asked for, line by line, with the evidence that sits behind it. Sets the price asked for against the least that will be accepted, and sets the priced deal against the margin floor. ## Where it happens The agent does this in three activities across two reference processes. Each one names the activity as that process words it. - **Check the Margin** - `ref/sls/configure-and-price`, activity 8 - [Configure and Price](../../../../processes/sales/configure-and-price.md) - **Set the Ask and the Floor** - `ref/sls/open-a-renewal`, activity 9 - [Open a Renewal](../../../../processes/sales/open-a-renewal.md) - **Work Out the Discount Ask** - `ref/sls/configure-and-price`, activity 7 - [Configure and Price](../../../../processes/sales/configure-and-price.md) ## What to record Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding. When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
Every server entry in an mcp.json needs either a command to run or a url to connect to, and the package cannot know either of those until somebody points it at their own systems. So the file is left out, the systems the agent needs are named by role in plugin.json, and you write the mcp.json when you set it up.
Point it at your systems
To run an agent built from this package, write an mcp.json that says which of your systems fills each role. The package names these 5 roles, and the access level beside each one is the most the work needs.
{
"$schema": "https://agent-plugins.org/schemas/1.1.0/mcp.schema.json",
"mcpServers": {
"rate-card-store": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/rate-card-store"
},
"entitlement-record": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/entitlement-record"
},
"cost-model": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/cost-model"
},
"quoting-system": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/quoting-system"
},
"approval-record": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/approval-record"
}
}
}
The hostnames here are a placeholder for your own. Whichever product holds each of these systems, the agent you build is yours and nobody else has to be involved in running it.
6 processes, 16 activities
The highlighted activities are the ones this abstract agent does. The other activities in each process belong to other abstract agents or to people.
Build the Quote · Approve What Is Off the Standard · Reprice a Smaller Term
Price Against the Rate Card · Net Off What Is Already Paid · Work Out the Discount Ask · Check the Margin · Route the Non-Standard Terms · Assemble the Quote · Hand the Quote On
Set the Ask and the Floor
Price the Bid
Price What the Save Costs · Get the Cost Approved
Take in the Approved Quote · Write the Price and the Terms
What it writes down
Per quote: every line with the card version its price was read from, what was netted off with the contract each deduction came from, the discount asked for line by line with the evidence behind it, the margin on the deal as asked and every line below the floor, each exception with the person who may sign it and the reason it was asked for, and the assembled quote at a version with the date it stops holding. When a term is repriced smaller, the new price and its distance from the floor are recorded beside the old one rather than replacing it.
What it will not do
Does not build the configuration or decide which products can sit together, which is the configurator agent's work. Does not approve its own discount, sign an exception, or set the floor it measures against. Does not write the proposal the buyer reads, and does not negotiate: what the buyer asks for and what is conceded is the negotiation-coordinator agent's record, not a change this agent makes to a price on its own.
These limits are written into the job on purpose, so that everyone adopting the process knows which decisions stay with a person.
Who has built one, and how far each one got
Nobody has built one yet. The catalog says so rather than leaving the section off, because an empty list is a fact about the document.
implements: quote-builder v1
One line in your agent's manifest. The catalog checks it against the records your runs actually leave.
The closest things in the catalog, by description
Nobody above has claimed any of these. This is the nearest match by wording between the job written above and what publishers wrote about their own listings, closest first, and wording is not evidence: some of these will be wrong, and a job with nothing suitable still gets whatever was nearest. The publishers have never heard of this abstract agent and have promised nothing about it. What a claim looks like is in the table above, and it is signed.
Not workers. These are capability that whatever does the job would use, which is a different relationship and kept in its own column for that reason.
- cintra-quote MCP server · cintrasupply.com · hosted · mirrored from the MCP registry Wholesale BOM pricer: send a parts list, get a priced line-by-line quote by email in minutes.
- JustFix Estimator MCP server · just-fix.github.io · hosted · mirrored from the MCP registry Quote UK trades jobs from any AI agent. Price breakdown + tappable booking link.
- Upshift MCP server · upshiftsites.com · hosted · run it yourself · mirrored from the MCP registry Audit a site's structured data and llms.txt, match a trade to a template, and quote real prices.