# Vaquill (remote · mcp.vaquill.ai)

Search US and Indian statutes, regulations, constitutions, and court rules.

- Trust score: 75/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- remote · `mcp.vaquill.ai`: 75/100 (this document), [markdown](https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/in-s.md), [page](https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/in-s)
- remote · `mcp.vaquill.ai`: 69/100, [markdown](https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/s.md), [page](https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/s)

## Channel facts

- Endpoint: `https://mcp.vaquill.ai/in/s/_`
- Transports: `streamable-http`
- Auth: `required`
- Version: `0.4.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-21.

- **Endpoint Security**: 60/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 21 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 77/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 6867 tokens (~274/item across 25 items; 22 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 63/100
  - Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Vaquill MCP server?

Vaquill is a hosted endpoint at https://mcp.vaquill.ai/in/s/_, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http vaquill-ai-vaquill-mcp 'https://mcp.vaquill.ai/in/s/_'
```

### Cursor

```json
{
  "mcpServers": {
    "vaquill-ai-vaquill-mcp": {
      "url": "https://mcp.vaquill.ai/in/s/_"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "vaquill-ai-vaquill-mcp": {
      "type": "http",
      "url": "https://mcp.vaquill.ai/in/s/_"
    }
  }
}
```

### Codex

```toml
[mcp_servers.vaquill-ai-vaquill-mcp]
url = "https://mcp.vaquill.ai/in/s/_"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vaquill-ai-vaquill-mcp": {
      "type": "remote",
      "url": "https://mcp.vaquill.ai/in/s/_",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add vaquill-ai-vaquill-mcp --url 'https://mcp.vaquill.ai/in/s/_' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  vaquill-ai-vaquill-mcp:
    url: "https://mcp.vaquill.ai/in/s/_"
```

### Netclaw

```json
{
  "McpServers": {
    "vaquill-ai-vaquill-mcp": {
      "Transport": "http",
      "Url": "https://mcp.vaquill.ai/in/s/_"
    }
  }
}
```

### Vellum

```bash
assistant mcp add vaquill-ai-vaquill-mcp -t streamable-http -u 'https://mcp.vaquill.ai/in/s/_'
```

### Other

