Plumbline — a trust layer for LLM answers
by plumbline.lattice-sys.com · remote · no sign-in to list tools · v0.1.0 · published by com.lattice-sys.plumbline
Every figure re-checked against SQL-computed facts; unsupported questions refused with the reason.
18 tools: 1 do something that can't be undone, 6 change things and 11 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone1Claude Code: ask: see these tools
- Changes things6Claude Code: ask: see these tools
- Only reads11Claude Code: allow: see these tools
6 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http plumbline https://plumbline.lattice-sys.com/mcp/demoFindings
Matches of fixed checks, with the text they matched.
- Warnask_submit_draft
The server marks "ask_submit_draft" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "ask_submit_draft" says "submit": a word for a change.
- Warnquery_fact
The server marks "query_fact" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "query_fact" says "query": a word for reading.
- Warnrun_code
The server marks "run_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}; The name "run_code" says "run": a word for a change.
- Warnrun_sql
The server marks "run_sql" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "run_sql" says "run": a word for a change.
- Warntrust_finalize
The server marks "trust_finalize" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "trust_finalize" says "finalize": a word for a change that another call does not undo.
- Infoask_prepare
The description mentions "credential".
What this check looks forMatched text
description: "...eration happens on your side, so no LLM credential ever reaches this server. An unanswerab..."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
18 tools
Can't be undone 1Claude Code: ask
trust_finalizeReturn the session's graded trust verdict: the tier (verified / registered-query / generated-sql / corroborated / unverified / conflict / refused), which trusted steps were skipped…1 finding
Why it is in this group
- The name "trust_finalize" says "finalize": a word for a change that another call does not undo.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "trust_finalize" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "trust_finalize" says "finalize": a word for a change that another call does not undo.
Description, as the server wrote it Return the session's graded trust verdict: the tier (verified / registered-query / generated-sql / corroborated / unverified / conflict / refused), which trusted steps were skipped across the session, the deterministic confidence (k of n figures store-verified, weakest figure tier, conflicts), the per-figure provenance, the per-call ledger, and the at-your-own-risk disclaimer.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Finalize Trust Verdict
Changes things 6Claude Code: ask
ask_prepareBYO step 1 of 2: run the server-side trust plane for a business question (plan, SQL-verified facts, evidence retrieval, answerability gate, prompt composition) and return the compo…1 finding
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "...eration happens on your side, so no LLM credential ever reaches this server. An unanswerab..."
Description, as the server wrote it BYO step 1 of 2: run the server-side trust plane for a business question (plan, SQL-verified facts, evidence retrieval, answerability gate, prompt composition) and return the composed prompt plus a single-use prepare_key (a signed handoff token; echo it back VERBATIM and in full, or use the short ask_id alias; in prose always say the ask_id, never the token). Read-only: prepare holds no server state and is safe to run without confirmation — the receipt is minted only at ask_submit_draft. Pass the user's question VERBATIM: do not expand, narrow, or reword it — the server plans coverage itself, and an unrequested rewrite misleads the user about what was asked. If you must revise it (e.g. to fold in essential conversation context), you MUST also pass the user's exact wording in original_question so the panel can disclose the revision. YOU (the connected model) then write the draft answer from that prompt and submit it with ask_submit_draft — generation happens on your side, so no LLM credential ever reaches this server. An unanswerable question still receives a prompt for reference; its draft is force-refused at submit and can never earn a verified verdict. Only a policy refusal stops at prepare. Recommended drafting path on this deployment.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: BYO: Prepare Grounded Prompt
ask_submit_draftBYO step 2 of 2: verify the draft you wrote for an ask_prepare prompt.1 finding
Why it is in this group
- The name "ask_submit_draft" says "submit": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "ask_submit_draft" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "ask_submit_draft" says "submit": a word for a change.
Description, as the server wrote it BYO step 2 of 2: verify the draft you wrote for an ask_prepare prompt. The server runs the SAME post-answer guards the strict path uses (facts presence, tagged claims, concept binding, earner-name grounding) against its own SQL facts and publishes the trust envelope; a draft that fails any guard is refused. Pass the prepare_key token back VERBATIM and in full. Handoffs are single-use per verdict and expire.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: BYO: Verify Client Draft
cross_checkCorroborate a figure you obtained (e.g.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Corroborate a figure you obtained (e.g. from run_sql) against the verified fact store: it re-derives the named value_key from the same SQL the verified pipeline uses and compares. AGREE lifts an otherwise-unverified session to 'corroborated'; DISAGREE marks a CONFLICT (worse than unverified). This is the only way a raw figure earns trust back, and it can only ever agree with a number the fact store itself computed. Resolvable keys cover the single-snapshot fact concepts plus temporal and per-department growth keys (e.g. indexed_people.<dept>); per-question keys (a named department's median, one person's direct-report count) return unmapped.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Cross-Check a Figure
query_factExecute a registered, versioned read-only fact query against the server-pinned dataset.1 finding
Why it is in this group
- The name "query_fact" says "query": a word for reading.
- The description's first verb is "execute": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "query_fact" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "query_fact" says "query": a word for reading.
Description, as the server wrote it Execute a registered, versioned read-only fact query against the server-pinned dataset. Provide query_id and version only: SQL is approved by the domain pack, never caller-supplied. Returns normalized rows plus a reproducible trust receipt containing the dataset and query versions.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Run Registered Fact Query
run_codeRun YOUR OWN JavaScript in the in-tenant coderunner sandbox with the read-only, snapshot-scoped plumb.query() SDK.1 finding
Why it is in this group
- The name "run_code" says "run": a word for a change.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "run_code" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}; The name "run_code" says "run": a word for a change.
Description, as the server wrote it Run YOUR OWN JavaScript in the in-tenant coderunner sandbox with the read-only, snapshot-scoped plumb.query() SDK. No filesystem, environment, or general network access. Read plumbline://sandbox-api.d.ts before writing code. The raw-SQL server opt-in is enabled, but results still bypass the trust path and are UNVERIFIED. Returns stdout/stderr plus metadata-only host-call trace evidence.
Annotations the server declares
- destructiveHint: false
- openWorldHint: false
- readOnlyHint: true
- title: Run Sandboxed JavaScript (Unverified)
run_sqlRun YOUR OWN single read-only SELECT/WITH over the virtual snapshot_* relations.1 finding
Why it is in this group
- The name "run_sql" says "run": a word for a change.
- The input takes a statement or command to run (input.sql), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "run_sql" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "run_sql" says "run": a word for a change.
Description, as the server wrote it Run YOUR OWN single read-only SELECT/WITH over the virtual snapshot_* relations. The query is statically verified against an allowlist, rewritten to the active snapshot, and run read-only. This BYPASSES the planner, grounding gate, and answer-facts reconciliation, so results are UNVERIFIED and labelled as such. Deployments may refuse the FIRST raw call of a session pending acknowledge_unverified: true (the refusal says how to proceed). Optionally declare `concepts` to learn which figures the fact store could corroborate via cross_check.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Run Read-Only SQL (Unverified)
Only reads 11Claude Code: allow
ask_resultFetch the published verdict for an ask_prepare session (status: pending, published, or unknown).No findings
Why it is in this group
- The description's first verb is "fetch": a word for reading.
Description, as the server wrote it Fetch the published verdict for an ask_prepare session (status: pending, published, or unknown). This is the app panel's polling surface, so the verified answer renders inside the panel that prepared the question. As the connected model you normally never need it: write your draft and call ask_submit_draft. Exception: if you are asked to submit for a session whose composed prompt is no longer in your context, call this with include_prompt true to receive that session's exact prompt again, then draft and submit.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: BYO: Fetch Published Verdict
compare_departmentsCompare two departments by headcount and compensation.No findings
Why it is in this group
- The name "compare_departments" says "compare": a word for reading.
Description, as the server wrote it Compare two departments by headcount and compensation. NOTE: internal drafting is disabled on this deployment. If your client supports MCP sampling, this tool asks YOUR model to draft in the same call (verified server-side); otherwise it returns an explicit refusal, and you should use ask_prepare then ask_submit_draft to draft with your own model.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Compare Departments (Verified)
describe_fact_capabilitiesList safe metadata for the registered fact queries available on the server-pinned dataset: IDs, labels, parameters, and result shapes, never SQL.No findings
Why it is in this group
- The name "describe_fact_capabilities" says "describe": a word for reading.
Description, as the server wrote it List safe metadata for the registered fact queries available on the server-pinned dataset: IDs, labels, parameters, and result shapes, never SQL. Use this when a question appears relevant but a selected route produced no facts; a route miss is not evidence that the underlying records are absent.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Discover Fact Capabilities
find_payroll_anomaliesSurface payroll and deduction anomalies in the latest snapshot.No findings
Why it is in this group
- The name "find_payroll_anomalies" says "find": a word for reading.
Description, as the server wrote it Surface payroll and deduction anomalies in the latest snapshot. NOTE: internal drafting is disabled on this deployment. If your client supports MCP sampling, this tool asks YOUR model to draft in the same call (verified server-side); otherwise it returns an explicit refusal, and you should use ask_prepare then ask_submit_draft to draft with your own model.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Payroll Anomalies (Verified)
get_ai_act_transparencyReturn the Art.No findings
Why it is in this group
- The name "get_ai_act_transparency" says "get": a word for reading.
Description, as the server wrote it Return the Art. 13 transparency descriptor: intended purpose, capabilities, limitations, human oversight, logging mechanism, and article mapping.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: EU AI Act Transparency Descriptor
get_answer_queriesShow the SQL behind one answer you already received, addressed by its correlation_id.No findings
Why it is in this group
- The name "get_answer_queries" says "get": a word for reading.
Description, as the server wrote it Show the SQL behind one answer you already received, addressed by its correlation_id. Returns only the recorded fact queries (id, version, label, SQL, parameters, result schema, dataset version) for that answer: no rows, no evidence text, no answer text, no envelope, and no way to list the catalog. Recorded SQL has its arguments inlined as literals, so a query that filters on a specific value discloses that value; the built-in workforce queries inline only snapshot ids. Requires the persisted compliance log and the same session that produced the answer. Absent from the no-auth public demo.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Show the SQL Behind an Answer
get_evidence_documentShow ONE retrieved evidence document behind an answer you already received, addressed by that answer's correlation_id plus a document_id from its evidence_documents references.No findings
Why it is in this group
- The name "get_evidence_document" says "get": a word for reading.
Description, as the server wrote it Show ONE retrieved evidence document behind an answer you already received, addressed by that answer's correlation_id plus a document_id from its evidence_documents references. Returns the full stored document (title, body, metadata, embedding_text) with the retrieval rank and scores the answer recorded; never the raw embedding vector. Only documents the addressed answer actually recorded resolve: there is no fetch-by-id in general and no way to browse the store. Requires the persisted compliance log and the same session that produced the answer. Absent from the no-auth public demo.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Show an Evidence Document Behind an Answer
get_manager_chainReturn the management/reporting chain for an employee.No findings
Why it is in this group
- The name "get_manager_chain" says "get": a word for reading.
Description, as the server wrote it Return the management/reporting chain for an employee. NOTE: internal drafting is disabled on this deployment. If your client supports MCP sampling, this tool asks YOUR model to draft in the same call (verified server-side); otherwise it returns an explicit refusal, and you should use ask_prepare then ask_submit_draft to draft with your own model.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Manager & Reporting Chain (Verified)
search_docsSearch Plumbline's own product and architecture documentation (how the verification, refusal, and trust layer itself works).No findings
Why it is in this group
- The name "search_docs" says "search": a word for reading.
Description, as the server wrote it Search Plumbline's own product and architecture documentation (how the verification, refusal, and trust layer itself works). Returns ranked, citable doc passages; does NOT touch employment data, and returns an empty result set honestly when nothing matches.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Search Plumbline Docs
search_employeeSearch the employment fact store for a person and return a grounded, verified answer.No findings
Why it is in this group
- The name "search_employee" says "search": a word for reading.
Description, as the server wrote it Search the employment fact store for a person and return a grounded, verified answer. NOTE: internal drafting is disabled on this deployment. If your client supports MCP sampling, this tool asks YOUR model to draft in the same call (verified server-side); otherwise it returns an explicit refusal, and you should use ask_prepare then ask_submit_draft to draft with your own model.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Search Employee (Verified)
summarize_benefitsSummarize benefit enrollments, optionally scoped (e.g.No findings
Why it is in this group
- The name "summarize_benefits" says "summarize": a word for reading.
Description, as the server wrote it Summarize benefit enrollments, optionally scoped (e.g. a department or plan). NOTE: internal drafting is disabled on this deployment. If your client supports MCP sampling, this tool asks YOUR model to draft in the same call (verified server-side); otherwise it returns an explicit refusal, and you should use ask_prepare then ask_submit_draft to draft with your own model.
Annotations the server declares
- openWorldHint: false
- readOnlyHint: true
- title: Benefits Summary (Verified)
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http plumbline https://plumbline.lattice-sys.com/mcp/demoRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__plumbline__ask_result",
"mcp__plumbline__compare_departments",
"mcp__plumbline__describe_fact_capabilities",
"mcp__plumbline__find_payroll_anomalies",
"mcp__plumbline__get_ai_act_transparency",
"mcp__plumbline__get_answer_queries",
"mcp__plumbline__get_evidence_document",
"mcp__plumbline__get_manager_chain",
"mcp__plumbline__search_docs",
"mcp__plumbline__search_employee",
"mcp__plumbline__summarize_benefits"
],
"ask": [
"mcp__plumbline__ask_prepare",
"mcp__plumbline__ask_submit_draft",
"mcp__plumbline__cross_check",
"mcp__plumbline__query_fact",
"mcp__plumbline__run_code",
"mcp__plumbline__run_sql",
"mcp__plumbline__trust_finalize"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as plumbline. Review it before you use it.