Agent skill

Mcpfusion Development

by vinkius-labs in vinkius-labs/mcpfusion

How to build production MCP servers with MCP Fusion using the MVA (Model-View-Agent) pattern.

Apache-2.0Auto-check passedAgent Workflows

Install Mcpfusion Development

skills CLI
$ npx skills add vinkius-labs/mcpfusion --skill mcpfusion-development -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install vinkius-labs/mcpfusion mcpfusion-development --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/vinkius-labs/mcpfusion.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/mcpfusion-development .claude/skills/mcpfusion-development && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
mcpfusion-development
GitHub stars
256
Token cost
~4.3k tokens
SKILL.md length
737 words
Files
5 (incl. references)
Skills in repo
2
Repo updated
First seen
Licence
Apache-2.0

At a glance

How to build production MCP servers with MCP Fusion using the MVA (Model-View-Agent) pattern.

  • Works in 6 steps: ALWAYS use defineModel() for domain… → Presenters receive Models via… → with*() methods are for tool INPUT… → …
  • Reviewing MCP Fusion code — including tools
  • SKILL.md covers Reference Examples, Project Structure, The Golden Rules and defineModel() — The "M" in MVA, plus 9 more sections
  • Runs TypeScript scripts from its folder

What it does

Mcpfusion Development is an agent skill from vinkius-labs/mcpfusion. How to build production MCP servers with MCP Fusion using the MVA (Model-View-Agent) pattern. Use this skill whenever writing, modifying, or reviewing MCP Fusion code — including tools, Presenters, Models, middleware, prompts, routers, tests, or server configuration. Activate even when the user just says "create a tool", "add an endpoint", "write a Presenter", or mentions @mcpfusion/core, defineModel, definePresenter, initMCPFusion, FluentToolBuilder, or any MCP Fusion API. This skill covers the entire framework…

Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/example-complete-crud.ts`, `references/example-proxy-api.ts` and `references/example-server-setup.ts`). Compatibility notes: Requires Node.js = 18, TypeScript 5.7+

It sits in Agent Workflows, covering MCP servers. It works with Model Context Protocol and OpenAI. The repository describes itself as: MCP Fusion - The TypeScript framework for secure MCP servers. The licence is Apache-2.0.

When your agent uses it

  • Reviewing MCP Fusion code — including tools
  • Server configuration
  • Just says create a tool
  • Add an endpoint

Example prompts

  • “create a tool”
  • “add an endpoint”
  • “write a Presenter”
  • “/mcpfusion-development”

Requirements

  • Node.js
  • Compatibility (from SKILL.md): Requires Node.js >= 18, TypeScript 5.7+

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. ALWAYS use defineModel() for domain entity schemas — never raw z.object(). Models go in models/.
  2. Presenters receive Models via .schema(MyModel) — the Presenter is the egress firewall.
  3. with*() methods are for tool INPUT parameters only (filters, IDs, pagination) — NOT for domain schemas.
  4. Handlers return raw data — the framework wraps with success() automatically. No boilerplate.
  5. One Model + one Presenter per entity, reused across every tool and prompt.
  6. Use semantic verbs: f.query() = readOnly, f.mutation() = destructive, f.action() = neutral.

What it can do on your machine

Read from SKILL.md and the folder at commit 1dab501. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (TypeScript), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Requires Node.js >= 18, TypeScript 5.7+

    From compatibility in the SKILL.md frontmatter.

Context cost

Mcpfusion Development loads about 4.3k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 137 tokens; SKILL.md has 737 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~137
When it runs · the whole SKILL.md, loaded when a task matches
~4.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~12k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from vinkius-labs/mcpfusion at commit 1dab501, republished under its Apache-2.0 licence (© vinkius-labs). 737 words, ~4,347 tokens.

Download SKILL.mdSave it as .claude/skills/mcpfusion-development/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
mcpfusion-development
description
How to build production MCP servers with MCP Fusion using the MVA (Model-View-Agent) pattern. Use this skill whenever writing, modifying, or reviewing MCP Fusion code — including tools, Presenters, Models, middleware, prompts, routers, tests, or server configuration. Activate even when the user just says "create a tool", "add an endpoint", "write a Presenter", or mentions @mcpfusion/core, defineModel, definePresenter, initMCPFusion, FluentToolBuilder, or any MCP Fusion API. This skill covers the entire framework surface.
compatibility
Requires Node.js >= 18, TypeScript 5.7+
license
Apache-2.0
metadata.author
vinkius-labs
metadata.version
3.0
metadata.tags
mcp, typescript, framework, mva

mcpfusion development Guide

MCP Fusion is a TypeScript framework for MCP servers built on the MVA (Model-View-Agent) pattern. The Model validates data, the Presenter (View) shapes what the AI perceives, and Tools (Agent layer) wire it all together.

For the complete API reference with all type signatures, read llms.txt at the root of the repository. This skill covers the essential patterns and rules.

Reference Examples

Complete, runnable examples are available in references/. Read them for concrete implementation patterns:

ExampleDomainPatterns Shown
example-complete-crud.tsProduct CatalogFull MVA lifecycle: Model → Presenter → Router → Query/Mutation/Action, ErrorBuilder, State Sync
example-proxy-api.tsBlog Platform.proxy() API pass-through, .fromModel(), field aliases, path params (:id), .handle() vs .proxy() decision tree
example-server-setup.tsGeneric AppFull server bootstrap: context, initMCPFusion(), middleware, autoDiscover(), prompts, State Sync policies, startServer()
example-testing.tsCustomer Service@mcpfusion/testing: Egress Firewall assertions, JIT System Rules, RBAC middleware, error handling, Symbol Invisibility

Project Structure

src/
├── models/               ← M — defineModel() declarations
│   ├── InvoiceModel.ts
│   └── UserModel.ts
├── views/                ← V — Presenters
│   ├── invoice.presenter.ts
│   └── user.presenter.ts
├── agents/               ← A — Tool definitions
│   ├── billing.tool.ts
│   └── users.tool.ts
├── index.ts              ← ToolRegistry + registerAll()
└── server.ts             ← attachToServer() bootstrap

Layer import rule: agents/ → views/ → models/ → @mcpfusion/core. Never import backwards.

The Golden Rules

  1. ALWAYS use defineModel() for domain entity schemas — never raw z.object(). Models go in models/.
  2. Presenters receive Models via .schema(MyModel) — the Presenter is the egress firewall.
  3. with*() methods are for tool INPUT parameters only (filters, IDs, pagination) — NOT for domain schemas.
  4. Handlers return raw data — the framework wraps with success() automatically. No boilerplate.
  5. One Model + one Presenter per entity, reused across every tool and prompt.
  6. Use semantic verbs: f.query() = readOnly, f.mutation() = destructive, f.action() = neutral.

defineModel() — The "M" in MVA

Every domain entity starts here. Produces a Model with a compiled Zod .schema.

typescript
import { defineModel } from '@mcpfusion/core';

export const InvoiceModel = defineModel('Invoice', m => {
    m.casts({
        id:           m.string(),
        amount_cents: m.number('CRITICAL: in CENTS. Divide by 100 for display.'),
        status:       m.enum('Status', ['paid', 'pending', 'overdue']),
        client_name:  m.string('Client name'),
    });
});

export const UserModel = defineModel('User', m => {
    m.casts({
        id:    m.string(),
        name:  m.string('Full name'),
        email: m.string('Email address'),
        role:  m.enum('Role', ['admin', 'member', 'guest']),
    });
    m.hidden(['password_hash', 'stripe_token']);  // Never exposed
    m.timestamps();                                // created_at + updated_at
    m.fillable({
        create: ['name', 'email', 'role'],
        update: ['name', 'email'],
    });
});
Type Helpers
MethodProducesUse
m.string(label?)z.string()General text
m.text(label?)z.string()Markdown / long content
m.number(label?)z.number()Numeric
m.boolean(label?)z.boolean()Flags
m.date(label?)z.string()YYYY-MM-DD
m.timestamp(label?)z.string()ISO datetime
m.uuid(label?)z.string()UUID
m.id(label?)z.number()Always required
m.enum(label, values)z.enum()Valid values
FieldDef Chaining
typescript
m.enum('Status', ['open', 'done']).default('open')
m.string('Display name').alias('displayName')     // agent says 'name', API gets 'displayName'
m.number('Score').examples([85, 92, 100])
Model.toApi() — Alias Resolution

Strips undefined values and renames aliased fields. Used automatically by .proxy(), call explicitly in .handle():

typescript
const data = TaskModel.toApi(input);
// { title: 'X', body: 'Y' }  ← alias applied, undefined stripped

Presenter — The "V" in MVA

The Presenter is the egress firewall between your handler and the wire. Schema MUST come from defineModel().

typescript
import { definePresenter, ui } from '@mcpfusion/core';

export const InvoicePresenter = definePresenter({
    name: 'Invoice',
    schema: InvoiceModel,                  // ← Model, never z.object()
    // autoRules: true (default) — .describe() annotations become system rules
    ui: (inv) => [ui.echarts({ series: [{ type: 'gauge', data: [{ value: inv.amount_cents / 100 }] }] })],
    agentLimit: { max: 50, onTruncate: (n) => ui.summary({ omitted: n, hint: 'Use filters.' }) },
    suggestActions: (inv) => inv.status === 'pending'
        ? [{ tool: 'billing.pay', reason: 'Process payment', args: { id: inv.id } }]
        : [],
    embeds: [{ key: 'client', presenter: ClientPresenter }],
});
createPresenter() — Fluent Builder
typescript
import { createPresenter, ui } from '@mcpfusion/core';

const UserPresenter = createPresenter('User')
    .schema(UserModel)
    .systemRules(['Display name in bold'])
    .uiBlocks((user) => [ui.summary({ total: 1, showing: 1 })])
    .agentLimit(50, { warningMessage: 'Showing {shown} of {total}. Use filters.' })
    .suggestActions((user) => [
        { tool: 'users.update', reason: 'Edit this user', args: { id: user.id } },
    ])
    .embed('team', TeamPresenter);
Presenter Layers
LayerWhat It Does
Egress Firewall.parse() strips undeclared fields — PII never reaches the wire
JIT System RulesRules travel with data, not in the global prompt
Server-Rendered UIECharts, Mermaid — deterministic, no hallucinated charts
Cognitive Guardrails.agentLimit() truncates + injects guidance
Action Affordances.suggestActions() — HATEOAS for agents
Relational Composition.embed() — child Presenters inherit the full pipeline
Prompt BridgePromptMessage.fromView() — same source of truth for tools AND prompts

Fluent API — Tools

Semantic Verbs
typescript
import { initMCPFusion } from '@mcpfusion/core';

interface AppContext { db: PrismaClient; user: { id: string; role: string } }
export const f = initMCPFusion<AppContext>();

// f.query()    — readOnly: true   (GET, no side effects)
// f.mutation() — destructive: true (DELETE, irreversible)
// f.action()   — neutral          (PUT/POST, no assumptions)
Building a Tool
typescript
export default f.query('billing.get_invoice')
    .describe('Get an invoice by ID')
    .withString('id', 'The invoice ID')
    .returns(InvoicePresenter)
    .handle(async (input, ctx) => {
        // input.id: string ✅ — fully typed, zero manual interfaces
        return await ctx.db.invoices.findUnique({ where: { id: input.id } });
        // ↑ Return raw data — Presenter handles validation, stripping, rendering
    });
Show full SKILL.md (317 more words)Show less
with*() Type-Chaining

Each call narrows the TypeScript generic — input is fully typed in .handle():

MethodAdds
.withString(name, desc?)Record<K, string>
.withOptionalString(name, desc?)Partial<Record<K, string>>
.withNumber(name, desc?)Record<K, number>
.withOptionalNumber(name, desc?)Partial<Record<K, number>>
.withBoolean(name, desc?)Record<K, boolean>
.withEnum(name, values, desc?)Record<K, V> (literal union)
.withArray(name, itemType, desc?)Record<K, T[]>

Bulk variants reduce verbosity — .withStrings({...}), .withOptionalStrings({...}), etc.:

typescript
f.query('tasks.filter')
    .withStrings({
        company_slug: 'Workspace identifier',
        project_slug: 'Project identifier',
    })
    .withOptionalStrings({
        title: 'Filter by title',
        workflow: 'Column name',
    })
    .withOptionalNumbers({ per_page: 'Results per page' })
.proxy() — Zero-Boilerplate API Proxying

Terminal method (alternative to .handle()) — auto-generates a handler that proxies to ctx.client:

typescript
// HTTP method inferred from verb: query → GET, mutation → POST, action → PUT
// Path params resolved from input: ':id' consumes input.id
// Auto-unwraps { data: ... } envelopes
f.query('user.get')
    .withString('id', 'User UUID')
    .proxy('users/:id');  // → GET users/abc-123

When to use: .proxy() for simple pass-through, .handle() when you need business logic.

.fromModel() — Model-Driven Input

Imports fillable fields from a Model's profile — zero manual .with*() calls:

typescript
const createTask = f.mutation('tasks.create')
    .fromModel(TaskModel, 'create')  // imports title, description, status
    .proxy('tasks');

const updateTask = f.action('tasks.update')
    .fromModel(TaskModel, 'update')
    .handle(async (input, ctx) => {
        const data = TaskModel.toApi(input);  // alias applied, undefined stripped
        await ctx.client.put(`tasks/${input.id}`, data);
    });

Decision tree:

  • Simple CRUD, no logic → .fromModel() + .proxy()
  • Custom logic → .fromModel() + .handle() + Model.toApi()
.instructions() — AI-First Guidance
typescript
f.query('docs.search')
    .describe('Search internal documentation')
    .instructions('Use ONLY when the user asks about internal policies. Do NOT use for general questions.')

Injected as [INSTRUCTIONS] in the tool description — reduces hallucination.

FluentRouter — Prefix Grouping

Shares prefix, middleware, and tags across child tools:

typescript
const users = f.router('users')
    .describe('User management')
    .use(requireAuth)
    .tags('core');

const listUsers = users.query('list')
    .withOptionalNumber('limit', 'Max results')
    .handle(async (input, ctx) => ctx.db.users.findMany({ take: input.limit }));

const deleteUser = users.mutation('delete')
    .withString('id', 'User ID')
    .handle(async (input, ctx) => ctx.db.users.delete({ where: { id: input.id } }));

Middleware

tRPC-style context derivation — enriches ctx type for .handle():

typescript
const requireAuth = f.middleware(async (ctx) => {
    const user = await db.getUser(ctx.token);
    if (!user) throw new Error('Unauthorized');
    return { user, permissions: user.permissions };
});

// ctx.user and ctx.permissions — fully typed downstream
f.mutation('admin.action')
    .use(requireAuth)
    .handle(async (input, ctx) => {
        ctx.user;        // ← typed!
        ctx.permissions; // ← typed!
    });

ErrorBuilder — Self-Healing Errors

typescript
const project = await ctx.db.projects.findUnique({ where: { id: input.id } });
if (!project) {
    return f.error('NOT_FOUND', `Project "${input.id}" not found`)
        .suggest('Check the ID. Use projects.list to see valid IDs.')
        .actions('projects.list', 'projects.search')
        .details({ searched_id: input.id })
        .retryAfter(0);
}

State Sync

Prevents temporal blindness — the agent knows when cached data is stale:

typescript
f.query('geo.countries').cached();                    // immutable — cache forever
f.query('billing.balance').stale();                   // volatile — never cache
f.mutation('sprints.update').invalidates('sprints.*', 'tasks.*');  // causal invalidation

Prompts — The Presenter Bridge

typescript
import { definePrompt, PromptMessage } from '@mcpfusion/core';

const AuditPrompt = definePrompt<AppContext>('audit', {
    args: { invoiceId: 'string' } as const,
    handler: async (ctx, { invoiceId }) => {
        const invoice = await ctx.db.getInvoice(invoiceId);
        return {
            messages: [
                PromptMessage.system('You are a Senior Financial Auditor.'),
                ...PromptMessage.fromView(InvoicePresenter.make(invoice, ctx)),
                PromptMessage.user('Begin the audit.'),
            ],
        };
    },
});

PromptMessage.fromView() decomposes a Presenter into XML-tagged messages — same schema, rules, and affordances in both tools and prompts.

Testing with @mcpfusion/testing

Runs the REAL execution pipeline in RAM — zero tokens consumed, deterministic:

typescript
import { createMCPFusionTester } from '@mcpfusion/testing';

const tester = createMCPFusionTester(registry, {
    contextFactory: () => ({ prisma: mockPrisma, tenantId: 't_42', role: 'ADMIN' }),
});

// Egress Firewall — PII physically absent
const result = await tester.callAction('db_user', 'find_many', { take: 5 });
expect(result.data[0]).not.toHaveProperty('passwordHash');

// JIT System Rules — travel with data
expect(result.systemRules).toContain('Email addresses are PII.');

// Middleware — GUEST blocked
const denied = await tester.callAction('db_user', 'find_many', { take: 5 }, { role: 'GUEST' });
expect(denied.isError).toBe(true);

Assert every MVA layer: result.data, result.systemRules, result.uiBlocks, result.isError.

Common Anti-Patterns — What NOT to Do

❌ Using raw z.object() for domain schemas
typescript
// WRONG:
const presenter = definePresenter({
    name: 'User',
    schema: z.object({ id: z.string(), name: z.string() }),  // ← NO!
});

// CORRECT:
const UserModel = defineModel('User', m => {
    m.casts({ id: m.string(), name: m.string() });
});
const presenter = definePresenter({ name: 'User', schema: UserModel });
❌ Manual success() wrapping
typescript
// WRONG:
.handle(async (input, ctx) => {
    return success(await ctx.db.users.findMany());  // ← unnecessary
});

// CORRECT:
.handle(async (input, ctx) => {
    return await ctx.db.users.findMany();  // ← framework wraps automatically
});
❌ Manual if-checks for optional fields
typescript
// WRONG:
.handle(async (input, ctx) => {
    const data: Record<string, unknown> = {};
    if (input.title) data.title = input.title;
    if (input.color) data.color = input.color;
    await ctx.client.updateItem(input.id, data);
});

// CORRECT:
.handle(async (input, ctx) => {
    const data = ItemModel.toApi(input);  // strips undefined, applies aliases
    await ctx.client.updateItem(input.id, data);
});
❌ Importing backwards between layers
typescript
// WRONG: model importing from tool
// models/UserModel.ts
import { listUsers } from '../agents/users.tool';  // ← NO!

// CORRECT: agents → views → models → @mcpfusion/core (one direction only)
❌ Duplicating Presenter logic across tools
typescript
// WRONG: formatting response manually in each handler
// CORRECT: define Presenter ONCE in views/, use .returns(Presenter) in every tool
❌ Using .withString() for domain entity fields
typescript
// WRONG: defining domain fields as tool input params
f.mutation('users.create')
    .withString('name', 'User name')
    .withString('email', 'Email')        // ← These are domain fields!
    .withString('role', 'User role')

// CORRECT: use .fromModel() for domain fields
f.mutation('users.create')
    .fromModel(UserModel, 'create')      // ← imports from Model's fillable profile

Quick Reference

I want to...Use
Define a domain entitydefineModel('Name', m => { ... })
Shape what the AI seesdefinePresenter({ schema: MyModel, ... })
Create a read toolf.query('entity.list')
Create a write toolf.mutation('entity.delete')
Create an update toolf.action('entity.update')
Group related toolsf.router('prefix')
Add auth middleware.use(requireAuth)
Return self-healing errorsf.error('CODE', 'message').suggest(...)
Proxy to an API.proxy('endpoint/:id')
Import fields from Model.fromModel(MyModel, 'profile')
Test MVA pipelinecreateMCPFusionTester(registry, { contextFactory })
Control caching.cached(), .stale(), .invalidates()
Build a promptdefinePrompt('name', { handler })
Bridge Presenter to promptPromptMessage.fromView(presenter.make(data, ctx))

© vinkius-labs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files (references) in .claude/skills/mcpfusion-development of vinkius-labs/mcpfusion.

  • SKILL.md
  • references/example-complete-crud.ts
  • references/example-proxy-api.ts
  • references/example-server-setup.ts
  • references/example-testing.ts

Open the folder on GitHubat commit 1dab501

Compare with similar skills

Mcpfusion Development next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Mcpfusion Development compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Mcpfusion Development this skillvinkius-labs/mcpfusion256—~4.3kAutomated safety check: PassApache-2.0
Codex with ChatGPT Planning LoopXiaoDuoYa/codex-with-chatgpt7.1k—~11kAutomated safety check: NotesMIT
Cao MCP Appsawslabs/cli-agent-orchestrator1.4k—~1.9kAutomated safety check: PassApache-2.0
Chatgpt AppsHaohao-end/openagent8081 repos~4.9kAutomated safety check: PassApache-2.0
Chatgpt App Builderalpic-ai/skybridge2.1k—~1kAutomated safety check: PassMIT
Agent QA Authoringvostride/agent-qa903—~569Automated safety check: PassCustom licence

Similar skills

  • Codex with ChatGPT Planning Loop

    XiaoDuoYa/codex-with-chatgpt

    Uses ChatGPT in the browser as the planning and review brain for a Codex session, with Codex keeping all execution and ChatGPT reading the workspace through a bridge.

    7.1k GitHub stars~11k tokensUpdated 8 days ago
    Agent WorkflowsAuto-check: notes
  • Cao MCP Apps

    awslabs/cli-agent-orchestrator

    Official

    Enable, operate, and extend CAO's MCP Apps surface — the host-rendered fleet dashboard visible inside MCP App hosts (Claude Desktop, ChatGPT, VS Code Copilot, Goose, Postman).

    1.4k GitHub stars~1.9k tokensUpdated today
    Agent WorkflowsAuto-check passed
  • Chatgpt Apps

    Haohao-end/openagent

    Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI.

    808 GitHub starsUsed in 1 repo~4.9k tokens
    Agent WorkflowsAuto-check passed
  • Chatgpt App Builder

    alpic-ai/skybridge

    Guide developers through creating and updating ChatGPT plugins.

    2.1k GitHub stars~1k tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Agent QA Authoring

    vostride/agent-qa

    A skill your agent uses when creating, editing, validating, or running agent-qa tests, suites, or hooks.

    903 GitHub stars~569 tokensUpdated 2 mo ago
    Agent WorkflowsAuto-check passed
  • MCP Apps Builder

    awslabs/cli-agent-orchestrator

    Official

    Load the official MCP Apps builder skills (create-mcp-app, migrate-oai-app, add-app-to-server, convert-web-app) from github.com/modelcontextprotocol/ext-apps.

    1.4k GitHub stars~1.7k tokensUpdated today
    Agent WorkflowsAuto-check passed

More from vinkius-labs/mcpfusion

  • Vinkius Deploy

    vinkius-labs/mcpfusion

    How to deploy MCP servers to Vinkius Edge using mcpfusion deploy.

    256 GitHub stars~1.7k tokensUpdated 18 days ago
    Auto-check: notes

Categories

Questions about Mcpfusion Development

What does Mcpfusion Development do?

How to build production MCP servers with MCP Fusion using the MVA (Model-View-Agent) pattern. Mcpfusion Development is an agent skill from vinkius-labs/mcpfusion. How to build production MCP servers with MCP Fusion using the MVA (Model-View-Agent) pattern.

When should I use Mcpfusion Development?

Mcpfusion Development fits situations like: reviewing MCP Fusion code — including tools; server configuration; just says create a tool; add an endpoint.

How do I install Mcpfusion Development in Claude Code?

Run `npx skills add vinkius-labs/mcpfusion --skill mcpfusion-development -a claude-code`. Or copy the skill folder (.claude/skills/mcpfusion-development in vinkius-labs/mcpfusion) into .claude/skills/mcpfusion-development in your project. Claude Code loads it when a task matches its description.

How do I install Mcpfusion Development in Codex?

Run `npx skills add vinkius-labs/mcpfusion --skill mcpfusion-development -a codex`. Or copy the skill folder (.claude/skills/mcpfusion-development in vinkius-labs/mcpfusion) into .agents/skills/mcpfusion-development in your project. Codex loads it when a task matches its description.

Can I use Mcpfusion Development in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add vinkius-labs/mcpfusion --skill mcpfusion-development -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/mcpfusion-development, .gemini/skills/mcpfusion-development, .github/skills/mcpfusion-development and .opencode/skills/mcpfusion-development in your project.

What does Mcpfusion Development need to run?

Going by SKILL.md and its folder, Mcpfusion Development needs TypeScript for the scripts in its folder. Our summary lists: Node.js. Compatibility (from SKILL.md): Requires Node.js >= 18, TypeScript 5.7+.

Does Mcpfusion Development access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Mcpfusion Development safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Mcpfusion Development use?

Mcpfusion Development is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Mcpfusion Development use?

About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.9k tokens, read only when the agent opens those files.

What are the alternatives to Mcpfusion Development?

Skills that share tags, products or a category with Mcpfusion Development: Codex with ChatGPT Planning Loop (XiaoDuoYa/codex-with-chatgpt, 7.1k stars), Cao MCP Apps (awslabs/cli-agent-orchestrator, 1.4k stars), Chatgpt Apps (Haohao-end/openagent, 808 stars) and Chatgpt App Builder (alpic-ai/skybridge, 2.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Mcpfusion Development?

vinkius-labs (a GitHub organization) maintains it in vinkius-labs/mcpfusion, which has 256 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 20, 2026.

Source: vinkius-labs/mcpfusion on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.