MCP Scaffold
timothywarner-org/claude-code
Scaffold production-ready Python MCP servers using FastMCP. An agent skill from timothywarner-org/claude-code.
Specialized guide for adding new MCP tools to the UniFi MCP Server following project standards, UniFi API patterns, and test-driven development practices.
$ npx skills add enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install enuno/unifi-mcp-server unifi-mcp-tool-builder --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/enuno/unifi-mcp-server.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/unifi-mcp-tool-builder .claude/skills/unifi-mcp-tool-builder && 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 "unifi-mcp-tool-builder" agent skill from https://github.com/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builder into .claude/skills/unifi-mcp-tool-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unifi-mcp-tool-builder", 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/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builderType 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 enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install enuno/unifi-mcp-server unifi-mcp-tool-builder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/enuno/unifi-mcp-server.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/unifi-mcp-tool-builder .agents/skills/unifi-mcp-tool-builder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "unifi-mcp-tool-builder" agent skill from https://github.com/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builder into .agents/skills/unifi-mcp-tool-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unifi-mcp-tool-builder", 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 enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install enuno/unifi-mcp-server unifi-mcp-tool-builder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/enuno/unifi-mcp-server.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/unifi-mcp-tool-builder .cursor/skills/unifi-mcp-tool-builder && 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 "unifi-mcp-tool-builder" agent skill from https://github.com/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builder into .cursor/skills/unifi-mcp-tool-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unifi-mcp-tool-builder", 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/enuno/unifi-mcp-server.git --path .agents/skills/unifi-mcp-tool-builder--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 enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install enuno/unifi-mcp-server unifi-mcp-tool-builder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/enuno/unifi-mcp-server.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/unifi-mcp-tool-builder .gemini/skills/unifi-mcp-tool-builder && 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 "unifi-mcp-tool-builder" agent skill from https://github.com/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builder into .gemini/skills/unifi-mcp-tool-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unifi-mcp-tool-builder", 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 enuno/unifi-mcp-server unifi-mcp-tool-builderInstalls 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 enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/enuno/unifi-mcp-server.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/unifi-mcp-tool-builder .github/skills/unifi-mcp-tool-builder && 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 "unifi-mcp-tool-builder" agent skill from https://github.com/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builder into .github/skills/unifi-mcp-tool-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unifi-mcp-tool-builder", 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 enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install enuno/unifi-mcp-server unifi-mcp-tool-builder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/enuno/unifi-mcp-server.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/unifi-mcp-tool-builder .opencode/skills/unifi-mcp-tool-builder && 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 "unifi-mcp-tool-builder" agent skill from https://github.com/enuno/unifi-mcp-server/tree/main/.agents/skills/unifi-mcp-tool-builder into .opencode/skills/unifi-mcp-tool-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unifi-mcp-tool-builder", 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.
unifi-mcp-tool-builderSpecialized guide for adding new MCP tools to the UniFi MCP Server following project standards, UniFi API patterns, and test-driven development practices.
Unifi MCP Tool Builder is an agent skill from enuno/unifi-mcp-server. Specialized guide for adding new MCP tools to the UniFi MCP Server following project standards, UniFi API patterns, and test-driven development practices. Use when implementing new UniFi Network Controller features as MCP tools.
Its SKILL.md is about 5.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering MCP servers and Test-driven development. It works with Model Context Protocol and Pydantic. The repository describes itself as: An MCP server that leverages official UniFi API. The licence is Apache-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a907070. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pytestblackruffmypyuvFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developer.ui.comFrom 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.
Unifi MCP Tool Builder loads about 5.8k tokens when it runs. Until then it costs about 63 tokens; SKILL.md has 1,097 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 found no risky patterns in SKILL.md.
Automated 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 enuno/unifi-mcp-server at commit a907070, republished under its Apache-2.0 licence (© enuno). 1,097 words, ~5,819 tokens.
.claude/skills/unifi-mcp-tool-builder/SKILL.md (or your agent's skills folder).This skill guides you through adding new MCP tools to the existing UniFi MCP Server. Unlike building an MCP server from scratch, this focuses on extending the current 74-tool implementation with new UniFi Network Controller functionality while maintaining the project's quality standards.
Project Context:
Before implementation, clarify:
Tool Categories in UniFi MCP Server:
Load UniFi API reference:
# Read the comprehensive UniFi API documentation
Read: docs/UNIFI_API.mdThis document contains verified endpoints for UniFi Network v10.0.156+.
Critical considerations:
Study similar tools in the codebase:
# Example: For a new device tool, read existing device tools
Read: src/tools/devices.py
Read: src/tools/device_control.py
# For network tools:
Read: src/tools/networks.py
Read: src/tools/network_config.py
# For testing patterns:
Read: tests/unit/test_devices.pyKey patterns to identify:
CRITICAL: Not all documented API endpoints actually exist!
The UniFi MCP Server has discovered that many documented endpoints don't exist in real controllers. Before implementation:
docs/UNIFI_API.md verification notesKnown endpoint issues:
Document your plan covering:
Tool Definition:
{action}_{resource})Data Models:
Testing Strategy:
Documentation:
Location: src/models/{feature}.py
from enum import Enum
from typing import Optional
from pydantic import BaseModel, Field, ConfigDict
class YourRequestModel(BaseModel):
"""Request model for your_tool operation.
Attributes:
site_id: UniFi site identifier
resource_id: Resource to operate on
options: Optional configuration parameters
"""
model_config = ConfigDict(extra="forbid", str_strip_whitespace=True)
site_id: str = Field(..., description="UniFi site ID (e.g., 'default')")
resource_id: str = Field(..., min_length=1, description="Resource identifier")
options: Optional[dict] = Field(None, description="Additional options")
class YourResponseModel(BaseModel):
"""Response from your_tool operation."""
success: bool
resource_id: str
message: strKey requirements:
model_config instead of Config)extra="forbid" to reject unknown fieldsLocation: src/tools/{category}.py (or new file if new category)
from fastmcp import Context
from src.models.your_model import YourRequestModel, YourResponseModel
from src.api.client import UniFiClient
from src.utils.validators import validate_site_id
@mcp.tool()
async def your_tool_name(
site_id: str,
resource_id: str,
options: dict | None = None,
settings: Context = None,
confirm: bool = False,
dry_run: bool = False,
) -> dict:
"""Brief one-line description of what this tool does.
Detailed explanation of the tool's purpose, when to use it,
and what it accomplishes. Include examples of common use cases.
Args:
site_id: UniFi site identifier (e.g., 'default')
resource_id: Resource to operate on
options: Optional configuration dictionary
settings: FastMCP context (auto-injected)
confirm: Required for mutating operations (default: False)
dry_run: Preview changes without applying (default: False)
Returns:
Dictionary containing:
- success: Operation success status
- resource_id: Modified resource identifier
- message: Human-readable result message
- details: (if dry_run) Preview of changes
Raises:
ValueError: If site_id is invalid or resource not found
PermissionError: If confirm=True not provided for mutation
Examples:
>>> # Read-only operation
>>> result = await your_tool_name(site_id="default", resource_id="abc123")
>>> # Mutating operation (requires confirmation)
>>> result = await your_tool_name(
... site_id="default",
... resource_id="abc123",
... confirm=True
... )
>>> # Preview changes first
>>> preview = await your_tool_name(
... site_id="default",
... resource_id="abc123",
... dry_run=True
... )
"""
# Validate inputs
validate_site_id(site_id)
# Get client from context
client: UniFiClient = settings.get("client")
# MUTATING OPERATIONS: Require confirmation
if not dry_run:
if not confirm:
raise PermissionError(
"This operation modifies network configuration. "
"Set confirm=True to proceed, or use dry_run=True to preview changes."
)
# Dry-run mode: Preview changes
if dry_run:
return {
"success": True,
"dry_run": True,
"preview": {
"operation": "your_operation",
"resource_id": resource_id,
"changes": {"key": "value"},
},
"message": "Dry-run completed. Set confirm=True to apply changes."
}
# Execute operation
try:
response = await client.request(
method="POST",
endpoint=f"/api/s/{site_id}/rest/your_endpoint",
json={"resource_id": resource_id, **(options or {})},
)
return {
"success": True,
"resource_id": resource_id,
"message": f"Successfully processed resource {resource_id}",
"data": response.get("data", {}),
}
except Exception as e:
# Provide actionable error messages
if "not found" in str(e).lower():
raise ValueError(
f"Resource '{resource_id}' not found in site '{site_id}'. "
f"Use list_resources tool to see available resources."
) from e
raiseImplementation checklist:
@mcp.tool() decoratorsrc/utils/validators.py)Location: src/main.py
Add your tool to the imports and ensure it's registered:
from src.tools.your_category import your_tool_name
# Tools are auto-registered via @mcp.tool() decorator
# No manual registration needed with FastMCPRun quality checks:
# Format code
black src/tools/your_file.py
isort src/tools/your_file.py
# Lint
ruff check src/tools/your_file.py --fix
# Type check
mypy src/tools/your_file.pyLocation: tests/unit/test_{category}.py
CRITICAL: UniFi MCP Server requires Test-Driven Development (TDD)
import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from src.tools.your_category import your_tool_name
class TestYourToolName:
"""Test suite for your_tool_name."""
@pytest.fixture
def mock_context(self):
"""Mock FastMCP context with UniFi client."""
context = MagicMock()
client = AsyncMock()
context.get.return_value = client
return context, client
@pytest.mark.asyncio
async def test_successful_operation(self, mock_context):
"""Test successful tool execution."""
context, client = mock_context
client.request.return_value = {
"data": {"_id": "abc123", "name": "test"}
}
result = await your_tool_name(
site_id="default",
resource_id="abc123",
settings=context,
confirm=True
)
assert result["success"] is True
assert result["resource_id"] == "abc123"
client.request.assert_called_once()
@pytest.mark.asyncio
async def test_requires_confirmation(self, mock_context):
"""Test that mutating operations require confirm=True."""
context, client = mock_context
with pytest.raises(PermissionError, match="Set confirm=True"):
await your_tool_name(
site_id="default",
resource_id="abc123",
settings=context,
confirm=False
)
@pytest.mark.asyncio
async def test_dry_run_mode(self, mock_context):
"""Test dry-run preview mode."""
context, client = mock_context
result = await your_tool_name(
site_id="default",
resource_id="abc123",
settings=context,
dry_run=True
)
assert result["dry_run"] is True
assert "preview" in result
client.request.assert_not_called()
@pytest.mark.asyncio
async def test_invalid_site_id(self, mock_context):
"""Test validation of site_id."""
context, client = mock_context
with pytest.raises(ValueError, match="Invalid site"):
await your_tool_name(
site_id="",
resource_id="abc123",
settings=context
)
@pytest.mark.asyncio
async def test_resource_not_found(self, mock_context):
"""Test handling of not found errors."""
context, client = mock_context
client.request.side_effect = Exception("Resource not found")
with pytest.raises(ValueError, match="not found"):
await your_tool_name(
site_id="default",
resource_id="nonexistent",
settings=context,
confirm=True
)
@pytest.mark.asyncio
async def test_with_optional_parameters(self, mock_context):
"""Test tool with optional parameters."""
context, client = mock_context
client.request.return_value = {"data": {"_id": "abc123"}}
result = await your_tool_name(
site_id="default",
resource_id="abc123",
options={"key": "value"},
settings=context,
confirm=True
)
assert result["success"] is True
# Verify options were passed to API
call_args = client.request.call_args
assert call_args[1]["json"]["key"] == "value"Test coverage requirements:
Target: 85%+ coverage for new code
# Run your specific test file
pytest tests/unit/test_your_category.py -v
# Run with coverage
pytest tests/unit/test_your_category.py --cov=src/tools/your_category --cov-report=term-missing
# Ensure coverage meets target (85%+)
pytest tests/unit/test_your_category.py --cov=src/tools/your_category --cov-report=html
open htmlcov/index.html # Review coverage reportLocation: API.md
Add your tool to the appropriate section with complete documentation:
### your_tool_name
**Description**: Brief one-line description
**Purpose**: Detailed explanation of when and why to use this tool
**Parameters**:
- `site_id` (string, required): UniFi site identifier (e.g., "default")
- `resource_id` (string, required): Resource identifier to operate on
- `options` (object, optional): Additional configuration options
- `confirm` (boolean, optional): Required for mutating operations (default: false)
- `dry_run` (boolean, optional): Preview changes without applying (default: false)
**Returns**:
```json
{
"success": true,
"resource_id": "abc123",
"message": "Successfully processed resource",
"data": { /* resource details */ }
}Dry-run response:
{
"success": true,
"dry_run": true,
"preview": {
"operation": "your_operation",
"resource_id": "abc123",
"changes": { /* preview of changes */ }
},
"message": "Dry-run completed. Set confirm=True to apply changes."
}Examples:
# Example 1: Preview changes (dry-run)
result = await mcp.call_tool("your_tool_name", {
"site_id": "default",
"resource_id": "abc123",
"dry_run": True
})
# Example 2: Execute operation
result = await mcp.call_tool("your_tool_name", {
"site_id": "default",
"resource_id": "abc123",
"confirm": True
})Error Handling:
ValueError: Invalid site_id or resource not foundPermissionError: Mutating operation requires confirm=TrueAPIError: UniFi API returned error (check message for details)API Endpoint: POST /api/s/{site}/rest/your_endpoint
Supported API Modes:
### 4.2 Update README.md (if major feature)
If adding a new feature category, update README.md:
```markdown
### Your New Feature Category
- **Feature Name**: Description of what it enables
- **Tools**: List of new tools
- **Use Cases**: Common scenarios where this is valuableAdd entry under "Unreleased" section:
## [Unreleased]
### Added
- New tool `your_tool_name` for managing XYZ (#123)
- Support for ABC feature in UniFi Network 10.0+# Run all tests
pytest tests/unit/
# Verify no regressions
pytest tests/unit/ --cov=src --cov-report=term-missing
# Check overall coverage (should remain ≥78%)
pytest tests/unit/ --cov=src --cov-report=html# Format (auto-fix)
black src/ tests/
isort src/ tests/
# Lint (auto-fix where possible)
ruff check src/ tests/ --fix
# Type check
mypy src/
# Security scan
bandit -r src/
# Pre-commit hooks
pre-commit run --all-files# Start MCP Inspector
uv run mcp dev src/main.py
# Open http://localhost:5173
# Test your new tool with real inputs
# Verify responses match expectationsIf you have access to a UniFi controller:
Before submitting:
{action}_{resource})black formatting passesisort import sorting passesruff linting passesmypy type checking passesbandit security scan passespytest all tests pass@mcp.tool()
async def list_resources(
site_id: str,
filters: dict | None = None,
settings: Context = None,
) -> list[dict]:
"""List resources in the UniFi controller.
This is a read-only operation requiring no confirmation.
"""
client = settings.get("client")
response = await client.request(
method="GET",
endpoint=f"/api/s/{site_id}/rest/resource",
params=filters or {}
)
return response.get("data", [])@mcp.tool()
async def update_resource(
site_id: str,
resource_id: str,
updates: dict,
settings: Context = None,
confirm: bool = False,
dry_run: bool = False,
) -> dict:
"""Update a resource (requires confirmation).
Mutating operations always require confirm=True.
"""
if not dry_run and not confirm:
raise PermissionError("Set confirm=True to proceed")
if dry_run:
return {"dry_run": True, "preview": updates}
client = settings.get("client")
response = await client.request(
method="PUT",
endpoint=f"/api/s/{site_id}/rest/resource/{resource_id}",
json=updates
)
return response@mcp.tool()
async def list_large_dataset(
site_id: str,
limit: int = 100,
offset: int = 0,
settings: Context = None,
) -> dict:
"""List resources with pagination support."""
client = settings.get("client")
response = await client.request(
method="GET",
endpoint=f"/api/s/{site_id}/rest/resource",
params={"limit": limit, "offset": offset}
)
return {
"data": response.get("data", []),
"total": response.get("meta", {}).get("total", 0),
"limit": limit,
"offset": offset
}@mcp.tool()
async def aggregate_across_sites(
settings: Context = None,
) -> dict:
"""Aggregate data across all sites."""
client = settings.get("client")
# Get all sites
sites_response = await client.request(
method="GET",
endpoint="/api/self/sites"
)
sites = sites_response.get("data", [])
# Aggregate data
results = []
for site in sites:
site_id = site["name"]
site_data = await client.request(
method="GET",
endpoint=f"/api/s/{site_id}/rest/resource"
)
results.append({
"site_id": site_id,
"data": site_data.get("data", [])
})
return {"sites": results}README.md - Project overview and quick startAPI.md - Complete MCP tool referenceAGENTS.md - AI agent development guidelinesDEVELOPMENT_PLAN.md - Roadmap and feature planningTESTING_PLAN.md - Testing strategy and coverage goalsCONTRIBUTING.md - Contribution guidelinesdocs/UNIFI_API.md - Verified endpoint documentation for v10.0.156+src/tools/devices.py - Device management examplessrc/tools/firewall.py - Firewall rule management patternssrc/tools/zbf_tools.py - Zone-Based Firewall implementationsrc/tools/qos.py - QoS profile management examplestests/unit/test_topology.py - High-coverage test examples (95%+)Last Updated: 2026-01-25 Maintained By: UniFi MCP Server Team
© enuno, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/unifi-mcp-tool-builder of enuno/unifi-mcp-server.
Open the folder on GitHubat commit a907070
Unifi MCP Tool Builder 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 |
|---|---|---|---|---|---|---|
| Unifi MCP Tool Builder this skillenuno/unifi-mcp-server | 284 | — | ~5.8k | Automated safety check: Pass | Apache-2.0 | |
| MCP Scaffoldtimothywarner-org/claude-code | 224 | — | ~940 | Automated safety check: Pass | MIT | |
| MCP Server BuilderjnMetaCode/superpowers-zh | 8.3k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Development AssistantRobThePCGuy/Claude-Patent-Creator | 196 | — | ~1.3k | Automated safety check: Notes | MIT | |
| MCP DeveloperJeffallan/claude-skills | 12k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Agent QA Authoringvostride/agent-qa | 904 | — | ~569 | Automated safety check: Pass | Custom licence |
timothywarner-org/claude-code
Scaffold production-ready Python MCP servers using FastMCP. An agent skill from timothywarner-org/claude-code.
jnMetaCode/superpowers-zh
Methodology for designing, implementing and testing Model Context Protocol servers in TypeScript or Python, covering tool design, error handling and security, in Chinese.
RobThePCGuy/Claude-Patent-Creator
Guides through adding new features, MCP tools, analyzers, and extending the patent creator system.
Jeffallan/claude-skills
Builds and debugs MCP servers and clients in TypeScript or Python, from tool and resource definitions to transport setup and inspector-based protocol checks.
vostride/agent-qa
A skill your agent uses when creating, editing, validating, or running agent-qa tests, suites, or hooks.
vostride/agent-qa
A skill your agent uses when investigating failed agent-qa runs, inspecting artifacts, classifying failures, or comparing recent runs.
enuno/unifi-mcp-server
Manage UniFi network infrastructure via the UniFi MCP Server.
enuno/unifi-mcp-server
Update UNIFIAPI.md with latest endpoints from developer.ui.com
enuno/unifi-mcp-server
Scaffold a new UniFi MCP tool with model, function, tests, and docs
enuno/unifi-mcp-server
Prepare a new release with version bump, changelog, and quality checks
enuno/unifi-mcp-server
Run tests and analyze coverage gaps by module to reach 80% target
enuno/unifi-mcp-server
Auto-generate and update API.md documentation from tool docstrings
Works with
Categories
Specialized guide for adding new MCP tools to the UniFi MCP Server following project standards, UniFi API patterns, and test-driven development practices. Unifi MCP Tool Builder is an agent skill from enuno/unifi-mcp-server. Specialized guide for adding new MCP tools to the UniFi MCP Server following project standards, UniFi API patterns, and test-driven development practices.
Unifi MCP Tool Builder fits situations like: implementing new UniFi Network Controller features as MCP tools; tasks that involve MCP servers; tasks that involve Test-driven development.
Run `npx skills add enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a claude-code`. Or copy the skill folder (.agents/skills/unifi-mcp-tool-builder in enuno/unifi-mcp-server) into .claude/skills/unifi-mcp-tool-builder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a codex`. Or copy the skill folder (.agents/skills/unifi-mcp-tool-builder in enuno/unifi-mcp-server) into .agents/skills/unifi-mcp-tool-builder 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 enuno/unifi-mcp-server --skill unifi-mcp-tool-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unifi-mcp-tool-builder, .gemini/skills/unifi-mcp-tool-builder, .github/skills/unifi-mcp-tool-builder and .opencode/skills/unifi-mcp-tool-builder in your project.
Going by SKILL.md and its folder, Unifi MCP Tool Builder needs the command-line tools its instructions call (pytest, black, ruff, mypy and uv). Our summary lists: Python 3.
SKILL.md names 1 domain. As links in the text: developer.ui.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Unifi MCP Tool Builder is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.8k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Unifi MCP Tool Builder: MCP Scaffold (timothywarner-org/claude-code, 224 stars), MCP Server Builder (jnMetaCode/superpowers-zh, 8.3k stars), Development Assistant (RobThePCGuy/Claude-Patent-Creator, 196 stars) and MCP Developer (Jeffallan/claude-skills, 12k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
enuno (a GitHub user) maintains it in enuno/unifi-mcp-server, which has 284 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 11, 2026.
Source: enuno/unifi-mcp-server on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.