Automate tender and RFQ pricing by extracting requirements from documents.
Tri‑Tender Pricing MCP
This is a production‑ready Model Context Protocol (MCP) server built with FastMCP for Tri‑Tender. It focuses on pricing schedules for tenders and RFQs.
The server exposes tools that:
- Detect and extract pricing requirements from tender packs
- Build a structured pricing model from tender rules + company rates
- Calculate final prices (including markups & VAT)
- Optionally compare against market prices
- Generate a styled HTML pricing report ready for PDF export
- Wrap the output in a Tri‑Tender‑friendly format for preview
1. Project Structure
tri_tender_pricing_mcp/
├── server.py
├── requirements.txt
├── README.md
├── tools/
│ ├── extract_pricing_requirements.py
│ ├── build_pricing_model.py
│ ├── calculate_prices.py
│ ├── generate_html_report.py
│ ├── fetch_market_prices.py
│ └── format_output.py
├── utils/
│ ├── pdf_reader.py
│ ├── docx_reader.py
│ ├── xlsx_reader.py
│ ├── classify_document.py
│ └── clean_text.py
└── resources/
├── pricing_templates/
│ ├── base_template.html
│ ├── table_style.css
│ └── branding.css
└── sample_data/
└── example_pricing.json
2. Installation
Create and activate a virtual environment (recommended), then:
pip install -r requirements.txt
Verify that FastMCP is installed:
fastmcp version
3. Running the MCP Server
fastmcp run server.py
By default FastMCP will use stdio for transport. Some hosts also support:
python server.py
or
fastmcp run --transport sse --host 0.0.0.0 --port 8000 server.py
(Consult the FastMCP docs / your host's docs if you want SSE or HTTP.)
4. Registering in Tri‑Tender (Desktop / Dyad)
Use a configuration entry like this in your MCP client:
{
"mcpServers": {
"tri_tender_pricing_mcp": {
"command": "python",
"args": ["server.py"],
"env": {}
}
}
}
If you deploy it remotely with SSE/HTTP, you can instead use:
{
"mcpServers": {
"tri_tender_pricing_mcp": {
"url": "http://YOUR-HOST:8000/sse"
}
}
}
5. Exposed Tools
`detect_pricing_requirements(file_path: str) -> dict`
- Reads PDF, DOCX or XLSX
- Cleans the text
- Classifies the document type (tender, pricing schedule, BOQ, etc.)
- Tries to extract pricing‑related sections
- Returns:
instructions(LLM‑ready description of what was found)summarycurrencypricing_items(rough skeleton list)raw_text(trimmed excerpt for the LLM)
`build_model(description: str, tender_rules: str, company_rates: str) -> dict`
- Takes free‑text input and produces a structured pricing model with:
items: description, unit, quantity, base_rate, markup_percentmeta: currency, VAT %, assumptions
`calculate(model_json: dict) -> dict`
- Applies line‑level calculations:
line_total_ex_vatline_vat_amountline_total_inc_vat
- Sums to grand totals
- Returns
items+totals+instructionsfor the LLM.
`market_prices(item_name: str) -> dict`
- Currently returns simulated market prices.
- Designed to be extended with real HTTP APIs (hardware, fuel, etc.).
`render_report(pricing_data: dict) -> dict`
- Renders a styled HTML report based on
resources/pricing_templates/base_template.html - Returns:
{ "mime_type": "text/html", "html": "..." }
`final_output(html: str) -> dict`
- Final simple wrapper used by Tri‑Tender desktop app / Dyad templates.
6. Customisation
- Update
resources/pricing_templates/base_template.htmland CSS files to match Tri‑Tender branding. - Extend the logic in
calculate_prices.pyto support:- multi‑year escalations
- different markups per category
- PSIRA / industry‑regulated minimums
- Plug real HTTP APIs into
fetch_market_prices.pyonce you have a host that allows outbound HTTP.
7. Safety Notes
- This server does no remote network calls by default.
- All calculations are purely local and deterministic.
- Perfect for running inside constrained MCP hosts (FastMCP Cloud, Cursor, Claude Desktop, etc.).
Tools (6)
detect_pricing_requirementsReads PDF, DOCX or XLSX to classify document type and extract pricing-related sections and items.build_modelProduces a structured pricing model with items, units, quantities, and markups from free-text input.calculateApplies line-level calculations for VAT and markups to generate grand totals.market_pricesReturns simulated market prices for specific items, designed for extension with real APIs.render_reportRenders a styled HTML report based on a base template and pricing data.final_outputFinal simple wrapper used by Tri-Tender desktop app or Dyad templates.Configuration
{"mcpServers": {"tri_tender_pricing_mcp": {"command": "python", "args": ["server.py"], "env": {}}}}