FedSalary: official pay data
Server Details
Official pay statistics for any job and place, offer checks and two-offer comparisons.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: get_pay retrieves official statistics, check_pay evaluates a specific offer or range against those statistics, compare_offers compares two offers, and find_jobs discovers openings. Although check_pay and get_pay share the same place coverage, their input/output semantics are clearly separated.
All four tools follow a consistent verb_noun snake_case pattern: check_pay, compare_offers, find_jobs, and get_pay. The verbs are predictable and aligned with the actions performed.
Four tools is a well-scoped set for a focused pay-data service: retrieve statistics, evaluate an offer, compare offers, and find jobs. Each tool earns its place without redundancy.
The surface covers core pay lookup, offer evaluation, comparison, and job discovery workflows. Minor gaps remain, such as no dedicated occupation/place discovery or standalone tax/cost-of-living lookup, but these are largely handled indirectly by the existing tools.
Available Tools
4 toolscheck_payCheck a pay offer or rangeARead-onlyIdempotentInspect
Where a job offer's pay, or a posted pay range, sits on the official pay distribution for the same job and place: the percentile span, the median, US take-home pay at the midpoint after federal and state tax, and for US metro areas which Department of Labor wage level (entry to fully competent) the pay meets. Same places as get_pay.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | Job title, FedSalary slug or occupation code. | |
| max | No | High end of the range (optional). | |
| min | Yes | Low end of the range, or the only figure. | |
| unit | No | year or hour. UK places take year only. | |
| place | Yes | us, ca, uk, a US state or large metro area, a Canadian province or a UK region. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, non-destructive, so the safety profile is covered; the description adds real behavioral context beyond that. It discloses the derived outputs (percentile span, median, net take-home after federal and state tax, DOL wage level) and scopes them geographically (US tax, US metro wage levels, UK year-only). It does not say what happens on unsupported places or out-of-range pay figures, which holds it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense sentence with the core computation front-loaded and the output list trailing, so an agent gets the gist immediately. Nothing is filler, but the run-on structure of the enumerated outputs makes it slightly harder to scan than a short bulleted form would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return-value burden, and it does: it names each returned figure and the conditions under which the DOL wage level applies. With five parameters fully documented in the schema and annotations covering safety and idempotency, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns more: stating that take-home is computed 'at the midpoint' tells the agent how min and max combine into a single figure, which the schema never says. Framing min as 'the low end of the range, or the only figure' also clarifies that a single number is a valid call. That is genuine meaning added on top of a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise computation: where a given offer or posted range falls on the official pay distribution, returning percentile span, median, US take-home pay, and DOL wage level. That is far more specific than the name alone. It references get_pay only to inherit its place coverage, so the boundary with compare_offers (also a sibling) is never drawn, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the framing ('a job offer's pay, or a posted pay range'), which tells an agent this is for evaluating a concrete figure rather than browsing a distribution. There is no explicit when-to-use/when-not statement and no guidance on choosing between this, get_pay, and compare_offers. The reference to get_pay clarifies shared place coverage but not task selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_offersCompare two US job offersARead-onlyIdempotentInspect
Two US job offers, each a pay figure in a state or one of the 50 largest metro areas, compared after federal income tax, Social Security, Medicare and state income tax, then after local prices (BEA regional price parities, rent included). Returns take-home pay, take-home at national prices, which offer is worth more and by how much, and the salary each place would need to match the other. With a job, also where each offer sits on the official pay distribution. City and county income taxes are not included.
| Name | Required | Description | Default |
|---|---|---|---|
| job | No | Optional job title or slug, to place each offer on the official distribution. | |
| unit | No | year or hour, for both offers (default year). | |
| a_pay | Yes | Offer A's pay. | |
| b_pay | Yes | Offer B's pay. | |
| a_place | Yes | Offer A's place: a US state or large metro area. | |
| b_place | Yes | Offer B's place. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world behaviour, so the description is freed to add methodology: which taxes are modeled (federal, Social Security, Medicare, state), that BEA regional price parities including rent drive the cost adjustment, and an explicit exclusion of city and county income taxes. That exclusion is exactly the kind of scope caveat an agent needs; only error handling and place-resolution failure modes are unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, with the comparison setup first and the return payload enumerated afterward. The opening clause 'each a pay figure in a state or one of the 50 largest metro areas' is slightly compressed/awkward but earns its place as a scope constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns, and it does so thoroughly (take-home, take-home at national prices, comparison verdict and magnitude, matching salary, optional distribution placement). For a 6-parameter analysis tool that is nearly complete; invalid-place behaviour is the only notable omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are already documented and the baseline is 3. The description adds little beyond the schema: it ties the job parameter to the distribution output and narrows places to 'a state or one of the 50 largest metro areas', but says nothing about unit handling (year vs hour) or pay formatting that the schema does not already cover.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation on a specific resource: two US job offers compared after federal/state tax and regional prices. It is clearly distinct from get_pay and check_pay (single-figure lookups) even though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scenario ('two US job offers') and the optional job parameter is described as adding distribution placement, but there is no explicit when-to-use/when-not guidance or routing to get_pay/check_pay for single-figure checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_jobsFind current job openings with their payARead-onlyIdempotentInspect
Current job openings in the US and Canada from employers' own job boards (read through their documented APIs, refreshed weekly), matching keywords and a place. Each result: title and employer as posted, places, posting date, the pay range when the employer published one, and when it did not, the official BLS median for the occupation in the US state named (national for US remote jobs); for published US ranges, where the range sits on the official distribution; and the link to apply on the employer's own site. Results are newest first or by published pay. Coverage is strongest for technology, finance, startups and remote work; many hospitals, retailers and public employers are not included yet, so few or no results does not mean no such jobs exist. No job descriptions; FedSalary takes no applications.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | new (default) or pay. | |
| place | No | A US state (texas or TX), a US metro area or large city (austin), remote (US remote jobs), canada, a Canadian province (ontario) or a large Canadian city (toronto). Leave out for everywhere. | |
| min_pay | No | Minimum yearly pay in USD: the top of the published range must reach it (Canadian ranges converted). Jobs without published pay are left out when this is set. | |
| keywords | No | Words matched against the job title and employer, all of which must match (data analyst, product manager, Stripe). | |
| published_pay_only | No | true = only jobs that publish a pay range. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, but the description adds substantial behavior the agent could not otherwise know: data provenance (employers' documented APIs, refreshed weekly), the BLS-median fallback when no range is published, geographic scoping of that fallback, and default ordering. The coverage caveat ('few or no results does not mean no such jobs exist') is exactly the kind of failure-mode disclosure that prevents a bad conclusion from an empty result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it returns and from where, then caveats, then scope limits; each segment carries information. The middle sentence listing result fields is long and semicolon-chained, and the dense packaging makes it harder to scan than it needs to be for a five-parameter search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the burden of describing return fields, and it explains the pay-derivation logic and coverage gaps thoroughly. The remaining gap is operational: it never states how many results are returned or whether result sets are capped/paginated, which matters for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including the default for sort and the min_pay rule that jobs without published pay drop out. The description adds little parameter-level meaning beyond the schema; it only restates keyword-and-place matching and mentions the pay-range sort superficially.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (find current job openings) plus scope: employers' own job boards in the US and Canada, matched by keywords and place. The result contract (title, employer, places, date, pay or BLS median, distribution position, apply link) makes it clearly distinguishable from the pay-lookup siblings check_pay/get_pay/compare_offers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when it applies (keyword + place job search over live postings) and useful boundaries: no job descriptions, takes no applications. It stops short of naming alternatives, e.g. it never says when to use check_pay or get_pay instead when the user only wants salary data, so routing between siblings is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payOfficial pay for a jobARead-onlyIdempotentInspect
Official pay statistics for one job in one place: median, 10th to 90th percentiles, employment, the publisher and reference period, take-home pay where the site shows it, and for US states and metro areas the U.S. Department of Labor's four wage levels (entry to fully competent). Covers the US (national, every state, the 50 largest metro areas), Canada (national, provinces) and the UK (national; regions are a table on the national answer). Returns the page's Markdown copy with a citation line.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | Job title as people say it (registered nurse, software engineer), a FedSalary page slug (registered-nurses) or an occupation code (SOC 29-1141, NOC 31301). | |
| place | No | us, ca or uk for a whole country (default us); a US state (texas or TX); a large US metro area (austin, seattle); a Canadian province (ontario); a UK region (london). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already announce readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real behavioral context on top: geographic coverage (US national/states/50 largest metros, Canada national/provinces, UK national with regions folded into the national answer) and the return shape ('the page's Markdown copy with a citation line'). It does not mention caching, rate limits, or what happens with an ambiguous job title, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource, then the payload, then the return format — a sensible order with no filler. The middle clause listing every metric is dense but each item carries scoping information. Slight cost in readability from the long compound sentence, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description supplies what is needed to call it correctly: what data comes back, the geographic scope, and that the response is Markdown with a citation. Annotations already handle the safety profile, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 100%, the baseline is 3, and the description adds genuinely new meaning beyond the schema: the note that UK regions are a table on the national answer tells the agent that passing a region for the UK yields a national page rather than a region-specific feed. That is a behavioral nuance about the 'place' parameter the schema does not convey. The 'job' parameter gains no extra semantics from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (official pay statistics for one job in one place) and enumerates exactly what is returned: median, 10th-90th percentiles, employment, publisher, reference period, take-home pay, and DOL wage levels. That is far more concrete than the title alone. It stops short of distinguishing itself from the sibling check_pay, so an agent cannot tell from this text which of the two single-job pay lookups to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for one job in one place' implies a single-entity lookup as opposed to a comparison, which hints at the boundary with compare_offers. However, there is no explicit when-to-use, when-not, or named alternative, and the overlap with check_pay is never addressed. Usage must be inferred rather than read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- First observed
check_pay - First observed
compare_offers - First observed
find_jobs - First observed
get_pay
Related MCP Connectors
ONS pay percentiles by UK postcode and occupation.
Live healthcare pay data: advertised ranges by role/state/city, offer checks, transparency scores.
Salary, level and job data from 1M+ pay reports. Benchmark pay, evaluate offers, search open jobs.
For employers: how a job posting compares with the market nearby, by competitor; hiring reports.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables querying real disclosed salary data across 20 regions, with tools to search jobs, retrieve salary statistics, and find similar roles.-
- AlicenseNot gradedqualityDmaintenanceUS + EU salary benchmarking, pay transparency compliance, and semantic endpoints. 1,400+ US occupations, 28 EU countries. MCP server for AI agents.MIT
- AlicenseNot gradedqualityCmaintenanceThis server calculates UK Statutory Sick Pay, Statutory Maternity, Paternity, Adoption, and Shared Parental Pay based on current rules. It also provides National Living Wage and National Minimum Wage rates and eligibility checks.MIT
- AlicenseNot gradedqualityCmaintenanceEnables models to query real US government data (BLS, BEA, Census, IRS 2026) to calculate 2026 take-home pay across all 50 states plus DC, compare cost-of-living-adjusted salaries between 50 US metros, retrieve tax bracket ladders, and look up occupation-level salary percentiles. Exposes five read-only tools over a free, keyless remote Streamable HTTP endpoint.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.