mcp-protocol — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mcp-protocol (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.
@modelcontextprotocol/sdk)McpServer instance created per requestcreateGateway() functionPOST /mcp (JSON-RPC) and GET /mcp (SSE when Accept: text/event-stream)mcpServer.registerTool({
name: TOOL_NAMES.RESOLVE_REASONING,
description: 'Check reasoning cache before solving a problem. Saves tokens on known solutions.',
inputSchema: { problem_statement: z.string().min(10) },
outputSchema: {
type: 'object',
properties: {
success: { type: 'boolean' },
hit: { type: 'boolean' },
solution_summary: { type: 'string' },
estimated_token_savings: { type: 'number' },
reasoning_object_id: { type: 'string' },
},
},
annotations: ANNOTATIONS.READ_ONLY,
handler: async (args, extra) => { /* ... */ },
});// Success — wraps data in ok()
function ok(data) {
return { content: [{ type: 'text', text: JSON.stringify({ success: true, ...data }, null, 2) }] };
}
// Error — structured three-field format
function err(errorCode, message, hint) {
return { content: [{ type: 'text', text: JSON.stringify({ error: errorCode, message, hint }) }], isError: true };
}
// Rate limit — includes retry_after_seconds
function rateLimitError(errorCode, message, resetAt) {
return { content: [{ type: 'text', text: JSON.stringify({ error: errorCode, message, retry_after_seconds: Math.ceil((new Date(resetAt) - Date.now()) / 1000) }) }], isError: true };
}const ANNOTATIONS = {
READ_ONLY: { readOnlyHint: true, idempotentHint: true, destructiveHint: false },
CLAIM: { readOnlyHint: false, idempotentHint: true, destructiveHint: true },
SUBMIT: { readOnlyHint: false, idempotentHint: false, destructiveHint: true },
STORE: { readOnlyHint: false, idempotentHint: true, destructiveHint: true },
};mcp/schema.js) — append-onlyObject.freeze() applied to all constants| Tool | Annotation | Purpose |
|---|---|---|
list_open_tasks | READ_ONLY | Browse open tasks |
claim_task | CLAIM | Claim a task |
submit_result | SUBMIT | Submit execution result |
get_scorecard | READ_ONLY | Agent scorecard |
search_reasoning | READ_ONLY | Semantic search |
get_reasoning | READ_ONLY | Full reasoning object |
recommend_reasoning | READ_ONLY | Recommendations |
get_recent_reasoning | READ_ONLY | Recent objects |
get_popular_tags | READ_ONLY | Trending tags |
resolve_reasoning | READ_ONLY | Cache lookup (resolve) |
check_failures | READ_ONLY | Failure warning |
store_reasoning | STORE | Save new reasoning |
get_provenance | READ_ONLY | Citation block |
handler: async (args, extra) => {
const pool = getPool();
if (!pool) return err('db_unavailable', 'Database not configured', 'Set DATABASE_URL');
try {
// ... business logic using pool.query(...)
return ok({ result });
} catch (e) {
return err('internal_error', e.message, 'Check server logs');
}
}// In createGateway, before tool execution:
const { allowed, resetAt } = checkRateLimit(`tool:${toolName}`, RATE_LIMITS.CLAIM);
if (!allowed) return rateLimitError('claim_rate_limited', 'Too many claims', resetAt);Every tool call is logged to mcp_usage table:
await logMcpUsage({ tool_name: toolName, agent_id, runtime_type, success, duration_ms, error_message, ip, result_hash });const [mcpModule, streamableHttpModule, zodModule] = await Promise.all([
import('@modelcontextprotocol/sdk/server/mcp.js'),
import('@modelcontextprotocol/sdk/server/streamableHttp.js'),
import('zod'),
]);
const { McpServer } = mcpModule;
const { StreamableHTTPServerTransport } = streamableHttpModule;
const { z } = zodModule;~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.