```json
{
  "mcpServers": {
    "vaquill-ai-vaquill-mcp": {
      "type": "http",
      "url": "https://mcp.vaquill.ai/in/s/_"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-21 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-20 (score 74, 0)

- [security] Tool “get_act_structure” rewrote its description, which is the text the model reads
- [security] Tool “get_section_history” rewrote its description, which is the text the model reads
- [security] Tool “india_act_cited_by” rewrote its description, which is the text the model reads
- [security] Tool “india_act_definitions” rewrote its description, which is the text the model reads
- [security] Tool “india_act_subordinate” rewrote its description, which is the text the model reads
- [functional] Server version: 4.0.3 → 4.0.5
- [functional] New tool “get_india_credit_balance”

### 2026-09-19 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-15 (score 72, +1)

- [security] Tool “india_section_references” rewrote its description, which is the text the model reads
- [security] Tool “india_act_cited_by” rewrote its description, which is the text the model reads
- [security] Tool “india_act_definitions” rewrote its description, which is the text the model reads
- [security] Tool “india_act_subordinate” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 230 → 280
- [cosmetic] “india_act_subordinate” added an optional parameter “page”
- [cosmetic] “india_act_subordinate” added an optional parameter “pageSize”
- [cosmetic] “india_act_cited_by” added an optional parameter “page”
- [cosmetic] “india_act_cited_by” added an optional parameter “pageSize”
- [cosmetic] “india_act_definitions” added an optional parameter “limit”
- [cosmetic] “india_act_definitions” added an optional parameter “page”
- [cosmetic] “india_act_definitions” added an optional parameter “pageSize”
- [cosmetic] “india_section_references” reworded the description of “section_number”
- [cosmetic] “list_acts” reworded the description of “category”
- [cosmetic] “list_acts” reworded the description of “department”
- [cosmetic] “list_acts” reworded the description of “page”
- [cosmetic] “list_acts” reworded the description of “pageSize”
- [cosmetic] “list_acts” reworded the description of “search”
- [cosmetic] “list_acts” reworded the description of “sort”
- [cosmetic] “list_acts” reworded the description of “state”
- [cosmetic] “list_acts” reworded the description of “status”
- [cosmetic] “list_acts” reworded the description of “yearFrom”
- [cosmetic] “list_acts” reworded the description of “yearTo”
- [cosmetic] “resolve_india_citation” reworded the description of “asAtDate”
- [cosmetic] “resolve_india_citation” reworded the description of “state”
- [cosmetic] “search_acts” reworded the description of “actStatus”
- [cosmetic] “search_acts” reworded the description of “category”
- [cosmetic] “search_acts” reworded the description of “legalSubject”
- [cosmetic] “search_acts” reworded the description of “matchType”
- [cosmetic] “search_acts” reworded the description of “provisionType”
- [cosmetic] “search_acts” reworded the description of “sectionType”
- [cosmetic] “search_acts” reworded the description of “yearFrom”
- [cosmetic] “search_acts” reworded the description of “yearTo”
- [cosmetic] “search_acts” reworded the description of “pageSize”
- [cosmetic] “get_act_amendments” reworded the description of “page”
- [cosmetic] “get_act_amendments” reworded the description of “pageSize”
- [cosmetic] “get_act_amendments” reworded the description of “section”
- [cosmetic] “get_act_amendments” reworded the description of “type”
- [cosmetic] “get_corresponding_provisions” reworded the description of “act_code”
- [cosmetic] “get_section_history” reworded the description of “section_number”
- [cosmetic] “india_act_cited_by” reworded the description of “limit”
- [cosmetic] “india_act_subordinate” reworded the description of “limit”

### 2026-09-12 (score 71, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 69, 0)

- [functional] New tool “get_pricing_in”
- [cosmetic] Tool “get_act_amendments” changed its title: Get Act Amendments → Act Amendment History
- [cosmetic] Tool “fetch” changed its title: Fetch → Fetch Indian Enactment
- [cosmetic] Tool “list_acts” changed its title: List Acts → Browse Indian Acts
- [cosmetic] Tool “search_acts” changed its title: Search Acts → Search Indian Acts
- [cosmetic] Tool “search” changed its title: Search → Search Indian Legislation
- [cosmetic] Tool “list_act_filters” changed its title: List Act Filters → Act Filter Values
- [cosmetic] Tool “get_corresponding_provisions” changed its title: Get Corresponding Provisions → IPC/CrPC to BNS/BNSS Mapping
- [cosmetic] Tool “get_act_text” changed its title: Get Act Text → Act Text

## MCP tools (22)

### `fetch` (~106 tokens)

Fetch Indian Enactment

Fetch one Indian enactment by the `id` from a `search` result, returning `{id, title, text, url, metadata}`. Also accepts a source URL or a bare path. NOTE: the India corpus serves an enactment as publisher links rather than inline text, so `text` carries the title and `metadata` carries the PDF, HTML and plain-text URLs to read. Prefer `get_act_text` if you can call it.

Input parameters:

- `id` (string, required)

### `get_act_amendments` (~346 tokens)

Act Amendment History

The amendment history recorded against one enactment: substitutions, insertions and omissions, each with the amending Act and its effective date (e.g. 'Subs. by Act 22 of 2023, s. 44 (w.e.f. 13-11-2025)'). Use to check whether a provision still reads as enacted before relying on its text. An empty list means no amendment was recorded, NOT that the Act was never amended. Cost: 5 credits.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `page` (integer): 1-based page number.
- `pageSize` (integer): Results per page (1-200).
- `section`: Keep only footnotes attached to this section, written exactly as the publisher does. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.
- `type`: Amendment action class. Served in the NOMINAL spelling; the corpus stores the verbal form (`substituted`) and either is accepted. Values: `substitution`, `insertion`, `omission`, `renumbering`, `addi…

### `get_act_section` (~255 tokens)

Get Act Section

