wmcp
Click on "Install 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., "@wmcplist available prompts"
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.
wmcp
MCP exposure infrastructure — how to run Model Context Protocol servers so Cursor, Claude Desktop, and Claude Code can reach them from WSL, Windows, or macOS.
This repo is the transport/wiring layer, plus an optional personas server (compose / list_prompts). It also ships a tiny example server (echo / ping) so you can verify the plumbing. Bring your own tools and prompt packs.
Requires Node.js ≥ 18.
What an MCP server is (short version)
An MCP server is a process that speaks Model Context Protocol — JSON-RPC messages describing tools, prompts, and/or resources. Clients (Cursor, Claude) call those tools during a chat.
The interesting part is not the tools themselves. It is how the client connects:
Transport | Who speaks it | How it runs |
stdio | Cursor (local), Claude Desktop | Client spawns |
Streamable HTTP | Cursor, Claude Desktop (URL mode) | One long-lived Node HTTP server; client POSTs to |
Legacy SSE | Claude Code CLI | Same HTTP server; |
wmcp implements all three from one codebase.
┌─────────────────┐ stdio ┌──────────────────┐
│ Cursor / Claude │ ◄────────────► │ example-server │ (per-process)
│ (local spawn) │ │ or stdio-bridge │
└─────────────────┘ └──────────────────┘
┌─────────────────┐ HTTP/SSE ┌──────────────────┐
│ Cursor / Claude │ ◄────────────► │ http-server │──► example
│ (URL mode) │ │ :8820 │──► personas (opt)
└─────────────────┘ └──────────────────┘Typical setup when the real Node runtime lives in WSL:
Run
http-serverinside WSL (systemd user unit ornpm start).Point Windows/mac Cursor at
http://localhost:8820/example(WSL localhost forwarding).Or, for stdio-only clients on Windows:
wsl.exe … node dist/example-server.js.
On macOS / native Linux, skip the wsl.exe path — run Node locally and point Cursor at http://localhost:8820/<server> or a direct node dist/….js stdio command.
Related MCP server: Hello World MCP Server
Quick start
git clone https://github.com/mwhobrey/wmcp.git
cd wmcp
npm install
npm run build
npm start # HTTP front door on :8820
curl http://localhost:8820/healthstdio smoke test (separate terminal):
node dist/example-server.js
# or: node dist/stdio-bridge.js exampleWire Cursor
If transport is "sse" (the default in the example config), start the HTTP server first (npm start) and leave it running. Cursor connects to URLs; nothing is listening otherwise.
Option A — paste a minimal entry (safest; does not touch other MCP servers):
{
"mcpServers": {
"example": {
"url": "http://localhost:8820/example"
}
}
}Add that under your existing mcpServers in Cursor's MCP config, then reload MCP and call ping on example.
For stdio instead of HTTP:
{
"mcpServers": {
"example": {
"command": "node",
"args": ["/absolute/path/to/wmcp/dist/example-server.js"]
}
}
}Option B — generate configs from this repo (WSL + Windows):
Warning:
npm run sync:mcpoverwrites~/.cursor/mcp.jsonand, when/mnt/cis present,C:\Users\<windowsUser>\.cursor\mcp.json. Back up first if you already have other servers configured.
Copy and edit config:
cp config/mcp-servers.example.json config/mcp-servers.json # set projectRoot, nodePath, wslUser, windowsUserWith the HTTP server running (for
"transport": "sse"):npm run sync:mcpReload MCP in Cursor. Call the
pingtool on theexampleserver.
transport in mcp-servers.json:
"sse"(default) → Cursor entries are{ "url": "http://localhost:8820/example" }— http-server must be up"stdio"→ Cursor spawns Node (orwsl.exeon Windows) — no shared HTTP process needed
Optional: personas server
Markdown prompt packs with hot reload. Tools:
Tool | Purpose |
| Merge layers into one system prompt (see order below) |
| List loaded prompts by category |
Also exposes MCP prompts (list / get) for clients that use that capability.
Compose merge order (each layer optional except when base is left on):
base(personas/base) — omitted ifbase: falseteam— repo/org policy cardpersona— roleskill— modescript— playbook
Sections are joined with ---. Template args apply to every included layer.
Enable on the HTTP front door:
cp env.example .env # then set WMCP_ENABLE_PERSONAS=1
# PERSONAS_DIR=/absolute/path/to/prompts # optional; default ./prompts
npm start
# → http://localhost:8820/personasCursor URL entry:
{
"mcpServers": {
"personas": {
"url": "http://localhost:8820/personas"
}
}
}Or run stdio directly (no WMCP_ENABLE_PERSONAS required):
npm run start:personas
# or: node dist/stdio-bridge.js personasSample prompts ship under prompts/ (personas/, skills/, scripts/, teams/). Replace them with your own — edits hot-reload; no restart needed.
Frontmatter shape:
---
name: engineer
description: Short description for list_prompts
category: persona
args:
- name: stack
description: Primary tech stack
required: false
---
# Role: Engineer
{{stack}}Primary stack: {{stack}}.{{/stack}}Template syntax: {{var}}, {{var|default}}, and {{var}}…{{/var}} (block omitted when unset).
Adding your own MCP server
Create
src/my-server.ts— construct an MCPServer, register tools, exposegetServer().Register a factory in
src/registry.ts.Add a
servers.myentry inconfig/mcp-servers.jsonwith"script": "my-server.js".npm run build && npm run sync:mcp(and restarthttp-serverif using URL mode).
The HTTP and stdio layers stay unchanged. They only need a name → () => Server factory.
Layout
src/
example-server.ts # reference MCP tools (echo, ping)
personas-server.ts # optional compose / list_prompts
registry.ts # name → factory map (+ env toggles)
http-server.ts # Streamable HTTP + legacy SSE multiplexer
stdio-bridge.ts # named stdio launcher
env-flags.ts
is-main-module.ts
prompts/ # sample prompt pack (swap for yours)
config/
mcp-servers.example.json
scripts/
sync-mcp-config.mjs
fix-permissions.mjs
systemd/
wmcp.serviceEnvironment
Variable | Default | Purpose |
|
| HTTP listen port |
|
| SSE keep-alive comment interval ( |
| off | Register |
|
| Markdown prompt root ( |
See env.example. Load via .env in the project root (dotenv) or export in the shell / systemd unit.
systemd (optional)
# edit User / paths in systemd/wmcp.service first
mkdir -p ~/.config/systemd/user
cp systemd/wmcp.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now wmcp
systemctl --user status wmcpTo enable personas under systemd, set WMCP_ENABLE_PERSONAS=1 in .env (or Environment= in the unit).
Design notes
One HTTP process, many logical servers — routes by path prefix; each request gets a fresh MCP
Serverinstance for Streamable HTTP (stateless).Fail per server at boot — a broken factory is skipped; others still serve.
Personas are optional — off by default so the public repo stays a transport template; flip the env when you want compose/list_prompts on HTTP. Direct
npm run start:personasalways works.Private prompt packs stay private — point
PERSONAS_DIRat an external directory, or replaceprompts/locally and don't commit company content.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mwhobrey/wmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server