Browse docs

Get started

MCP server

Give Claude Code, Codex, Cursor, VS Code or any Model Context Protocol client the rule for a place and a date, with its official source, instead of a remembered number.

What it is

SettingValue
Packagejuriset-mcp on PyPI and npm; runs on your machine
Hostedhttps://mcp.juriset.dev/mcp, streamable HTTP, nothing to install
Registrydev.juriset/juriset in the official MCP registry
Tools8, all read-only
KeyOptional; without one you get today's rules within the keyless limits

Both servers call the Juriset API and return its answer unchanged. Neither can change anything, and neither sees anything but the questions your agent asks it.

Set it up in 3 steps

  1. For the local server, install uv. For the hosted server, skip this.
  2. Add Juriset to your client with the snippet for it below, and restart the client.
  3. Ask: "What is the minimum wage in Ontario today? Cite the source." The answer should name the Ontario government page and quote it.

Client configuration

Claude Code

Terminal
claude mcp add juriset -- uvx juriset-mcp

Or the hosted server:

Terminal
claude mcp add --transport http juriset https://mcp.juriset.dev/mcp

Codex

~/.codex/config.toml
[mcp_servers.juriset]
command = "uvx"
args = ["juriset-mcp"]

Cursor

.cursor/mcp.json in your project, or ~/.cursor/mcp.json for every project
{
  "mcpServers": {
    "juriset": {
      "command": "uvx",
      "args": [
        "juriset-mcp"
      ]
    }
  }
}

VS Code

.vscode/mcp.json
{
  "servers": {
    "juriset": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "juriset-mcp"
      ]
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "juriset": {
      "command": "uvx",
      "args": [
        "juriset-mcp"
      ]
    }
  }
}

Gemini CLI

~/.gemini/settings.json
{
  "mcpServers": {
    "juriset": {
      "command": "uvx",
      "args": [
        "juriset-mcp"
      ]
    }
  }
}

Claude Desktop

claude_desktop_config.json (Settings, Developer, Edit config)
{
  "mcpServers": {
    "juriset": {
      "command": "uvx",
      "args": [
        "juriset-mcp"
      ]
    }
  }
}

Through npm

Clients set up for npx can run the same server from npm. It still needs uv, which it calls:

mcpServers JSON
{
  "mcpServers": {
    "juriset": {
      "command": "npx",
      "args": [
        "-y",
        "juriset-mcp"
      ]
    }
  }
}

Any other client

Run uvx juriset-mcp as a stdio server, or connect to https://mcp.juriset.dev/mcp over streamable HTTP. Chat apps with custom connectors, such as Claude and ChatGPT where the plan allows them, take the hosted URL.

Keys and limits

No key is needed to try it. Without one the API answers today's rules, read-only, up to 60 an hour and 500 a day per IP address. History, as_of and the change feed need an API key on a plan that includes them. A tool that is refused returns the API's error, which says why.

For the local server, put the key in the server's environment as JURISET_API_KEY:

mcpServers JSON
{
  "mcpServers": {
    "juriset": {
      "command": "uvx",
      "args": [
        "juriset-mcp"
      ],
      "env": {
        "JURISET_API_KEY": "jrs_live_…"
      }
    }
  }
}

For the hosted server, send it as a bearer token:

Terminal
claude mcp add --transport http juriset https://mcp.juriset.dev/mcp --header "Authorization: Bearer jrs_live_…"

Keep the real key in your client's secret store or environment, never in a file you commit or in a chat.

Tools

ToolWhat it does
list_jurisdictionsList the US and Canadian jurisdictions Juriset covers, or find one by name.
list_rule_typesList the kinds of rule Juriset publishes.
get_ruleGet the rule in force today for one rule type in one jurisdiction, with its citation: source URL, verbatim excerpt and the snapshot Juriset stored.
get_rule_as_ofGet the rule that was (or will be) in effect on a date, in the same shape as get_rule.
get_rule_historyList every version ever published of one jurisdiction's rule, with its effective dates, values, citation and whether it is current, superseded or withdrawn.
compare_jurisdictionsGet one rule type across jurisdictions in one call, each entry in the same shape as get_rule.
list_changesList changes to published rules, oldest first: new versions, amendments, corrections and repeals, each naming the rule, the versions moved from and to, the effective date and the version id to pass to resolve_version.
resolve_versionGet exactly the version a stored id names, forever, even after it was superseded or withdrawn: the values, effective dates, citation, verification record and its status today.

