Contoso Payroll MCP server — payroll processing tools for a Microsoft 365 Copilot declarative agent. Processes timesheet data, computes gross pay, taxes, deductions, and net pay, runs compliance checks, and generates payroll registers and tax summaries.
Server has 6 tools with clear verb-noun naming (get_, process_, check_, explain_, tax_, get_). All tools have descriptions (avg ~100 chars, within baseline 34-392). Input schemas present for all tools with type declarations. However, parameter descriptions are sparse or generic ('List of employee timesheet rows' repeated 4x), and output schemas are not formally documented in the code. Error handling is minimal, no recovery guidance or error classification. The server accepts flexible input (JSON string, dict, array) which is good for usability but lacks validation constraints. No tool annotations visible (readOnlyHint/destructiveHint/idempotentHint) despite fastmcp support. Overall: solid naming and basic schemas, but descriptions lack LLM-optimization detail and output structure is undocumented.
Pre-flight anomaly & compliance check — run this before funding.
Break down one employee's paycheck: gross → pre-tax → taxes → post-tax → net.
Get a recap of the last payroll run (if any): totals, period, and whether a run exists.
Return a realistic sample timesheet + employer, so the demo runs without a real Excel.
Run payroll for the given timesheet rows → full payroll register + totals.
Employer tax liability, cash to deposit, and the filings this run feeds.
Parameter descriptions are generic and repeated. 'List of employee timesheet rows' appears in 4 tools without explaining format, required fields, or constraints. LLMs cannot infer whether to pass raw JSON, a CSV string, or a structured object.
Output schemas are not formally documented. Tools return structuredContent with 'view', 'register', 'totals' fields, but the schema structure is implicit in code comments, not in tool registration. LLMs cannot plan downstream operations without knowing what fields to expect.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite fastmcp support. process_payroll is destructive (WRITE risk) and should be marked; get_* tools should be marked read-only. Agents cannot distinguish safe retry candidates from irreversible operations.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2025-06-18+ | v2 |
Error handling is absent. No error classification (retryable vs user-fixable vs fatal), no recovery guidance, no validation of input constraints. If an LLM passes invalid frequency or malformed employee data, the tool will fail silently or with a generic exception.
Parameter 'frequency' lacks enum constraint. Description says 'Pay frequency (weekly, biweekly, semimonthly, monthly)' but does not enforce it. LLMs may pass 'fortnightly', 'every-two-weeks', or other variants, causing silent failures.