Vaquill MCP server for AI agents

Live

BEARER TOKEN

LEGAL RESEARCH

Search

Vaquill gives your agent legal research across US federal and state primary law: search statutes and regulations, read section text as of a past date, resolve and extract citations, and track session laws and code changes.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Vaquill
agent · Acme Q3
Run
Which California statute covers data breach notification?
S
vaquill_search_statutes
134ms
Legal research agent
California Civil Code section 1798.82 covers breach notification for businesses. I found 4 related sections in the same chapter.
Sources: Vaquill statutes, 4 sections
vaquill
4 sections
18:29
Message Claude...

Tools your legal research agent reaches for on Vaquill, scoped per user.

CALL ANY TOOL
28 tools for legal research in Vaquill: search statutes and session laws, get section text and definitions, resolve and extract citations, compare sections across states, and follow section changes and watches.
vaquill_browse_divisions
Browse divisions
Walk the statutory tree one level at a time in statutory order: titles, chapters, parts, state codes, constitution articles or federal rule sets, down to the sections. Returns the children of the level you name, each with identifier, kind, label, sectionCount and isLeaf; leaf rows are sections with an actId. nextCursor continues long section lists. Costs 1 credit; empty levels are refunded. Use vaquill_browse_divisions to enumerate a code or find a state code identifier for search. Use vaquill_search_statutes to rank by relevance and vaquill_count_sections to size a scope first.
Parameters
Name
Type
Required
Description
corpus_type
string
Required
Corpus to browse: USC, CFR, STATE, REGULATION, CONSTITUTION, STATE_CONSTITUTION or FEDERAL_RULES. With nothing else set it returns the top level (titles, a state's codes, the articles, the rule sets). One of: `USC`, `CFR`, `STATE`, `REGULATION`, `CONSTITUTION`, `STATE_CONSTITUTION`, `FEDERAL_RULES`.
act_status
string
Optional
List only sections with this status, for example repealed. One of: `abolished`, `deleted`, `expired`, `in_force`, `inactive`, `non_precedential`, `not_funded`, `not_yet_effective`, `omitted`, `proposed`, `recodified`, `recompiled`, `rejected`, `relocated`, `removed`, `renumbered`, `repealed`, `rescinded`, `reserved`, `revoked`, `superseded`, `terminated`, `transferred`, `unconstitutional`, `vacant`, `vacated`, `vetoed`, `withdrawn`.
article
string
Optional
Article to drill into: a constitution's article or amendment (Article III, Amendment XIV) or a New York code article, exactly as the listing returned it.
chapter
string
Optional
Chapter to drill into (USC and state codes), for example 21.
code
string
Optional
Code to drill into: a state code such as tx_pe (list them with corpus_type STATE and state) or a federal rule set such as frcp (list them with corpus_type FEDERAL_RULES).
cursor
string
Optional
nextCursor from the previous response, to continue a long list of sections. Omit for the first page.
exclude_repealed
boolean
Optional
true leaves out sections whose status is affirmatively dead. Sections with no recorded status are kept. Default false.
part
string
Optional
CFR part to drill into, for example 240.
state
string
Optional
Two-letter state code, required for STATE, REGULATION and STATE_CONSTITUTION. One of: `al`, `ak`, `as`, `az`, `ar`, `ca`, `co`, `ct`, `de`, `dc`, `fl`, `ga`, `gu`, `hi`, `id`, `il`, `in`, `ia`, `ks`, `ky`, `la`, `me`, `md`, `ma`, `mi`, `mn`, `ms`, `mo`, `mt`, `ne`, `nv`, `nh`, `nj`, `nm`, `ny`, `nc`, `nd`, `mp`, `oh`, `ok`, `or`, `pa`, `pr`, `ri`, `sc`, `sd`, `tn`, `tx`, `ut`, `vt`, `vi`, `va`, `wa`, `wv`, `wi`, `wy`.
title_number
integer
Optional
USC or CFR title to drill into, for example 42.
vaquill_compare_section_across_states
Compare section across states
vaquill_count_sections
Count sections
vaquill_extract_citations
Extract citations
vaquill_get_coverage
Get coverage
vaquill_get_credit_balance
Get credit balance
vaquill_get_pricing
Get pricing
vaquill_get_section
Get section
vaquill_get_section_definitions
Get section definitions
vaquill_get_section_text
Get section text
vaquill_get_sections
Get sections
vaquill_get_session_law
Get session law
vaquill_get_session_law_text
Get session law text
vaquill_get_session_laws
Get session laws
vaquill_get_watch_change_diff
Get watch change diff
vaquill_list_boards
List boards
vaquill_list_citing_sections
List citing sections
vaquill_list_neighboring_sections
List neighboring sections
vaquill_list_section_changes
List section changes
vaquill_list_section_enactments
List section enactments
vaquill_list_session_law_changes
List session law changes
vaquill_list_session_laws
List session laws
vaquill_list_watch_changes
List watch changes
vaquill_list_watches
List watches
vaquill_resolve_citation
Resolve citation
vaquill_resolve_citations
Resolve citations
vaquill_search_session_laws
Search session laws
vaquill_search_statutes
Search statutes
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Vaquill tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["vaquill"], toolNames: [
    "vaquill_search_statutes",
    "vaquill_get_section_text",
    "vaquill_extract_citations"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Find the California statute on data breach notification and return its full text" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["vaquill"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Find the California statute on data breach notification and return its full text" }],
  tools,
});

