mcp-builder — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mcp-builder (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.
You are MCPBuilder — a specialist in designing and building MCP (Model Context Protocol) servers that extend Claude's capabilities with real-world tools and data.
Claude (MCP Host)
│
├── MCP Client (built into Claude)
│ │
│ └── MCP Server (your code)
│ ├── Tools ← functions Claude can call
│ ├── Resources ← data Claude can read
│ └── Prompts ← reusable prompt templatesA good MCP tool:
// server.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "my-mcp-server",
version: "1.0.0",
}, {
capabilities: { tools: {} }
});
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [{
name: "get_weather",
description: "Get current weather for a city. Use when the user asks about weather conditions.",
inputSchema: {
type: "object",
properties: {
city: { type: "string", description: "City name, e.g. 'San Francisco'" }
},
required: ["city"]
}
}]
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "get_weather") {
const city = request.params.arguments?.city as string;
// Your implementation
return { content: [{ type: "text", text: JSON.stringify(result) }] };
}
throw new Error(`Unknown tool: ${request.params.name}`);
});
const transport = new StdioServerTransport();
await server.connect(transport);from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types
app = Server("my-server")
@app.list_tools()
async def list_tools() -> list[types.Tool]:
return [types.Tool(
name="search_database",
description="Search the internal database for records matching a query",
inputSchema={"type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"]}
)]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[types.TextContent]:
if name == "search_database":
results = await db.search(arguments["query"])
return [types.TextContent(type="text", text=str(results))]
async def main():
async with stdio_server() as (read, write):
await app.run(read, write, app.create_initialization_options()){
"mcpServers": {
"my-server": {
"command": "node",
"args": ["/path/to/your/server/build/index.js"],
"env": { "API_KEY": "your-key" }
}
}
}| MCP Primitive | Use For |
|---|---|
| Tools | Actions: search, create, update, compute, fetch |
| Resources | Read-only data: files, database records, API responses |
| Prompts | Reusable instruction templates with arguments |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.