Skip to main content
Glama
matanitah

Workers' compensation MCP

by matanitah

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_jurisdictions lists the 50 states and the District of Columbia. regulation_coverage is act, chapter, section, or rules. regulation_retrieval is live or stored.

  • get_jurisdiction returns the agency, the primary-law citation, and the regulation catalog. Each catalog entry includes coverage and retrieval.

  • get_reimbursement returns the stored JSON. benefits holds the weekly maximum, weekly minimum, wage-replacement rate, and temporary-total week cap. claimcalc holds ClaimCalc's injury-level settlement. figures_from becomes official only when a rate notice states all four benefit fields.

  • get_regulations fetches one cataloged official URL and returns its text. The default document is the statute when rules are also cataloged. section returns 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 returns fetch_error. A state with no cataloged URL returns status: 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:mcp

That 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 8000

Docker

docker build -t workers-comp-mcp .
docker run --rm -p 8000:8000 workers-comp-mcp

Chat 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.py

Ollama must already be running and gemma4 must appear in ollama list. The dashboard is at http://localhost:8501.

Tests

uv run pytest

Available Tools

4 tools
get_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).

NameRequiredDescriptionDefault
stateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
stateYes
sectionNo
source_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
stateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 4 tool updatesv0.1.0
    • First observedget_jurisdiction
    • First observedget_regulations
    • First observedget_reimbursement
    • First observedlist_jurisdictions

TDQS

A3.8/5.0

Scored across 4 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching and retrieving federal regulatory agenda data, including RIN details, agency agendas, and edition coverage.
    7 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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