Mcp Funnel — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Funnel (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.
Core infrastructure package for MCP Funnel. Provides transport implementations, secret management, logging, authentication utilities, and resilient connection management.
yarn add @mcp-funnel/coreClient transport implementations for the Model Context Protocol:
All transports implement the MCP SDK Transport interface for seamless integration.
Secure secret provider system with fine-grained control:
DotEnvProvider: Loads secrets from .env filesProcessEnvProvider: Filters process environment variables by prefixInlineProvider: Defines secrets directly in configurationStructured logging infrastructure with security-first design:
Resilient connection handling with intelligent retry logic:
Interfaces for implementing authentication providers:
Secure environment variable interpolation:
${VAR} and ${VAR:default} patternsresolveEnvVar: Resolve a single variableresolveConfigFields: Resolve specific fields in config objectsimport { StdioClientTransport } from '@mcp-funnel/core';
const transport = new StdioClientTransport('my-server', {
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-memory'],
env: { NODE_ENV: 'production' },
cwd: '/path/to/working/dir',
});
await transport.start();import { SecretManager, createSecretProviders } from '@mcp-funnel/core';
const providers = createSecretProviders([
{ type: 'dotenv', config: { path: '.env' } },
{ type: 'process', config: { prefix: 'MCP_' } },
{ type: 'inline', config: { values: { API_KEY: 'secret' } } },
]);
const secretManager = new SecretManager(providers);
const secrets = await secretManager.resolveSecrets();
// Use secrets with environment variable resolution
const resolvedEnv = {
...secrets,
DATABASE_URL: resolveEnvVar('${DB_HOST}:${DB_PORT}/${DB_NAME}'),
};import { ReconnectionManager } from '@mcp-funnel/core';
const reconnectionManager = new ReconnectionManager({
initialDelayMs: 1000,
maxDelayMs: 30000,
maxAttempts: 10,
backoffMultiplier: 2,
jitter: 0.25,
});
reconnectionManager.onStateChange((event) => {
console.log(`Connection: ${event.from} -> ${event.to}`);
if (event.nextRetryDelay) {
console.log(`Next retry in ${event.nextRetryDelay}ms`);
}
});
// During connection attempt
reconnectionManager.onConnecting();
try {
await connectToServer();
reconnectionManager.onConnected();
} catch (error) {
reconnectionManager.onDisconnected(error);
await reconnectionManager.scheduleReconnect(() => connectToServer());
}import { EnvVarPatternResolver, resolveEnvVar } from '@mcp-funnel/core';
// Simple resolution
const url = resolveEnvVar('${API_HOST}:${API_PORT}');
// With default values
const resolver = new EnvVarPatternResolver();
const config = resolver.resolve('${NODE_ENV:development}');
// Resolve specific config fields
import { resolveConfigFields } from '@mcp-funnel/core';
const config = {
apiUrl: '${API_BASE_URL}/v1',
token: '${API_TOKEN}',
timeout: 5000, // Not resolved
};
const resolved = resolveConfigFields(config, ['apiUrl', 'token']);MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.