new-provider — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited new-provider (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Scaffold a new backend provider with all required files following project conventions.
/new-provider <name>
Examples:
/new-provider scryfall/new-provider spellbook/new-provider seventeen_lands/new-provider edhrecGiven /new-provider <name>:
src/mtg_mcp_server/services/<name>.pyimport structlog
from mtg_mcp_server.services.base import DEFAULT_USER_AGENT, BaseClient, ServiceError
log = structlog.get_logger(service="<name>")
class <Name>Error(ServiceError): ...
class <Name>NotFoundError(<Name>Error): ...
class <Name>Client(BaseClient):
"""<Name> API client."""
def __init__(
self,
base_url: str = "...", # from Settings
rate_limit_rps: float = ...,
user_agent: str = DEFAULT_USER_AGENT,
) -> None:
super().__init__(
base_url=base_url,
rate_limit_rps=rate_limit_rps,
user_agent=user_agent,
)src/mtg_mcp_server/providers/<name>.pyfrom fastmcp import FastMCP
from fastmcp.server.lifespan import lifespan
from fastmcp.exceptions import ToolError
from mtg_mcp_server.config import Settings
from mtg_mcp_server.providers import TOOL_ANNOTATIONS
from mtg_mcp_server.services.<name> import <Name>Client
_client: <Name>Client | None = None
@lifespan
async def <name>_lifespan(server: FastMCP):
global _client
settings = Settings()
client = <Name>Client(base_url=settings.<name>_base_url)
async with client:
_client = client
yield {}
_client = None
<name>_mcp = FastMCP("<DisplayName>", lifespan=<name>_lifespan)
def _get_client() -> <Name>Client:
if _client is None:
raise RuntimeError("<Name>Client not initialized — server lifespan not running")
return _client
# Tools go here — each uses:
# annotations=TOOL_ANNOTATIONS
# client = _get_client()
# ToolError for error responsestests/services/test_<name>.py — Service layer tests with respx mockstests/providers/test_<name>_provider.py — Provider tests using FastMCP test clienttests/fixtures/<name>/ — Directory for JSON fixtures (empty, user captures separately)src/mtg_mcp_server/types.pyAdd response models for the service. Use model_validate(), not parse_obj().
docs/SERVICE_CONTRACTS.md for the service's API detailsdocs/TOOL_DESIGN.md for the tools this provider should exposeToolError from fastmcp.exceptions for error responses_client, never instantiate per callserver.py~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.