4.8 KiB
rfp-form-filler
CoWork skill that auto-fills the standard required forms, certifications, and representations that accompany a proposal submission — from MPM's maintained company profile — so the proposal team never retypes the same company data onto every form by hand.
Version: 1.0.0 Author: Andy Gilliom Repo: https://git.mpm.to/mpm/rfp-form-filler CoWork Project: CW-025 — RFP Form Filler
Overview
This is the companion to rfp-analyzer (CW-010). Where rfp-analyzer produces the list of required forms for a solicitation, rfp-form-filler actually fills them in. It reads a maintained company-profile reference (verified corporate facts seeded from Odoo res.company, plus procurement-specific fields like UEI, CAGE, NAICS, insurance, and authorized signatory) and places those values onto whatever form the user provides — across four formats: fillable PDF (AcroForm), flat/scanned PDF, Word (.docx), and tables embedded in the RFP body. Its governing rule is never fabricate compliance data: any field the profile doesn't have is left blank and reported, and every certification/signature is routed to a human.
Data note: In this public repo the company-profile files (
references/company-profile.md,assets/mpm-profile.json) are sanitized templates. The populated version containing MPM's real identifiers, insurance, and banking data is maintained privately in the CW-025 Google Drive coordination folder and inside the packaged.skill. Populate the template locally before use.
Skills
| Skill | What It Does |
|---|---|
rfp-form-filler |
Fills required proposal forms from the company profile. Triggers on: "fill out the forms", "required forms", "certifications and reps", "Buy America cert", "DBE form", "SF-LLL", "lobbying certification", "debarment/suspension", "W-9", "vendor registration", "bidder information form", "non-collusion affidavit", "EEO form", "references form", or any blank PDF/Word/RFP-embedded form needing company information. |
Components
| Path | Purpose |
|---|---|
SKILL.md |
Orchestrator: load profile → identify format → fill → deliver, with the never-fabricate rules. |
references/company-profile.md |
Maintained company data (sanitized template here; real values kept private). Read first. |
assets/mpm-profile.json |
Machine-readable profile with field-name aliases; used to seed the PDF Tools connector profile and to match form fields. |
references/form-catalog.md |
Standard federal/transit forms (W-9, Buy America, SF-LLL, debarment, DBE, EEO, non-collusion, references), what each needs, and per-form gotchas. |
references/format-workflows.md |
Per-format fill procedure for all four form formats. |
scripts/fill_flat_pdf.py |
Overlays text onto flat (non-fillable) PDFs at given coordinates. |
Setup Instructions
- Install the skill into your CoWork profile (Save skill on the
.skillcard, or install from this repo). - Populate
references/company-profile.mdandassets/mpm-profile.jsonwith your real company data (or use the private populated copy from the CW-025 Drive folder). - Ensure the PDF Tools connector is available for fillable-PDF handling, and the
docx/pdfskills for Word and PDF work. scripts/fill_flat_pdf.pyrequirespypdfandreportlab(pip install pypdf reportlab).
Setup Checklist
- Skill installed
- Company profile populated (or private copy in place)
- PDF Tools connector connected
pypdf+reportlabavailable for flat-PDF overlay
Workflow Notes
- Never fabricate compliance data. Missing values are left blank and reported as "needs input"; identifiers (UEI, CAGE, DUNS, EIN, DBE #) are never guessed.
- Certifications and signatures are human. The skill fills identity portions and flags the affirmation/signature block for the authorized signatory.
- Profile currency. SAM.gov registration, insurance certs, and DBE certs expire — re-verify each proposal cycle. Corporate basics can be re-pulled from Odoo
res.company.
Requirements
- CoWork with the
docxandpdfskills - PDF Tools connector (fillable-PDF profile fill)
- Python:
pypdf,reportlab(flat-PDF overlay) - Odoo MCP (CW-003) — optional, for re-seeding corporate basics
Troubleshooting
| Symptom | Fix |
|---|---|
| Form field left blank unexpectedly | The profile value is null/TODO — populate it in the profile files. |
| Flat-PDF text lands in the wrong spot | Use fill_flat_pdf.py --list-sizes to get page dimensions; PDF origin is bottom-left. |
| Fillable-PDF field names don't match profile | Match against the aliases lists in mpm-profile.json; add new aliases as needed. |
| Certification checkbox pre-selected | It shouldn't be — those are human-affirm; report as a bug if the skill selected one. |