Corpus Law

Search and cite US law from official sources, then form an LLC or nonprofit with free agent tools.

Should I use this

Quality & Safety

B
Description quality
98%
Schema completeness
90%
Naming quality
62%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (13)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'law.list_coverage' description contains placeholder textin law.list_coverage
  • LOWTool 'law.search' doesn't follow camelCase/snake_casein law.search
  • LOWTool 'law.get_node' doesn't follow camelCase/snake_casein law.get_node
  • LOWTool 'law.list_coverage' doesn't follow camelCase/snake_casein law.list_coverage
  • LOWTool 'account.status' doesn't follow camelCase/snake_casein account.status
  • LOWTool 'formation.requirements' doesn't follow camelCase/snake_casein formation.requirements
  • LOWTool 'formation.compare' doesn't follow camelCase/snake_casein formation.compare
  • LOWTool 'formation.lookup_naics' doesn't follow camelCase/snake_casein formation.lookup_naics
  • LOWTool 'formation.handoff' doesn't follow camelCase/snake_casein formation.handoff

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,641Tokens (tool definitions)
~4.4 KBTypical response size
Significant attention impact (3.63% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "corpus-legal": {
      "url": "https://corpuslaw.us/api/mcp"
    }
  }
}

Remote endpoints

https://corpuslaw.us/api/mcpstreamable-http

What it can do

Tool inventory

Tools (10)

๐ŸŸข Read-only๐ŸŸก Write๐Ÿ”ด Deleteโšช Unknown
๐ŸŸขlaw.search(query, jurisdiction, mode, limit)

