Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Server (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.
Production-ready MCP server template for building Model Context Protocol servers with TypeScript and Bun runtime.
This is a template project for creating MCP servers. It includes:
bun install# Start the MCP server
bun run start
# Development with hot reload
bun run devAdd to your MCP client configuration:
{
"mcpServers": {
"mcp-server-template": {
"command": "bun",
"args": ["run", "/path/to/mcp-server-template/src/server.ts"]
}
}
}Or use the built version:
{
"mcpServers": {
"mcp-server-template": {
"command": "node",
"args": ["/path/to/mcp-server-template/dist/server.js"]
}
}
}In src/types/index.ts:
import { z } from "zod";
export const MyToolInputSchema = z.object({
param1: z.string().min(1).describe("Parameter description"),
param2: z.number().optional().describe("Optional parameter"),
});
export type MyToolInput = z.infer<typeof MyToolInputSchema>;In src/tools/index.ts:
export const toolDefinitions = [
{
name: "my_tool",
description: "Description of what the tool does",
inputSchema: {
type: "object" as const,
properties: {
param1: { type: "string", description: "Parameter description" },
param2: { type: "number", description: "Optional parameter" },
},
required: ["param1"],
},
},
];export async function handleMyTool(input: unknown): Promise<CallToolResult> {
try {
const validated = MyToolInputSchema.parse(input);
log.info('Executing tool', { tool: 'my_tool', params: validated });
// Your logic here
const result = { data: "..." };
log.info('Tool completed', { tool: 'my_tool', success: true });
return createSuccessResult(result);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
return createErrorResult(message, "my_tool");
}
}export async function handleToolCall(name: string, args: unknown): Promise<CallToolResult> {
switch (name) {
case "my_tool":
return handleMyTool(args);
default:
return createErrorResult(`Unknown tool: ${name}`, name);
}
}Create tests/unit/my_tool.test.ts:
import { describe, test, expect } from "bun:test";
import { handleMyTool } from "../../src/tools/index.js";
describe("My Tool", () => {
test("should work correctly", async () => {
const result = await handleMyTool({ param1: "test" });
expect(result.isError).toBe(false);
});
});Create docs/tools/my_tool.md:
# my_tool
Description of what the tool does.
## Parameters
| Name | Type | Required | Description |
|------|------|----------|-------------|
| param1 | string | Yes | Description |
## Examples
**Input:**
\`\`\`json
{ "param1": "value" }
\`\`\`
**Output:**
\`\`\`json
{ "data": "result" }
\`\`\`| Script | Description |
|---|---|
bun run dev | Start development server with hot reload |
bun run build | Build for production |
bun run start | Run production build |
bun test | Run unit tests |
bun run test:coverage | Run tests with coverage |
bun run test:runtime | Run runtime testcases |
bun run lint | Run Biome linter |
bun run lint:fix | Auto-fix lint issues |
bun run format | Format code with Biome |
bun run typecheck | Type check without emit |
DEBUG=true - Enable debug loggingbun --versionbun run typecheckDEBUG=true bun run startSee DEVELOPMENT.md for development setup.
MIT License - see LICENSE for details.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.