The descriptions below are the ones your agent receives, word for word.

list_jurisdictions

List the US and Canadian jurisdictions Juriset covers, or find one by name. The other Juriset tools take slugs, not names. Each entry has the slug, name, level (country, state, province, county or city) and parent. Examples: Washington or WA → us-wa; Alberta → ca-ab; the federal levels are us and ca. Omit query for all of them. Reads the registry; no rule lookup.

ArgumentTypeDescription
querystringA name, postal abbreviation or slug, any case: Washington, WA, us-wa. Omit to list every jurisdiction.

list_rule_types

List the kinds of rule Juriset publishes. Each entry has its slug (the rule_type argument of the other tools), domain, description, how jurisdiction levels combine (override, max or stack) and the JSON Schema of its data, with every field described. Examples: minimum_wage and overtime (domain employment). Optional domain filter. Reads the registry; no rule lookup.

ArgumentTypeDescription
domainstringOnly this domain's rule types, e.g. employment or payroll.

get_rule

Get the rule in force today for one rule type in one jurisdiction, with its citation: source URL, verbatim excerpt and the snapshot Juriset stored. Example: {"rule_type": "minimum_wage", "jurisdiction": "us-wa"}. The response is the API's: data holds the values (described by the JSON Schema at schema_url), effective_from and verified_at date them, id is the version id to record with any decision that relies on it (see resolve_version), and verification says which models extracted and checked it and whether a person reviewed it. Where levels stack (e.g. US federal and state overtime) every level comes back as its own entry in layers; Juriset never merges them. Informational only, not legal advice (disclaimer).

ArgumentTypeDescription
rule_type (required)stringRule type slug from list_rule_types, e.g. minimum_wage, overtime.
jurisdiction (required)stringJurisdiction slug from list_jurisdictions, e.g. us-wa (Washington), us (US federal), ca-ab (Alberta).
domainstringThe rule type's domain, e.g. employment. Optional: when omitted it is looked up from the rule type.

get_rule_as_of

Get the rule that was (or will be) in effect on a date, in the same shape as get_rule. Example: {"rule_type": "minimum_wage", "jurisdiction": "us-wa", "as_of": "2025-06-30"}. Use it to see what applied when a past decision was made. A date before Juriset's coverage of that jurisdiction is answered with an error that says where coverage starts. Informational only, not legal advice. If the API key's plan does not include as-of queries the error says so.

ArgumentTypeDescription
rule_type (required)stringRule type slug from list_rule_types, e.g. minimum_wage, overtime.
jurisdiction (required)stringJurisdiction slug from list_jurisdictions, e.g. us-wa (Washington), us (US federal), ca-ab (Alberta).
domainstringThe rule type's domain, e.g. employment. Optional: when omitted it is looked up from the rule type.
as_of (required)stringThe date, YYYY-MM-DD, past or future.

get_rule_history

List every version ever published of one jurisdiction's rule, with its effective dates, values, citation and whether it is current, superseded or withdrawn. Example: {"rule_type": "minimum_wage", "jurisdiction": "us-wa"}. Covers that jurisdiction's own rule only; other levels that apply (e.g. us) are separate calls. Each entry's id can be passed to resolve_version. Informational only, not legal advice.

ArgumentTypeDescription
rule_type (required)stringRule type slug from list_rule_types, e.g. minimum_wage, overtime.
jurisdiction (required)stringJurisdiction slug from list_jurisdictions, e.g. us-wa (Washington), us (US federal), ca-ab (Alberta).
domainstringThe rule type's domain, e.g. employment. Optional: when omitted it is looked up from the rule type.

compare_jurisdictions

Get one rule type across jurisdictions in one call, each entry in the same shape as get_rule. Example: {"rule_type": "minimum_wage", "jurisdictions": ["us-wa", "us-or", "us-ca"]}. Without jurisdictions, every state and province (or the level you name) is returned: about 3 KB each, 50+ entries. Entries are never merged or ranked. Informational only, not legal advice. as_of needs an API key whose plan includes as-of queries.