Searches US federal, state, and municipal law by topic or keyword (legality, permits, zoning, licensing, compliance, filing requirements). Returns ranked provisions with verbatim citations, headings, snippets, and node ids. `jurisdiction` limits results to one state, federal law, or a city.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Natural-language or keyword query, e.g. 'distillery permit requirements'."
    },
    "jurisdiction": {
      "type": "string",
      "description": "Optional short code to scope the search, e.g. 'TX', 'US', or 'CA-SF'. Valid codes are listed by law.list_coverage. Includes the jurisdiction's sub-jurisdictions."
    },
    "mode": {
      "type": "string",
      "enum": [
        "hybrid",
        "semantic",
        "keyword"
      ],
      "default": "hybrid",
      "description": "Retrieval mode. 'hybrid' (default) fuses vector similarity with keyword search."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25,
      "default": 8,
      "description": "Number of results to return (1โ€“25)."
    }
  },
  "required": [
    "query"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸขlaw.get_node(id)

Returns the full official text, citation, and hierarchy of one legal provision, by its node id (the UUID in search results).

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Node UUID, as returned in law.search results."
    }
  },
  "required": [
    "id"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸขlaw.list_coverage

Lists the covered jurisdictions (federal, state, and municipal) with per-jurisdiction provision counts, searchable-chunk counts, GIS status, and a placeholder flag.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
โšชaccount.status(referral_code)

Reports the credit balance, tier, rate limits, and upgrade options for the API key on this connection, or the free-tier allowance and the key URL for an anonymous caller. Free โ€” this call does not consume a credit. Also mints or returns a referral code; `referral_code` on later calls keeps the same referral identity.

Input Schema

{
  "type": "object",
  "properties": {
    "referral_code": {
      "type": "string",
      "description": "An active referral code returned by an earlier account.status call; it keeps the same referral identity. An inactive code is replaced with a new one."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸขformation.requirements(entityType, state)

Returns the intake checklist for forming an LLC (limited liability company) or nonprofit corporation in one US state: every required field, that state's specific questions, live all-in pricing including the state filing fee, and the optional EIN add-on with its price when available. Free; does not consume credits.

Input Schema

{
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "enum": [
        "llc",
        "nonprofit"
      ],
      "description": "Entity type to form."
    },
    "state": {
      "type": "string",
      "description": "Two-letter US state code, e.g. 'MS', 'WY', 'DE'."
    }
  },
  "required": [
    "entityType",
    "state"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸขformation.compare(providers, view, limit)

Compares LLC formation providers on price, recurring costs, registered-agent renewals, and machine/agent capabilities, from a dated dataset of 19 LLC services + 1 adjacent verified against primary sources. Corpus is one of the compared providers and is scored with the same rubric, including its own gaps; the response says so. Free; does not consume credits.

Input Schema

{
  "type": "object",
  "properties": {
    "providers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Specific providers to compare, by name or slug (e.g. ['corpus','legalzoom']). Absent = a ranked field. A name with no dossier is listed in the response rather than dropped."
    },
    "view": {
      "type": "string",
      "enum": [
        "overall",
        "lowest_total_cost",
        "most_transparent",
        "most_agentic",
        "developer"
      ],
      "description": "overall (default, by Agentic Readiness) ยท lowest_total_cost (parsed first-year estimate) ยท most_transparent ยท most_agentic ยท developer (public MCP/API only)."
    },
    "limit": {
      "type": "integer",
      "description": "How many providers to return in a ranked view. Default 5, max 19. Ignored when 'providers' is given."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸขformation.lookup_naics(businessDescription)

Returns candidate NAICS industry codes (typically 2โ€“6) for a plain-English business description. A code is required for every LLC, and for nonprofits in AK, CT, LA, MS, TN, WV. Free; does not consume credits.

Input Schema

{
  "type": "object",
  "properties": {
    "businessDescription": {
      "type": "string",
      "maxLength": 500,
      "description": "What the business does, in plain words."
    }
  },
  "required": [
    "businessDescription"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸขformation.handoff(entityType, state, proposedName, contactEmail, naicsCode, ...)

Validates an LLC or nonprofit formation draft (people, address, management, EIN answers, state-specific answers) and returns exactly what is still missing. A complete draft also returns a prefilled corpuslaw.us link that opens the formation agent with every detail loaded, where the founder reviews, signs in, and pays. Free; does not consume credits.

Input Schema

{
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "enum": [
        "llc",
        "nonprofit"
      ],
      "description": "Entity type to form."
    },
    "state": {
      "type": "string",
      "description": "Two-letter US state code, e.g. 'MS', 'WY', 'DE'."
    },
    "proposedName": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Proposed company name."
    },
    "contactEmail": {
      "type": "string",
      "maxLength": 254,
      "description": "Founder contact email."
    },
    "naicsCode": {
      "type": "string",
      "pattern": "^\\d{2,6}$",
      "description": "NAICS industry code, 2โ€“6 digits (formation.lookup_naics returns candidates)."
    },
    "businessActivity": {
      "type": "string",
      "maxLength": 500,
      "description": "In one plain sentence, what the business actually does, in the founder's words (not the company name). Corpus researches the licenses and permits that apply from this."
    },
    "principalOffice": {
      "type": "object",
      "description": "Principal office address (street, city, state required for a complete draft).",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "state": {
          "type": "string"
        },
        "postalCode": {
          "type": "string"
        }
      }
    },
    "management": {
      "type": "string",
      "enum": [
        "member_managed",
        "manager_managed"
      ],
      "description": "LLC management type."
    },
    "parties": {
      "type": "array",
      "description": "The people. LLC: at least one 'member' and an 'organizer' (one person holding both roles appears as two entries). Nonprofit: an 'incorporator' and at least 3 'director' entries (plus officers where the state requires them).",
      "items": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "enum": [
              "organizer",
              "member",
              "manager",
              "director",
              "incorporator",
              "president",
              "secretary",
              "treasurer"
            ]
          },
          "fullName": {
            "type": "string",
            "maxLength": 120
          },
          "email": {
            "type": "string",
            "maxLength": 254
          }
        },
        "required": [
          "role",
          "fullName"
        ]
      }
    },
    "nonprofit": {
      "type": "object",
      "description": "Nonprofit-only fields.",
      "properties": {
        "purposeStatement": {
          "type": "string",
          "description": "At least 20 characters."
        },
        "hasDissolutionClause": {
          "type": "boolean"
        },
        "exemptionIntent": {
          "type": "string",
          "enum": [
            "none",
            "501c3_later",
            "501c3_now"
          ]
        }
      }
    },
    "ein": {
      "type": "object",
      "description": "Optional EIN (federal tax ID) add-on, when available โ€” formation.requirements states whether it can currently be sold and at what price. `wanted` records the founder's decision. No Social Security Number is accepted here: the founder enters it in a secure panel on corpuslaw.us.",
      "properties": {
        "wanted": {
          "type": "boolean"
        },
        "responsibleParty": {
          "type": "object",
          "properties": {
            "fullName": {
              "type": "string"
            },
            "phone": {
              "type": "string"
            }
          }
        },
        "startDate": {
          "type": "string",
          "description": "Company start date, MM/DD/YYYY."
        },
        "principalActivity": {
          "type": "string",
          "description": "Principal business activity in a few plain words."
        },
        "numberOfMembers": {
          "type": "number"
        },
        "hasEmployees": {
          "type": "boolean",
          "description": "W-2 employees expected in the next 12 months."
        },
        "firstDateWagesPaid": {
          "type": "string",
          "description": "MM/DD/YYYY โ€” only when hasEmployees."
        },
        "agriculturalEmployees": {
          "type": "number"
        },
        "otherEmployees": {
          "type": "number"
        },
        "taxLiabilityUnder1000": {
          "type": "boolean"
        },
        "trucking": {
          "type": "boolean"
        },
        "gambling": {
          "type": "boolean"
        },
        "exciseTax": {
          "type": "boolean"
        },
        "sellsTobaccoAlcoholFirearms": {
          "type": "boolean"
        }
      }
    },
    "stateSpecificAnswers": {
      "type": "object",
      "description": "Per-state quirk answers under the EXACT keys shown by formation.requirements (e.g. \"would_you_like_to_list_members_managers_on_the_state_record\"). Values are strings or booleans.",
      "additionalProperties": {
        "type": [
          "string",
          "boolean"
        ]
      }
    },
    "expedite": {
      "type": "boolean",
      "description": "Optional expedited state filing, available only in states where formation.requirements lists an EXPEDITE line (the price and listed days are in that line). true records that the founder chose it."
    },
    "expediteSkipReview": {
      "type": "boolean",
      "description": "Optional, with expedite: true, where formation.requirements shows a SKIP REVIEW line. true records that the founder heard that SKIP REVIEW sentence verbatim and explicitly agreed. It takes effect only on an order an agent pays for directly, where the founder's email confirmation page shows the choice again before anything is filed. A handoff link ignores it: on the page the founder ticks it themselves."
    },
    "referral_code": {
      "type": "string",
      "description": "A referral code issued by account.status. With a valid code the founder saves 25% of the Corpus service fee and the order is credited to the code; an absent or unrecognised code changes nothing about the link."
    }
  },
  "required": [
    "entityType",
    "state"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
๐ŸŸกformation.checkout(draft, contactEmail, consent, idempotencyKey, orderId, ...)

Creates the founder's LLC or nonprofit formation order and a USDC (Solana) payment request โ€” no API key, no Corpus sign-in. Payment is USDC on Solana ONLY. The first call takes the complete draft, the founder's contactEmail, an idempotencyKey (the same order is returned on retry), and consent { version, registeredAgentAcknowledgements: true }, which records that the founder accepted the registered-agent acknowledgements. A queue-lane order first returns a submission promise, accepted with a second call { orderId, trackingToken, acceptPromise: { termDays } }. The payment response includes a payPageUrl: an ordinary https link to a Corpus page with a QR code to scan with a phone camera, a button that opens a Solana wallet, and the address and exact amount for a manual send. The founder pays the exact amount from a self-custody wallet (never an exchange withdrawal; refunds go only to the sending wallet) and must click the confirmation link Corpus emails within 48 hours, or the order is refunded. Nothing is filed before that confirmation, and then Corpus's human review, unless the founder chose to skip review on an expedited order (offered only where formation.requirements shows a SKIP REVIEW line). The tax-ID add-on is not sold here. Free; does not consume credits.

Input Schema

{
  "type": "object",
  "properties": {
    "draft": {
      "type": "object",
      "description": "First call: the complete formation draft, the same shape formation.handoff takes.",
      "properties": {
        "entityType": {
          "type": "string",
          "enum": [
            "llc",
            "nonprofit"
          ],
          "description": "Entity type to form."
        },
        "state": {
          "type": "string",
          "description": "Two-letter US state code, e.g. 'MS', 'WY', 'DE'."
        },
        "proposedName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Proposed company name."
        },
        "contactEmail": {
          "type": "string",
          "maxLength": 254,
          "description": "Founder contact email."
        },
        "naicsCode": {
          "type": "string",
          "pattern": "^\\d{2,6}$",
          "description": "NAICS industry code, 2โ€“6 digits (formation.lookup_naics returns candidates)."
        },
        "businessActivity": {
          "type": "string",
          "maxLength": 500,
          "description": "In one plain sentence, what the business actually does, in the founder's words (not the company name). Corpus researches the licenses and permits that apply from this."
        },
        "principalOffice": {
          "type": "object",
          "description": "Principal office address (street, city, state required for a complete draft).",
          "properties": {
            "line1": {
              "type": "string"
            },
            "line2": {
              "type": "string"
            },
            "city": {
              "type": "string"
            },
            "state": {
              "type": "string"
            },
            "postalCode": {
              "type": "string"
            }
          }
        },
        "management": {
          "type": "string",
          "enum": [
            "member_managed",
            "manager_managed"
          ],
          "description": "LLC management type."
        },
        "parties": {
          "type": "array",
          "description": "The people. LLC: at least one 'member' and an 'organizer' (one person holding both roles appears as two entries). Nonprofit: an 'incorporator' and at least 3 'director' entries (plus officers where the state requires them).",
          "items": {
            "type": "object",
            "properties": {
              "role": {
                "type": "string",
                "enum": [
                  "organizer",
                  "member",
                  "manager",
                  "director",
                  "incorporator",
                  "president",
                  "secretary",
                  "treasurer"
                ]
              },
              "fullName": {
                "type": "string",
                "maxLength": 120
              },
              "email": {
                "type": "string",
                "maxLength": 254
              }
            },
            "required": [
              "role",
              "fullName"
            ]
          }
        },
        "nonprofit": {
          "type": "object",
          "description": "Nonprofit-only fields.",
          "properties": {
            "purposeStatement": {
              "type": "string",
              "description": "At least 20 characters."
            },
            "hasDissolutionClause": {
              "type": "boolean"
            },
            "exemptionIntent": {
              "type": "string",
              "enum": [
                "none",
                "501c3_later",
                "501c3_now"
              ]
            }
          }
        },
        "ein": {
          "type": "object",
          "description": "Optional EIN (federal tax ID) add-on, when available โ€” formation.requirements states whether it can currently be sold and at what price. `wanted` records the founder's decision. No Social Security Number is accepted here: the founder enters it in a secure panel on corpuslaw.us.",
          "properties": {
            "wanted": {
              "type": "boolean"
            },
            "responsibleParty": {
              "type": "object",
              "properties": {
                "fullName": {
                  "type": "string"
                },
                "phone": {
                  "type": "string"
                }
              }
            },
            "startDate": {
              "type": "string",
              "description": "Company start date, MM/DD/YYYY."
            },
            "principalActivity": {
              "type": "string",
              "description": "Principal business activity in a few plain words."
            },
            "numberOfMembers": {
              "type": "number"
            },
            "hasEmployees": {
              "type": "boolean",
              "description": "W-2 employees expected in the next 12 months."
            },
            "firstDateWagesPaid": {
              "type": "string",
              "description": "MM/DD/YYYY โ€” only when hasEmployees."
            },
            "agriculturalEmployees": {
              "type": "number"
            },
            "otherEmployees": {
              "type": "number"
            },
            "taxLiabilityUnder1000": {
              "type": "boolean"
            },
            "trucking": {
              "type": "boolean"
            },
            "gambling": {
              "type": "boolean"
            },
            "exciseTax": {
              "type": "boolean"
            },
            "sellsTobaccoAlcoholFirearms": {
              "type": "boolean"
            }
          }
        },
        "stateSpecificAnswers": {
          "type": "object",
          "description": "Per-state quirk answers under the EXACT keys shown by formation.requirements (e.g. \"would_you_like_to_list_members_managers_on_the_state_record\"). Values are strings or booleans.",
          "additionalProperties": {
            "type": [
              "string",
              "boolean"
            ]
          }
        },
        "expedite": {
          "type": "boolean",
          "description": "Optional expedited state filing, available only in states where formation.requirements lists an EXPEDITE line (the price and listed days are in that line). true records that the founder chose it."
        },
        "expediteSkipReview": {
          "type": "boolean",
          "description": "Optional, with expedite: true, where formation.requirements shows a SKIP REVIEW line. true records that the founder heard that SKIP REVIEW sentence verbatim and explicitly agreed. It takes effect only on an order an agent pays for directly, where the founder's email confirmation page shows the choice again before anything is filed. A handoff link ignores it: on the page the founder ticks it themselves."
        }
      },
      "required": [
        "entityType",
        "state"
      ]
    },
    "contactEmail": {
      "type": "string",
      "maxLength": 254,
      "description": "First call: the founder's email. The confirmation link is sent here; nothing files until they click it."
    },
    "consent": {
      "type": "object",
      "description": "First call: the founder's attestation to the registered-agent acknowledgements, which the founder heard verbatim. `version` is the consentVersion formation.requirements shows.",
      "properties": {
        "version": {
          "type": "string",
          "description": "The consentVersion of the acknowledgement text the founder accepted."
        },
        "registeredAgentAcknowledgements": {
          "type": "boolean",
          "const": true
        }
      },
      "required": [
        "version",
        "registeredAgentAcknowledgements"
      ]
    },
    "idempotencyKey": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{8,128}$",
      "description": "A random id, one per order and reused on every retry; the same key returns the same order for 24 hours."
    },
    "orderId": {
      "type": "string",
      "description": "Second call (or to refresh an expired charge): the orderId returned earlier."
    },
    "trackingToken": {
      "type": "string",
      "description": "Second call: the trackingToken returned with the orderId."
    },
    "acceptPromise": {
      "type": "object",
      "description": "Second call, queue lane only: the founder accepted the submission promise with this many days.",
      "properties": {
        "termDays": {
          "type": "integer",
          "minimum": 1,
          "maximum": 90
        }
      },
      "required": [
        "termDays"
      ]
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}
โšชformation.payment_status(orderId, trackingToken)

Reports the USDC payment state of an LLC or nonprofit formation order created by formation.checkout: awaiting, paid, expired, underpaid or held, plus whether the founder has confirmed by email (required within 48 hours of payment). Reading the chain also records a payment that just arrived. Free; does not consume credits.

Input Schema

{
  "type": "object",
  "properties": {
    "orderId": {
      "type": "string",
      "description": "The orderId formation.checkout returned."
    },
    "trackingToken": {
      "type": "string",
      "description": "The trackingToken formation.checkout returned."
    }
  },
  "required": [
    "orderId",
    "trackingToken"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Human-readable tool result (also mirrored in content[].text)."
    },
    "isError": {
      "type": "boolean",
      "description": "True when the tool could not complete successfully."
    }
  },
  "required": [
    "text"
  ]
}

Recommended Prompts

search_research
Search for information about [topic] using Corpus Law
Expected tools: law.search
find_specific
Find [specific item] using Corpus Law
Expected tools: law.search
retrieve_data
Get details about [item] from Corpus Law
Expected tools: law.get_node
fetch_info
Fetch [information type] using Corpus Law
Expected tools: law.get_node
list_items
List all [items] available in Corpus Law
Expected tools: law.list_coverage

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
verifiedversion not recorded10 tools