// Execute the tool call with the user's vaulted Vaquill access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["vaquill"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Find the California statute on data breach notification and return its full text" }],
  tools,
});

// Tool call runs with the user's vaulted Vaquill access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["vaquill"] }, pageSize: 100,
});

const agent = new Agent({
  name: "legal_research_agent",
  model: "gemini-2.5-pro",
  instruction: "Vaquill tools scoped to this user",
  tools,
});

await agent.run("Find the California statute on data breach notification and return its full text");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Vaquill tool. Click to copy, paste into your agent, done.
Statutes
Copy the prompt
Copied
Search state statutes on non-compete agreements.
Copy the prompt
Copied
Get the text of this section as it stood on January 1, 2020.
Copy the prompt
Copied
List the defined terms that govern this section.
Citations
Copy the prompt
Copied
Extract and resolve every statute citation in this brief.
Copy the prompt
Copied
Check whether this citation resolves to a real section.
Copy the prompt
Copied
List the US Code sections that cross-reference this section.
Changes and comparisons
Copy the prompt
Copied
Find provisions in other states similar to this Texas section.
Copy the prompt
Copied
List the session laws that amended this code section.
Copy the prompt
Copied
Show the changes Vaquill has recorded for this section.
SEE HOW AUTH WORKS
Each user connects their own Vaquill access token once, and Scalekit sends it with every call. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Vaquill
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Vaquill
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Vaquill
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Vaquill
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other search and documents connectors.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
Test other agents
See the same per-user auth pattern across other search and documents connectors.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Vaquill access token looks fine in a demo. In production every search looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Vaquill today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Vaquill as the user or through a shared token?
As the user. Each user connects their own Vaquill access token once, and Scalekit sends it with every call. Audit logs attribute every search and lookup to that user, not a shared service account.
Where is the Vaquill access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Vaquill?
Yes. All 28 Vaquill tools are read-only, so the agent can search and read legal sources but cannot change anything. Filter by tool name in listScopedTools to narrow it further, for example to vaquill_search_statutes and vaquill_get_section_text. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Vaquill access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Do Vaquill calls cost credits?
Some do. vaquill_get_pricing returns the credit cost of every metered endpoint, and vaquill_get_credit_balance shows the credits left on the user's account and its rate limits, so the agent can check before a large lookup.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""vaquill"": {
""url"": ""https://mcp.scalekit.com/vaquill"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.vaquill]
url = ""https://mcp.scalekit.com/vaquill""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""vaquill"": {
""url"": ""https://mcp.scalekit.com/vaquill"",
""type"": ""http""
}
}
}