Tool

Research questions with verified citations and budget control

Deep research agent that verifies every claim against source text, enforces spending budgets to the cent, and keeps local data analysis private.

Works with sqlitetavilybraveanthropicopenai

91
Spark score
out of 100
Updated last month
Source checked Sep 10, 2026
Version 0.1.0

Add to Favorites

Why it matters

Conduct deep research on complex questions by decomposing queries, searching multiple sources, extracting and verifying claims against original text, detecting contradictions, and producing cited answers-all while enforcing strict spending limits and keeping local data private.

Outcomes

What it gets done

01

Decompose research questions into sub-queries and search across web sources with configurable depth

02

Extract claims from sources and verify each quote appears verbatim in the original text

03

Detect contradictions between claims and generate answers with citations under enforced budget

04

Analyze local CSV/JSON files with privacy-preserving SQL that only returns aggregates, never raw rows

Source

Get it from source

Spark does not host a copy of it.

Open source

Reports

Agent outcome reports

No reports yet

Overview

Mole

mole is a deep-research agent that decomposes questions, searches sources, extracts claims with verified quotes, checks for contradictions, and writes cited answers. Every model call is reserved against a budget before execution and settled after, enforcing spending limits at the database schema level. It runs as a static binary, uses your API keys, and speaks MCP for integration with coding agents. Use mole when you need research with hard cost controls (0% overshoot), every claim backed by verbatim quotes checked against sources, or local data analysis where raw contents must stay on your machine. It fits scenarios requiring verifiable research outputs, integration with MCP-compatible coding agents, or analysis of CSV/TSV/JSON/JSONL files with privacy guarantees.

What it does

mole is a deep-research agent that decomposes questions, searches sources, extracts claims, verifies every quote against its source text, checks for contradictions, and writes answers with citations. Every model call is reserved against a budget before execution and settled after, ensuring the spending ceiling you set is never exceeded. It runs as a single static binary on your machine, uses your own API keys, and speaks MCP so coding agents can drive it.

When to use - and when NOT to

Use mole when you need research with hard cost controls: the budget is enforced in the database schema itself, not estimated, with 0% measured overshoot across the test corpus. Use it when you need every claim backed by a verbatim quote checked against the source page before it reaches your answer. Use it when analyzing local CSV, TSV, JSON, or JSONL files where the raw data must stay on your machine - the model chooses hypothesis templates and column names, mole renders and runs SQL locally, and only aggregates (counts, means, test results, buckets covering at least five records) leave your system.

Do NOT use mole if you need Parquet file support for local data analysis. Do NOT use it if you require the model to see raw rows or write SQL directly - mole enforces a privacy boundary by design.

Inputs and outputs

Inputs: research questions with budget constraints (dollar or token limits), dataset schemas for structured extraction, and local data files (CSV/TSV/JSON/JSONL) for analysis.

Outputs: answers with citations where claims are checked against source text, dataset results available via mole dataset <session-id> command in CSV or JSON format, and aggregate results from local data analysis with inspection via mole crossings <session-id>.

Integrations

Search providers: Tavily and Brave are supported. Configure with mole config set search.provider tavily or brave.

Model providers: Anthropic (Claude Sonnet 5, Claude Haiku 4.5) and any OpenAI-compatible endpoint (DeepSeek, Ollama, llama.cpp, vLLM, proxies). Configure with:

mole config set llm.provider anthropic
mole config set llm.api-key sk-...
mole config set llm.model claude-sonnet-5
mole config set llm.cheap-model claude-haiku-4-5

For OpenAI-compatible endpoints:

mole config set llm.provider openai-compatible
mole config set llm.base-url https://api.deepseek.com/v1
mole config set llm.model deepseek-chat

MCP clients: mole serves MCP over a unix socket (mode 0600, refuses connections from other users). Point clients at the shim in .mcp.json:

{
  "mcpServers": {
    "mole": { "command": "mole-mcp" }
  }
}

Toolkit mode: Run mole serve --toolkit to invert control - your coding agent's model does the reasoning while mole contributes the deterministic half (search, extraction, verification). Works with Claude Code, Qwen Code, and other subscription-based coding agents.

Who it's for

Researchers and developers who need verifiable research with hard cost controls. Data analysts who must keep local data local while still leveraging LLM reasoning. Teams using MCP-compatible coding agents (Claude Code, Cursor, Windsurf) who want to add research capabilities without sending credentials through client config files. Users of subscription-based coding environments who want to use their existing model allocation for research reasoning while mole handles search, extraction, and verification.

