MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
Compare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage.
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install homeassistant-ai/ha-mcp bat-story-eval --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/homeassistant-ai/ha-mcp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/bat-story-eval .claude/skills/bat-story-eval && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "bat-story-eval" agent skill from https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-eval into .claude/skills/bat-story-eval/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "bat-story-eval", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-evalType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install homeassistant-ai/ha-mcp bat-story-eval --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/homeassistant-ai/ha-mcp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/bat-story-eval .agents/skills/bat-story-eval && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "bat-story-eval" agent skill from https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-eval into .agents/skills/bat-story-eval/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "bat-story-eval", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install homeassistant-ai/ha-mcp bat-story-eval --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/homeassistant-ai/ha-mcp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/bat-story-eval .cursor/skills/bat-story-eval && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "bat-story-eval" agent skill from https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-eval into .cursor/skills/bat-story-eval/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "bat-story-eval", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/homeassistant-ai/ha-mcp.git --path .claude/skills/bat-story-eval--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install homeassistant-ai/ha-mcp bat-story-eval --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/homeassistant-ai/ha-mcp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/bat-story-eval .gemini/skills/bat-story-eval && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "bat-story-eval" agent skill from https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-eval into .gemini/skills/bat-story-eval/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "bat-story-eval", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install homeassistant-ai/ha-mcp bat-story-evalInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/homeassistant-ai/ha-mcp.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/bat-story-eval .github/skills/bat-story-eval && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "bat-story-eval" agent skill from https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-eval into .github/skills/bat-story-eval/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "bat-story-eval", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install homeassistant-ai/ha-mcp bat-story-eval --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/homeassistant-ai/ha-mcp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/bat-story-eval .opencode/skills/bat-story-eval && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "bat-story-eval" agent skill from https://github.com/homeassistant-ai/ha-mcp/tree/master/.claude/skills/bat-story-eval into .opencode/skills/bat-story-eval/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "bat-story-eval", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
bat-story-evalCompare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage.
Bat Story Eval is an agent skill from homeassistant-ai/ha-mcp. Compare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/evaluation-protocol.md` and `references/regression-protocol.md`).
It sits in Agent Workflows, covering MCP servers. The repository describes itself as: The Unofficial and Awesome Home Assistant MCP Server. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b274a93. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteGlobGrepTaskFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvgitdockerpython3claudeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uv, git and docker, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Bat Story Eval loads about 3.4k tokens when it runs, and up to ~6.3k if it reads all its reference files. Until then it costs about 34 tokens; SKILL.md has 1,079 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Write, Glob, Grep, TaskAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from homeassistant-ai/ha-mcp at commit b274a93, republished under its MIT licence (© homeassistant-ai). 1,079 words, ~3,398 tokens.
.claude/skills/bat-story-eval/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.You are the evaluator. Run the steps in order; each one uses the output of the step before it.
From $ARGUMENTS, extract:
--baseline: REQUIRED. Git tag/branch of the released version (e.g., v6.6.1).--agents: Agent list (default: gemini). Comma-separated.--stories: Force specific pre-built story IDs (e.g., s01,s02). Overrides triage selection.--all-stories: Skip triage, run ALL pre-built stories.--keep-container: Keep HA containers alive after run for manual inspection.--model: Model for Claude agent (e.g., haiku, sonnet).If $ARGUMENTS is --help or missing --baseline, show usage and stop:
/bat-story-eval --baseline v6.6.1
/bat-story-eval --baseline v6.6.1 --agents gemini,claude
/bat-story-eval --baseline v6.6.1 --stories s01,s02
/bat-story-eval --baseline v6.6.1 --all-stories --agents claude --model haikucd "$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")/worktree/uat-stories"
git diff <baseline>..HEAD -- src/ha_mcp/ --stat
git diff <baseline>..HEAD -- src/ha_mcp/ --name-onlyClassify changed files:
tools/tools_*.py): specific tool implementations changedclient/, server.py, errors.py, tools/util_helpers.py): affects all toolsutils/, resources/): may affect all toolsSkip if --stories or --all-stories was passed.
tests/uat/stories/catalog/s*.yaml (title, description, prompt, setup)client/, server.py, errors.py) -> all stories selectedRead the diff carefully. Your job is to catch regressions. For each changed code path NOT covered by selected pre-built stories, ask: "could this break something a user would notice?" If yes, design a custom story to test that hypothesis.
Guidelines: Always create at least 1 custom story. Each must test a distinct regression hypothesis — don't create stories that overlap. Stop when you've covered the risky gaps.
Write each as /tmp/custom_c<NN>.yaml using the standard story format:
id: c01
title: "Short description of what is being tested"
category: custom
weight: 5
description: >
Rationale: [what changed in the diff and why this scenario tests it]
setup:
- tool: ha_config_set_helper
args:
helper_type: "input_boolean"
name: "Test Entity Name"
prompt: >
[Natural language request a real user would make that exercises the changed code]
teardown: []
verify:
questions:
- "Did the agent achieve the expected outcome?"
- "Did it use the expected tools?"
expected:
tools_should_use:
- ha_search
description: >
[What a correct agent should do]Design principles:
For EACH agent, run all stories against the baseline version. One container per agent, reused across all stories.
cd "$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")/worktree/uat-stories"
uv run python tests/uat/stories/run_story.py \
tests/uat/stories/catalog/<first_story>.yaml \
--agents <agent> --keep-container \
--branch <baseline> \
--results-file local/uat-results.jsonlCAPTURE from stderr: HA URL (e.g., http://localhost:32771), token, session file path.
After each story, verify via ha_query.py using the story's verify.questions:
uv run python tests/uat/stories/scripts/ha_query.py \
--ha-url http://localhost:PORT --ha-token TOKEN \
--agent <agent> \
"Does an automation with alias 'Sunset Porch Light' exist?"Record each answer as confirmed / denied / unclear. A non-zero exit
from ha_query.py means the query itself failed (the output carries an
[exit N] marker; [exit 124] is a timeout) — that is not one of the three
outcomes; re-run it, and if it keeps failing record the story as unverified
(Step 5) rather than scoring it. See references/evaluation-protocol.md.
Run remaining pre-built stories on the same container:
uv run python tests/uat/stories/run_story.py \
tests/uat/stories/catalog/<next_story>.yaml \
--agents <agent> --ha-url http://localhost:PORT --ha-token TOKEN \
--branch <baseline> \
--results-file local/uat-results.jsonlVerify each immediately after running.
uv run python tests/uat/stories/run_story.py \
/tmp/custom_c01.yaml \
--agents <agent> --ha-url http://localhost:PORT --ha-token TOKEN \
--branch <baseline> \
--results-file local/uat-results.jsonlVerify each via ha_query.py using the custom story's verify.questions.
Stop only the container kept in step 1a. PORT is the host port in its Container kept alive: http://localhost:PORT line:
docker stop $(docker ps -q --filter "publish=PORT")Repeat Step 1 for the target (local code). Same stories, same order, fresh container.
The only difference: omit --branch so run_story.py uses local code.
uv run python tests/uat/stories/run_story.py \
tests/uat/stories/catalog/<first_story>.yaml \
--agents <agent> --keep-container \
--results-file local/uat-results.jsonlSame container reuse for remaining stories (--ha-url). Same verification after each.
For each story on each version, read the session file captured during the run.
Gemini sessions (JSON):
python3 -c "
import json, sys
data = json.load(open(sys.argv[1]))
for msg in data.get('messages', []):
for tc in msg.get('toolCalls', []):
print(f\" {tc['name']} ({tc.get('status', '?')})\")
" /path/to/session.jsonClaude sessions (JSONL):
python3 -c "
import json, sys
for line in open(sys.argv[1]):
entry = json.loads(line)
if entry.get('type') == 'assistant':
for b in entry.get('message', {}).get('content', []):
if b.get('type') == 'tool_use':
print(f\" {b['name']}\")
" /path/to/session.jsonlCompare against expected.tools_should_use:
| Black-Box | White-Box | Score |
|---|---|---|
| Entity correct + right structure | Right tools | pass |
| Entity correct + right structure | Wrong tools or recovered errors | pass (with notes) |
| Entity correct + wrong structure | Any | partial |
| Entity not created | Any | fail |
Primary metrics (decide pass/fail on these):
Secondary metrics (report but don't decide on these alone):
# Gemini: input includes cached, so subtract
billable = (input - cached) + output + thoughts
# Claude: input_tokens is already non-cached
billable = input + outputFor each story+agent:
Append eval results as NEW lines (never modify existing):
record["eval_score"] = "pass" # or "partial", "fail", or "unverified"
record["eval_notes"] = "Entity created, triggers verified"
record["eval_trend"] = "stable" # or "new", "improved", "decreased"
# "unverified" is for a story whose verification query itself failed — it is
# not a result, so it carries no trend and is not compared to the baseline.Diff: <baseline>..HEAD — N files changed in src/ha_mcp/
Selected pre-built: s01, s03, s05 (3 stories — tools_automation.py, tools_search.py changed)
Custom stories: c01, c02 (2 stories — covering error handling, fuzzy search threshold)
Skipped: s02, s04, s06-s12 (tools unchanged)Also read the model and quantization fields from each JSONL record (written
by run_story.py) and show them as columns. Results vary by model, and the same
base model at different quants behaves very differently, so a report naming only
the agent is ambiguous after the fact. (Quant is - for cloud backends that
don't expose it.)
| Story | Agent | Model | Quant | Baseline | Target | Trend | Baseline Tokens | Target Tokens | Delta |
|-------|--------|------------------|-------|----------|--------|--------|-----------------|---------------|-------|
| s01 | claude | claude-sonnet-4-6| - | pass | pass | stable | 36,262 | 34,100 | -6% |
| s03 | claude | claude-sonnet-4-6| - | pass | pass | stable | 42,000 | 41,500 | -1% |For EACH custom story, output a full section:
#### c01: [Title]
**Rationale**: [What changed in the diff and why this tests it]
**Setup**:
- Created input_boolean "Sophisticated Kitchen Sensor" via FastMCP
**Test prompt**: "[The exact prompt sent to the agent]"
**Verification**:
| Question | Baseline | Target |
|----------|----------|--------|
| Found the entity? | confirmed | confirmed |
| Used ha_search? | confirmed | confirmed |
**Score**: baseline=pass, target=pass, trend=stable
**Tokens**: baseline=28,500, target=27,200 (-5%)If any trend = decreased:
git diff <baseline>..HEADWhen a story has >30% more billable tokens vs baseline, check for KV-cache misses:
for i, msg in enumerate(data["messages"]):
tok = msg.get("tokens", {})
cached = tok.get("cached", 0)
total = tok.get("input", 0)
print(f"Turn {i+1}: input={total:,} cached={cached:,} non-cached={total-cached:,}")A turn with cached=0 after a non-cold-start turn = KV-cache miss (provider-side, not a code regression).
Compare tool description sizes between versions:
uv run python tests/uat/stories/scripts/measure_tools.py \
--output local/tool-sizes-target.json
uv run python tests/uat/stories/scripts/measure_tools.py \
--output local/tool-sizes-baseline.json --branch <baseline>Flag >5% total size increase (directly impacts token cost per turn).
| File | Purpose |
|---|---|
tests/uat/stories/run_story.py | Story runner (container, setup, agent CLI) |
tests/uat/stories/scripts/ha_query.py | Query live HA via agent+MCP for verification |
tests/uat/stories/catalog/s*.yaml | Pre-built story definitions |
local/uat-results.jsonl | Historical results (gitignored) |
references/evaluation-protocol.md | Scoring rules, verification questions, cross-agent checks |
references/regression-protocol.md | Regression classification and flaky handling |
--baseline is required: it's both the diff source and the control group--keep-container), rest use --ha-url/tmp/ (ephemeral); full details reported in Step 6worktree/uat-stories worktree root (where pyproject.toml lives) for uv run© homeassistant-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in .claude/skills/bat-story-eval of homeassistant-ai/ha-mcp.
Open the folder on GitHubat commit b274a93
Bat Story Eval next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Bat Story Eval this skillhomeassistant-ai/ha-mcp | 5k | — | ~3.4k | Automated safety check: Notes | MIT | |
| MCP Server Builderanthropics/skills | 180k | 63 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 4 repos | ~1.2k | Automated safety check: Pass | MIT | |
| MCP Integration for Pluginsanthropics/claude-plugins-official | 38k | 11 repos | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Microsoft Skill CreatorMicrosoftDocs/mcp | 1.9k | 3 repos | ~2.1k | Automated safety check: Pass | CC-BY-4.0 | |
| Crush Configurationcharmbracelet/crush | 29k | — | ~3.7k | Automated safety check: Pass | Custom licence |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
anthropics/claude-plugins-official
Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.
MicrosoftDocs/mcp
Create agent skills for Microsoft technologies using official documentation.
charmbracelet/crush
Explains how to configure the Crush coding agent with crushrc or crush.json, covering providers, models, LSPs, MCP servers, hooks, permissions and config precedence.
mksglu/context-mode
Routes large command, file, API and browser output through context-mode tools so only the needed result enters the agent's context, instead of dumping it via Bash.
homeassistant-ai/ha-mcp
Run bot acceptance tests to validate MCP tools work correctly from a real AI agent's perspective.
homeassistant-ai/ha-mcp
Review a contribution PR for safety, quality, and readiness.
homeassistant-ai/ha-mcp
Deep analysis of a single GitHub issue with codebase exploration, implementation planning, and architectural assessment.
homeassistant-ai/ha-mcp
Implement a GitHub issue end-to-end — create a worktree branch, implement the feature with tests, create a draft PR, then iteratively resolve all CI failures and review comments until the PR is clean.
homeassistant-ai/ha-mcp
Manage your own GitHub pull requests — check CI status, inline review comments, PR-level comments, resolve review threads, fix issues, and iterate until all checks pass and threads are resolved.
homeassistant-ai/ha-mcp
Find merged PR authors missing from README and update the contributors list after approval
Categories
Compare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage. Bat Story Eval is an agent skill from homeassistant-ai/ha-mcp. Compare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage.
Bat Story Eval fits situations like: tasks that involve MCP servers.
Run `npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a claude-code`. Or copy the skill folder (.claude/skills/bat-story-eval in homeassistant-ai/ha-mcp) into .claude/skills/bat-story-eval in your project. Claude Code loads it when a task matches its description.
Run `npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a codex`. Or copy the skill folder (.claude/skills/bat-story-eval in homeassistant-ai/ha-mcp) into .agents/skills/bat-story-eval in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/bat-story-eval, .gemini/skills/bat-story-eval, .github/skills/bat-story-eval and .opencode/skills/bat-story-eval in your project.
Going by SKILL.md and its folder, Bat Story Eval needs the command-line tools its instructions call (uv, git, docker, python3 and claude). Our summary lists: Python 3; Docker. Its frontmatter pre-approves these tools: Bash, Read, Write, Glob, Grep, Task.
SKILL.md contains no URLs. Its commands use uv, git and docker, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Bat Story Eval is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Bat Story Eval: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and Microsoft Skill Creator (MicrosoftDocs/mcp, 1.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
homeassistant-ai (a GitHub organization) maintains it in homeassistant-ai/ha-mcp, which has 5,015 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 11, 2026.
Source: homeassistant-ai/ha-mcp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.