prompto × plumbline

LLM answers checked against the data, or a refusal with the reason.

Connect your own LLM app to a dataset through Plumbline. Every figure in an answer is checked against SQL facts before you see it; a question the data cannot support gets a refusal that states why, never a guess. Setup is one URL, below.

Terms used here

MCP
Model Context Protocol: the standard by which LLM apps (Claude, ChatGPT, VS Code, others) call external tools. Plumbline is an MCP server; you add its URL to your LLM app.
snapshot
A pinned copy of the dataset that answers come from. The demo snapshot is a 100-person, 19-department payroll dataset from an HR sandbox (synthetic people, realistic structure).
verified
Each number in an answer is matched against SQL-computed facts from the snapshot. Figures that match are marked verified; a mismatch is flagged as a conflict in front of you.
refusal
When the snapshot has no evidence for a question, the answer is a refusal naming the gap. A refusal is a correct outcome, not an error.
explanation record
The audit trail behind an answer: which facts were used, what was checked, what was refused or disclosed. Retrievable per answer.

What it looks like in your LLM app

mockup · your LLM app
Claude · Plumbline connected over MCP
What will compensation look like next year?
PLUMBLINE via PROMPTO
answerability gate · coverage: empty · no facts published
Who are our biggest pay outliers versus their own department, and by how much?
PLUMBLINE via PROMPTO

Five people sit well above their department's median pay. Florian Grady leads at 6.0× the Electronics median, $518,878 against $86,590.

up to department medianabove median (the outlier gap)
5/5 figures store-verified · sources: compensation_facts, department_growth

Mockup of an LLM chat with Plumbline connected: you type the question, the verdict panel renders in the conversation. Every figure and name shown is real output against the demo snapshot (annualized pay). Hosts without panel support get the same content as text.

What you are connecting to

host layerPromptO

Serves MCP servers into Claude, ChatGPT, VS Code, and other MCP hosts: the in-chat panel, confirm gates, and a plain-text fallback where panels are unavailable.

trust pipelinePlumbline

Every figure in an answer is checked against SQL-computed facts and labeled with how it was checked; a question the evidence cannot support is refused with the reason. Workforce data is the first domain; the mechanics are domain-agnostic.

Connect your LLM

A shared demo endpoint is open. No account; it is rate-limited per address and per day. Pick your client:

terminal, then restart the session

claude mcp add --transport http plumbline-demo https://plumbline.lattice-sys.com/mcp/demo

Settings → Connectors → Add custom connector → paste as URL

https://plumbline.lattice-sys.com/mcp/demo

Desktop then runs its connect step and approves the demo automatically (no account, no password). The URL must be publicly reachable over https, which is what this address is.

Settings → Connectors → Advanced → Developer mode → Add connector → MCP server URL

https://plumbline.lattice-sys.com/mcp/demo

ChatGPT connects from its own servers, so the URL must be https and publicly reachable; a private/tailnet address will not work from ChatGPT.

.vscode/mcp.json in your workspace

{ "servers": { "plumbline-demo": { "type": "http", "url": "https://plumbline.lattice-sys.com/mcp/demo" } } }

~/.cursor/mcp.json

{ "mcpServers": { "plumbline-demo": { "url": "https://plumbline.lattice-sys.com/mcp/demo" } } }

~/.gemini/settings.json

{ "mcpServers": { "plumbline-demo": { "httpUrl": "https://plumbline.lattice-sys.com/mcp/demo" } } }

any MCP client speaking streamable HTTP

{"url": "https://plumbline.lattice-sys.com/mcp/demo"}

Then type this in your LLM session

Paste these prompts one at a time. Each shows a different part of the pipeline. In hosts with MCP panel support (Claude, ChatGPT) the verdict renders as an in-chat panel with suggestion chips; a chip copies its question so you can paste it here.

1 · a question the data cannot answer

Using the plumbline tools, answer exactly this question: What will compensation look like next year?

Expected: a refusal naming the gap (no future compensation data in the snapshot), not a guess.

2 · a question it can answer

Using the plumbline tools, answer exactly this question: How many people and departments are in this company?

Expected: a verified answer (100 people, 19 departments) with per-figure provenance.

3 · analysis with per-figure provenance

Using the plumbline tools: which roles are unusually paid, and which employees are compensation outliers?

Expected: named outliers with each figure carrying its own provenance tier (store-verified, derived, or unverified).

4 · a refusal on policy, not on data

Using the plumbline tools, answer exactly this question: Which employee most deserves a raise this year, based on their performance?

Expected: refused as an employment decision with no performance evidence in the snapshot. The data could produce a name; the pipeline declines to.

5 · org topology and anomalies

Which managers look like routing hot spots? Then find anomalies in benefits deduction patterns compared to peers.

Expected: grounded org-topology and anomaly findings, each tied to snapshot facts; partial evidence stays visible instead of becoming a guess.

6 · change over time

Using the plumbline tools: what changed most between the last two snapshots?

Expected: a diff grounded in the two pinned snapshots, not a narrative about "trends".

7 · sandboxed code, then earn the figure back

Get the total headcount and the three largest department counts from Plumbline's verified tools, use run_code to compute each department's share of the total in the isolated sandbox (show the arithmetic), then corroborate the total with cross_check (value_key 'people').

Expected: the sandbox arithmetic comes back labeled UNVERIFIED (it bypasses the trust path by design); cross_check then corroborates the total against the SQL fact store. That round trip is the point: computed figures are cheap, corroborated figures are earned.

8 · raw SQL from inside the sandbox (demo opt-in)

In run_code, read plumbline://sandbox-api.d.ts, then run: const rows = await plumb.queryRows("SELECT department, count(*) AS people FROM snapshot_employees GROUP BY department ORDER BY people DESC LIMIT 5"); console.log(JSON.stringify(rows)). Report the rows, then corroborate the total headcount with cross_check.

Expected: raw rows, loudly labeled UNVERIFIED. This read-only, snapshot-scoped SQL reach is a server-side opt-in enabled on this shared demo so you can probe the boundary; it is not on by default in production, where the sandbox has no data access and SQL runs only as the server's own registered, replayable queries.

9 · the audit trail

Show the explanation record for that last answer.

Expected: which facts were used, what was checked, what was refused or disclosed.