Unlike chat interfaces with web search, mole enforces budgets at the database schema level, verifies every quote verbatim before it can reach an answer, and maintains a privacy boundary for local data analysis.

Source README

Mole - a deep research agent in Go, exposed over MCP

A deep-research agent with an enforced budget, verified quotes, and a privacy boundary for local data.

Ask a question. mole decomposes it, searches, reads sources, extracts claims,
checks each claim against the text it came from, looks for contradictions between
them, and writes an answer with citations. Every model call is reserved against a
budget before it happens and settled after, so the ceiling you set is the ceiling
it hits.

It runs as a single static binary on your machine, uses your own API keys, and
speaks MCP so a coding agent can drive it - either by handing mole a question and
collecting the answer, or, in toolkit mode, by doing the reasoning with its own
model while mole supplies the parts that are not model calls.

mole researching a question: planning, 39 claims, two contradictions found, $0.0149 spent


Why mole

Three things mole does that a chat interface with web search does not.

The budget is enforced, not estimated. Every call is reserved before it is
made and settled after, against a ledger with non-negative constraints in the
database schema itself. --usd 0.50 means the run stops at fifty cents. Measured
overshoot across the test corpus is 0%.

Every claim carries a quote, checked against the source. A claim whose quote
does not appear verbatim in the page it was mined from is discarded at extraction,
before it can reach an answer. Claims that survive can be re-read against their
source afterwards, and one that turns out not to be supported is marked as such in
the report rather than quietly dropped.

Your local data stays local. Point mole at a CSV or a folder and it will
analyse it without the contents leaving your machine: the model chooses a
hypothesis template and column names, mole renders and runs the SQL, and only
aggregates - counts, means, test results, buckets covering at least five records -
are allowed back. mole crossings shows you exactly what left.


Install

Script - Linux and macOS, amd64 and arm64:

curl -fsSL https://raw.githubusercontent.com/lajosdeme/mole/main/install.sh | sh

Downloads the release archive for your platform, verifies its SHA-256 against the
checksums published with the release, and installs mole and mole-mcp into
~/.local/bin (or /usr/local/bin if that is writable). It uses sudo only if
the target directory needs it, and --dry-run shows what it would do. If piping a
script into a shell makes you uneasy - reasonable - read it first, or use one of
the paths below.

Homebrew - macOS and Linux:

brew install lajosdeme/mole/mole

Fully qualified, and it has to be: an unrelated mole (a macOS cleanup tool) is in
homebrew/core, so brew install mole will always mean that one. Both install a
binary called mole, so only one can be linked at a time.

Arch Linux - from the AUR:

yay -S mole-research-bin      # prebuilt release binaries
yay -S mole-research          # build from source

Not mole: that name and mole-bin on the AUR belong to an SSH tunnelling tool
that has held them since 2020. The package installs /usr/bin/mole and declares
the conflict, so pacman will tell you rather than overwrite anything.

Debian and Ubuntu - .deb from the releases page:

curl -fsSLO https://github.com/lajosdeme/mole/releases/latest/download/mole_amd64.deb
sudo dpkg -i mole_amd64.deb

An .rpm is published for the same platforms.

From source - needs Go 1.25+:

go install github.com/lajosdeme/mole/cmd/mole@latest
go install github.com/lajosdeme/mole/cmd/mole-mcp@latest

Or clone and make install, which stamps the version so mole version reports the
tag rather than dev.

Every path installs the same thing: two static binaries with no runtime
dependencies, built CGO_ENABLED=0. The database is SQLite, created on first use
under your XDG data directory.

Configure

You need a search provider and a model provider. Keys live in
~/.config/mole/config.json, mode 0600 - never in environment variables that
leak into process listings, and never in .mcp.json.

mole config set search.provider tavily          # or: brave
mole config set search.tavily-key tvly-...

mole config set llm.provider anthropic          # or: openai-compatible
mole config set llm.api-key sk-...
mole config set llm.model claude-sonnet-5
mole config set llm.cheap-model claude-haiku-4-5

mole doctor                                     # verify everything above

Any OpenAI-compatible endpoint works - DeepSeek, Ollama, llama.cpp, vLLM, a proxy:

mole config set llm.provider openai-compatible
mole config set llm.base-url https://api.deepseek.com/v1
mole config set llm.model deepseek-chat

A model served from localhost is priced at zero and still counted in tokens, so
--tokens bounds a self-hosted run that costs no money at all.


Usage

Research a question

