Documentation
MCP server
20 read-only tools over prior-art retrieval, patent space, and §112 claim analysis. One endpoint, one bearer token, no session to manage.
Endpoint
POST https://mcp.antecedint.com/api/v1/mcp
Each tool calls an endpoint on the REST API with your own key, so a tool call and a direct call cost the same and count once.
Sign in and your key is issued on the spot. Then these examples fill in with it and run.
Sign inConnect
Most hosts take a URL and a header. Paste this into your client's config, restart it, and the 20 tools appear.
{
"mcpServers": {
"antecedint": {
"url": "https://mcp.antecedint.com/api/v1/mcp",
"headers": { "Authorization": "Bearer ak_live_..." }
}
}
}To check a key by hand before wiring anything up, list the tools:
curl -sS https://mcp.antecedint.com/api/v1/mcp \
-H 'Authorization: Bearer ak_live_...' \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' Your key goes on every request, including initialize. Sign in if you do not have one; it is issued on the spot.
Tools
Every tool is read-only: nothing here writes to a file, a docket, or a case. The descriptions below are the exact strings tools/list returns, because this page is generated from the same registry.
Prior Art Search
Timeout 120s
Semantic prior-art search over 10.5M+ US patents for a claim and/or abstract. Two-stage neural retrieval (fine-tuned dense encoder + optional late-interaction reranker) plus a citation-graph channel. Returns ranked references with titles, abstracts and similarity scores. Full claim text is NOT included by default: set includeClaims, or rank first and pull the few worth reading with get_patent_claims, which is the cheaper shape for most work. Specification bodies are never returned. Pass filedBefore with the priority date of the application you are searching for: prior art must predate the invention, and without that bound the results include later filings that cannot be cited.
Parameters
| Name | Type | Description |
|---|---|---|
| claims | string | Claim text (independent claim 1 works best). (min length 10, max length 20000) |
| abstract | string | Optional abstract or invention summary. (max length 10000) |
| count | integer | Number of references to return (default 50). (min 1, max 100) |
| rerank | boolean | Apply the ColBERT reranker to the top results (slower, higher precision). |
| filedBefore | string | Exclude references filed on or after this date (YYYY, YYYY-MM or YYYY-MM-DD). Prior art must predate the invention it is cited against, so pass the priority date of the application being searched. Without it the results include later filings, which cannot be cited as prior art against it. |
| hybrid | boolean | Also run keyword (BM25) search over titles and abstracts and fuse the rankings (default false). Set it when your query uses a term of art: the encoder was trained on meaning and does not guarantee an exact phrase outranks a paraphrase, so dense search alone can miss a document that names the thing. Each result gains matched_legs, how many of the three retrievers found it. |
| hyde | boolean | Rewrite the query into patent language before searching (default false). A model drafts a hypothetical abstract and first claim for what you described, and that is searched instead. Set it when you have a description rather than claim text: the index holds formal claim language and a plain-English query has to cross that gap unaided. Do NOT set it when you already have a claim, which is the strongest query available. Adds about two seconds. metadata.hyde returns the generated text. |
| includeClaims | boolean | Return full claim text for every reference (default false). The lookup adds about a second regardless of how many references are asked for, so leaving this off and calling get_patent_claims on the two or three worth reading is usually faster overall. While it is off, each result carries title_source: "namespace", meaning the title came from the vector index rather than the authoritative lookup and may name another patent. |
| cpc3 | string[] | Restrict to these CPC subclasses, e.g. ["H01M","F28D"]. Useful for a second pass once a first search has shown which art areas matter. CPC data covers about 65% of the index and an unclassified reference is excluded by this filter rather than ranked lower, so a first search should usually leave it unset. |
Patent Claim Text
Timeout 120s
Fetch full claim text and abstracts for specific US application numbers, up to 25 per call. Use after search_prior_art to read the references worth reading: the search ranks and this returns the text, so a search of fifty does not pay to fetch fifty full claim sets. Titles here come from the authoritative lookup table rather than the vector index.
Parameters
| Name | Type | Description |
|---|---|---|
| appNumbers req | string[] | US application numbers, digits only. These are the application_number values a search returns. (max 25 items) |
Patent Neighborhood
Timeout 120s
Given a US application number, return its position in Antecedint's semantic patent space plus its nearest semantic neighbors (similar patents with similarity scores).
Parameters
| Name | Type | Description |
|---|---|---|
| appNum req | string | US application number, digits only (7-12 digits). (pattern ^\d{7,12}$) |
| topK | integer | Number of neighbors (default 20). (min 1, max 100) |
Cited Prior Art Map
Timeout 120s
For a US application number, return its cited prior art (examiner-cited references flagged and listed first) resolved to patent-space positions. Useful for seeing what an examiner actually cited against an application.
Parameters
| Name | Type | Description |
|---|---|---|
| appNum req | string | US application number, digits only. (pattern ^\d{7,12}$) |
| year | integer | Filing year of the citing application, if known (makes the lookup faster). (min 1970, max 2035) |
Semantic Patent-Space Locate
Timeout 120s
Semantic search into patent space: give free text (or a US application number) and get the nearest patents with similarity scores plus a landing position. A fast way to find the closest existing art to any technical text.
Parameters
| Name | Type | Description |
|---|---|---|
| query | string | Free-text technical description to locate. Provide either query or appNum. (min length 8, max length 4000) |
| appNum | string | US application number to locate by its own abstract + first claim. (pattern ^\d{7,12}$) |
| topK | integer | Number of nearest patents (default 20). (min 1, max 100) |
Antecedent Basis Check
Timeout 120s
Check a claim set for §112(b) antecedent-basis defects. Finds definite recitations ("the widget", "said widget") with no earlier indefinite recitation in the same claim or in a claim it depends from, plus double inclusions, plural/singular mismatches, and improper dependencies. Implicit antecedent basis (MPEP 2173.05(e)) is suppressed, so "the outer surface of the housing" is not flagged. Findings are graded high/medium/low: high means no plausible antecedent exists anywhere, low means one probably exists under different wording. Deterministic, no LLM. Pass claims for a draft, or appNum for a filed application.
Parameters
| Name | Type | Description |
|---|---|---|
| claims | object[] | The claim set, in order. Provide either claims or appNum. (max 300 items) |
| appNum | string | US application number, digits only; pulls the claims from the warehouse. (pattern ^\d{7,8}$) |
| minSeverity | string | Lowest severity to report (default low = everything). (one of high, medium, low) |
| includeSuppressed | boolean | Also return candidates the implicit-basis rules suppressed, with the rule that killed each. Useful for auditing the checker. |
Claim Term Support Map
Timeout 180s
Map every claim term to the specification passages that give it meaning, with exact locations (section, paragraph number, char offsets). Each term is graded by HOW the spec supports it: formally defined, defined by the claim, scoped by enumeration, mapped to an embodiment, characterized functionally, merely described, or UNDESCRIBED, which is a §112(a) written-description signal. With includeParents, the same analysis runs against the specs of the parent applications in the continuity chain (continuation, CIP, divisional, provisional), so terms supported here but in no ancestor are surfaced as NEW MATTER that cannot claim the parent's filing date.
Parameters
| Name | Type | Description |
|---|---|---|
| appNum | string | US application number, digits only. Required for the continuity walk. (pattern ^\d{7,8}$) |
| claims | object[] | Claim set to analyze. Omit to use the filed claims for appNum. (max 300 items) |
| sections | object[] | Specification sections to ground against. Omit to pull the filed spec for appNum. (max 60 items) |
| includeParents | boolean | Walk the continuity chain and check each parent spec for support (default true when appNum is given). |
| maxAncestors | integer | Cap on ancestors to check (default 6). (min 0, max 12) |
| ocr | boolean | Allow OCR for image-only filings. Most provisionals are image-only, so this is usually needed to read them. |
Patent Whitespace Opportunities
Timeout 120s
List analyzed gaps ("whitespace") in patent space ranked by opportunity score. Each gap includes a summary of what is missing, bordering CPC areas and patents, temporal profile, and nearby active assignees. Filter by CPC section letter and minimum opportunity.
Parameters
| Name | Type | Description |
|---|---|---|
| limit | integer | Max gaps to return (default 100). (min 1, max 500) |
| section | string | CPC section letter filter (A-H, Y). (pattern ^[A-HYa-hy]$) |
| minOpportunity | number | Minimum opportunity score (0-1). (min 0, max 1) |
CPC Code Lookup
Timeout 120s
Look up a CPC classification symbol: what it covers, where it sits in the scheme, and which art units actually examine it. The art-unit spread is empirical (where applications carrying the symbol were really routed) with per-unit probabilities and an entropy score: low entropy means the symbol predicts the art unit, high means it does not. Use before filing to anticipate routing, or to decide whether classification is worth arguing.
Parameters
| Name | Type | Description |
|---|---|---|
| code req | string | CPC symbol, e.g. C11D or C11D7/261. (pattern ^[A-HYa-hy][0-9A-Za-z/]{0,18}$) |
| childLimit | integer | How many child symbols to return (default 50). (min 0, max 500) |
| distributionLimit | integer | How many art units to list in the distribution, largest first (default 20). unique_art_units is always the true total. (min 0, max 500) |
Patent CPC Classification
Timeout 120s
Get the CPC symbols assigned to a published application or granted patent, from the USPTO Master Classification File. Separates inventive symbols (covering what is claimed) from additional ones (disclosed but not claimed) — build a prior-art search from the inventive set. Accepts a publication or application number.
Parameters
| Name | Type | Description |
|---|---|---|
| number req | string | Publication or US application number, digits only. (pattern ^\d{7,12}$) |
Art Unit Profile
Timeout 120s
Profile one USPTO art unit: what technology it examines, its examiner roster, and how it behaves — allowance and rejection rates, time to first action, interview receptiveness, RCE tolerance and estimated prosecution cost. generated_context is the one-paragraph account of the technology; the model-written long description is served as its opening and length only. examiner_count is the roster length, and examiner_count_in_statistics appears when the stored statistics counted a different roster. Check statistics.data_quality before relying on the numbers: it reports how many applications and office actions they rest on, and thin units carry the same field names with far weaker support.
Parameters
| Name | Type | Description |
|---|---|---|
| artUnit req | string | USPTO art unit, e.g. 2872. (pattern ^\d{3,4}$) |
Examiner Search
Timeout 120s
Find USPTO examiners by surname or art unit, returning ids and names to pass to get_examiner_profile. Matching is anchored, so pass a surname (or the start of the surname-first name), not a substring from the middle.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Surname, or a prefix of the surname-first full name. (min length 2, max length 80) |
| artUnit | string | Restrict to one art unit. (pattern ^\d{3,4}$) |
| limit | integer | Maximum matches (default 20). (min 1, max 100) |
Examiner Statistics
Timeout 120s
Statistics for one USPTO examiner, by id or by surname-first name (e.g. "SMITH ADAM M"): rejection analytics, allowance behaviour, interview and RCE patterns, timing and cost. Use it to calibrate a response strategy to the examiner who will actually read it. The default response is about 4,000 tokens: per-application lists (applications_with_interviews, applications_with_rcex), two wide histograms (by_sequence_length, document_code_breakdown) and two cold per-application sections (behavioral_patterns, rejection_analysis) are each replaced by a count and the include name that brings them back. percentile_rankings and claims_analysis are null where never computed, which is every examiner sampled. Read data_quality first: populations names the denominators, volume.tier says how much the numbers rest on, withheld lists fields removed as wrong, and notes lists pairs that disagree.
Parameters
| Name | Type | Description |
|---|---|---|
| examiner req | string | Examiner id, or USPTO surname-first full name. (min length 2, max length 120) |
| include | string | Comma-separated sections to add: applications_with_interviews, applications_with_rcex, by_sequence_length, document_code_breakdown (thousands of tokens each); behavioral_patterns, rejection_analysis (cold, may reach megabytes). |
Warm the Inference Hub
Timeout 120s
Start the encoder before you need it. The inference hub scales to zero, so the first search_prior_art or locate_in_patent_space after an idle period waits about 40 seconds for models to load. Call this first and that wait happens outside your search. Returns immediately by default with an estimate; pass wait to block until the models are ready instead of polling. Free, and it never counts against quota. Set rerank only if the search will set rerank, since the reranker costs another 25 seconds to load.
Parameters
| Name | Type | Description |
|---|---|---|
| rerank | boolean | Also load the ColBERT reranker. Only needed if the search that follows sets rerank; it adds about 25 seconds to the warm-up. |
| wait | integer | Seconds to block until the models are ready, up to 120. The default of 0 returns straight away with an estimate, which suits warming ahead of other work. Set it to turn a polling loop into one call. (min 0, max 120) |
MPEP Section
Timeout 120s
One MPEP section, with keyRules and examinerActions separated from the prose that obliges them. This is what a US examiner is required to apply, so it is the text an argument about whether they applied it correctly has to rest on. Section ids carry dots and parentheses (601.01(c)) and the punctuation is part of the id.
Parameters
| Name | Type | Description |
|---|---|---|
| sectionId req | string | MPEP section id, e.g. 2106 or 601.01(c). (pattern ^[0-9A-Za-z.()\-]{1,40}$) |
EPO Guidelines Section
Timeout 120s
One section of the EPO Guidelines for Examination, in the same shape as get_mpep_section because the flow that reaches it is the same flow one step later: an applicant with a US rejection usually has a European family member. Carries citations, parentSection and childSections alongside the generated keyRules.
Parameters
| Name | Type | Description |
|---|---|---|
| sectionId req | string | EPO Guidelines section id, e.g. g-ii-3.3 or c-iv-2. (pattern ^[0-9A-Za-z.\-]{1,40}$) |
Office Action Form Paragraph
Timeout 120s
The literal paragraph an examiner pasted into an office action, by its code. Turns a paragraph number read off a rejection into the statute behind it, the MPEP section it rests on, the rejection type, and the notes the examiner was given about when to use it. title is the heading and template the text with [1], [2] placeholders; brackets lists what fills them, which is often where the substance of the rejection sits. mustFollow names paragraphs that have to appear before this one. isAIA and preAIAEquivalent matter for anything filed near the changeover. A leading paragraph symbol is accepted.
Parameters
| Name | Type | Description |
|---|---|---|
| code req | string | Form paragraph code, e.g. 6.11 or 7.37.01. (pattern ^[¶\s0-9A-Za-z.\-]{1,24}$) |
Form Paragraphs by Rejection Type
Timeout 120s
Every form paragraph an examiner could have reached for, filtered by rejection type or by the MPEP section it rests on. Given a rejection type this is the set they chose from, which is what tells a deliberately narrow choice from the only available one. rejectionType takes a statute (103, 112(b), 101, 1.52) or a label (obviousness, indefiniteness, enablement, double_patenting); either reaches the paragraphs the other would. At least one filter is required; this does not list the whole table.
Parameters
| Name | Type | Description |
|---|---|---|
| rejectionType | string | A statute (102, 103, 112(b), 112(a), 112(f), 101, 121, or a CFR rule such as 1.52) or a label (obviousness, anticipation, indefiniteness, enablement, written_description, means_plus_function, abstract_idea, double_patenting, restriction, allowance, drawing_objection). (pattern ^[0-9A-Za-z.()_ \-]{1,40}$) |
| mpepSection | string | MPEP section the paragraph rests on, e.g. 706, 707 or 2175. (pattern ^[0-9A-Za-z.()\-]{1,40}$) |
| limit | integer | How many to return (default 25). (min 1, max 100) |
Guidance Cross-References
Timeout 120s
What a guidance section points at and what points at it, one hop, both directions. Forward is what else a rule depends on; backward is what breaks if you misread it, and is the direction that is hard to get any other way. The node id prefix selects the corpus: mpep-2106 or epo-c-ix-3. A hub section is cited by hundreds of others, so the fan-out is capped and truncated says which direction hit the cap.
Parameters
| Name | Type | Description |
|---|---|---|
| nodeId req | string | Graph node id, prefixed mpep- or epo-. (pattern ^(mpep|epo)-[0-9A-Za-z.()\-]{1,40}$) |
| limit | integer | Maximum edges per direction (default 50). (min 1, max 200) |
USPTO Design Search Code
Timeout 120s
One USPTO design search code, e.g. 03.19.17 for a fish symbol used for religious significance. A classification scheme rather than guidance; it sits in this corpus because it arrived with the same data, not because it belongs beside the MPEP.
Parameters
| Name | Type | Description |
|---|---|---|
| code req | string | Design search code, e.g. 03.19.17. (pattern ^[0-9]{2}(\.[0-9]{2}){0,3}$) |
Limits and timeouts
Limits are counted per key, not per IP, so two clients sharing a key share its budget. Every response carries RateLimit and RateLimit-Policy headers, so a client can pace itself without waiting to be refused.
| Messages | 120 per minute | Per key. Counts every JSON-RPC message, including tools/list and ping. |
| Tool calls | 30 per minute | Per key. Counts only tools/call. |
| Requests | 1,000 per day | Default on a new key. Set per key when it is issued. |
| Requests | 30,000 per month | Default on a new key. |
How long a call can take
These are real analyses over 10.5M+ filings, not lookups, and the slow ones are slow. Each tool has its own ceiling: 120s for most, 180s for map_claim_support, which may fetch and read the specifications of every parent application in a continuity chain. The load balancer holds a connection open for 300s, so a call is never cut off before its own timeout fires.
Two knobs cost time when you turn them on: rerank on a prior-art search, which runs a late-interaction model over the top results, and includeParents on a claim-support map, which multiplies the work by the length of the chain. Set your client's timeout to match the tool you are calling rather than to a global default.
We do not publish latency percentiles yet. When we do, they will be measured against this deployment rather than a benchmark rig.
Transport
Reference for anyone debugging a client rather than writing one. If your host speaks MCP, you should not need any of it.
- Method
- POST only. GET and DELETE return 405 with an Allow: POST header.
- Protocol
- 2025-06-18. Also accepts 2025-03-26 and 2024-11-05, and echoes back the version it agreed to.
- Sessions
- None. There is no Mcp-Session-Id to send or store, and no state to resume.
- Body
- application/json, up to 2 MB. Larger bodies get a 413.
- Batches
- Accepted for 2025-03-26 clients: up to 20 messages, of which at most 2 may be tools/call.
- Streaming
- Not used. Every response is a single JSON body.
Errors
Transport and authentication problems come back as HTTP status codes with a machine-readable code field.
| Status | Code | Cause |
|---|---|---|
| 400 | UNSUPPORTED_PROTOCOL_VERSION | The MCP-Protocol-Version header names a version we do not speak. |
| 400 | BATCH_TOO_LARGE | More than 20 messages in one batch. |
| 400 | BATCH_TOO_MANY_TOOL_CALLS | More than 2 tools/call in one batch. Send them as separate requests. |
| 401 | MISSING_API_KEY | No Authorization header. The response carries a WWW-Authenticate challenge. |
| 401 | INVALID_AUTH_FORMAT | The header is not of the form "Bearer <key>". |
| 401 | KEY_NOT_FOUND | The key does not exist, is suspended, or is revoked. |
| 401 | API_KEY_EXPIRED | The key is past its expiry date. |
| 403 | ORIGIN_NOT_ALLOWED | A browser Origin header we do not allow. Server-to-server callers send no Origin and are unaffected. |
| 403 | IP_NOT_WHITELISTED | The key has an IP allowlist and the request came from outside it. |
| 405 | Any method other than POST. | |
| 413 | Request body over 2 MB. | |
| 429 | MCP_RATE_LIMIT_EXCEEDED | Over the per-minute message limit. |
| 429 | MCP_TOOL_RATE_LIMIT_EXCEEDED | Over the per-minute tool-call limit. |
| 429 | USAGE_LIMIT_EXCEEDED | Over the daily or monthly quota. The body reports the limit it enforced and when it resets. |
| 503 | The server is draining for a deploy. Retry. |
A tool that runs and fails returns a normal JSON-RPC result with isError: true rather than a protocol error, so the model can read what went wrong and react. Protocol-level failures use the standard codes:
| -32600 | Invalid Request. The body is not a JSON-RPC 2.0 message, or the batch was empty. |
| -32601 | Method not found. |
| -32602 | Invalid params, including a tool name that is not in the registry. |
| -32603 | Internal error. The tool failed rather than the transport. |