Prototype · pilot-first 634 tests green MCP SDK 17/17 live

India's public records are "public" in name only.

Blocked by WAFs. Gated by CAPTCHAs. Scattered across seven portals that were never designed to talk to each other.

AI makes it worse. LLMs hallucinate directorships, fabricate court citations, and invent company affiliations with the confidence of fact and the reliability of chance. In a field where one missed link can change a case, an unsourced answer isn't innovation — it's a liability dressed up as intelligence.

Vajra exists because we refuse to accept this.

We build graph-native link analysis that connects fragmented records into a knowledge graph — every node carrying a source URL, every edge carrying a retrieval timestamp. We never draw conclusions. We assemble provenance-stamped leads and hand them to humans who decide what they mean.

Every lead carries its source. Every connection carries proof.

Seven portals. Seven silos. One researcher doing it alone.

These records live across disconnected government portals, each with its own schema, its own access barriers, and its own quiet way of saying "the data is public, but you can't have it." Researchers spend 40 hours per matter hopping between them, downloading PDFs, copy-pasting into spreadsheets, and hoping — hoping — they didn't miss a hidden directorship in a shell company three layers deep.

Their citations break. Their notes go unverified. Their colleagues redo the same work slightly differently next week. No one can prove what was checked, what was missed, or where every lead came from.

This is not diligence. It is a system that was never designed for the people who depend on it.

329
politicians · 2024 Lok Sabha
profiles loaded with declared assets, liabilities, party, and constituency — verified against live MyNeta data.
14,491
electoral-bond donations
mapped to donor companies and recipient parties, joining three cycles of ECI disclosures into one query-able graph.
9,870
declared assets linked
from election affidavits, each attributed to its source page and retrieval timestamp. About 30 assets per MP, no manual copy-paste.
0
fabricated edges — across 7 sources
no relationship is inferred without provenance. Every lead is a source-returned record.

One name. Four phases. Every lead traced to its source.

A researcher gives Vajra a name. Vajra runs a four-phase investigation pipeline and stores every result in a Neo4j knowledge graph — with a source URL and retrieval timestamp on every node and every edge. Checkpoints make it resume-safe.

Phase 01

Profile & declared assets

Pulls election affidavits from MyNeta/ADR: declared assets, liabilities, party affiliation, constituency, criminal-record disclosures.

Creates Politician and Asset nodes linked by DECLARED edges — each carrying the affidavit page URL.

source: myneta.info
Phase 02

Corporate & donations

Searches MCA21 for director history, OpenCorporates for cross-border registrations, and the ECI bond-by-bond release for donor-to-party flows.

Creates Company, Donation, and PoliticalParty nodes linked by DIRECTOR_OF and MADE_DONATION edges.

sources: mca21 · opencorporates · eci bonds
Phase 03

Litigation & case status

Queries eCourts for case status and Indian Kanoon for full-text judgment search. Detects CAPTCHA walls, surfaces them honestly, and falls back to Kanoon.

Creates CourtCase nodes linked by INVOLVED_IN edges. A case mention is a lead, never a finding of guilt or status.

sources: ecourts · indiankanoon · cic/rti
Phase 04

Network & shortest paths

Analyzes the stored graph: company networks, common connections, shortest paths between entities, and cross-source graph queries a spreadsheet can never surface.

Returns json, cypher, or dot exports — every node and edge in the result already carries a source URL.

backend: Neo4j · export: json · cypher · dot

Every result is a lead — a research finding with provenance, not a conclusion. The tool shows you where to look. You decide what it means.

Five differentiators. No fluff.

Every line below is something the codebase and live VM store validate — verified test runs, real writes, real audit trails, real protocol negotiations. Nothing is a forecast or a slogan.

Provenance is the product

Every node & edge stores a source URL & retrieval timestamp. The same query that gives you the answer tells you where it came from.

`DECLARED` edges carry affidavit page URL · `MADE_DONATION` carries bond number

Graph-native, not tabular

Director → Company → Donation → Party → Court Case. Connected via a Neo4j knowledge graph. One query, not five spreadsheets.

`cypher MATCH` path queries, Graphviz DOT export for visual layout

India-first, not India-added

