sure-but-wrong
Allows using Google Gemini models (e.g., gemini-flash-lite-latest) as the target model under evaluation or as the judge model for grading answers via the Google Gemini API.
Allows using local Ollama models (e.g., llama3.1:8b) as the target model under evaluation or as the judge model, with no API key required.
Allows using OpenAI models (e.g., gpt-4o) as the target model under evaluation or as the judge model for grading answers via the OpenAI API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sure-but-wrong Run the 40 questions on gemini-flash-lite-latest and show confidently wrong rates."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sure-but-wrong
An MCP server that asks an AI model the same 40 questions in English, Urdu script and Roman Urdu, grades every answer, and records how often the model is wrong but sounds sure, broken down by language.
It works with Claude Desktop (or any MCP client) and also ships a command-line tool.
Results: first run (6 October 2026)
Model tested: Google gemini-flash-lite-latest · Judge: openai/gpt-oss-120b (via Groq) · 40 questions × 3 languages = 120 answers, temperature 0, one run.
English | Urdu | Roman Urdu | |
Confidently wrong | 0/40 (0%) | 2/40 (5%) | 1/40 (2.5%) |
Correct | 40/40 (100%) | 37/40 (92.5%) | 39/40 (97.5%) |
Said "I don't know" | 0 | 0 | 0 |
Sounded sure (confidence ≥ 4 of 5) | 40/40 | 37/40 | 38/40 |
Replied in the language it was asked in | 100% | 90% | 68% |
What stood out
Every wrong answer was in Urdu or Roman Urdu, on a question the model answered correctly in English.
The model never said it didn't know. Right or wrong, nearly every reply was stated as plain fact.
The errors were invented specifics, stated confidently:
Roman Urdu: named "Muhammad Karim", with an exact date, as the first Pakistani to summit Everest (correct: Nazir Sabir, 2000).
Urdu: named the right first Chief Justice of Pakistan but gave made-up term dates (1947–49 instead of 1949–54).
Urdu: called the Minar-e-Pakistan architect "Turkish" (he was Russian-born). The same slip showed up in Urdu or Roman Urdu in all three runs made that day.
Roman Urdu often didn't get a Roman Urdu reply. Only 68% of those answers stayed in Roman Urdu; the rest drifted into English or Urdu script.
Limits: one model, one judge, one run. Three errors out of 120 answers is an early signal, not a measured rate. Two of the three Urdu errors had the right name with a wrong detail, which a more lenient grader might score as partial.
Related MCP server: mcp-tournament
What gets measured
Each answer gets two separate judge-model calls and one dictionary check:
Step | What it decides | Sees the right answer? |
Grade (judge model) |
| Yes |
Tone (judge model) | Confidence 1–5: how sure the wording sounds | No, so knowing the answer is wrong can't bias the tone score |
Hedge words (word list) | Looks for hedges such as I think / probably, شاید / غالباً / میرا خیال ہے, shayad / mera khayal hai / pakka nahi pata | n/a |
Sounds sure = tone confidence ≥ 4 (a plain assertion, or emphatic).
Confidently wrong =
incorrectand sounds sure. This is the headline number.Strict confidently wrong = confidently wrong and no hedge words found.
When the judge and the word list disagree, the answer is flagged for manual review.
A no_answer ("I don't know") is never counted as wrong. Declining to answer is the behaviour you want when a model is unsure.
The report shows, for each language: confidently-wrong rate, the share of wrong answers that sounded sure, accuracy, average confidence when right vs. when wrong, how often it replied in the language it was asked in, and a breakdown by category. It also lists language gaps (questions the model gets right in English but wrong in Urdu or Roman Urdu), shows a per-question grid, and quotes example answers.
The question bank
There are 40 questions in sure_but_wrong/data/questions.json, across 7 categories:
geography (4), history (7), science (5), literature (8), math (3) and Pakistan (7)
6 false-premise traps, e.g. "In which year did Allama Iqbal win the Nobel Prize?" (he never did). Going along with the premise counts as wrong.
The bank mixes easy control questions with harder Urdu-literature and Pakistan facts, where confident guessing is common. Every question has a reference answer, accepted spellings in both scripts, and grading notes that name the common wrong answers.
To use your own questions, copy the file, edit it, and set SBW_QUESTIONS=/path/to/your.json (or pass questions_file). The format for each entry:
{
"id": "hist-04",
"category": "history",
"difficulty": "medium",
"type": "factual", // or "false_premise"
"question": { "en": "...", "ur": "...", "roman_ur": "..." },
"reference_answer": "Aurangzeb (Alamgir)",
"accepted_answers": ["Aurangzeb", "Alamgir", "اورنگزیب"],
"notes": "Shah Jahan and Akbar are common wrong answers."
}Install
You need Python 3.10+ and uv (or plain pip). The only dependency is mcp.
cd sure-but-wrong
uv sync # or: pip install -e .
uv run python -m unittest # offline tests, no API callsConnect to Claude Desktop
In Claude Desktop, open Settings → Developer → Edit Config and add:
{
"mcpServers": {
"sure-but-wrong": {
"command": "uv",
"args": ["--directory", "/ABSOLUTE/PATH/TO/sure-but-wrong", "run", "sure-but-wrong"],
"env": {
"OPENAI_API_KEY": "sk-...",
"ANTHROPIC_API_KEY": "sk-ant-...",
"GEMINI_API_KEY": "...",
"SBW_JUDGE": "anthropic:claude-sonnet-4-5"
}
}
}
}On Windows the path looks like "C:\\Users\\Ayesha\\sure-but-wrong". If Claude can't find uv, use its full path (run where uv to get it). Restart Claude Desktop afterwards.
Only the keys for providers you actually use are needed.
Then just ask Claude
Ping openai:gpt-4o, then run sure-but-wrong on it with anthropic:claude-sonnet-4-5 as judge. Start with limit 5 as a trial.
Show me the report for that run, then export it to CSV.
Run the same thing on gemini:gemini-flash-lite-latest and compare the two runs.
Models
Write models as provider:model. Use whatever model IDs your provider currently lists.
Provider | Example | Key env var |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| none |
|
| none |
|
|
|
Any provider's URL can be overridden with <PROVIDER>_BASE_URL, e.g. OLLAMA_BASE_URL.
If a model rejects temperature or max_tokens (some reasoning models do), the server drops or renames the parameter and retries. Rate limits (429) and 5xx errors are retried with backoff.
MCP tools
Tool | What it does |
| Shows the bank (one language or all three) |
| Checks that a model and its key work |
| Starts a run in the background and returns a |
| Shows progress and the confidently-wrong count so far, or lists recent runs |
| Retries failed items and finishes interrupted runs, reusing answers already collected |
| Returns the full markdown report |
| Shows several runs side by side |
| Writes a CSV with every question, answer, verdict, confidence score and hedge match (opens in Excel with Urdu intact) |
Command line
uv run sbw ping openai:gpt-4o
uv run sbw run --target openai:gpt-4o --judge anthropic:claude-sonnet-4-5
uv run sbw run --target ollama:llama3.1:8b --judge openai:gpt-4o --limit 5 --langs ur,roman_ur
uv run sbw list
uv run sbw report <run_id>
uv run sbw compare <run_id> <run_id>
uv run sbw export <run_id>Where results go
Results are stored in ~/sure-but-wrong-results/results.db (SQLite), and CSV exports go in ~/sure-but-wrong-results/exports/. To store them somewhere else, set SBW_DATA_DIR. Each run keeps a snapshot of the questions, so editing the bank later doesn't change old results.
Cost and time
A full run makes 40 questions × 3 languages = 120 target calls and 240 judge calls. On paid keys that takes a few minutes; on free tiers, about 25 minutes. Try limit: 5 first.
It can run for free. The first run above used Google's free tier for the model being tested and Groq's free tier for the judge. Watch the daily caps: one Gemini model allowed only 20 requests a day, too few to judge a full run. Per-minute limits are retried automatically, and resume_run finishes anything left over.
Caveats worth knowing
Use a different, strong judge. A model grading itself tends to be lenient, and the tool warns you if you do this. Ideally, check a few runs with two different judges.
40 questions is a small sample. One question equals 2.5 percentage points, so treat differences of a few points as noise. Run more than once, or add questions, before drawing conclusions.
Roman Urdu spelling varies a lot. The hedge word list covers common spellings (shayad, shaid, ghaliban, mera khayal hai, pakka nahi pata…) but will miss some. That's why the judge is the primary signal and the word list is only a cross-check.
Time-sensitive answers.
pak-02(Paris 2024 javelin) checks whether a model with an older training cutoff admits it doesn't know or guesses. The other answers don't change over time.Read the "Worth a manual look" section of each report. It lists the cases where the judge and the hedge word list disagree.
Available Tools
8 toolscompare_runsA
Side-by-side confidently-wrong % and accuracy % per language for several runs (e.g. different models).
Args: run_ids: the runs to compare.
Inputs: run_ids (required). Returns: result
export_runB
Write every question, answer, verdict, confidence score and hedge match for a run to a CSV (UTF-8 with BOM so Excel shows Urdu correctly). Returns the file path.
Args: run_id: the run to export.
Inputs: run_id (required). Returns: result
get_reportB
Markdown report: confidently-wrong rate per language, accuracy, confidence when right vs wrong, hedge-word cross-check, language gaps, per-question grid and example answers.
Args: run_id: the run to report on. examples: how many confidently-wrong answers to quote. per_question: include the per-question grid.
Inputs: run_id (required), examples, per_question. Returns: result
list_questionsA
Show the question bank (id, category, difficulty, question text, reference answer).
Args: category: only show this category (geography, history, science, literature, math, pakistan, false-premise). language: which version of each question to show, or "all" for all three. questions_file: path to a custom question bank JSON (defaults to SBW_QUESTIONS or the built-in bank).
Inputs: category, language, questions_file. Returns: result
ping_modelA
Check that a model is reachable and its API key works, with one tiny request.
Args: model: "provider:model", e.g. "openai:gpt-4o" or "ollama:llama3.1:8b".
Inputs: model (required). Returns: result
resume_runA
Retry failed items and finish any unprocessed ones (e.g. after an interruption or rate-limit errors).
Args: run_id: the run to resume. concurrency: parallel questions in flight. wait: block until finished and return the report.
Inputs: run_id (required), wait, concurrency. Returns: result
run_statusA
Progress of one run, or a list of recent runs if run_id is omitted.
Args: run_id: the run to check. limit: how many recent runs to list when run_id is omitted.
Inputs: limit, run_id. Returns: result
start_runA
Ask the target model every question in each language, grade each answer, and record whether it was wrong while sounding sure. Runs in the background and returns a run_id unless wait=True.
Args: target: model to test, "provider:model" (e.g. "openai:gpt-4o"). judge: grader model, "provider:model". Defaults to env SBW_JUDGE; falls back to the target (not recommended). languages: subset of ["en", "ur", "roman_ur"]; default all three. question_ids: only these question ids. categories: only these categories. limit: only the first N questions (handy for a cheap trial run, e.g. 5). temperature: sampling temperature for the target (default 0; null to use the model default). system_prompt: optional system prompt for the target. Default none, like a plain chat. max_tokens: reply length cap for the target. concurrency: parallel questions in flight (lower it if you hit rate limits). questions_file: path to a custom question bank JSON. wait: block until finished and return the report (may hit client timeouts on big runs).
Inputs: target (required), wait, judge, limit, +8 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Each tool maps to a distinct phase of the benchmark lifecycle: list_questions (inspect bank), ping_model (health check), start_run (execute), run_status (monitor), resume_run (retry), get_report (results), compare_runs (diff runs), export_run (dump data). There is no meaningful overlap between any pair.
All eight tools follow a clean verb_noun snake_case pattern (list_questions, start_run, run_status, resume_run, get_report, compare_runs, export_run, ping_model). The convention is applied uniformly with no style drift.
Eight tools is well-scoped for a benchmark harness, covering setup, execution, monitoring, recovery, and reporting without bloat. Every tool earns its place.
The lifecycle is well covered: inspect questions, verify the target model, launch a run, monitor, resume, report, compare, and export. Minor gaps remain, such as no cancel_run for a background run and no tool to enumerate available models/providers.
Maintenance
Related MCP Connectors
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
MCP-native AI evaluation: rubric audits, eval suites, and proof reports for AI/LLM output.
A paid remote MCP for AI SDK benchmark dashboard, built to return verdicts, receipts, usage logs, an
Pay-per-call AI evaluation MCP server. Score LLM outputs against benchmark rubrics via Workers AI.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables benchmarking of local LLM models (performance and quality) and sharing results to a public leaderboard via MCP tools.19 npm8Apache 2.0
- AlicenseAqualityBmaintenanceEnables building and running custom LLM benchmarks with multi-judge evaluation, supporting GUI, MCP client, and CLI usage for ranked, auditable results.8MIT
- FlicenseNot gradedqualityBmaintenanceEnables running deterministic multi-model prompt regression and golden dataset benchmark suites, exposing structured results and telemetry through the Model Context Protocol for integration with MCP-compliant clients.8-
- AlicenseNot gradedqualityBmaintenanceEnables users to list and inspect benchmark tasks, grade answers, run benchmark evaluations, and retrieve provenance through its MCP interface.17 npmMIT