posthog/improving-mcp-tools
> MCP agent experience with the eval harness, picks the highest-impact tool problem from production data, makes one bounded fix, and keeps it only if before/after scores improve. Use when asked to "improve my MCP", run an MCP improvement campaign, fix tool discoverability or descriptions based on evidence, or prepare an eval-backed PR for a tool change. Every shipped change must carry eval evidence; guardrails below are hard rules.
This is a copy. The original lives at posthog/ai-plugin-improving-mcp-tools.
npx skills add https://github.com/PostHog/posthog --skill improving-mcp-tools
An MCP server gets better only in ways you can measure. This skill is the
campaign procedure: score the current agent experience, fix the biggest
problem, re-score, and only ship changes the numbers justify. It is the
operating manual for the "improve my MCP" loop — one iteration per pass,
journaled so a later iteration (or a different agent) can resume without
repeating work.
services/mcp/evals/ is the harness. benchmark/tasks.yaml is a fixed set of
agent tasks with expected_tools and success_criteria; scores are only
comparable across runs of the same benchmark version.
LIVE_MCP_URL=... LIVE_MCP_TOKEN=... pnpm exec tsx evals/runner/probe.ts --out score.json
from services/mcp/. Reports tool-presence misses (discoverability), probe
failures, and latency p50/p95. Non-zero exit = regression.
accuracy. Use it for description/discoverability changes — probes cannot
detect that an agent picks the wrong tool.
Run the harness against a seeded local or devbox stack, never against a
customer project. Local recipe: `NODE_ENV=development PORT=9876
POSTHOG_API_BASE_URL=http://localhost:8000 pnpm dev:hono`, personal API key as
LIVE_MCP_TOKEN.
the MCP analytics tools (query-mcp-tool-stats, query-mcp-tool-failures,
query-mcp-tool-descriptions, query-mcp-tool-sample-intents) and the
lenses in the signals scout cookbook
(products/signals/skills/signals-scout-mcp-tool-calls/references/queries.md):
failure leaderboard, retry/struggle, latency, intents that matched no tool.
shows with two failed attempts. One issue per iteration — a PR that fixes
three things can't be attributed to any of them when scores move.
sharpen a tool description so the right intent finds it, tighten an input
schema that agents keep getting wrong, fix an annotation, update a skill.
sample. Keep the change only if the target metric improves and nothing else
degrades. A discarded change is a normal outcome — journal it and move on.
in references/campaign-journal.md). Keep
it stampable: ≤400 changed lines, only files inside the allowlist below,
apply the stamphog label. Autonomy level comes from the campaign config —
default is draft PR for human review; only arm auto-merge when the
operator has explicitly enabled the self-driving experiment (see
guardrails).
These are not suggestions; violating any of them ends the campaign pass.
products/*/mcp/tools.yaml,products/*/skills/, services/mcp/evals/, the codegen outputs of
pnpm generate-tools / scaffold-yaml (services/mcp/src/tools/generated/**
and services/mcp/schema/generated-tool-definitions.json), and docs.
Anything else (handler code, package manifests, workflows, migrations, auth
paths) → stop and hand the finding to a human as a draft PR or report
instead.
read-only. Never create, mutate, or delete customer-visible objects while
measuring.
score, and the exact harness commands used.
benchmark/tasks.yaml in the same PR asa fix it validates — changing the exam and the answer together proves
nothing. Benchmark changes are their own PR and bump version.
after 3 open unmerged campaign PRs). Two failed attempts on an issue parks
it permanently.
says stop — stop mid-iteration, journal state, end cleanly.
tool for another — that's why the no-regression sample is mandatory. The
intent-cluster snapshot's tool_overlaps (see
exploring-mcp-intent-clusters)
lists exactly which pairs compete for which intents: snapshot it before a
description rewrite and recompute after, and treat a capture shift in an
overlapping pair as the regression signal.
before attributing a latency change to your fix.
check getToolsForFeatures gating before "fixing" discoverability.
Take posthog/improving-mcp-tools from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.