Governed support MCP: answers only KB-grounded questions with citations, escalates the rest.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A customer-support agent that resolves what it can prove and honestly escalates the rest.
AI support agents are strong on common questions and dangerous on the edges: asked something the knowledge base does not cover, most will still produce a fluent, confident, wrong answer. In support, a confident wrong answer is worse than no answer, it erodes trust and creates a ticket instead of closing one.
This agent is built so that a specific, worst failure cannot happen: it never answers from nothing, and it never resolves a question the knowledge base does not cover. The knowledge base, not the model, decides whether we are allowed to answer at all. Every answer is grounded in a cited passage. Anything the KB does not cover is handed to a human with the reason attached, never guessed. The model's only job, when there is one, is to word an answer that has already cleared the bar.
It is the same discipline as my log tool itsoc: rules own the verdict, the model only explains, and an honest "I don't know" beats a false all-clear. Here the verdict is resolve or escalate.
Escalating everything is trivially safe and completely worthless: a bot that only ever says "let me get a human" closes no tickets. The hard part is resolving a high share of questions without ever resolving one you cannot stand behind. Honesty is what makes that possible β because the agent structurally cannot give an ungrounded answer, you can push the resolve threshold as high as the citations actually support, and the downside of aiming high is a safe escalation, never a confident wrong answer. Honesty is not the tax on the resolution rate; it is what lets you raise it.
Three outcomes, and only three:
| Outcome | When | What the customer gets |
|---|---|---|
| RESOLVE | the KB covers the question (coverage and score clear the bar) | a grounded answer with its source cited and a confidence figure |
| ESCALATE (low confidence) | the KB is partly relevant but not strong enough | honest handoff to a human, with the closest passages attached |
| ESCALATE (not covered) | the KB does not cover this | honest handoff, and the model is not permitted to answer |
The decision is made by deterministic retrieval and term coverage, with explicit,
auditable thresholds (core/resolver.py), not by a prompt asking a model to be careful.
Python 3.9+, standard library only. No pip install to run the core, no API key, nothing
leaves your machine.
The first resolves with a citation. The second escalates honestly (no_match). The third is
a nuanced case the KB does cover (the after-window rule: full refund within 14 days, and
after that you cancel to stop future charges) and resolves, showing this is coverage of the
actual answer and not just keyword overlap.
Accuracy on easy questions is table stakes. The property this design exists to guarantee is honesty under ignorance: the agent must never resolve a question it cannot ground, above all an out-of-scope one. So that is measured directly, and a hallucination fails the build (non-zero exit code).
(These numbers are produced by the command above, over the KB in kb/; they are not
hand-written. Re-run it and it re-derives them.)
The labeled set (eval/questions.jsonl) is bucketed so the harness reports different kinds of
correctness honestly:
The one number that is never allowed to be non-zero is the hallucination count.
Retrieval is stdlib BM25 plus term coverage. That choice is deliberate and it has a cost worth stating plainly:
Crucially, that failure mode biases toward escalation β the safe direction β never toward a
confident wrong answer. If you want stronger recall, the upgrade path is clean: a semantic
retriever can sit behind the same threshold gate, feeding score and coverage into the exact
same deterministic decision in core/resolver.py. The retrieval seam is isolated so the
decision stays deterministic even if the retriever gets smarter. This repo documents that seam;
it does not ship the semantic retriever.
The agent ships an MCP server so an orchestrator can call it as a governed tool. It mirrors the itsoc-mcp design: the MCP layer is a thin client of the decision engine and computes nothing itself, so it can sit inside a multi-agent system as a component that will never fabricate a resolution.
The package is publish-ready β pyproject.toml builds a grounded-support-agent
distribution and server.json registers it as io.github.Ankit512/grounded-support-agent. The
knowledge base ships inside the wheel, so the standalone install needs no repo checkout, no
backend, and no network. See PUBLISHING.md for the release flow. Until it is
published to PyPI, use the in-repo commands above β the uvx form works only after publishing.
Two tools: resolve_or_escalate (the verdict, with citations and provenance) and
get_evidence (the ranked passages, for a human reviewer, with no decision attached). Every
response carries a provenance block tying the answer to the exact KB that produced it.
core/rephrase.py) enforces this β every content word and number in
a rephrase must be grounded in the cited passage or the rephrase is rejected and the raw cited
text is used. The agent runs and is fully testable with no model at all.Precision matters here, so this is stated exactly. The agent cannot give an ungrounded answer and cannot resolve an out-of-scope question β those are structural, enforced by the coverage gate and verified by the eval and the tests. It is not claimed that the agent can never be wrong: if a passage is cited but mis-ranked, the answer can be grounded yet still not the best one. Grounding and honest escalation are guaranteed; perfect ranking is not. The value is that the failure that remains is a visible, cited, auditable one β not a fluent fabrication.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/grounded-support-agent)<a href="https://allmcps.com/mcp/grounded-support-agent"><img src="https://allmcps.com/api/badge/grounded-support-agent?style=directory" alt="Grounded Support Agent on AllMCPs" /></a>