mcp-ticket-demo
Provides a set_[mqtt](/mcp/servers/integrations/mqtt) tool for configuring the server's MQTT settings, enabling MQTT connectivity as part of operating and integrating the server.
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., "@mcp-ticket-demoshow me all open high-priority tickets and who they're assigned to"
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.

MCP Ticket Demo — A Full-Stack MCP Reference Server
A production-shaped MCP server you can run in under five minutes. Ships with 19 tools, 3 resources, 5 prompts, three auth modes, API key management, per-tool gates, rate limiting, a live observability dashboard, and a VS Code / Bob / Cursor / Windsurf control-plane extension.
Use it to learn MCP, test IDE integrations, run live demos, or as a reference implementation when building your own server.
Companion to MCP as a Platform: What I Learned Building a Portfolio of MCP Servers · MCP Dev Summit Toronto · 5 October 2026 · Talk slides →
MCP server (3.0.1) | |
VS Code extension (1.16.0) | |
Talk slides |
Personal open-source project.
What makes this useful beyond a hello-world
Most MCP examples stop at "here is a tool that returns a string." This one goes further:
Feature | What you learn |
19 tools with intent-named descriptions | Nouns live in a schema, verbs stay as tools — not |
3 resources ( |
|
5 MCP prompts | User-facing prompts vs agent-facing tools |
Tool annotations ( | Client confirm/retry UX |
Server instructions | The README the model actually reads |
| Clients don't need to parse |
Attribution scar — | 201 is not done. The bot owns the ticket. |
Schema discovery — | One query tool beats a pile of |
0 tools discovered — hand a laptop path to a cloud runner | The silent failure with no error and no warning |
stdio + SSE + Streamable HTTP from one codebase | Three transports, same 19 tools |
Auth modes ( | Security is an operator concern |
| SSE and Streamable HTTP sessions refresh; one-shot curl does not |
Rate limiting with | Stop the model retrying in a loop |
PII redaction on | Same tool, same endpoint; the |
| Alive ≠ works. Public |
Live observability — | See what the model is actually doing |
Operate it over MCP — settings (one | The control plane is part of the server, not a side door |
Three ways to operate one server — | Same steps, same Demo setup, checked against each other |
Related MCP server: FlowMCP Server
Quickstart — five minutes
# Run directly from npm — no clone needed
npx mcp-ticket-demo # stdio (IDE spawns this)
MCP_MODE=http npx mcp-ticket-demo # HTTP — opens /health /test /admin /mcp
# Or clone and run
git clone https://github.com/markusvankempen/mcp-ticket-demo
cd mcp-ticket-demo/server && npm install && npm run httpThen open in a browser:
URL | What it shows |
Is the process alive? ( | |
Read-only smoke: seed tickets, schemas, and | |
Auth mode, API keys, tool gates, observability | |
Call counters, error log, full call trace | |
Tool inventory with scope and auth status |
From a terminal
The same mcp-ticket-demo command is also a client for a running server, local or deployed. With no arguments it is still the MCP server, so the IDE configs below keep working.
npx mcp-ticket-demo status # http://127.0.0.1:8787/mcp by default
npx mcp-ticket-demo call run_query schema=tickets 'filter={"status":"open"}' limit=5 # any tool, values typed from its schema
npx mcp-ticket-demo demo apply --user demo --password demo # users, keys, auth write, 30 calls / 60 s
npx mcp-ticket-demo demo check --user demo --password demo # acts as each role and as nobody
npx mcp-ticket-demo status --url https://my-host.example.com # a deployed server--json prints one document for scripts, and exit codes are 0 done · 1 refused · 2 usage · 3 unreachable. Commands that delete or reconfigure ask first. Every command, option and example is in server/README.md, and a copy-paste page is at /clients/cli.html on a running desk. demo apply changes real settings, so use it on a server you own.


Laptop login: demo / demo. On a public bind (HOST=0.0.0.0, container, Code Engine) set ADMIN_PASSWORD — the default is disabled. Write smoke is /test?write=1 after admin sign-in.
Add to your IDE (one line)
VS Code / GitHub Copilot — .vscode/mcp.json:
{
"servers": {
"mcp-ticket-demo": {
"type": "stdio",
"command": "npx",
"args": ["mcp-ticket-demo"],
"env": { "MCP_MODE": "stdio" }
}
}
}Bob / Cursor / Windsurf — .bob/mcp.json / .cursor/mcp.json / .windsurf/mcp.json:
{
"mcpServers": {
"mcp-ticket-demo": {
"command": "npx",
"args": ["mcp-ticket-demo"],
"env": { "MCP_MODE": "stdio" }
}
}
}Or install the extension and click Register server with all IDEs — it writes all four configs at once: VS Code Marketplace · Open VSX

Tools
The server has 19 tools. Six are the ticket desk, below. Eight operate the server itself: update_settings (every setting is one patch: auth mode, rate limit, call trace, desk sign-in, transports, events, gates, locks and scopes), set_mqtt, users, API keys, import_settings and sample traffic. Most of those need the admin scope even while auth is off; server/README.md lists the scope of each. Three are timers, start_timer, stop_timer and push_timer, with no get_timer (push_timer also streams the timer as events; see Events): you read a timer through the schema, run_query with schema=timers (server/README.md). push_log sends a log line as an event, and watch_system publishes the machine as system.info, including a container's cgroup limit. Plain lists are not tools of their own: run_query reads settings (the saved settings, importable as they are), system (the machine), events (the events already sent), and, with an admin credential, users, api_keys, trace, errors and counters. The page at /clients/dashboard.html draws them. Each of these tools is declared once and everything else is generated from that definition.
The ticket desk (6)
Tool | Scope | When to use | Lesson |
|
| First call, and after any denial | Discovery beats guessing |
|
| Open a ticket — always pass | Omit it → 201 + bot owns the ticket |
|
| Comment on a known ticket | Write tool; gated |
|
| Resolve a ticket, optionally add resolution note |
|
|
| Before any query | No |
|
| The one query tool: | Nouns in a schema, verbs as tools. Replaces |

3 Resources
Resources are addressable and pinnable — clients can subscribe and refresh. Tools are for agent loops.
URI | What it returns | Same gate as |
| One ticket by id |
|
| Live open ticket list (top 25) |
|
| Query schema shape (also |
|
Call resources/list to browse — you do not need to know a URI ahead of time. A denied read is a JSON-RPC error (not a fake ticket document you can pin).
5 Prompts
User-facing prompts — the user picks these, the model executes them.
Prompt | Lesson it teaches |
| Find service-account scars in the live data |
| Create without |
|
|
|
|
|
|
Auth model
off All tools open. No credential needed. Default for local dev.
write Read tools open. Write tools need a credential. The customer phone shows only with a `pii` credential.
all Every tool call requires a credential.Credentials: Authorization: Bearer <api key> over HTTP · MCP_API_KEY env var over stdio.
Issue keys, set modes, toggle per-tool gates, and lock individual tools on /admin.
A change broadcasts notifications/tools/list_changed to connected SSE and Streamable HTTP sessions (Cursor/Bob after initialize). One-shot POST /mcp (curl) has no session — it sees the new list on the next call.
Repo layout
mcp-ticket-demo/
server/ MCP server — tools, resources, prompts, auth, HTTP pages
src/cli/ The command line client (mcp-ticket-demo <command>)
clients/ Copy-paste setup pages served at /clients/ (editors, browser, CLI, settings)
extension/ VS Code / Bob / Cursor / Windsurf control-plane extension (packs a copy of server/)
docs/ Walkthroughs, lessons learned, publishing guide
Dockerfile node:20-bookworm-slim, non-root USER node, WORKDIR /appDocs
Doc | What's in it |
Index of these guides, for server 3.0.1 and extension 1.16.0 | |
End-to-end demo guide — 16 live curl demos, every lesson, real captured output | |
15 lessons building a real MCP server — war stories + pre-publish checklist | |
Local stdio + HTTP walkthrough | |
Code Engine deploy + the 0-tools-discovered repro | |
Auth modes, API keys, tool gates | |
IBM Bob specific setup | |
npm + MCP Registry + VS Code Marketplace publish steps | |
The VS Code / Cursor / Bob extension — tabs, Remote config, commands | |
Full curl reference for every endpoint, and the command line client |
Environment variables
Variable | Default | What it does |
|
|
|
|
| HTTP only. |
|
|
|
|
|
|
|
|
|
| unset | Extra |
| unset | Register one key at boot |
| unset | stdio credential. The command line client sends it as a bearer key |
| unset | stdio basic auth. The command line client sends them as HTTP Basic |
|
| Command line client only: the server to talk to |
| unset |
|
|
| Calls per window per caller |
| unset | If set, writes need |
Honest limits
Tickets live in memory — a new container starts from seed data.
Admin auth is a session cookie, not SSO. Cookie is
HttpOnly(+Secureon HTTPS)./healthbeing green does not mean the ticket went to the right person.Public
/testdoes not create or close tickets. Use/test?write=1after admin sign-in.Remote config, the extension's Remote config tab and the command line change real settings (auth mode, users, keys, rate limit) on whatever server you point them at. Demo setup is for a server you own.
Author: Markus van Kempen · markus.van.kempen@gmail.com · markusvankempen.github.io · MCP Dev Summit Toronto talk · Talk slides · npm · VS Code Marketplace · Open VSX
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
Streamable HTTP MCP server exposing planner flows, tasks, and squads.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseBqualityDmaintenanceA mock MCP server for testing MCP client implementations and development workflows. Supports tools, prompts, and resources across multiple transport protocols (stdio, HTTP, SSE).1MIT

FlowMCP Serverofficial
AlicenseNot gradedqualityDmaintenanceProvides LocalServer and RemoteServer implementations for running MCP servers locally via stdio or remotely via HTTP/SSE, with simple and advanced deployment options.1MIT- AlicenseAqualityCmaintenanceA production-ready foundation for building secure, observable MCP servers with built-in authentication, rate limiting, and reference tools like database-query and semantic-search.1513 npmMIT
- AlicenseNot gradedqualityBmaintenanceA demo MCP server showcasing every MCP capability with fake logic, including tools, resources, prompts, progress, cancellation, elicitation, sampling, roots, and subscriptions, over Streamable HTTP, HTTP+SSE, and stdio transports.5 npmMIT