kungfu-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kungfu-mcpnarrate a spar between Shaolin and Wudang"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kungfu-mcp
🎬 Live presentation: https://davidcai.github.io/kungfu-mcp/presentations/
A humorous Model Context Protocol server, in TypeScript, that catalogs the major factions of the kung fu world (the martial-arts underworld) and narrates sparring matches between them.
It demonstrates the three MCP primitives side by side:
Tools (model-controlled) —
list_factions,get_faction,spar,spar_arena.Resources (application-driven context) —
kungfu://kungfu/rosterandkungfu://factions/{id}profiles as markdown.Apps (interactive UI rendered in chat) —
spar_arenalaunches an inline arena built on aui://resource that calls tools back on the server.
The server runs on WebStandardStreamableHTTPServerTransport over Hono (Apps require HTTP transport).
Starting the MCP server
npm install
npm start # builds (server + UI), then serves → http://localhost:3001/mcpThe server logs kungfu-mcp listening on http://localhost:3001/mcp.
Fast iteration (no build):
npm run dev # tsx server.ts — runs the server directlyNote:
npm run devskips the UI build. Tools and resources work immediately; thespar_arenaUI returns an error untilnpm run buildhas produceddist/mcp-app.htmlat least once.
Script | What it does |
|
|
|
|
|
|
| Launch the MCP Inspector |
Related MCP server: Hilanet MCP
Inspecting the MCP server
The MCP Inspector is the fastest way to verify tools, resources, and templates. It is not an app host — it cannot render the spar_arena UI — but everything else is testable.
With the server running (npm start), in another terminal:
npm run inspectIn the Inspector UI:
Transport Type:
HTTPURL:
http://localhost:3001/mcpConnect
Then exercise each primitive:
Tools tab — call
list_factions,get_faction(id: "shaolin"),spar(faction_a: "shaolin", faction_b: "wudang"),spar_arena.Resources tab — read
kungfu://kungfu/roster; browse thekungfu://factions/{id}template (id autocompletes).
list_factions and spar return both humorous text (for the LLM) and structuredContent (for the UI) in a single result.
Using kungfu-mcp in Cursor
Cursor 2.6+ is a native MCP Apps host — point it at the running server and spar_arena renders inline in the chat as an interactive iframe. Add the server to ~/.cursor/mcp.json (or project .cursor/mcp.json):
{ "mcpServers": { "kungfu": { "type": "http", "url": "http://localhost:3001/mcp" } } }Then call spar_arena, pick two factions (e.g. Neo vs. Morpheus), and press Begin the Spar.
Progressive enhancement: hosts without MCP Apps support just get
spar_arena's text result, so the server stays usable everywhere. Other app-capable hosts (e.g. Claude web/Desktop via acloudflaredtunnel + paid plan) also render the arena.
What the server exposes
Tools
Tool | Arguments | What it does |
| (none) | Roster markdown + |
|
| Full profile for one faction as markdown. |
|
| Biased narration + |
| (none) | Launches the interactive Spar Arena UI (MCP App). |
Resources
URI | Type | What it returns |
| static | The full roster as markdown. |
| template | Per-faction profile as markdown (list + complete). |
| app UI | The bundled Spar Arena HTML. |
Project layout
server.ts # HTTP entry: hono + @hono/node-server + WebStandardStreamableHTTPServerTransport on :3001/mcp
vite.config.ts # react() + viteSingleFile(), input mcp-app.html → dist/mcp-app.html
mcp-app.html # UI shell: #root div + src/ui/main.tsx script tag
src/ # one file per MCP primitive:
tools.ts # Tools — list_factions, get_faction, spar
resources.ts # Resources — kungfu://kungfu/roster + kungfu://factions/{id}
app.ts # App — spar_arena tool + ui://spar-arena/app.html resource
ui/ # React UI (useApp hook from @modelcontextprotocol/ext-apps/react)
format.ts # shared markdown formatting (tools, resources, and the UI)
data.ts # KungfuFaction[] dataset (the heart of the humor)Build outputs: build/server.js (run by npm start) and dist/mcp-app.html (the ui:// resource).
Notes
A demo. All factions, fun facts, and spar outcomes are fabricated for entertainment.
Tools and resources render the same markdown via
src/format.ts; the primitives differ only in who decides to fetch the content.The server is HTTP-only (stdio was dropped because Apps require HTTP).
This server cannot be deployed
Maintenance
Related MCP Connectors
Description of my MCP server
Related MCP Servers
- AlicenseAqualityDmaintenanceA lightweight MCP server that tells you exactly who you are.11MIT
- FlicenseNot gradedqualityDmaintenanceA satirical MCP server providing HR-related tools that simulate actions in a corporate dystopia, such as increasing salaries, scheduling mandatory fun events, and generating corporate jargon.37-

@byimprint/mcp-serverofficial
AlicenseNot gradedqualityFmaintenanceRetired MCP server for byImprint's historical creator-intelligence experiment. It is no longer active.300 npmMIT- AlicenseNot gradedqualityCmaintenanceA single-player cinematic geopolitical roleplay MCP server where an LLM game-master handles decision-making with persistent world state and rules enforcement.256 npmMIT