by vinkius-labs
MCP Fusion - The TypeScript framework for secure MCP servers.
# Add to your Claude Code skills
git clone https://github.com/vinkius-labs/mcpfusionGuides for using mcp servers skills like mcpfusion.
Last scanned: 5/30/2026
{
"issues": [
{
"type": "npm-audit",
"message": "@aws-sdk/xml-builder: Vulnerability found",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "@hono/node-server: @hono/node-server has authorization bypass for protected static paths via encoded slashes in Serve Static Middleware",
"severity": "high"
},
{
"type": "npm-audit",
"message": "brace-expansion: brace-expansion: Zero-step sequence causes process hang and memory exhaustion",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "esbuild: esbuild enables any website to send any requests to the development server and read the response",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "express-rate-limit: express-rate-limit: IPv4-mapped IPv6 addresses bypass per-client rate limiting on servers with dual-stack network",
"severity": "high"
},
{
"type": "npm-audit",
"message": "fast-uri: fast-uri vulnerable to path traversal via percent-encoded dot segments",
"severity": "high"
},
{
"type": "npm-audit",
"message": "fast-xml-parser: fast-xml-parser has stack overflow in XMLBuilder with preserveOrder",
"severity": "high"
},
{
"type": "npm-audit",
"message": "flatted: flatted vulnerable to unbounded recursion DoS in parse() revive phase",
"severity": "high"
},
{
"type": "npm-audit",
"message": "hono: Hono Vulnerable to Cookie Attribute Injection via Unsanitized domain and path in setCookie()",
"severity": "high"
},
{
"type": "npm-audit",
"message": "ip-address: ip-address has XSS in Address6 HTML-emitting methods",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "path-to-regexp: path-to-regexp vulnerable to Denial of Service via sequential optional groups",
"severity": "high"
},
{
"type": "npm-audit",
"message": "picomatch: Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching",
"severity": "high"
},
{
"type": "npm-audit",
"message": "postcss: PostCSS has XSS via Unescaped </style> in its CSS Stringify Output",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "qs: qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/undefined entries in comma-format arrays when encodeValuesOnly is set",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "vite: Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "vitepress: Vulnerability found",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "yaml: yaml is vulnerable to Stack Overflow via deeply nested YAML collections",
"severity": "medium"
}
],
"status": "WARNING",
"scannedAt": "2026-05-30T15:20:15.714Z",
"npmAuditRan": true,
"pipAuditRan": true
}mcpfusion is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by vinkius-labs. MCP Fusion - The TypeScript framework for secure MCP servers. It has 257 GitHub stars.
mcpfusion returned warnings in SkillsLLM's automated security scan. It has no critical vulnerabilities, but review the flagged issues in the Security Report section before adding it to your workflow.
Clone the repository with "git clone https://github.com/vinkius-labs/mcpfusion" and add it to your Claude Code skills directory (see the Installation section above).
mcpfusion is primarily written in TypeScript. It is open-source under vinkius-labs on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh mcpfusion against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
Requires a passing catalog security scan. Resolve the flagged issues and resubmit to enable featuring.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The TypeScript framework for secure, MCP 2.0-native servers.
MCP Fusion is a TypeScript framework that enforces security at the architectural level of every MCP server. Raw data never reaches the LLM without passing through a typed egress firewall. Tools are physically removed from the agent's namespace when the workflow state forbids them. Every behavioral surface is hashed, locked, and auditable in version control.
The framework ships with a SKILL.md — a machine-readable architectural contract. AI coding agents read the Skill and produce correct, governed servers on the first pass.
2026-07-28) — Full ComplianceMCP Fusion is 100% compatible with MCP 2.0 (protocol revision 2026-07-28). Every feature the spec defines is implemented or handled via the MCP SDK v2. Every feature the spec deprecates is deprecated in MCP Fusion.
| Feature | Status | How |
|---|---|---|
| Stateless protocol | ✅ | transport: 'stateless' — per-request serving, no sessions, no initialize handshake, Mcp-Method/Mcp-Name header routing |
| Multi Round-Trip Requests (MRTR) | ✅ | requireInput() + readInput() — native InputRequiredResult / resultType: "input_required" model |
| Request State Sealing | ✅ | requestStateKey — HMAC-SHA256 sealed state for multi-round elicitation (SEP-2322) |
| Structured Content | ✅ | successStructured() + structuredContent field on ToolResponse |
| Output Schema | ✅ | outputSchema in compileToolDefinition() wire format |
| List Caching | ✅ | ttlMs / cacheScope directly on result root (SEP-2549) — public / private scope |
| Pagination | ✅ | cursor / nextCursor on prompts/list (extensible to all list ops) |
server/discover |
✅ | Handled by MCP SDK v2 Server |
resultType |
✅ | Handled by MCP SDK v2 Server ("complete" / "input_required") |
Per-request _meta |
✅ | io.modelcontextprotocol/* fields handled by MCP SDK v2 |
resources/templates/list |
✅ | URI template resources with pagination |
subscriptions/listen |
✅ | MCP 2.0 stream-based subscription pattern with filter + acknowledgment |
x-mcp-header |
✅ | .withHeaderParam() on FluentToolBuilder — parameter mirroring to HTTP headers |
title & icons |
✅ | Tool.title, BaseModel.title, Icon domain model, createIcon() |
resource_link |
✅ | Content type in tool results and prompt messages |
| JSON Schema 2020-12 | ✅ | Default dialect enforced by MCP SDK v2 |
Error codes (-32020–-32022) |
✅ | HeaderMismatch, MissingRequiredClientCapability, UnsupportedProtocolVersion |
| Protocol version | ✅ | Defaults to 2026-07-28 in all server metadata (Server Card, introspection) |
All features deprecated by MCP 2.0 (SEP-2577 / SEP-2596) are deprecated in MCP Fusion with @deprecated markers and migration guidance. They remain functional during the deprecation window (earliest removal: 2027-07-28).
| Deprecated Feature | Migration Path |
|---|---|
| Roots | Pass directories/files via tool parameters, resource URIs, or server configuration |
| Sampling | Integrate directly with LLM provider APIs |
Logging (notifications/message) |
Log to stderr for stdio; use OpenTelemetry (TelemetrySink / DebugObserver) |
| Dynamic Client Registration | Client ID Metadata Documents |
| HTTP+SSE transport | Streamable HTTP (transport: 'http') or stateless (transport: 'stateless') |
includeContext values |
Omit the field or use "none" |
📄 Deprecation Registry — full compliance statement and migration guide.
MCP Fusion includes a SKILL.md that encodes the entire MVA architecture, security patterns, and governance rules into a format AI coding agents consume directly.
Open your project in Cursor, Claude Code, GitHub Copilot, or Windsurf and describe what you need:
"Build an MCP server for patient records with Prisma. Redact SSN and diagnosis from LLM output. Gate discharge tools until attending physician signs off."
The agent reads the Skill. It produces defineModel() declarations with m.hidden() for sensitive fields, definePresenter() with .redactPII(['*.ssn', '*.diagnosis']) for DLP compliance, FSM state gating via .bindState() for workflow enforcement, and file-based routing under src/tools/. You review the PR.
The Skill is not documentation. It is the security contract. Every server the AI produces inherits the governance stack because the Skill encodes Presenters, state machines, and lockfile generation as mandatory structural patterns.
📄 SKILL.md · llms.txt (complete API reference for LLM consumption)
The Presenter validates every response through a Zod schema compiled from defineModel(). Undeclared fields are stripped in RAM before serialization. PII is redacted via V8-optimized fast-redact compiled functions. Rules travel with data, not in the system prompt. The Late Guillotine pattern applies redaction after UI blocks render — charts and suggestions always see full data, the wire never does.
const PatientPresenter = createPresenter('Patient')
.schema(PatientModel)
.redactPII(['*.ssn', '*.diagnosis'])
.rules((p) => [
p.status === 'critical' ? 'PRIORITY: Patient is critical.' : null,
])
.suggest((p) => p.status === 'admitted'
? [suggest('ward.discharge', 'Begin discharge protocol')]
: []);
The Presenter also runs a PromptFirewall — an LLM-as-Judge that evaluates dynamically generated system rules for prompt injection before they reach the agent. Fail-closed by default.
Tools bound to FSM states are physically removed from tools/list when the current state does not match. The LLM cannot call what does not exist in its namespace. Powered by XState v5 with manual fallback when XState is not installed.
const gate = f.fsm({
id: 'discharge', initial: 'admitted',
states: {
admitted: { on: { PHYSICIAN_SIGNOFF: 'approved' } },
approved: { on: { DISCHARGE: 'discharged' } },
discharged: { type: 'final' },
},
});
export default f.mutation('ward.discharge')
.bindState('approved', 'DISCHARGE')
.handle(async (input, ctx) => ctx.db.patients.discharge(input.id));
| State | Visible tools |
|---|---|
admitted |
ward.view, ward.update_vitals |
approved |
ward.discharge, ward.view |
discharged |
ward.view |
Serverless-compatible: FsmStateStore persists state to Redis/KV across request boundaries. Each request gets an isolated gate.clone().
Eight introspection modules that make behavioral changes visible and auditable:
| Module | What it does |
|---|---|
| ToolContract | Materializes the complete behavioral surface of each tool |
| BehaviorDigest | SHA-256 hash of the behavioral surface |
| CapabilityLockfile | mcpfusion.lock — git-diffable behavioral snapshot, CI gate via fusion lock --check |
| CryptoAttestation | HMAC-SHA256 runtime verification — fail-fast if behavioral digest drifts |
| ContractDiff | Per-field diff between lockfile versions |
| EntitlementScanner | Static analysis of handler source for I/O capabilities (fs, network, subprocess, eval) with evasion heuristics |
| SemanticProbe | LLM-as-Judge for detecting semantic drift in handler output |
| TokenEconomics | Context window inflation risk profiling |
SandboxEngine executes LLM-provided JavaScript in a sealed V8 isolate. No process, require, fs, or network access. One isolate per engine, fresh empty context per execution. Memory-limited, timeout-enforced, output-capped, abort-signal-compatible.
version: "1.0"
server:
name: "github-tools"
connections:
github:
type: rest
base_url: "https://api.github.com"
auth:
type: bearer
token: "${SECRETS.GITHUB_TOKEN}"
tools:
- name: search_repos
description: "Search GitHub repositories"
instruction: "Use for finding projects by topic or keyword."
rules:
- "Max 10 results per query"
parameters:
query: { type: string, required: true }
execute:
connection: github
method: GET
path: "/search/repositories"
query: { q: "{{query}}", per_page: "10" }
response:
extract: ["items[].{full_name, description, stargazers_count, html_url}"]
mcpfusion yaml dev
export const InvoiceModel = defineModel('Invoice', m => {
m.casts({
id: m.string(),
amount_cents: m.number('CRITICAL: in CEN