Skip to content

LeaveSheet: Davis-Bacon wage rates and WH-347 certified payroll

by tresor4k · remote · no sign-in to list tools · v0.1.0 · published by GitHub user tresor4k

Read-only Davis-Bacon wage determination lookup, crew pay checks, fringe 6B, WH-347 payroll drafts.

Final · 1Changes · 4

8 tools: 1 do something that can't be undone, 4 change things and 3 only read.

Scanned Oct 21, 2026

3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http leavesheet-certified-payroll https://app.tabletemplates.com/api/mcp

Findings

Matches of fixed checks, with the text they matched.

3 warn
  • The server marks "check_crew_pay" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "check_crew_pay" says "pay": a word that usually means money moves, which cannot be taken back.

    What this check looks for
  • The server marks "draft_conformance_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "draft_conformance_request" says "request": a word for a change.

    What this check looks for
  • The description names a tool "wh347_fringe_reconcile" that this server does not list.

    Matched text

    description: "...) for the week. Same computation as the wh347_fringe_reconcile tool of leavesheet-mcp: 6B per line, totals..."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

8 tools

Can't be undone 1Claude Code: ask
  • check_crew_payUse when the user wants to know whether each worker on a Davis-Bacon job was paid at least the WD rate for a payroll week.1 finding

    Why it is in this group

    • The name "check_crew_pay" says "pay": a word that usually means money moves, which cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "check_crew_pay" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "check_crew_pay" says "pay": a word that usually means money moves, which cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Use when the user wants to know whether each worker on a Davis-Bacon job was paid at least the WD rate for a payroll week. For every worker and classification it computes the base and fringe due vs. paid, recomputes overtime (hours over 40 in the workweek, 29 CFR 5.5(b)(1) and 5.32), checks apprentice registration and the daily apprentice ratio (29 CFR 5.5(a)(4)), and totals the restitution owed, each amount with its CFR citation; also returns the WH-347 lines as paid. Up to 50 workers. Either pass the pasted WD text (wdText) and link each segment to a row with wdRowId (from get_wage_rates on the same text), or give the WD rate of each segment directly (rate) as the user reads it in the contract. Example: wdText="General Decision Number: TX20260291 …", weekEnding="2026-06-07", workers=[{name:"Crew 1", segments:[{classification:"Welder", wdRowId:"r1", stByDay:[8,8,8,8,8], paidBaseRate:22}]}].

    Annotations the server declares

    • title: Check crew pay
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Changes things 4Claude Code: ask
  • annualize_fringeUse when a contractor pays a fringe plan (health, pension…) for a worker who also does private work, and needs the hourly credit it may take on Davis-Bacon payrolls.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Use when a contractor pays a fringe plan (health, pension…) for a worker who also does private work, and needs the hourly credit it may take on Davis-Bacon payrolls. Applies 29 CFR 5.25(c): plan cost divided by all hours worked, over-credit and fringe owed on DBRA hours, and the defined-contribution pension exception checks. Example: annualPlanCost=9600, totalHoursWorked=2000, dbraHours=600, plan={kind:"health"}, claimedHourlyCredit=8.

    Annotations the server declares

    • title: Annualize fringe
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • build_certified_payrollUse when the user is ready to produce the weekly certified payroll (WH-347 PDF or Excel).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Use when the user is ready to produce the weekly certified payroll (WH-347 PDF or Excel). Computes the WH-347 columns for the crew and returns a link to the export page where the files are generated in the browser; the crew data travels in the URL fragment, which is never sent to the server. The optional last 4 digits of each SSN are typed by the user on that page only. Do not put SSNs or addresses in the arguments. Up to 50 workers.

    Annotations the server declares

    • title: Build certified payroll
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • draft_conformance_requestUse when a worker performs a classification that is missing from the WD and the contractor must ask the contracting officer to add it.1 finding

    Why it is in this group

    • The name "draft_conformance_request" says "request": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "draft_conformance_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "draft_conformance_request" says "request": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Use when a worker performs a classification that is missing from the WD and the contractor must ask the contracting officer to add it. Fills the SF-1444 fields, compares the proposed rate with related WD classifications, and checks the criteria of 29 CFR 5.5(a)(1)(iii)(A) (each answered yes / no / to verify). Related classifications come from neighbourRowIds (get_wage_rates on the pasted wdText, passed again here) or are given directly. Example: missingClassification="Drone operator", tasks=["aerial survey"], wd="TX20260291", wdText="General Decision Number: TX20260291 …", neighbourRowIds=["r1"], proposed={base:24,fringe:0}.

    Annotations the server declares

    • title: Draft conformance request
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • reconcile_fringe_6bUse when the user wants to check that the fringe credited on the WH-347 (column 6B) matches what was paid to each plan (health and welfare, pension, vacation, training) for the wee…1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The description names a tool "wh347_fringe_reconcile" that this server does not list.

      Matched text

      description: "...) for the week. Same computation as the wh347_fringe_reconcile tool of leavesheet-mcp: 6B per line, totals..."

      What this check looks for
    Description, as the server wrote it
    Use when the user wants to check that the fringe credited on the WH-347 (column 6B) matches what was paid to each plan (health and welfare, pension, vacation, training) for the week. Same computation as the wh347_fringe_reconcile tool of leavesheet-mcp: 6B per line, totals per plan, reconciles when |sum 6B − sum plans| < 0.005. Up to 50 workers.

    Annotations the server declares

    • title: Reconcile fringe 6B
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 3Claude Code: allow
  • compare_wd_revisionsUse when the user asks what changed between two modifications of the same WD (e.g.No findings

    Why it is in this group

    • The name "compare_wd_revisions" says "compare": a word for reading.
    Description, as the server wrote it
    Use when the user asks what changed between two modifications of the same WD (e.g. the one in the contract vs. the latest one) and pastes both texts. Lists classifications added, removed and those whose base or fringe changed, with old and new amounts and the verbatim rows. Example: wdTextA="General Decision Number: CA20260001 … (modification 2)", wdTextB="… (modification 3)".

    Annotations the server declares

    • title: Compare WD revisions
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • find_wage_determinationUse when the user needs the general wage determination (WD) for a federally funded construction project.No findings

    Why it is in this group

    • The name "find_wage_determination" says "find": a word for reading.
    Description, as the server wrote it
    Use when the user needs the general wage determination (WD) for a federally funded construction project. This tool makes no network call: it explains where the WD is (the one incorporated in the contract or bid documents, starting with "General Decision Number"), builds the sam.gov search link with the filters to set (state, county, construction type) for the user to open, and quotes the revision rules of 29 CFR 1.6(c). If the user pastes the WD text (wdText) with the contract award date, it reads the modification table and picks the modification that applies under 29 CFR 1.6(c). Example: state="TX", county="Travis", constructionType="Highway", awardDate="2026-06-01". Then call get_wage_rates with the pasted text.

    Annotations the server declares

    • title: Find wage determination
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_wage_ratesUse when the user needs the prevailing base rate and fringe of one or more classifications and has the text of the WD (pasted from the contract or the sam.gov page).No findings

    Why it is in this group

    • The name "get_wage_rates" says "get": a word for reading.
    Description, as the server wrote it
    Use when the user needs the prevailing base rate and fringe of one or more classifications and has the text of the WD (pasted from the contract or the sam.gov page). Reads the pasted text and returns each matching classification row (craft, classification, zone, base and fringe $/h with the rule they come from, notes, parse confidence) plus the verbatim excerpt and the sam.gov page to check it. rowId values feed check_crew_pay and draft_conformance_request when the same text is passed. Example: wdText="General Decision Number: TX20260291 05/18/2026 …", search="welder".

    Annotations the server declares

    • title: Get wage rates
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.1.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http leavesheet-certified-payroll https://app.tabletemplates.com/api/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__leavesheet-certified-payroll__find_wage_determination",
      "mcp__leavesheet-certified-payroll__get_wage_rates",
      "mcp__leavesheet-certified-payroll__compare_wd_revisions"
    ],
    "ask": [
      "mcp__leavesheet-certified-payroll__check_crew_pay",
      "mcp__leavesheet-certified-payroll__annualize_fringe",
      "mcp__leavesheet-certified-payroll__build_certified_payroll",
      "mcp__leavesheet-certified-payroll__draft_conformance_request",
      "mcp__leavesheet-certified-payroll__reconcile_fringe_6b"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as leavesheet-certified-payroll. Review it before you use it.