A single provision with its citation, its position in the act, the structural
features its text carries, and what it points at.

\**Cost: 2 credits.**

This does not return the provision's text. `GET /acts/{actId}/sections/{n}/body`
does, and is priced separately because it reads the act document.

\`wordCount` is summed across every passage of the provision. `actsReferenced`
is whitespace-normalised before deduplication, because the publisher's line
breaks otherwise make one cited act look like two.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `section_number` (string, required): Section number exactly as the publisher writes it. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.

### `get_act_section_body` (~316 tokens)

Get Act Section Body

The publisher's own text for one provision.

\**Cost: 3 credits.** Refunded when we hold the provision and cannot reproduce
its text, because you asked for text and did not get it.

The text is sliced out of the act document by the character offsets stored with
each passage. It is never assembled by concatenating search passages: those
carry a retrieval header that we synthesized (`Act: ... | India | State | In
Force`), and serving that as statute would put our words inside a quotation of
the law.

\**This text is as the publisher published it.** We do not apply amendments to
it. `GET /acts/{actId}/sections/{n}/history` lists every amendment we hold for
the provision, each with an `appliedStatus` saying whether it is reflected here.
It is not.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `section_number` (string, required): Section number exactly as the publisher writes it. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.

### `get_act_status` (~337 tokens)

Get Act Status

Everything we know about an act's standing, kept in three separate vocabularies
that are deliberately never collapsed into one verdict.

\**Cost: 1 credit.**

\- `publisherStatus` is `act_status` exactly as India Code records it. Their
  word.
\- `servedStatus` is ours: whether this API answers for the act, or has retired
  it as withdrawn by the publisher or as a duplicate of one we kept.
\- `repealClaim` is the publisher's repeal record WITH its source, and with the
  caveat that we do not verify whether the repealing instrument was itself
  brought into force.

That last distinction is not pedantry. India Code lists the Industrial Disputes
Act, 1947 as repealed by Act 37 of 2020, the Industrial Relations Code, which
has never been commenced. Serving that as flatly "repealed" would be wrong, so
this endpoint does not.

A retired act answers here with `servedStatus: retired` and the reason, rather
than 404ing, because "we deliberately withdrew this" is a more useful answer
than "no such thing".

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…

### `get_act_structure` (~230 tokens)

Get Act Structure

The act's own shape: its chapters and parts where the publisher gives any, and
the provisions under each.

\**Cost: 2 credits.**

\`hasHierarchy` is false for most acts and that is not an error: the publisher
gives many acts no chapter or part divisions at all, and for those `nodes` is a
flat list of sections. The free `GET /acts/coverage` publishes how many acts do
carry a hierarchy, as `depth.actsWithStructure`.

Section numbers are sorted numerically with their alphabetic suffixes kept
attached, so `498A` follows `498` and `10` follows `2`.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…

### `get_act_text` (~142 tokens)

Act Text

Source links for one enactment: the plain-text, PDF and HTML renderings, plus how many sections it holds. Use when the user wants to read or cite the Act itself rather than a matched section. Cost: 3 credits.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…

### `get_corresponding_provisions` (~225 tokens)

IPC/CrPC to BNS/BNSS Mapping

Map a repealed Indian criminal code to the 2023 code that replaced it, section by section: IPC to BNS and CrPC to BNSS, in force from 1 July 2024. Pass either side ('ipc' or 'bns' both work). Use whenever a source, a pleading or the user cites an old section number, so you answer under the provision actually in force rather than the repealed one. 'iea'/'bsa' return 404 until that mapping lands. Cost: 1 credit.

Input parameters:

- `act_code` (string, required): Either side of a recodification pair, matched case-insensitively so `IPC` and `ipc` are the same request. `ipc`/`bns` and `crpc`/`bnss` each return the same mapping; `iea`/`bsa` are accepted and 404…

### `get_coverage` (~256 tokens)

Get Coverage

Describe the corpus behind this API: how many acts and provisions it holds, how
they break down by jurisdiction, regulator and status, and how DEEP that holding
goes.

\**Cost: free.**

