TenderAI — MCP Server for Tender & Proposal Management
A production-ready Model Context Protocol server that automates government/enterprise tender workflows: RFP parsing, technical proposal writing, financial proposal assembly, partner coordination, and compliance tracking.
Features
- 18 MCP Tools across 5 domains: Document Intelligence, Technical Proposals, Financial Proposals, Partner Coordination, Past Proposal Indexing & Search
- Hybrid Search: FTS5 full-text keyword search + sqlite-vec vector similarity search with Reciprocal Rank Fusion (RRF)
- 5 Resource URI schemes for knowledge base access: past proposals, templates, vendors, company profile, standards
- 4 Workflow Prompts for end-to-end orchestration: tender analysis, executive summaries, partner checks, full proposal workflow
- AI-Powered: Uses Claude to parse RFPs, generate proposal sections, and produce compliance narratives
- Voyage AI Embeddings (optional): Semantic search over past proposals — finds similar projects even without exact keyword matches
- Document Generation: Professional DOCX proposals and XLSX BOM spreadsheets
- SQLite Database: Tracks RFPs, proposals, vendors, BOM items, partners, deliverables, and indexed past proposals
- OAuth 2.0: Built-in OAuth support for claude.ai integration (Dynamic Client Registration + PKCE, auto-approve)
Quick Start
Local Development (stdio)
# Clone and setup
cd tenders
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# Configure
cp .env.example .env
# Edit .env — set ANTHROPIC_API_KEY
# Run
python -m app.server
Claude Desktop / Claude Code Configuration
stdio (local):
{
"mcpServers": {
"tenderai": {
"command": "python",
"args": ["-m", "app.server"],
"cwd": "/path/to/tenders",
"env": {
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}
HTTP (remote — Claude Code/Desktop):
{
"mcpServers": {
"tenderai": {
"type": "http",
"url": "https://tender.yfi.ae/mcp",
"headers": {
"Authorization": "Bearer <MCP_API_KEY>"
}
}
}
}
Claude.ai (OAuth 2.0):
Set OAUTH_ISSUER_URL=https://tender.yfi.ae in .env, then add https://tender.yfi.ae/mcp as an integration on claude.ai. OAuth flow completes automatically.
Production Deployment
sudo ./setup.sh tender.yfi.ae
# Edit /opt/tenderai/.env — set ANTHROPIC_API_KEY
sudo systemctl start tenderai
Tools
Document Intelligence
| Tool | Description |
|---|---|
parse_tender_rfp | Parse PDF/DOCX RFP and extract structured data |
generate_compliance_matrix | Generate compliance matrix DOCX for an RFP |
check_submission_deadline | Check deadline and calculate milestones |
validate_document_completeness | Validate proposal has all required sections |
Technical Proposals
| Tool | Description |
|---|---|
write_technical_section | Write a single proposal section with AI |
build_full_technical_proposal | Generate complete technical proposal DOCX |
generate_architecture_description | Generate formal architecture narrative |
write_compliance_narrative | Write compliance response for a requirement |
Financial Proposals
| Tool | Description |
|---|---|
ingest_vendor_quote | Parse vendor quote and extract line items |
build_bom | Build Bill of Materials from vendor quotes |
calculate_final_pricing | Calculate final pricing with margins |
generate_financial_proposal | Generate financial proposal DOCX + BOM XLSX |
Partner Coordination
| Tool | Description |
|---|---|
draft_partner_brief | Draft technical requirements brief for partner |
create_nda_checklist | Generate NDA checklist for partner engagement |
track_partner_deliverable | Track expected deliverable from partner |
Past Proposal Indexing & Search
| Tool | Description |
|---|---|
index_past_proposal | Parse + AI-summarize a past proposal folder into searchable index |
search_past_proposals | Search indexed proposals — keyword, semantic, or hybrid mode |
list_indexed_proposals | List all indexed proposals with aggregate stats |
Resources
| URI Pattern | Description |
|---|---|
proposals://past/{id} | Past proposal content |
templates://{type} | Proposal templates |
vendors://{name} | Vendor profiles |
company://profile | Company profile |
standards://{ref} | Standards references |
Prompts
| Prompt | Description |
|---|---|
analyze_new_tender | Full tender intake and go/no-go analysis |
write_executive_summary | Tailored executive summary generation |
partner_suitability_check | Evaluate partner fit for a tender |
full_proposal_workflow | End-to-end proposal orchestration guide |
Knowledge Base
Populate these directories to improve AI-generated content:
data/
├── knowledge_base/
│ ├── company_profile/
│ │ └── profile.md # Company description, capabilities, differentiators
│ ├── templates/
│ │ ├── executive_summary.md
│ │ ├── technical_approach.md
│ │ └── ... # Section-specific templates
│ └── standards/
│ ├── iso27001.md
│ └── ... # Standards reference docs
├── past_proposals/
│ ├── tra_network_2024/
│ │ ├── Technical_Proposal.pdf # Your original submission files
│ │ ├── Cost_Sheet.xlsx # Financial data for pricing reference
│ │ └── _summary.md # Auto-generated by index_past_proposal
│ └── omantel_5g_2024/
│ └── ...
├── rfp_documents/ # Auto-populated by parse_tender_rfp
├── vendor_quotes/ # Vendor quote files
└── generated_proposals/ # Auto-populated output
Search Architecture
Past proposals can be indexed for fast retrieval:
Upload files → index_past_proposal → AI extracts metadata → stored in SQLite
├── FTS5 (keyword search, always on)
└── sqlite-vec (vector search, optional)
- FTS5: BM25 keyword ranking with porter stemming — sub-millisecond search
- Vector: Voyage AI embeddings (512-dim) stored in sqlite-vec — semantic similarity
- Hybrid: Both combined via Reciprocal Rank Fusion (RRF) for best results
- Set
VOYAGE_API_KEYin.envto enable vector search (200M free tokens from Voyage AI)
Backup
# Manual backup
./backup.sh /backups/tenderai 30
# Cron (daily at 2 AM)
0 2 * * * /opt/tenderai/backup.sh /backups/tenderai 30
Architecture
app/
├── server.py # Entry point — FastMCP init and wiring
├── config.py # Settings from .env
├── tools/
│ ├── document.py # 4 document intelligence tools
│ ├── technical.py # 4 technical proposal tools
│ ├── financial.py # 4 financial proposal tools
│ ├── partners.py # 3 partner coordination tools
│ └── indexing.py # 3 past proposal indexing & search tools
├── resources/
│ └── knowledge.py # 5 resource URI handlers
├── prompts/
│ └── workflows.py # 4 workflow prompts
├── db/
│ ├── schema.sql # SQLite schema (10 tables + FTS5 + triggers)
│ ├── database.py # Async database layer + sqlite-vec + OAuth CRUD
│ └── models.py # Pydantic models
├── services/
│ ├── llm.py # Anthropic SDK wrapper (15 prompt templates)
│ ├── parser.py # PDF/DOCX/XLSX parser
│ ├── embeddings.py # Voyage AI embedding service (optional)
│ └── docwriter.py # DOCX/XLSX generator
└── middleware/
├── auth.py # ASGI Bearer token auth (Claude Code/Desktop)
└── oauth.py # OAuth 2.0 provider (claude.ai)