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
| Setting | Value |
|---|---|
| Package | juriset-mcp on PyPI and npm; runs on your machine |
| Hosted | https://mcp.juriset.dev/mcp, streamable HTTP, nothing to install |
| Registry | dev.juriset/juriset in the official MCP registry |
| Tools | 8, all read-only |
| Key | Optional; 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
- For the local server, install uv. For the hosted server, skip this.
- Add Juriset to your client with the snippet for it below, and restart the client.
- 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
claude mcp add juriset -- uvx juriset-mcp
Or the hosted server:
claude mcp add --transport http juriset https://mcp.juriset.dev/mcp
Codex
[mcp_servers.juriset] command = "uvx" args = ["juriset-mcp"]
Cursor
{
"mcpServers": {
"juriset": {
"command": "uvx",
"args": [
"juriset-mcp"
]
}
}
}VS Code
{
"servers": {
"juriset": {
"type": "stdio",
"command": "uvx",
"args": [
"juriset-mcp"
]
}
}
}Windsurf
{
"mcpServers": {
"juriset": {
"command": "uvx",
"args": [
"juriset-mcp"
]
}
}
}Gemini CLI
{
"mcpServers": {
"juriset": {
"command": "uvx",
"args": [
"juriset-mcp"
]
}
}
}Claude Desktop
{
"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": {
"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": {
"juriset": {
"command": "uvx",
"args": [
"juriset-mcp"
],
"env": {
"JURISET_API_KEY": "jrs_live_…"
}
}
}
}For the hosted server, send it as a bearer token:
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
| Tool | What it does |
|---|---|
list_jurisdictions | List the US and Canadian jurisdictions Juriset covers, or find one by name. |
list_rule_types | List the kinds of rule Juriset publishes. |
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. |
get_rule_as_of | Get the rule that was (or will be) in effect on a date, in the same shape as get_rule. |
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. |
compare_jurisdictions | Get one rule type across jurisdictions in one call, each entry in the same shape as get_rule. |
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. |
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. |
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.
| Argument | Type | Description |
|---|---|---|
query | string | A 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.
| Argument | Type | Description |
|---|---|---|
domain | string | Only 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).
| Argument | Type | Description |
|---|---|---|
rule_type (required) | string | Rule type slug from list_rule_types, e.g. minimum_wage, overtime. |
jurisdiction (required) | string | Jurisdiction slug from list_jurisdictions, e.g. us-wa (Washington), us (US federal), ca-ab (Alberta). |
domain | string | The 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.
| Argument | Type | Description |
|---|---|---|
rule_type (required) | string | Rule type slug from list_rule_types, e.g. minimum_wage, overtime. |
jurisdiction (required) | string | Jurisdiction slug from list_jurisdictions, e.g. us-wa (Washington), us (US federal), ca-ab (Alberta). |
domain | string | The rule type's domain, e.g. employment. Optional: when omitted it is looked up from the rule type. |
as_of (required) | string | The 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.
| Argument | Type | Description |
|---|---|---|
rule_type (required) | string | Rule type slug from list_rule_types, e.g. minimum_wage, overtime. |
jurisdiction (required) | string | Jurisdiction slug from list_jurisdictions, e.g. us-wa (Washington), us (US federal), ca-ab (Alberta). |
domain | string | The 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.
| Argument | Type | Description |
|---|---|---|
rule_type (required) | string | Rule type slug from list_rule_types, e.g. minimum_wage. |
domain | string | The rule type's domain, e.g. employment. Optional: when omitted it is looked up from the rule type. |
jurisdictions | list of string | Up to 100 jurisdiction slugs, any level, e.g. ["us-wa", "us-or", "us-ca"]. Not with level. |
level | list of string | Instead of jurisdictions: every jurisdiction at these levels, e.g. ["state", "province"] (the default). |
as_of | string | A 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.
| Argument | Type | Description |
|---|---|---|
since | string | Where to start: an ISO 8601 date or date-time, e.g. 2026-10-01 (midnight UTC). Give this or cursor. |
cursor | string | The cursor of the previous response, to continue or to poll for new changes. |
jurisdictions | list of string | Jurisdiction slugs, e.g. ["us", "us-wa"]; each matches its own rules only. |
rule_type | string | Only this rule type, e.g. overtime. |
domain | string | Only this domain, e.g. employment. |
limit | integer | Changes 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.
| Argument | Type | Description |
|---|---|---|
version_id (required) | string | A 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
| Problem | Fix |
|---|---|
| uvx: command not found | Install 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 tools | Restart 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 proxy | The 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.