ArgumentTypeDescription
rule_type (required)stringRule type slug from list_rule_types, e.g. minimum_wage.
domainstringThe rule type's domain, e.g. employment. Optional: when omitted it is looked up from the rule type.
jurisdictionslist of stringUp to 100 jurisdiction slugs, any level, e.g. ["us-wa", "us-or", "us-ca"]. Not with level.
levellist of stringInstead of jurisdictions: every jurisdiction at these levels, e.g. ["state", "province"] (the default).
as_ofstringA date, YYYY-MM-DD, instead of today.

list_changes

List changes to published rules, oldest first: new versions, amendments, corrections and repeals, each naming the rule, the versions moved from and to, the effective date and the version id to pass to resolve_version. Example: {"since": "2026-10-01", "jurisdictions": ["us", "us-wa"]}. Each jurisdiction matches its own rules only, so for everything that changes Washington's answer pass the federal level too. While has_more is true, call again with the response's cursor. Needs an API key whose plan includes the change feed; otherwise the error says so. Informational only, not legal advice.

ArgumentTypeDescription
sincestringWhere to start: an ISO 8601 date or date-time, e.g. 2026-10-01 (midnight UTC). Give this or cursor.
cursorstringThe cursor of the previous response, to continue or to poll for new changes.
jurisdictionslist of stringJurisdiction slugs, e.g. ["us", "us-wa"]; each matches its own rules only.
rule_typestringOnly this rule type, e.g. overtime.
domainstringOnly this domain, e.g. employment.
limitintegerChanges per call, 1 to 500.

resolve_version

Get exactly the version a stored id names, forever, even after it was superseded or withdrawn: the values, effective dates, citation, verification record and its status today. Version ids (rv_…) come from the id of any rule response. Use it to re-check the value a decision relied on, or to show an auditor which rule applied. Example: {"version_id": "rv_000000000000000000000000F2"}. Informational only, not legal advice.

ArgumentTypeDescription
version_id (required)stringA version id from a rule response's id, e.g. rv_000000000000000000000000F2.

What comes back

The API's response, unchanged. Each value has its citation (source URL, verbatim excerpt and the saved copy), the dates it applies, how it was verified, and a version ID (rv_…) to record with a decision. Where levels of government stack, each level is its own entry; Juriset never merges them and never computes an answer for a case.

Security

  • Every tool is read-only and says so (readOnlyHint), so a client that honours it can skip the approval prompt.
  • The local server runs on your machine and talks only to https://api.juriset.dev.
  • The hosted server is stateless. It passes your key to the API for that one request and never logs or stores it; keyless callers are counted by their own IP address.
  • Keys never appear in a tool result, so they cannot leak into a transcript through Juriset.

Troubleshooting

ProblemFix
uvx: command not foundInstall uv, then restart the client so it sees the new PATH. The npm package runs through uv too. Or use the hosted server, which needs nothing installed.
The client shows no Juriset toolsRestart the client after editing its config, and check the JSON is valid. Most clients show the server's log in their MCP settings.
rate_limited (429)The keyless limit (60 an hour, 500 a day per IP address) is spent. The error says when to retry; a key raises the limit to your plan's.
plan_required (403)History, as_of and the change feed need a key on the Developer plan or up. Set JURISET_API_KEY, or send the key to the hosted server as a bearer token.
jurisdiction_not_found (404)The agent guessed a slug. Ask it to call list_jurisdictions first; the error lists close matches when there are any.
Behind a corporate proxyThe local server calls https://api.juriset.dev over HTTPS and honours the usual HTTPS_PROXY variable. Allow that host, or mcp.juriset.dev for the hosted server.

Use with AI

Paste this into Claude Code, Codex, Cursor or any coding agent. It points the agent at this guide and at the machine-readable docs, so it works from Juriset's own descriptions rather than from memory.

Read https://juriset.dev/docs/mcp.
Add the Juriset MCP server to your own configuration: the local package (uvx juriset-mcp) if uv is installed, otherwise the hosted server at https://mcp.juriset.dev/mcp. If JURISET_API_KEY is set in my environment, pass it through; never ask me to paste it.
Then check it works: call list_jurisdictions for Ontario, then get_rule for minimum_wage there, and show me the value, its effective date, the citation URL and the version id.

Informational only. Not legal advice. Verify with the cited source.