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
Findings (13)
- HIGH
- MEDIUMin law.list_coverage
- LOWin law.search
- LOWin law.get_node
- LOWin law.list_coverage
- LOWin account.status
- LOWin formation.requirements
- LOWin formation.compare
- LOWin formation.lookup_naics
- LOWin formation.handoff
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (10)
๐ข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
law.searchlaw.searchlaw.get_nodelaw.get_nodelaw.list_coverageCommunity
Evidence