groundcheck
An MCP server that lets any AI agent evaluate RAG outputs -- faithfulness scoring, hallucination detection, and retrieval quality metrics -- with zero API keys, using MCP sampling.
README
<!-- mcp-name: io.github.offquestxo/groundcheck -->
groundcheck
Playwright verifies your UI. Sentry verifies your runtime. groundcheck verifies your AI's answers.
An MCP server that lets any AI agent evaluate RAG outputs -- faithfulness scoring, hallucination detection, and retrieval quality metrics -- with zero API keys, using MCP sampling so the judge model is whatever the connected client is already running.
The problem
You've vibe-coded a RAG app. It answers, but sometimes it makes stuff up, and you can't tell when. There's no test for "did the model lie about what the documents say." groundcheck is that test.
Demo

<!-- TODO: record a short terminal/Claude Desktop demo GIF showing groundcheck_detect_hallucinations catching a planted hallucination, and drop it at docs/demo.gif. Placeholder above until then. -->
Quickstart
Claude Code:
claude mcp add groundcheck -- uvx groundcheck
Claude Desktop -- add to claude_desktop_config.json
(full example):
{ "mcpServers": { "groundcheck": { "command": "uvx", "args": ["groundcheck"] } } }
Cursor -- same shape, in .cursor/mcp.json (see
examples/claude_code.md for the full config).
No API key needed if your client supports MCP sampling. Try it: ask your
agent to run groundcheck_detect_hallucinations on an answer and its
sources.
Tools
| Tool | What it does | Judge? |
|---|---|---|
groundcheck_evaluate_faithfulness |
Claim-by-claim faithfulness score (0-1) against sources | LLM (sampling) |
groundcheck_detect_hallucinations |
Only the unsupported/contradicted claims, for a fix-it loop | LLM (sampling) |
groundcheck_evaluate_retrieval |
precision@k, recall@k, MRR, NDCG -- gold labels (instant) or LLM-graded | Optional |
groundcheck_compare |
Judge which of two candidate answers is better, with position-bias mitigation | LLM (sampling) |
groundcheck_run_suite |
Batch-evaluate a set of cases (inline or JSONL), persist a report | LLM (sampling) |
groundcheck_get_report |
Fetch a persisted report by id | None |
How it works
flowchart LR
subgraph Client["Your MCP client (Claude Desktop / Code / Cursor)"]
Model[("Your LLM")]
end
Client -- "tool call" --> Server["groundcheck MCP server"]
subgraph Server["groundcheck"]
Det["Deterministic tools\nmetrics.py -- pure Python\nprecision@k, recall@k, MRR, NDCG"]
Judged["LLM-judged tools\nclaim decomposition + verification"]
end
Judged -- "sampling/createMessage" --> Model
Model -- "judged verdicts" --> Judged
Server -- "result" --> Client
The split matters: retrieval metrics with gold labels are pure math and run
instantly with zero model calls. Faithfulness, hallucination detection, and
compare need semantic judgment, so they call back into your own connected
model via MCP sampling
-- no separate API key, no separate bill. If your client doesn't support
sampling yet, set ANTHROPIC_API_KEY as a fallback; if neither is available,
you get a clear error naming both options.
Cost: deterministic metrics are free (no model calls). LLM-judged tools cost 1-2 model calls via your client's existing inference -- no API key required on top of what you're already paying your client for.
What groundcheck is NOT
- Not an observability platform. It doesn't collect traces, dashboards, or alerts over time -- it scores the RAG output you hand it, once, when you ask. For production observability, look at LangSmith or Arize Phoenix.
- Not for agent-trajectory evals. It judges answers against sources, not whether an agent took the right sequence of actions.
- Not enterprise-scale. Reports are local JSON files. If you need multi-tenant dashboards, RBAC, or dataset versioning at scale, LangSmith or Phoenix are the right tool.
Case study: tuning tool descriptions
evals/RESULTS.md tracks tool-selection and hallucination-detection accuracy before and after tuning tool docstrings -- the actual before/after numbers, not just the final descriptions.
Security
Read-only, compute-only server: no shell access, no network egress except an
opt-in ANTHROPIC_API_KEY fallback, no filesystem writes outside the local
report store. dataset_path is validated against an allowlisted directory
to prevent path traversal. Full threat model in SECURITY.md.
Roadmap
- [ ] MCP Tasks primitive for async
run_suiteon large datasets. - [ ] MCP Apps report UI (render a report inline instead of raw JSON).
- [ ] Publish to PyPI and the MCP Registry (packaging is ready; not yet published).
Development
uv sync --all-extras
uv run pytest
uv run ruff check .
MIT licensed. See LICENSE.
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。