Workers' compensation MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Workers' compensation MCPWhat are California's weekly workers' comp benefit limits?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Workers' compensation MCP
A FastMCP server over the OKF wiki in state-by-state-research. It returns each jurisdiction's reimbursement JSON and, when a publisher URL is cataloged, the text of that official page.
Tools
list_jurisdictionslists the 50 states and the District of Columbia.regulation_coverageisact,chapter,section, orrules.regulation_retrievalisliveorstored.get_jurisdictionreturns the agency, the primary-law citation, and the regulation catalog. Each catalog entry includescoverageandretrieval.get_reimbursementreturns the stored JSON.benefitsholds the weekly maximum, weekly minimum, wage-replacement rate, and temporary-total week cap.claimcalcholds ClaimCalc's injury-level settlement.figures_frombecomesofficialonly when a rate notice states all four benefit fields.get_regulationsfetches one cataloged official URL and returns its text. The default document is the statute when rules are also cataloged.sectionreturns the passage that starts at a citation. Some jurisdictions return text saved from the official page when that host blocks the server. A failed live fetch returnsfetch_error. A state with no cataloged URL returnsstatus: uncatalogued.
benefits holds weekly benefit limits from ClaimCalc. A field is replaced only when an official rate notice states a different number, and figures_from becomes official only when that notice states all four benefit fields. claimcalc holds that source's injury-level settlement amount.
Related MCP server: Cannabis Regulatory Intelligence MCP Server
Run locally
uv sync
uv run fastmcp run server.py:mcpThat uses stdio. For HTTP, the endpoint is http://localhost:8000/mcp:
uv run fastmcp run server.py:mcp --transport http --host 0.0.0.0 --port 8000Docker
docker build -t workers-comp-mcp .
docker run --rm -p 8000:8000 workers-comp-mcpChat dashboard
A Streamlit chat drives the MCP server with the local Ollama model gemma4. The model calls list_jurisdictions, get_jurisdiction, get_reimbursement, and get_regulations through the FastMCP client.
uv sync --group dashboard
uv run --group dashboard streamlit run dashboard.pyOllama must already be running and gemma4 must appear in ollama list. The dashboard is at http://localhost:8501.
Tests
uv run pytestAvailable Tools
4 toolsget_jurisdictionGet JurisdictionA
Return the agency, primary-law citation, and regulation catalog for a state.
state is a postal code or jurisdiction name, such as CA or California.
Each catalog entry includes coverage (act, chapter, section, or
rules) and retrieval (live or stored).
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden; "Return" signals a read-only lookup, but there is no statement about permissions, error behavior for an unknown state, or pagination. It does add real value by defining what a catalog entry contains and the meaning of the `coverage` and `retrieval` values, which goes beyond the schema.
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?
Payload is front-loaded in the first sentence, with parameter semantics immediately after and no filler. Slightly more elaborate than necessary given an output schema exists, but every clause carries information.
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 single-parameter read with an output schema present, the description covers the parameter format and the meaning of nested catalog fields, which is what an agent needs. Lacking only failure/edge-case behavior and sibling routing.
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 0% – the `state` property has no documentation at all – so the description must compensate, and it does: it specifies the accepted forms (postal code or jurisdiction name) with concrete examples (CA, California). No constraints on invalid input are given, keeping it from a 5.
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 plus the exact payload: agency, primary-law citation, and regulation catalog for a state. It implicitly separates itself from list_jurisdictions and get_regulations (metadata/catalog vs. the regulation text itself) but never names the siblings, so an agent must infer the boundary.
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 only implied – the agent can deduce this is the lookup to call before get_regulations, but there is no explicit "use this when..." statement, no exclusions, and no mention of how it relates to list_jurisdictions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_regulationsGet RegulationsA
Fetch one cataloged official regulation and return its text.
The URL comes from that jurisdiction's catalog. This tool does not accept
an arbitrary URL and does not summarize the document. When several
documents are cataloged, the default is primary-statute; pass source_id
for another, such as agency-rules. A catalog entry that names a saved
text file returns that file. section returns the passage that starts at
that citation. A failed live fetch returns status fetch_error. When no
official URL is cataloged, the result is status uncatalogued with the
citation and agency link already recorded in the wiki.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | ||
| section | No | ||
| source_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that only cataloged URLs are used, that saved text files are returned, and names two outcome states (`fetch_error`, `uncatalogued`). It omits auth requirements, caching/rate limits, and freshness of live fetches.
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 the core action, then the constraints and parameter notes in short sentences. Nearly every sentence adds a fact, though the saved-text-file sentence and error-state sentences could be slightly tightened.
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?
All three parameters are undocumented in schema, and the description covers two of them plus the failure modes; an output schema handles return shape. Remaining gaps are auth/permissions and how `state` values are formed (which the sibling list_jurisdictions presumably supplies).
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 0%, so the description must compensate, and it largely does: `source_id` is explained via the `primary-statute`/`agency-rules` distinction and `section` is defined as the passage starting at a given citation. `state` is only implied through 'that jurisdiction's catalog' and never explicitly described.
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 opening sentence states a specific verb and resource plus return content: fetch one cataloged official regulation and return its text. It also scopes the tool negatively ('does not accept an arbitrary URL', 'does not summarize'), which separates it from any fetch/summarize sibling.
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?
It states the default document type (`primary-statute`) and when to pass `source_id` for an alternative like `agency-rules`, which is real routing guidance. It stops short of naming when to use a sibling tool (e.g., list_jurisdictions first), so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reimbursementGet ReimbursementB
Return the stored reimbursement JSON for a state.
benefits holds the weekly maximum, weekly minimum, wage-replacement rate,
and temporary-total week cap. claimcalc is ClaimCalc's injury-level
settlement figure. state is a postal code or name.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does usefully disclose that the payload is 'stored' (i.e., a precomputed read rather than a calculation) and enumerates the meaning of the `benefits` and `claimcalc` fields, but it says nothing about behavior for an unknown/invalid state (error vs empty result) or any access constraints.
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 the core action in the first sentence, followed by compact field glosses and finally the parameter hint. Every sentence contributes, though the field-by-field breakdown of the return payload runs somewhat long given an output schema already exists.
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?
An output schema exists, so return-value explanation is not strictly required, yet the description still adds semantic meaning for `benefits` and `claimcalc` field names. Combined with the parameter format hint, the definition is nearly sufficient — only the failure mode for an unrecognized state is left unspecified.
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 0%, so the description must compensate for the single `state` parameter — and it does, clarifying that it accepts either a postal code or a state name. That format hint is not available anywhere in the schema and materially reduces malformed calls; accepted-value enumeration or case-sensitivity rules are the only gaps.
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 ('Return the stored reimbursement JSON') scoped to a single state, which is unambiguous. It doesn't explicitly contrast itself with the sibling tools (list_jurisdictions, get_jurisdiction, get_regulations), though the reimbursement topic is clearly distinct from jurisdiction lookup and regulation retrieval.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives or exclusions. An agent can infer that it calls this to fetch reimbursement figures for a state, but nothing tells it when to prefer this over get_regulations or what to do for a state that isn't supported.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jurisdictionsList JurisdictionsA
List the 50 states and the District of Columbia in the research wiki.
Each row includes the postal code, the jurisdiction name, whether a cataloged official regulation URL is on file, whether that document is the act, a chapter, a section, or agency rules, whether the text is fetched live or read from a saved file, and whether a medical fee schedule object is stored.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does a solid job: it discloses exactly which columns each row carries, including document-type classification, live-versus-saved text provenance, and whether a medical fee schedule object exists. It does not state that the call is read-only, its cost/latency, or that the set is exactly 51 rows and fixed—minor gaps given the strong data disclosure.
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 scope before the row detail. The second sentence is a dense enumeration that slightly overlaps the output schema, but each item is a distinct field an agent might filter on, so it mostly earns its place.
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 zero-parameter, read-only listing with an output schema, nothing an agent needs in order to call it correctly is missing: scope, row contents and fixed cardinality are all stated, and return structure is covered by the schema.
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?
Zero parameters, so there is nothing for the description to compensate for and the baseline is 4. The description correctly signals a no-argument, whole-set listing, matching the empty schema with additionalProperties=false.
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 ('List') and a precisely bounded resource ('the 50 states and the District of Columbia in the research wiki'), which an agent can tell apart from the singular get_jurisdiction sibling. It stops short of naming or contrasting the alternatives explicitly, so it is clear but not maximally differentiating.
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?
There is no explicit statement of when to call this versus get_jurisdiction or the other get_* siblings, nor preconditions. Usage is only implied: enumerate the jurisdiction set to find a postal code before drilling into a single jurisdiction with get_jurisdiction.
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
v0.1.0- First observed
get_jurisdiction - First observed
get_regulations - First observed
get_reimbursement - First observed
list_jurisdictions
TDQS
Scored across 4 tools
Each tool has a distinct role: listing jurisdictions, retrieving jurisdiction metadata, retrieving reimbursement data, and fetching regulation text. The only mild overlap is between get_jurisdiction's regulation catalog and get_regulations, but their descriptions clearly separate metadata lookup from document retrieval.
All tool names follow a consistent snake_case verb_noun pattern: list_jurisdictions, get_jurisdiction, get_reimbursement, get_regulations. The convention is predictable and easy to scan.
Four tools are reasonable for a focused read-only research wiki covering jurisdictions, metadata, reimbursement, and regulation text. The surface is lean, though it leaves little room for additional lookup modes.
The tool set covers the core lifecycle of listing jurisdictions, inspecting a jurisdiction's catalog, retrieving reimbursement data, and fetching regulation text. Minor gaps exist, such as no search or bulk catalog browsing, but the main read-only workflows are covered.
Maintenance
Related MCP Connectors
Resolve, search and verify legal citations against the official sources, with provenance.
Search U.S. case law, fetch opinions, and ask matter-aware legal questions over your documents.
Official EUR-Lex, UK, US, and gazette search, metadata fetch, and change-only watches.
Keyless, read-only US public records for agents: SEC, FDA, enforcement, sanctions, market data.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to search and analyze legal documents from multiple jurisdictions including US federal and state law, case law, EU regulations, UK legislation, Canadian law, Congress bills, SEC filings, and FDA data through free government APIs.6MIT
- AlicenseNot gradedqualityDmaintenanceEnables querying cannabis testing limits, controlled substance schedules, and compliance requirements across US states, UN/EU, and Health Canada jurisdictions with source-linked data.MIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving federal regulatory agenda data, including RIN details, agency agendas, and edition coverage.7 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables agent clients to perform read-only regulatory retrieval through tools for searching the corpus, retrieving source text, tracing citations, listing authorities, and inspecting recent filings. It is designed to keep regulated actions and workspace changes behind human review gates.Apache 2.0