Read the `depth` block before building on this API. It answers four independent
questions, because "we hold the act" and "we hold what amended it" are different
claims and only one of them is true for most of the corpus:

\- `actsWithText` is every act we serve;
\- `actsWithAmendmentEvents` is the much smaller set for which we hold parsed
  amendment records;
\- `actsClaimingAmendmentsWithoutEvents` is the known gap between them, published
  so that an empty amendment list is legible as a gap rather than as a claim
  that nothing ever changed.

Two different kinds of count appear here and they are labelled. `passages` in
the breakdown lists is faceted live and exact right now. The act-level numbers
in `totals` and `depth` come from a full distinct-act scan, and `measuredOn`
says when it ran. Do not divide one into the other.

### `get_india_credit_balance` (~239 tokens)

Get India Credit Balance

Returns the credits this API key's account can spend right now.

\**Free.** Never charged, so it is safe to poll for low-balance alerting or to
pre-flight a batch job.

\**Authentication:** any valid `vq_key_` key. No particular scope is required.

Credits are account-wide and are **not** split by jurisdiction: the same balance
funds the India legislation endpoints and the United States primary-law
endpoints, from one ledger. This route and the United States
\`GET /api/v1/credits/balance` therefore report the same number, and spending on
either surface moves both.

Read `bySource` before assuming a balance is durable: `subscription` credits are
use-it-or-lose-it at the period end, while `payg` credits you purchased persist
and burn last. `nextExpiry` tells you what is about to be forfeited and when.

\## Example

