MCP tool reference
Look up the six examiner tools, their inputs, return values, defaults, and failure conditions.
Use your client’s live tools/list response to confirm the deployed schemas. This page documents the service in mcp_server.py and the durable-job behavior in mcp_jobs.py. Structured conveyances have domain rules beyond the transport’s object schema.
Tools and cost
| Tool | Purpose | Invokes title models |
|---|---|---|
list_surveys | List registered cases | No |
compute_mineral_ownership | Calculate supplied conveyances with exact fractions | No |
mineral_buying_summary | Calculate net mineral acres from supplied conveyances | No |
start_title_exam | Launch a durable examination | Yes |
get_title_exam_status | Inspect a saved job | No |
get_title_exam_results | Read its summary or an available report | No |
The hosted transport is Streamable HTTP with a static bearer key. See Connect your agent for authentication. The shared key permits access to registered cases and paid starts; it does not provide personal accounts or case-specific permissions.
Tool results and the MCP envelope
The examples below show application data, not complete MCP protocol envelopes. Check the tool result’s isError before using its content.
In the locked Python SDK, list_surveys exposes an array under structuredContent.result, and may include separate text parts for individual rows. Start, status, and result tools expose structured objects. The two arithmetic tools return JSON in text content; a client must support that form as well as structured content.
An HTTP authentication failure is a transport error. A validation failure after tool dispatch is an MCP tool error. HTTP success alone does not prove that a tool succeeded.
list_surveys
Return the registered survey names and their county/abstract context. Use the exact returned survey value when selecting a pilot case.
Inputs: none. Pass an empty object:
{}
Return data: an array of objects with these fields:
| Field | Type | Meaning |
|---|---|---|
survey | string | Exact registered case name |
county | string | Configured county, or an empty string |
abstract | string | Configured abstract, or an empty string |
The list is configuration data, not evidence that every case has usable PDFs. The owner prepares and confirms the case packet before a paid run.
compute_mineral_ownership
Calculate current mineral fee interests from a chronological list of structured conveyances. The tool uses exact rational arithmetic and makes no model calls.
| Input | Type | Required | Default |
|---|---|---|---|
conveyances | array of objects | Yes | None |
Conveyance fields
| Field | Type | Default | Meaning |
|---|---|---|---|
vol_pg | string | "" | Instrument volume/page label |
kind | string | DEED | PATENT, DEED, or PROBATE; unrecognized values become DEED |
grantor | string | "" | Party conveying the interest |
grantee | string | "" | Party receiving the interest |
affects_minerals | boolean | true | Whether the record affects the mineral calculation |
fraction | fraction string or null | null | Conveyed fraction; null or omitted means all of the grantor’s interest |
fraction_of | string | GRANTOR | GRANTOR for the grantor’s interest; TRACT for the whole tract |
reservations | array of objects | [] | Reserved interests, described below |
probate_shares | object | {} | Heir names mapped to their shares of the decedent’s estate |
community | boolean | false | Whether the probate calculation treats the interest as community property |
surviving_spouse | string | "" | Surviving spouse’s name for that calculation |
The tool does not sort records or accept a date field. Supply chronological order. Use estate shares in probate_shares, rather than pre-multiplied tract fractions.
Each reservation has fraction, type, and of:
| Field | Type | Default | Meaning |
|---|---|---|---|
fraction | fraction string | Required | Reserved fraction between zero and one |
type | string | MI | Mineral interest (MI) or royalty burden (NPRI or RI); unrecognized types become MI |
of | string | TRACT | Fraction basis, TRACT or GRANTOR |
Use the documented values. The nested object schema does not enforce every enum or spelling. In particular, an unrecognized fraction basis is not a reliable way to request a different calculation.
Request and response example
This fictional patent followed by a half-tract deed leaves Samuel Hale and Thomas Reed with equal mineral fee interests:
{
"conveyances": [
{"vol_pg": "10/1", "kind": "PATENT", "grantee": "Samuel Hale"},
{
"vol_pg": "20/1",
"kind": "DEED",
"grantor": "Samuel Hale",
"grantee": "Thomas Reed",
"fraction": "1/2",
"fraction_of": "TRACT"
}
]
}
The successful application data is:
{
"mineral_interests": {"Samuel Hale": "1/2", "Thomas Reed": "1/2"},
"mineral_decimals": {"Samuel Hale": 0.5, "Thomas Reed": 0.5},
"npri_burdens": {},
"life_estates": {},
"mineral_fee_sum": "1",
"flags": [],
"verification_scope": "arithmetic integrity only; it does not prove a complete or legally verified title chain",
"verified": true
}
Return fields
| Field | Type | Meaning |
|---|---|---|
mineral_interests | object of fraction strings | Mineral fee fraction by owner |
mineral_decimals | object of numbers | Decimal equivalents |
npri_burdens | object of fraction strings | Royalty burdens outside the mineral fee |
life_estates | object of strings | Remainderman-to-life-estate-holder mapping |
mineral_fee_sum | fraction string | Sum of mineral fee interests |
flags | array of strings | Calculation issues requiring review |
verification_scope | string | Scope of the arithmetic assertion |
verified | boolean | Fee sum equals one and no calculation flags exist |
verified=true applies to the supplied list. Missing real-world records can leave that list internally consistent. It does not establish legal title.
Failure conditions
Malformed or out-of-range explicit fractions return a tool error, including deed fractions, reservation fractions, and probate shares. Only an omitted or null deed fraction means all of the grantor’s interest.
An oversized mineral reservation produces an INVALID_RESERVATION review flag. A reservation that consumes an entire explicit partial grant also requires review. Invalid interests block an unqualified deterministic result. See Accuracy and limits for the remaining interpretation limits.
mineral_buying_summary
Calculate net mineral acres (NMA) for supplied interests using independently checked subject-tract acreage.
| Input | Type | Required | Default | Meaning |
|---|---|---|---|---|
conveyances | array of objects | Yes | None | Same chronological format as compute_mineral_ownership |
gross_acres | number | Yes | None | Gross acreage of the subject tract |
survey | string | No | "" | Report label |
county | string | No | "" | Report label |
Reuse the fictional conveyances above and add gross_acres: 100. Each half-interest yields 50 NMA. The worked arithmetic prompts include a complete buying request.
| Return field | Type | Meaning |
|---|---|---|
closeable | boolean | Deterministic report status, subject to its stated scope |
total_acquirable_nma | number or null | Total calculable NMA |
acquirable | array of objects | Each entry has owner, nma (number or null), and life_estate (holder or an empty string) |
royalty_burdens | array of objects | Each entry has owner and fraction string fraction |
curative_items | array of strings | Conditions requiring review or correction |
closeable_scope | string | Limits closeable to the deterministic calculation |
nma_scope | string | Explains the supplied-chain requirement |
report_text | string | Human-readable buying report |
NMA values are null unless the mineral fee sums to one, the calculation has no flags, and gross acreage is positive. Nonpositive acreage creates a curative item. NPRI burdens are separate from mineral fee acreage.
closeable is not landman approval or a legal opinion. It cannot detect every omitted record or incorrect input interpretation. Malformed fractions fail as described for compute_mineral_ownership.
start_title_exam
Launch a detached examination and return its job ID immediately. This tool uses paid models. Start only after selecting a prepared case and agreeing on spend.
| Argument | Type | Required | Default | Constraints |
|---|---|---|---|---|
survey_name | string | Yes | None | Exact registered name, or supported ad hoc case name; trimmed, at most 160 characters |
docs_dir | string | No | "" | Existing server directory resolving below project data/, containing lowercase *.pdf files |
county | string | No | "" | Required for ad hoc cases |
abstract | string | No | "" | Case context, such as A-100 |
state | string | No | TX | Two alphabetic characters, uppercased |
seed_ref | string | No | "" | Empty for folder scope; fixture seed must be a filename, not a path; at most 300 characters |
provider | enum | No | fixture | fixture, exa, openarchive, browserbase, or composite |
driver | enum or null | No | null | Null resolves to hosted bfs or local stdio agent; hosted agent is rejected |
max_docs | integer | No | 50 | From 1 to 500 |
budget | number or null | No | null | Finite and positive when supplied; mandatory for web providers |
cost_per_doc | number | No | 0 | Finite and nonnegative; positive for web providers |
validate | boolean | No | false | Request the optional advisory validation stage |
allow_browser | boolean | No | false | Requires browserbase/composite and host sourcing opt-in |
allow_purchase | boolean | No | false | Requires browser opt-in, compatible provider, and host purchase opt-in |
survey_name, county, and abstract reject controls and have a 160-character limit. Context strings do not select a different legal workflow; the documented use case is Texas oil and gas records.
Case scope
- Registered case: supply an exact
survey_name. The owner has configured its PDF directory and context. An explicit validdocs_diroverrides the directory for that request. - Ad hoc case with PDFs: supply a server-side
docs_dirandcounty. - Ad hoc case without PDFs: only
exaandbrowserbasesupport an empty directory; supply county and a nonempty seed. Other providers require a PDF directory.
There is no upload operation. A laptop directory path does not transfer files to the server. See Documents and sourcing for provider capabilities and identity checks.
Paid request template
Replace the survey placeholder with a value returned by list_surveys. This is a request template, not a runnable fictional case:
{
"survey_name": "<exact registered survey>",
"provider": "fixture",
"driver": "bfs",
"max_docs": 50,
"validate": false,
"allow_browser": false,
"allow_purchase": false
}
The response has a generated lowercase UUID:
{
"job_id": "<generated UUID>",
"state": "queued",
"status_tool": "get_title_exam_status",
"results_tool": "get_title_exam_results"
}
The default deployment admits one queued or running examination. A busy server rejects another start; it does not place the request in a waiting queue. A lost client connection does not cancel the worker.
Gates and acquisition budget
Browser sourcing requires both ALLOW_BROWSER_SOURCING on the host and allow_browser=true in the request. Purchases also require ALLOW_BROWSER_PURCHASE and allow_purchase=true. Admission and execution check these independently. Both host gates are off in the pilot.
budget tracks estimated acquisition spend using cost_per_doc. It does not cap the total bill for models, search, browser sessions, and records. The ledger can exceed its threshold by one document estimate, and a charged but refused provider delivery can be absent from it. Use separate provider spending controls.
Invalid inputs, unsupported case combinations, disabled host gates, and occupied concurrency return tool errors. See Start-request errors for messages and corrective actions.
get_title_exam_status
Inspect one saved job. This call also reconciles a queued/running record whose worker has stopped.
| Input | Type | Required | Default |
|---|---|---|---|
job_id | string | Yes | None |
Use the generated lowercase UUID. The tool accepts no filesystem path.
| Return field | Type | Meaning |
|---|---|---|
job_id | string | Saved job ID |
state | string | queued, running, complete, incomplete, or failed |
created_at, started_at, finished_at | timestamp string or null | UTC lifecycle times; unavailable values can be null |
error | string or null | Bounded public error description |
summary | object | Fields listed below |
Summary fields
| Field | Type | Meaning |
|---|---|---|
stop_reason | string or null | Current available sourcing terminus |
docs_read | integer or null | Stored count; can be unavailable while running |
reports_ready | boolean | Current LRS and LOR exist for the stored sourced set |
completion_state | string | complete if both coverage and analysis criteria pass; otherwise incomplete |
coverage_limited | boolean | A document/depth cap dropped work |
coverage_complete | boolean | Manifest exists, no cap/depth drop, and supported successful termination |
analysis_complete | boolean | Current reports plus readable nonempty QA checkpoint, without known QA failure |
qa_review_failed | boolean | Known QA failure |
qa_review_artifact_ready | boolean | Usable QA checkpoint exists |
artifacts | object of booleans | Availability of the six fixed report artifacts |
review_flags | array of strings | Allow-listed workflow codes, not a full title-risk inventory |
review_notes | array of strings | Bounded summaries excluding raw provider text |
reports_ready requires a sourcing manifest and LRS/LOR timestamps at least as recent as that manifest. A filename alone does not prove freshness.
There is no live phase, percentage, or actual spend field. A missing count is not evidence that the worker has stalled. Read Review examination results before relying on a completed status.
Sourcing stop reasons
| Value | Meaning |
|---|---|
PATENT_REACHED | Frontier drained, patent reached, and no unresolved cited predecessor |
ROOT_OF_RECORD | Frontier drained at the available record’s earliest point, without an unresolved cited predecessor |
DEAD_END_RED | A cited predecessor remains unresolved, even if another branch reached a patent |
BUDGET_EXHAUSTED | Estimated acquisition ledger reached its threshold |
FRONTIER_DRAINED | Supported stored-state value; the current evaluator normally uses ROOT_OF_RECORD |
NOT_DONE | Internal continuation value, not a finished result |
The default sourcing depth is 40. A terminus can look successful while coverage_limited=true keeps completion incomplete.
Invalid IDs return job_id must be a UUID generated by start_title_exam. A valid-format ID without a record returns unknown job_id.
get_title_exam_results
Read a summary or one available bounded report for a saved job.
| Input | Type | Required | Default |
|---|---|---|---|
job_id | string | Yes | None |
artifact | enum | No | summary |
| Artifact | Server file | Returned format |
|---|---|---|
summary | Computed summary | Object |
lrs | 5_lrs.csv | CSV in text content |
lor | 5_lor.txt | Text in content |
buying | 6_buying.txt | Text in content |
review_sheet | review.csv | CSV in text content |
faithfulness | 7_faithfulness.json | JSON serialized in text content |
validation | 4_validation_report.json | Optional JSON serialized in text content |
A summary result has job_id, state, and summary. A report result adds artifact and string content.
Non-summary reads require reports_ready=true and the requested file to exist. An incomplete job can meet this condition and expose partial reports. Preserve that label in your review.
Reads stop at 100,000 bytes and append [truncated] if more content exists. There is no pagination or full-file download tool. Ask the owner for the full private artifact when truncation matters.
Unavailable current reports return current reports are not ready; use get_title_exam_status. A missing selected file returns artifact '<name>' is not available. Read the availability map before requesting optional validation.
Interface limits
The six tools cannot upload documents, list past jobs, cancel workers, save corrections, resume existing jobs, configure providers, or rotate credentials. Source PDFs, engine logs, raw extraction checkpoints, and arbitrary paths are not exposed.
Use First examination for the start/status/results sequence and Troubleshooting for recovery without duplicate work.