We handle Akamai WAFs on MCA21. We parse MyNeta's 2024 layout. We detect eCourts' CAPTCHA. India is the only market.

Per-source `source_info()` enumerates WAF, CAPTCHA, rate limit, auth

Embeddable via MCP

Vajra ships as an MCP tool provider — stdio & Streamable HTTP, both protocol 2024-11-05 / 2025-03-26 and 2026-07-28. Embed Vajra's graph in any legal-AI host.

`mcp_e2e_sdk_http.py` 17/17 · `mcp_e2e_sdk_http_v2.py` 17/17 live

Read-only by design

The API is locked down. The write path is gated behind `mcp.allow_investigate`. The only person who can damage the graph is the person who owns it.

`_reject_public_mutation` returns 403 on REST · write tool hidden in `tools/list`

Seven registries. One graph. Every node provenance-stamped.

Vajra scrapes what it can reach, parses what it finds, and links what it stores. When a source blocks automated access — MCA21's Akamai WAF, eCourts' CAPTCHA — we surface the failure honestly. We do not silently skip. We do not fabricate fallback.

Source What it holds Status
MyNeta / ADR Election affidavits, declared assets & liabilities ● Active · 2024-layout parser & constituency fallback
ECI bond disclosures Electoral-bond purchaser/encashment data (by bond #) ● Active · 14,491 donations seeded
Indian Kanoon Court judgments, case text, criminal-case detection ● Active · most reliable source
MCA21 Corporate filings, director lists, CINs, DINs ◐ Best-effort · Akamai WAF blocks automation
OpenCorporates Cross-border company registrations & officers ◐ Best-effort · requires API key
eCourts v6 Case status, filings, court orders ◐ Best-effort · CAPTCHA required per search
CIC / RTI RTI disclosures, government responses □ Stub · not yet implemented

329 politicians profiled · 9,870 assets linked · 14,491 donations mapped · 1,317 donor companies · 24 parties

Every number traces to a verified run against the live Neo4j store on the GCP VM. None are projections. See docs/STATUS.md for audit logs.

Three planes. One Neo4j per customer. Read-only by default.

Vajra is engineered for high-stakes work — disputes, white-collar, diligence, investigations. The architecture is the guarantee. Engineering facts, not aspirations.

Plane 01 · Collect

Investigation runner

ops runner · your VM, container, or CI cron
  • Disk checkpoints for minutes-to-hours runs
  • Polite per-source rate limits; one stable egress IP
  • Source-rights controls per pilot scope
  • Only writer to customer Neo4j via `vajra` CLI
Plane 02 · Store

Hosted Neo4j · one per customer

AuraDB or self-hosted · encrypted Bolt (`neo4j+s://`)
  • Dedicated instance per customer agency
  • Per-customer evidence directory; no shared state
  • Schema constraints & indexes for identity stability
  • Resumed sessions re-scope to the current `allow_investigate` setting after restart
Plane 03 · Serve

Read-only API tier · serverless

Python 3.12 ASGI · scales to zero
  • Read-only FastAPI (PilotGuard enforced)
  • `X-API-Key` per customer · 401 without · per-key rate limit
  • Ephemeral fs · never writes to disk · audit-only logs
  • Interactive docs at /docs · health at /health

Read-only by default

Public REST mutations return 403. The MCP write tool is hidden from `tools/list` unless `mcp.allow_investigate=true`. The architecture, not a flag, locks the graph down.

Per-customer isolation

One dedicated Neo4j per agency; no shared credentials, ports, logs, or backups between tenants.

Provenance-audited

Every request produces a JSON audit line with masked credentials, tool method, key hash, and JSON-RPC error code. MCP bearer-token rotation is tamper-evident: each retired token is hash-chained into an auditable store.

Human review required

A named reviewer accepts or rejects every material lead. The graph produces findings; the human produces conclusions.

The entity layer for legal-AI platforms.

Vajra ships as a Model Context Protocol tool provider. Legal-AI hosts — Veritect, SCC, Manupatra, CaseMine, Claude Desktop, and custom agents — can call Vajra over stdio or HTTP for provenance-stamped entity leads through the protocol they already use.

  • Seven read tools: search, graph export, company network, shortest paths, common connections, source metadata, health.
  • One gated write tool: vajra_investigate, hidden by default and refused unless allow_investigate=true.
  • Zero new runtime dependency. The MCP SDK is a dev-only test dependency; the server uses only Python stdlib + the project graph layer.
  • Both protocol eras: legacy 2024-11-05 / 2025-03-26 handshake (mcp SDK v1) and the stateless 2026-07-28 revision (mcp SDK v2).
stdio · mcp SDK v1 clientPython
# drives Vajra as an MCP tool provider from any legal-AI host
async with streamable_http_client(url, http_client=http_client) as (read, write):
    async with ClientSession(read, write, client_info=Implementation(name="veritect", version="1.0")) as session:
        await session.discover()            # negotiate 2024-11-05 / 2025-03-26 / 2026-07-28
        tools = await session.list_tools()    # 7 read tools, write tool hidden
        result = await session.call_tool(
            "vajra_search_entities",
            {"query": "Nitin Gadkari", "limit": 5})
        print(result.content[0].text)   # JSON: name, label, source URL, retrieval ts

Live-validated on the GCP VM: mcp_e2e_sdk_http.py 17/17, mcp_e2e_sdk_http_v2.py 17/17, mcp_e2e_write.py 9/9, mcp_e2e_session_resume.py 12/12. See docs/MCP_INTEGRATION.md.

For people who refuse to guess.

The lawyer who refuses to file a memo based on unverified AI output

The investigator who knows one missed directorship can change a case

The journalist who needs every claim to carry a source before it goes to print

The compliance officer who needs an audit trail, not just an answer

The platform team embedding entity investigation into a legal-AI host

The researcher tired of spending 40 hours doing what should take minutes

They share a worldview: evidence before conclusions, provenance before claims, human judgment before automation.

One scoped matter. Four weeks. Evidence before enthusiasm.

Run one real investigation through Vajra. We bring the graph, the API, the MCP server, and an audit trail. You bring the real matter, the named reviewer, and the willingness to grade us honestly at the end. Cell A: ₹50,000 · Cell B: ₹75,000 · Cell C: ₹1,20,000. The cell is fixed; the matter is yours.

STEP 01

Scope one matter

An authorized scope: entities, sources, date window, named reviewer, success criteria. Opaque matter IDs only — no PII ever enters the system.

STEP 02

Stand up isolated env

Dedicated Neo4j instance, dedicated evidence directory, per-customer API key. pilot.enabled fail-closed. No shared state.

STEP 03

Run the pipeline

Up to three scoped matters over four weeks. Checkpoint-resumable. Source skip register & write-audit log delivered with every brief.

STEP 04

Scorecard & go/no-go

Structured feedback at two check-ins, exit scorecard, and a go/no-go based on evidence — not enthusiasm. No continuity commitment on either side.

Open a pilot conversation →

pre-pilot · no pilot has been run · no customer has paid · see commercialization/ for evidence register

The lines we will not cross.

1.

We will never fabricate a relationship the data does not support. If a connection is probabilistic, we flag it for mandatory human review. A graph edge is a lead, never a conclusion.

2.

We will never publish a conclusion without provenance. Every lead carries a source URL and a retrieval timestamp. Without that, it is an AI-generated opinion dressed up as research.

3.

We will never sell automated decisions in high-stakes contexts. The API is read-only by default. The write path is gated. The system is designed so the only person who can damage the graph is the person who owns it.

4.

We will never scrape private data. Only public records. Only government disclosures. Only information the law already makes available. Only the sources named for the matter at hand.

5.

We will never claim production readiness before the evidence exists. We are a working prototype. We are pilot-first. We will say what works, what doesn't, and what is unvalidated — and we will say it in writing.

6.

We will never weaken the read-only default without explicit decision. This is not a feature to be toggled. It is the architecture. It is the line we will not cross even when crossing it would be easier, faster, or more profitable.

The standard

The public record is not a lie. It's just locked behind a door that wasn't supposed to be there.

We're building the key. Not to replace human judgment — but to make it possible.

Every lead carries its source. Every connection carries proof.
That is the standard. That is Vajra.