mole research "how much electricity does the bitcoin network use?" --usd 0.50
mole research "..." --tokens 200000            # token budget instead of dollars
mole research "..." --max-sources 8 --max-depth 3
mole research "..." --json                      # machine-readable result

Budget is required, and the two units are mutually exclusive. Only dollar mode can
price a search call; only token mode can bound a model whose rates mole does not
know.

Ask a follow-up

mole ask <session-id> "what did the Cambridge estimate say?"

Answers from the claims that session already collected. No new searching, no new
spending beyond the one call to phrase the answer.

Build a dataset instead of prose

mole research "largest UK supermarket chains and their revenue" \
  --mode dataset \
  --schema 'company:text!,revenue:number=annual revenue in GBP,employees:number' \
  --usd 0.50

mole dataset <session-id> --format csv > chains.csv
mole dataset <session-id> --format json          # every value every source gave

! marks the field that identifies a row. Rows are merged across sources by fuzzy
key, so Aldi and Aldi UK become one row with two sources. CSV holds one value
per cell and says so - it carries a source count and a contested column naming
the fields the sources disagree about. JSON carries every disagreeing value with
the sources behind each.

Analyse local data

mole connect add sales ./exports/sales.csv       # one file
mole connect add exports ./exports               # or a whole folder
mole research "how does spend differ between regions?" \
  --actors local_compute --usd 0.30

mole crossings <session-id>                      # what left the machine

CSV, TSV, JSON and JSONL are supported; Parquet is not. The model never sees a
row and never writes SQL - it picks a template and column names, and mole renders
the statement.

Serve MCP clients

mole serve

Listens on a unix socket, mode 0600, in a private directory, and refuses
connections from any other user. Point a client at the shim:

{
  "mcpServers": {
    "mole": { "command": "mole-mcp" }
  }
}

No credentials in that file - the shim forwards to the daemon, which holds them.

Use the subscription you already pay for (toolkit mode)

mole serve --toolkit

The arrangement above has mole own the model: it plans, mines and writes with your
API key, and the coding agent driving it is pressing a button. Toolkit mode inverts
that. The agent's model does the reasoning; mole contributes the deterministic
half
- which is the half worth having, and the half that does not care whose model
is on the other side of it.

If you are inside Claude Code or Qwen Code on a subscription, your model tokens are
already paid for. This is the mode for that.

Fourteen tools, each named mole.<tool>, alongside the research.* tools - the
flag adds a surface rather than replacing one:

session session_open, session_close
retrieval search, fetch - through mole's SSRF guard, robots handling and rate limiter
evidence verify_quote, claim_add, claims_list, citations
local data connect_list, aggregate - the privacy boundary, unchanged
graph pairs_candidates, edge_add
dataset rows_add, dataset

Inspect a run

mole sessions                # recent sessions and what they cost
mole trace <session-id>      # per-call cost and timing breakdown
mole stats --fetch           # why fetches failed, across sessions

How it works

question
   ↓  planner            decompose into sub-questions, replan as evidence arrives
   ↓  executor           one lead at a time per worker, reserved and settled
   ↓  actor              search → fetch → extract → mine claims
   ↓                     every claim quote-checked against its source
   ↓  verifier           pair up related claims, adjudicate, build the claim graph
   ↓                     re-read a sample of claims against their sources
   ↓  output             synthesise from claims that survived, with citations
answer

Three actor types feed the same graph. web searches and reads pages.
academic queries Crossref, OpenAlex, arXiv and PubMed, deduplicates by DOI and
prefers open-access full text. local_compute runs deterministic SQL over data
you registered and never lets a row reach the model.

Toolkit mode runs the same machinery with the arrows reversed: the agent decides what
to search, what to read and which claims relate, and mole does the quote checking,
the pair retrieval, the merging and the SQL rendering. Both modes share one copy of
each - the same AcceptRow for dataset rows, the same aggregation gate, the same
lexical retriever - so a toolkit graph and an autonomous one are built the same way.


Honest numbers

mole grades its own runs. mole eval <session-id> prints a scorecard, and any
metric it cannot compute says so instead of quietly reading zero.

budget overshoot 0% - no run has exceeded its ceiling
claim integrity 100% - every stored claim carries a source and a verbatim quote
citation accuracy 100% - every quote found in the source it cites
grounding rate 80% - of claims re-read against their source, confirmed
contradiction precision 70% with the confirm pass, 51% without
merge precision / recall 1.000 / 1.000 on constructed ground truth

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.