credence
Tracks uncertain values stated by the user and blocks model writes that embed unverified values until confirmed.
README
Credence
AI doesn't remember what it wasn't sure about. Credence does.
pip install credence-guard
credence demo # 30-second smoke test, no API key required
[mcp] adds the FastMCP server for Claude Code. Core package has zero hard dependencies.
The problem
You say: "The rate limit is probably around 50 — I haven't confirmed it yet."
Fifteen turns later, Claude writes:
RATE_LIMIT = 50 # no warning. no flag. shipped.
The API rejects every request at 2am. The real limit was 10. Claude forgot you weren't sure.
This isn't hallucination. The model reproduced exactly what it read. What it read had the qualifier stripped — by context compression, fifteen turns back.
What Credence does
Tracks uncertain values the moment you state them. Blocks writes that embed those values until you confirm them.
you say "rate limit is probably 50"
→ observer registers it (before Claude responds)
→ Claude writes: RATE_LIMIT = 50 # ⚠ CREDENCE[unverified]
→ write blocked until you confirm
Every other tool warns. Credence enforces.
What it looks like
# Claude generates this. Credence intercepts before it ships.
class StripeClient:
API_VERSION = "2023-10-16" # ⚠⚠ CREDENCE[stale]: API date versions change on release — verify before shipping
RATE_LIMIT = 100 # ⚠ CREDENCE[unverified]: I think Stripe rate limit is around 100 req/min
TOKEN_EXPIRY = 3600 # ⚠⚠ CREDENCE[stale]: Token/session lifetime values are set by the vendor — verify
MAX_RETRIES = 3
TIMEOUT_MS = 5000
credence: blocked Edit — 2 unverified value(s)
→ I think Stripe rate limit is around 100 req/min | TOKEN_EXPIRY = 3600
Verify first, then retry. Use credence_constraints to see all pending.
After you confirm: "Confirmed — rate limit is 100 req/min per stripe.com/docs" → gate clears.

Setup
1. Add to .mcp.json:
{ "mcpServers": { "credence": { "command": "credence-server" } } }
2. Add to .claude/settings.json:
{
"hooks": {
"UserPromptSubmit": [
{ "hooks": [{ "type": "command", "command": "python3 -m credence.observer" }] }
],
"PreToolUse": [
{
"matcher": "Write|Edit|Bash|NotebookEdit",
"hooks": [{ "type": "command", "command": "python3 -m credence.hooks" }]
}
]
}
}
Done. No API key required.
Registry: Credence creates
epistemic_registry.dbin your working directory. Add*.dbto your.gitignore, or setCREDENCE_DB=~/.credence/registry.dbto keep it global.Session tracking: Set
CREDENCE_SESSION_ID=my-projectto keep constraints stable across directory changes and terminal restarts.Event log: The gate writes block/allow events to
~/.credence/events.jsonl(local only, never sent anywhere). SetCREDENCE_NO_LOG=1to disable.Constraint cap: The registry allows up to 500 constraints per session by default. Override with
CREDENCE_MAX_CONSTRAINTS=<n>.
How it works
Two layers, neither requires model cooperation:
| Layer | Hook | Role |
|---|---|---|
| Observer | UserPromptSubmit |
Passive listener — registers uncertain values before Claude generates anything |
| Gate | PreToolUse |
Blocks writes that embed unverified values |
The observer fires before the model processes your message. If you say "I think the rate limit is 50", the registry has that entry before Claude generates a single token.
What gets blocked
credence: blocked Edit — 2 unverified value(s)
→ rate limit is probably 50 req/min | token expires in 3600s
Verify first, then retry. Use credence_constraints to see all pending.
Once verified, the gate clears.
What Credence does NOT do
- Does not verify facts — it cannot tell you if a value is correct
- Does not catch uncertainty that was never stated
- Does not block the model from saying a wrong value in prose — only from writing it to a file or command
Measured results
46% of uncertainty qualifiers are stripped by Claude Haiku during context compression. Credence blocks 100% of those writes (n=50, bootstrap CI: [0%–0%]).
Validated across 7 open-weight models (Qwen, Mistral, Llama, Phi, Gemma) from 5 organizations: same failure mode, same block rate.
credence demo # smoke test, no API key
credence stats # false-positive rate from real gate usage
credence feedback 1|2|3 # tag last gate block: correct / noise / skip
python3 -m pytest tests/ -q # 829 tests
python3 -m evals.latency_report # P50/P95/P99
Full methodology: docs/TECHNICAL_REPORT.md
Project layout
credence/ pip-installable package
observer.py passive UserPromptSubmit hook
hooks.py PreToolUse enforcement gate
mcp_server.py 17-tool MCP server
registry.py SQLite constraint store
memory.py cross-session persistence
tests/ 829 tests
evals/ validation studies + multi-model benchmarks
docs/ technical report, architecture, ETP spec
credence_gate/ Rust gate (alternative to Python hooks.py)
experimental/ Phase 2 work — not yet shipped
paper/ Research paper draft + figures
Research
The scientific basis for Credence is documented in paper/ (EQL / EQLR / FCR).
The companion geometry thesis — on confabulation detection and why the detection axis is dissociable from the causal control axis — lives in a separate repo: → Detection Without Control
Built by
Lakshmi Chakradhar Vijayarao — GitHub · LinkedIn · X
Apache 2.0 License
<!-- mcp-name: io.github.Lakshmi-Chakradhar-Vijayarao/credence -->
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。