mispick MCP server
2026년 10월 31일 커밋혼동 행렬과 자동 재작성 기능을 사용하여 AI 모델이 도구를 서로 혼동하는 사례를 식별하고 수정하기 위해 MCP tool 정의를 분석합니다.
다른 이름 msc35/mispick
- 스타
- 1
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 10월 31일
- 라이선스
- MIT
mispick MCP란?
mispick은(는) MCP server입니다. 혼동 행렬과 자동 재작성 기능을 사용하여 AI 모델이 도구를 서로 혼동하는 사례를 식별하고 수정하기 위해 MCP tool 정의를 분석합니다.
프로젝트 README에서 생성된 요약
mispick MCP server 정보
mispick은 Model Context Protocol 서버를 구축하는 개발자가 AI 모델이 도구를 서로 혼동하는 시점을 식별할 수 있도록 지원합니다. 현실적인 테스트 요청을 생성하고 모델이 올바른 도구를 선택하도록 요청함으로써, 혼동 행렬과 정밀도/재현율 점수를 생성하여 문제가 되는 도구 설명을 강조합니다. 이 프로세스는 이름이 유사한 도구들로 인해 모델이 잘못된 동작을 수행하지 않도록 보장합니다.
사용자는 Ollama를 사용하여 로컬에서 무료로 도구를 실행하거나, 필요한 API 키를 제공하여 GPT-4o 또는 Claude와 같은 클라우드 모델에 연결할 수 있습니다. 이 도구는 도구 정의만 읽고 실제 도구 호출은 절대 실행하지 않으므로 사용하기 안전합니다. 시스템은 단일 서버, 캡처된 JSON 스냅샷 또는 전체 Claude Desktop 설정을 분석하여 서로 다른 서버 간의 충돌을 감지할 수 있습니다.
감지를 넘어, 이 도구는 혼동을 해결하기 위해 도구 설명에 대한 자동 재작성을 제안할 수 있습니다. 제안된 내용은 원래의 요청을 대상으로 재테스트하여 검증하며, 측정 가능한 개선을 보이는 변경 사항만 권장합니다. 이를 통해 측정되지 않은 편집으로 인해 도구 선택 성능이 의도치 않게 저하되는 일반적인 문제를 방지합니다.
활용 사례
- 1도구 설명 혼동 감지서버 내의 특정 도구 중 어떤 것이 AI 모델에 의해 서로 혼동되고 있는지 식별합니다.
- 2서버 간 도구 충돌 방지설정 내의 서로 다른 서버에 있는 도구들이 클라이언트에 의해 잘못 교체되고 있는지 확인합니다.
- 3CI에서 도구 품질 모니터링도구 선택 정확도가 특정 임계값 이상으로 유지되도록 배포 파이프라인에 자동화된 체크를 설정합니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
구성
MISPICK_BASE_URL
| 이름 | 설명 | 유형 |
|---|---|---|
| MISPICK_BASE_URL | — |
자동 검사
2026년 11월 15일에 실행됨전체 보고서 →아직 인증되지 않았습니다. 서버는 80점 이상의 점수, 심각한 결함 없음, 그리고 검사에 충분한 데이터를 갖추어야 합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능msc35/mispick is public and reachablegithub.com/msc35/mispick ↗통과
- 패키지가 이 저장소를 소스로 명시검사되지 않음
- 빌드 출처(Sigstore 증명)검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-10-31github.com/msc35/mispick ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음검사되지 않음
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기mispick
Find out which of your MCP tools an AI model mixes up.
TL;DR
- The problem. An AI assistant picks which tool to use by reading each tool's short description. If two descriptions sound alike, it quietly picks the wrong one, and nothing tells you.
- What mispick does. It writes realistic test requests for every tool, asks a real model to pick a tool for each one, and counts what it picked. You get a table of which tools get mistaken for which (a confusion matrix), plus a 0–100 score.
- It's safe. It only reads the tool list. It never runs a tool, so you can point it at a server that deletes things.
- It can suggest fixes, and it re-tests each suggested rewrite. It keeps only the ones that measurably helped.
- Free by default. It runs on a local model through Ollama. Cloud models are optional.
- Status: v0.2.0 is on PyPI. A public benchmark of real MCP servers is running now. A research study built on it is pre-registered, with first results in.
uvx mispick run --cmd "python -m my_server"
How to read the report. Each row of the table is a tool. Each column is what the model actually picked when that tool was the right answer. A perfect server has every count on the diagonal. Anything off the diagonal is a mix-up worth fixing. Every percentage comes with a range (a 95% confidence interval), because with few test requests a single number can mislead.
What the benchmark found
We ran mispick on 14 real MCP servers from the official registry: 3,636 test requests on Gemini 3.5 Flash-Lite. Full results: docs/study.md.
- Most requests go to the right tool, but not all: 85% did.
- Mistakes are concentrated: only 107 of 6,024 tool pairs were ever mixed up, so a server usually has a few specific problem pairs rather than general confusion.
- Results are repeatable: 97% of requests got the same answer in all three runs.
- Overlapping names and similar descriptions go with more mix-ups, but with 13 servers that evidence is fragile.
- The clearest tip for server authors: say when to use each tool. Tools whose description does were less often mistaken for others.
- One server could not be used with Gemini at all, because of a broken schema in its tool list.
Three real servers, as confusion matrices. Each row is the tool a request was meant for, and each column is what the AI picked. Numbers on the diagonal are correct.
- ai.wavespeed/mcp, 60% correct. Every request to run a model went to
list_models, and so did most requests to get a price.
- Memory (MCP reference server), 67% correct. Edit and delete requests often went to
search_nodesfirst. The model looked up the entry before changing it, which is sensible, but mispick scores the first call, so it counts as a miss.
- Acquisition.gov, 100% correct. Five clearly separated tools and no mix-ups. This is what a good tool surface looks like.
Every number here comes from results/: headline.json, analysis.json, and the
frozen run in analysis/data/benchmark-v1/. Results are for one model on one date; see the
limitations below.
Why this rather than a static linter
mcp-lint, mcpolish, oh-my-mcp, mcp-conform and mcp-cve-lint check tool definitions
against rules, and they are good at it — run one. But a description can pass every rule and still
be indistinguishable from the tool next to it. Rule-based linters predict problems; this measures
them, by putting your tool list in front of a real model and counting what it picks. Two other
projects do measure selection — whichtool (local
models, but no rewrites, one server per run) and toolfit
(rewrites, but cloud-only, one server per run). Neither looks across servers. The full comparison,
with what each one actually does, is in docs/research.md.
How it works
- Connect to your server and read
tools/list(nevertools/call). - For each tool, generate N realistic requests — plus hard negatives written to sit as close as possible to its nearest neighbour, and some requests no tool should answer.
- Ask the model to choose a tool for each request, K times, showing it the real tool definitions a client would send.
- Score it: accuracy, per-tool precision and recall, a confusion matrix, argument validity, stability across the K runs — every rate with a Wilson 95% interval.
- Propose rewrites for the worst pairs, re-run the same requests against them, and keep only the ones that measurably won.
Install
uvx mispick --help # no install
uv tool install mispick # or keep it
pip install mispick
The default backend is a local model through Ollama, so it costs nothing and needs no account:
ollama pull qwen3.5:4b
Cloud models are optional, with the matching key in the environment:
mispick run --snapshot tools.json --model openai/gpt-4.1-mini # OPENAI_API_KEY
mispick run --snapshot tools.json --model gemini/gemini-3.5-flash-lite # GEMINI_API_KEY
mispick run --snapshot tools.json --model anthropic/claude-haiku-4-5-20251001
# anything else that speaks the OpenAI dialect - vLLM, OpenRouter, LM Studio
MISPICK_BASE_URL=http://localhost:8000/v1 mispick run --snapshot tools.json \
--model compatible/my-model
On cost. Every selection call re-sends the whole tool list, so a cloud run is priced by
tool-list size × queries × runs, not by the number of servers. Measuring one real 64-tool server
at N=8 K=3 is about 30M input tokens on its own. --dry-run is not implemented yet; until it is,
read the token estimate mispick prints and multiply.
Use
# measure a local server, a remote one, or a captured snapshot
mispick run --cmd "python -m my_server"
mispick run --url https://example.com/mcp
mispick run --snapshot tools.json
# capture a snapshot so later runs are offline and reproducible
mispick snapshot --cmd "python -m my_server" -o tools.json
# every server in your config at once, and what they do to each other
mispick run --config ~/Library/Application\ Support/Claude/claude_desktop_config.json
# rewrites for the worst pairs, each one re-tested
mispick fix --cmd "python -m my_server" --patch fix.diff
# reports and CI
mispick run --snapshot tools.json --format html --out report.html --badge badge.svg
mispick run --snapshot tools.json --fail-under 80 # exit 1 below the threshold
mispick compare base.json head.json --max-drop 5 # exit 1 on a regression
Generated requests are cached in .mispick/queries.yaml. Read that file and edit it — it is
your test set, and it only regenerates for a tool whose name, description or schema changed.
Commit it.
Proven fixes
mispick fix rewrites both descriptions in a confused pair, then re-runs the same requests
against the rewrite and reports before/after with an exact McNemar test — the trials are paired,
so an unpaired test would be the wrong one. Rewrites that fail are shown too.
That re-test is the whole point. Hasan et al. rewrote tool descriptions with an LLM across 231 tasks and found success rose by a median 5.85 points — but regressed in 16.67% of cases (arXiv 2602.14878). An unmeasured rewrite is a one-in-six chance of making things worse. mispick also caps rewrite length, so a rewrite cannot win by crowding out its neighbours, and it never edits your source — it prints a suggestion.
Expect rejections, especially on a small local model. In our own runs against
ollama/qwen3.5:4b, two of three proposed rewrites measurably made selection worse — one of them
took a tool from 78% to 58% accuracy, breaking 14 trials and fixing none, and it replicated when
re-run with three times the data. Its stated reasoning read perfectly sensibly. The third improved
by 10 points but over only two changed trials, which is not enough to call, so mispick reported it
as inconclusive rather than banking it. A 4B model is good enough to find confusion and often not
good enough to write its way out of it; fix mode is more productive with a larger model. Either
way the verdicts are the product — a run where nothing is accepted has told you something true.
Across servers
Point --config at a whole claude_desktop_config.json and mispick loads every server at once,
because that is how a client sees them. It reports which bare tool names collide across servers
and — the part that matters — how often a request for one server's tool is answered by another
server's. On the two-server fixture, 17% of trials cross servers and workspace:search_docs falls
to 0% recall: every request for it is answered by wiki:search_docs. The MCP spec names this
problem and warns that serverInfo.name is not unique across servers, so mispick keys on your
config label instead.
In CI
- uses: actions/checkout@v4
- uses: msc35/mispick-action@v1
with:
snapshot: tools.json
model: anthropic/claude-haiku-4-5-20251001
fail-under: '80'
compare-base: 'true'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
It posts the report as a sticky PR comment, and with compare-base the comment reads
84 → 91 (▲7) and names the confusions that appeared or disappeared. With no model key it skips
with an explanation instead of failing — a check that goes red over a missing secret is a check
people learn to ignore. See examples/github-action. The Action also
lives on its own in msc35/mispick-action, for the
GitHub Marketplace.
Benchmark
benchmark/ measures real servers from the official MCP registry that start without an API key,
and builds a static leaderboard from the results.
- Now running. A daily GitHub Actions job measures 15 servers on Gemini 3.5 Flash-Lite's free tier. It needs about 11 days because of the free tier's daily limit, and it resumes where it stopped each day.
- Reproducible. The captured tool lists are committed in
benchmark/snapshots/. - Safe. Only
initializeandtools/listare ever sent. - Honest about coverage. The page also lists the servers it could not measure, so coverage is not overstated.
See benchmark/README.md and the run plan in docs/benchmark-plan.md.
Research study
The benchmark data also feeds a small study. Its analysis plan was written and committed before looking at any results, so the questions can't be bent to fit the answers. The study asks three questions:
- What makes two tools easy to confuse? For example, similar descriptions, overlapping names, or missing "use this when…" guidance.
- Does a cheap model's confusion predict a stronger model's?
- Do generated test requests give the same answers as hand-written ones?
First results are in. Similar tool names go with more mix-ups, but with 13 servers the evidence is fragile. The clearest signal: a tool whose description says when to use it gets its requests taken by other tools less often. Plan: docs/analysis-plan.md. Results: docs/study.md.
Limitations
Read these before quoting a number.
- Results depend on the model. A score is one model's reading of one tool surface on one day, not a property of your server. Every report says so, and states the model, N, K and the date.
- Small local models are noisy. That is why every rate carries a Wilson 95% interval and why
--runsexists. With K=3 the intervals are wide; read them, not the point estimate. - The requests are generated, so they are not your traffic. They are a stand-in for it. Edit
.mispick/queries.yamlto make them yours. - It measures one selection turn. Not multi-step agent behaviour, not tool output quality, not
recovery after a bad call. Arguments are checked against
inputSchemaand no further. - A low score can be correct. Two tools may genuinely overlap. mispick tells you the model cannot separate them; whether they should be separable is your call.
mispick fixoften accepts nothing, and that is working as intended. See the note above.- Token counts are estimates, and lower bounds — a real tokenizer and the provider's framing both add to them.
- Reasoning models spend heavily on hidden thinking. mispick turns thinking off by default for
Ollama (measured: 89s → 2.2s per call on
qwen3.5:4b, same answers);--thinkrestores it.
Development
uv sync --all-extras # --all-extras so mypy also checks the Anthropic backend
uv run pytest # offline; no model or network needed
uv run ruff check . && uv run mypy src
uv run mispick run --snapshot tests/fixtures/confusing_tools.json --model mock
--model mock is a deterministic offline backend. The test suite uses it, so pytest passes with
no Ollama, no keys and no network.
License
MIT. See LICENSE.
mispick MCP 질문
파괴적인 작업을 수행하는 서버에서 mispick을 실행해도 안전한가요?
네, 안전합니다. mispick은 도구 목록을 읽기만 하며 실제 도구 호출을 실행하지는 않습니다.
mispick을 사용하려면 유료 API 키가 필요한가요?
아니요, 기본적으로 무료이며 Ollama를 사용하여 로컬 모델에서 실행할 수 있습니다.
mispick이 서로 다른 서버의 도구가 뒤섞이는 것을 감지할 수 있나요?
네, 전체 설정 파일을 지정하면 특정 서버의 도구 요청에 대해 다른 서버가 잘못된 응답을 하는 경우를 보고할 수 있습니다.