\```bash
curl https://api.vaquill.ai/api/v1/in/credits/balance \
  \-H "Authorization: Bearer $VAQUILL_API_KEY"
\```

### `get_pricing_in` (~142 tokens)

Get Pricing In

Credit-to-price conversion rate and per-endpoint costs for the India legislation surface (`/in/acts/*`).

\**No authentication required.** 1 credit = $0.01 USD, billed in USD.

Pass `?region=US` to price the United States primary-law surface instead: it is the same credit balance and the same key.

Input parameters:

- `region`: Jurisdiction to price. `US` for the United States primary-law surface, `IN` for the India legislation surface. Defaults to the jurisdiction of the document you are reading, so a caller who does not s…

### `get_section_history` (~546 tokens)

Get Section History

The amendment record for a single provision: what changed, which Act changed it,
which of that Act's sections did so, when it took effect where the publisher
records a date, and the wording it replaced where the publisher quotes it.

\**Cost: 2 credits.** An empty history for a provision we hold IS the answer and
is charged; the `coverage` block tells you whether it is empty because nothing
changed or because we hold no parsed record.

\**Read `appliedStatus` on every event.** It is `not_applied` throughout, because
the text this API serves is the publisher's published text and we do not edit
it. That is a deliberate, stated position rather than an omission: you should
never have to infer currency from silence.

\**`asOf` returns a TIMELINE, not text.** We hold amendment events and no
versioned text, so there is no honest way to render this provision as it stood
on a date. Passing `asOf` tells you how many recorded amendments had taken
effect by then, how many had not, and how many carry no date at all. `isBounded`
true means we hold no recorded event affecting that date, which is not the same
as there having been none.

Coverage is real and uneven: many acts carry a non-zero amendment count with no
parseable footnote behind it, and about half the records we do hold carry no
effective date. Read the `coverage` block on this response for the provision you
asked about, and the free `GET /acts/coverage` for the corpus-wide split
(`depth.actsWithAmendmentEvents` against
\`depth.actsClaimingAmendmentsWithoutEvents`).

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `asOf`: Split the recorded amendments around a date (YYYY-MM-DD). Returns a timeline, never reconstructed text.
- `limit` (integer): Events per page.
- `offset` (integer): Zero-based offset.
- `section_number` (string, required): Section number exactly as the publisher writes it. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.

### `india_act_cited_by` (~383 tokens)

India Act Cited By

Inbound citations: provisions elsewhere in the corpus that name this act.

\**Cost: 2 credits.** A confident "nothing cites this" is the answer and is
charged.

🔴 **Matched on the act's TITLE, not on an identifier**, because that is what
the corpus stores. A citing document that wrote the title differently is
missed, and the publisher's own line breaks make that measurable. Read
\`matchBasis` and treat the result as a floor rather than a complete set.

A foundational act can be cited by thousands of provisions, so the answer is
PAGED with `page` + `pageSize`, the same as the rest of this API.

\`total` is the number of distinct citing PROVISIONS across all pages, not the
size of the page you were served (`returned`) and not the number of matching
passages: one provision is stored as many passages, so `total` is the smaller
number. `totalIsExact` goes false only if the corpus scan behind that count hits
its ceiling, which no act in the corpus currently reaches.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `limit`: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both.
- `page` (integer): 1-based page number.
- `pageSize`: Rows per page (1-100). Defaults to 25.

### `india_act_definitions` (~318 tokens)

India Act Definitions

The terms an act defines, and the provision that defines them.

\**Cost: 2 credits.** Refunded when the act holds no extracted definitions,
because the caller asked for definitions and did not get any.

⚠️ Coverage is thin and stated rather than implied: extracted defined terms
exist for a minority of served acts. An empty answer here means we did not
extract them, NOT that the act defines nothing. `definitionSections` is
returned separately so you can read the defining provision directly even when
no terms were extracted from it.

\`terms` is paged with `page` + `pageSize`, because a long definitions clause can
run to thousands of entries. `definitionSections` is short and is NOT paged, so
it repeats in full on every page.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `limit`: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both.
- `page` (integer): 1-based page number.
- `pageSize`: Rows per page (1-100). Defaults to 25.

### `india_act_subordinate` (~304 tokens)

India Act Subordinate

Subordinate instruments the publisher records as made under this act: rules,
regulations, notifications and orders.

\**Cost: 2 credits.** An act with no subordinate instruments on record is the
answer and is charged.

🔴 Resolved by the parent's TITLE. The stored `parent_act_id` is India Code's
own identifier and does not address this corpus, so a hard link would resolve to
nothing. Title matching reaches a served parent for most instruments that name
one, and `matchBasis` says so on every response.

Paged with `page` + `pageSize`. `total` counts distinct INSTRUMENTS across all
pages, not the rows on this page (`returned`) and not matching passages.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `limit`: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both.
- `page` (integer): 1-based page number.
- `pageSize`: Rows per page (1-100). Defaults to 25.

### `india_section_references` (~319 tokens)

India Section References

Outbound citations: the other enactments this provision names, and the sections
of its own act it cross-refers to.

\**Cost: 2 credits.** An empty result for a provision we hold IS the answer and
is charged; a provision we do not hold is refunded.

Act references are resolved to an `actId` where the title names something we
serve, and returned with `resolved: false` where it does not. That is the
honest split: the publisher names acts we may not hold, and a null id is a
coverage fact rather than a parse failure.

This route takes no query parameters and is not paged: one provision's own
outbound edges are a short list. `totalActs` and `totalSections` are the full
counts, and `truncated` says whether the row cap cut either list.

Input parameters:

- `act_id` (string, required): Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable…
- `section_number` (string, required): Section number exactly as the publisher writes it. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.

### `list_act_filters` (~55 tokens)

Act Filter Values

Self-describing filter vocabulary: every category, state, department and status the acts corpus actually holds, with counts. Call this before filtering, so a query uses a value that exists instead of returning empty because the spelling was wrong.

### `list_acts` (~468 tokens)

Browse Indian Acts

Browse and filter enactments rather than searching their text: by jurisdiction (central or a state), issuing regulator, year and status. Use when the user wants to know WHAT exists in an area before asking what it says, or to confirm an Act's exact title before citing it. Cost: 1 credit.

Input parameters:

- `category`: Jurisdictional class of the instrument. `repealed` and `spent` are accepted for backward compatibility and resolve against the act's status instead. Values: `central`, `state`, `regulatory`, `repeale…
- `department`: Issuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Departmen…
- `page` (integer): 1-based page number.
- `pageSize` (integer): Results per page (1-100).
- `search`: Keep only acts whose title contains this substring, matched case-insensitively. A title filter, not a search over the text: use POST /acts/search for that.
- `sort` (string): Sort order. `popular` is DEPRECATED and behaves as `year_desc`: it ordered by a read counter held only in the retired store. Values: `year_desc`, `year_asc`, `title_asc`, `title_desc`, `popular`.
- `state`: Jurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage.
- `status`: The publisher's lifecycle status for the act. Their claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `spent`.
- `yearFrom`: Earliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way…
- `yearTo`: Latest year of enactment to include, inclusive.

### `resolve_india_citation` (~486 tokens)

Resolve India Citation

Turn a citation a lawyer would type into the provision it names.

\**Cost: 2 credits.** A malformed citation is a 422 and is NOT charged. Every
other outcome is, including `not_found`: a confident negative is the answer.

Accepts what Indian practice actually writes, not what a style guide prescribes.
Three published standards exist and they disagree about element order, while the
most common real form, `u/s 302 IPC`, appears in none of them. So order does not
matter, and all of these work:

    u/s 302 IPC
    Section 302 of the Indian Penal Code, 1860
    s.302 IPC
    S. 376(2)(g), IPC
    clause (a) of sub-section (1) of section 302 IPC
    O. 39 R. 1 CPC
    Art. 21 of the Constitution
    Regulation 24 of the SEBI (LODR) Regulations, 2015
    Maharashtra Act No. LXXVII of 2018

🔴 **Read `status` before reading `candidates`.** `ambiguous` is a real answer
and it is charged, because narrowing a citation to two named enactments is the
work. The commonest cause is the 2023 recodification: after 1 July 2024,
\`s. 302` names both IPC 302 (murder) and BNS 302 (uttering words to wound
religious feelings), while BNS 103 is murder. Both codes are live law
simultaneously for the lifetime of pending trials, so this endpoint will not
choose for you. Send `asAtDate` and it will.

\`r/w` ("read with") is split into separate citations and each is resolved.

Input parameters:

- `asAtDate`: The date the conduct or document belongs to, as YYYY-MM-DD. This is how a caller says which side of the 2023 recodification they mean: without it, a criminal section number resolves to BOTH the old c…
- `cite` (string, required): One citation string.
- `state`: Narrow to one jurisdiction. Required for a State-universal title, where the same short title names a different act in each State.

### `resolve_india_citations_batch` (~216 tokens)

Resolve India Citations Batch

The same resolver over a list, for when you would otherwise loop.

\**Cost: 2 credits per DISTINCT citation.** Batching buys a round trip, never a
discount. Duplicates are collapsed before pricing, so sending the same citation
twice is charged once. Each citation is refunded individually when we fail on
it; one citation failing never refunds or voids the others.

Up to 50 distinct citations, and up to 500 before deduplication. Unknown fields
on the body are refused rather than ignored.

Input parameters:

- `asAtDate`: The date the conduct or document belongs to, as YYYY-MM-DD. This is how a caller says which side of the 2023 recodification they mean: without it, a criminal section number resolves to BOTH the old c…
- `citations` (array, required): Citation strings, as a lawyer would type them.
- `state`: Narrow to one jurisdiction. Required for a State-universal title.

### `search` (~85 tokens)

Search Indian Legislation

Generic corpus search over Indian Central and State legislation, returning `{id, title, url}` records for citation. Present so this server works in clients that require the standard search/fetch pair. Prefer `search_acts` if you can call it: it filters by category, state, year and status. Pair with `fetch` to read a result.

Input parameters:

- `query` (string, required)

### `search_acts` (~961 tokens)

Search Indian Acts

Search Indian legislation down to the individual section: Central and State Acts plus the instruments of the principal regulators (SEBI, RBI, MCA, IRDAI, TRAI, DGFT). Use for any 'what does Indian law say' question. Supports boolean and phrase queries; filters by category, state, year and status. Returns sections with title, chapter and a sourceUrl pointing at the publisher's own document. The returned actId (e.g. 'IND_central_2065') feeds every acts tool. Cost: 2 credits.

Input parameters:

- `actStatus`: Filter by the publisher's lifecycle status. Accepts one value or a list. This is the publisher's claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `s…
- `actTitle`: Filter by words in the act's title. Each word must appear, so `Bharatiya Nyaya` narrows to the Sanhita.
- `category`: Jurisdictional class. `repealed` and `spent` are accepted for backward compatibility and resolve against `actStatus` instead. Values: `central`, `state`, `regulatory`, `repealed`, `spent`.
- `department`: Issuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Departmen…
- `excludeRepealed` (boolean): Drop provisions whose act the publisher records as repealed or spent. Off by default, because repealed law is still law that was in force and is routinely the thing being researched.
- `isSubordinate`: True for subordinate instruments only (rules, notifications, circulars, orders); false for principal acts only. Omit for both.
- `legalSubject`: Filter by subject area, classified at ingest. Accepts one value or a list. Values: `administrative_law`, `banking_finance`, `civil_procedure`, `constitutional_law`, `corporate_law`, `criminal_law`, `…
- `matchType` (string): How query terms must appear in the provision text. `any` (the default) leaves hybrid ranking to do the work; `all` keeps only provisions containing EVERY query term; `phrase` keeps only those contain…
- `page` (integer): 1-based page number. `page * pageSize` may not exceed 100; narrow the query with filters to reach deeper matches.
- `pageSize` (integer): Results per page (1-50).
- `provisionType`: Filter by what the provision DOES. Accepts one value or a list. Values: `mandatory`, `general`, `prohibitory`, `overriding`, `discretionary`, `declaratory`.
- `query` (string, required): Search query.
- `sectionNumber`: Filter by exact section number. The publisher's own numbering, which is not an integer: `498A`, `376DA` and `2-A` all occur, and the alphabetic suffix is part of the number rather than a sub-provisio…
- `sectionType`: Filter by structural kind of the passage. Accepts one value or a list. Values: `amendment_provision`, `article`, `body`, `chapter_heading`, `definition_clause`, `definitions`, `part_heading`, `preamb…
- `state`: Jurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage.
- `yearFrom`: Earliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way…
- `yearTo`: Latest year of enactment to include, inclusive.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/in-s#diagnostics

## Score history

- 2026-09-21: 75
- 2026-09-20: 74
- 2026-09-19: 74
- 2026-09-18: 73
- 2026-09-17: 73
- 2026-09-16: 72
- 2026-09-15: 72
- 2026-09-14: 71
- 2026-09-13: 71
- 2026-09-12: 71
- 2026-09-11: 70
- 2026-09-10: 70
- 2026-09-09: 69
- 2026-09-08: 69
- 2026-09-07: 69
- 2026-09-06: 68
- 2026-09-05: 68
- 2026-09-04: 68
- 2026-09-03: 67
- 2026-09-02: 67

## Common questions

### What is the Vaquill MCP server?

Vaquill is an MCP server listed in the public MCP registry as io.github.Vaquill-AI/vaquill-mcp. Search US and Indian statutes, regulations, constitutions, and court rules. This page covers its hosted endpoint (https://mcp.vaquill.ai/in/s/_).

### Is the Vaquill MCP server safe to use?

Vaquill scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Vaquill MCP server expose?

Vaquill exposes 22 tools: fetch, get_act_amendments, get_act_section, get_act_section_body, get_act_status, and 17 more. Their descriptions and schemas cost roughly 6,735 tokens of context every time the server is loaded.

### Does the Vaquill MCP server require authentication?

No. We connected to Vaquill without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Vaquill MCP server still maintained?

Vaquill is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.vaquill.ai/in/s/_
- Authorisation metadata: https://mcp.vaquill.ai/.well-known/oauth-protected-resource/in/s/_
- Repository: https://github.com/Vaquill-AI/vaquill-mcp
- Changelog RSS feed: https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/in-s.xml
- Changelog JSON feed: https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/in-s.json
- HTML version of this page: https://verifymcp.io/servers/vaquill-ai-vaquill-mcp/in-s
