Skip to main content
AllMCPs
BrowseBestCategoriesStackCompareToolsGuidesBlog
Log in Submit MCP

Stay in the loop

Get new MCP servers and top picks in your inbox.

AllMCPs

The open directory for discovering and installing Model Context Protocol servers.

AllMCPs on GitHub (opens in a new tab)
Launched onTiny Startupstinystartups.com
Explore
  • Browse servers
  • Best MCP servers
  • Categories
  • MCP clients
  • Agent prompts
  • Stack Builder
  • Compare servers
  • Random discovery New
  • Submit a server
  • Pricing & Boost Boost
Learn
  • Guides hub
  • What is MCP?
  • Install guide
  • Build an MCP server
  • Deploy an MCP server
  • Security guide
  • Troubleshooting
  • MCP for SEO & AEO
  • Protocol versioning
  • Transports: stdio vs HTTP
  • State of MCP (stats)
  • Blog & updates
Tools
  • All developer tools
  • Config generator
  • Config validator
  • Config auditor
  • MCP playground
  • Token calculator
  • OpenAPI → MCP
  • Badge generator
For agents
  • REST API docs
  • Trust & traffic Live
  • Remote MCP server SSE ↗ (opens in a new tab)
  • llms.txt ↗ (opens in a new tab)
  • Catalog JSON ↗ (opens in a new tab)
Company
  • About
  • Advertise Sponsor
  • Contact
  • GitHub ↗ (opens in a new tab)
  • Terms
  • Privacy
AllMCPs VerifiedAllMCPs VerifiedFeatured on Nick LaunchesFeatured on Nick LaunchesLaunch Llama NewsletterLaunch Llama NewsletterVerified DR - allmcps.comVerified DR - allmcps.comFeatured on SaaSGrowFeatured on SaaSGrowFeatured on Twelve ToolsFeatured on Twelve ToolsFeatured on Saaspa.geFeatured on Saaspa.geFeatured on Findly.toolsFeatured on Findly.toolsFeatured on Startup FameFeatured on Startup FameFeatured on LaunchKiwiFeatured on LaunchKiwiFeatured on ScrollLaunchFeatured on ScrollLaunchFeatured on DailyPingsFeatured on DailyPingsFazier badgeFazier badgeFeatured on NewTool.siteFeatured on NewTool.siteFeatured on saasfame.comFeatured on saasfame.comDR Checker - Domain RatingDR Checker - Domain RatingListed on Turbo0Listed on Turbo0Launched on LaunchBoard - Product Launch PlatformLaunched on LaunchBoard - Product Launch PlatformList on SimilarlabsList on Similarlabshttps://codetrendy.comhttps://codetrendy.comListed on DevTool.ioFeatured on BuildlistFeatured on BuildlistLaunched on Tiny StartupsFeatured on ShowMeBestAIFeatured on ShowMeBestAIFind us on LaunchZoneFind us on LaunchZoneAllMCPs VerifiedAllMCPs VerifiedFeatured on Nick LaunchesFeatured on Nick LaunchesLaunch Llama NewsletterLaunch Llama NewsletterVerified DR - allmcps.comVerified DR - allmcps.comFeatured on SaaSGrowFeatured on SaaSGrowFeatured on Twelve ToolsFeatured on Twelve ToolsFeatured on Saaspa.geFeatured on Saaspa.geFeatured on Findly.toolsFeatured on Findly.toolsFeatured on Startup FameFeatured on Startup FameFeatured on LaunchKiwiFeatured on LaunchKiwiFeatured on ScrollLaunchFeatured on ScrollLaunchFeatured on DailyPingsFeatured on DailyPingsFazier badgeFazier badgeFeatured on NewTool.siteFeatured on NewTool.siteFeatured on saasfame.comFeatured on saasfame.comDR Checker - Domain RatingDR Checker - Domain RatingListed on Turbo0Listed on Turbo0Launched on LaunchBoard - Product Launch PlatformLaunched on LaunchBoard - Product Launch PlatformList on SimilarlabsList on Similarlabshttps://codetrendy.comhttps://codetrendy.comListed on DevTool.ioFeatured on BuildlistFeatured on BuildlistLaunched on Tiny StartupsFeatured on ShowMeBestAIFeatured on ShowMeBestAIFind us on LaunchZoneFind us on LaunchZone
© 2026 Jackalope Digital LLC. All rights reserved.
  1. Home
  2. Developer Tools
  3. MCP Ticket Demo
  4. README

MCP Ticket Demo README

The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the MCP Ticket Demo listing page.

Back to MCP Ticket Demo View source on GitHub

MCP as a Platform — MCP Dev Summit Toronto 2026

MCP Ticket Demo — A Full-Stack MCP Reference Server

npm npm downloads VS Code Open VSX License Node.js MCP IBM Cloud Linux Foundation

A production-shaped MCP server you can run in under five minutes. Ships with 10 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 servernpm install mcp-ticket-demo
VS Code extensionVS Code Marketplace · Open VSX
Talk slidesmarkusvankempen.github.io/linuxfoundation-mcp-dev-summit

Personal open-source project. Not an IBM product.


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:

FeatureWhat you learn
10 tools with intent-named descriptionsNaming is the interface — not request(path, method)
3 resources (ticket://, tickets://open, schema://)resources/list enumerates instances; reads use the same gate() as the matching tool
5 MCP promptsUser-facing prompts vs agent-facing tools
Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint: false)Client confirm/retry UX
Server instructionsThe README the model actually reads
isError: true on every failureClients don't need to parse ok: false
Attribution scar — create_ticket without requester_email201 is not done. The bot owns the ticket.
Schema discovery — list_schemas → get_schema → run_queryOne query tool beats a pile of query_* names
0 tools discovered — hand a laptop path to a cloud runnerThe silent failure with no error and no warning
stdio + SSE + Streamable HTTP from one codebaseTwo transports, same 10 tools
Auth modes (off / write / all) + per-tool gate + per-tool auth lockSecurity is an operator concern
tools/list_changed broadcast when admin flips a gateSSE and Streamable HTTP sessions refresh; one-shot curl does not
Rate limiting with retry_after_seconds in the errorStop the model retrying in a loop
PII redaction on lookup_customerScope-gated field visibility
/health vs /testAlive ≠ works. Public /test is read-only; cwd stays off public /health
Live observability — /log page with counters, error log, call traceSee what the model is actually doing

Quickstart — five minutes

bash
# 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 http

Then open in a browser:

URLWhat it shows
http://127.0.0.1:8787/healthIs the process alive? (cwd only on localhost)
http://127.0.0.1:8787/testRead-only smoke (search / get / schemas / query)
http://127.0.0.1:8787/adminAuth mode, API keys, tool gates, observability
http://127.0.0.1:8787/logCall counters, error log, full call trace
http://127.0.0.1:8787/toolsTool inventory with scope and auth status

/health — liveness check with version, tool count, and cwd

/test — read-only smoke test scoring all four read tools

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:

config.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:

config.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

Extension diagnostics panel — all steps passing, server confirmed healthy


10 Tools

ToolScopeWhen to useLesson
describe_serveropenFirst call, and after any denialDiscovery beats guessing
search_ticketsreadFind by status / requester / keywordIntent name, not an HTTP wrapper
get_ticketreadYou already have a TCK-… idInstance fetch
create_ticketwriteOpen a ticket — always pass requester_emailOmit it → 201 + bot owns the ticket
add_commentwriteComment on a known ticketWrite tool; gated
close_ticketwriteResolve a ticket, optionally add resolution notedestructiveHint: true, idempotentHint: true
list_schemasreadBefore any queryDiscover the shape
get_schemareadAfter list, before queryFields + filterable keys
run_queryreadThe one query toolReplaces query_tickets / query_assets / …
lookup_customerpiiCustomer record — phone is PIIRedacted without pii scope

Chat tab — AI calls MCP tools to create and query tickets live


3 Resources

Resources are addressable and pinnable — clients can subscribe and refresh. Tools are for agent loops.

URIWhat it returnsSame gate as
ticket://TCK-1001One ticket by idget_ticket
tickets://openLive open ticket list (top 25)search_tickets
schema://ticketsQuery schema shape (also customers, assets)get_schema / list_schemas

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.

PromptLesson it teaches
search-open-ticketsFind service-account scars in the live data
attribution-scarCreate without requester_email → explain what broke
schema-discoverylist_schemas → get_schema → run_query walkthrough
close-ticket-flowadd_comment then close_ticket in sequence
diagnose-serverdescribe_server — auth mode, scopes, available tools

Auth model

Code
off    All tools open. No credential needed. Default for local dev.
write  Read tools open. write + pii tools need a 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

Dockerfile
mcp-ticket-demo/
  server/       MCP server — tools, resources, prompts, auth, HTTP pages
  extension/    VS Code / Bob / Cursor / Windsurf control-plane extension
  docs/         Walkthroughs, lessons learned, publishing guide
  Dockerfile    UBI9 minimal, non-root USER 1001, WORKDIR /app

Docs

DocWhat's in it
docs/DEMO.mdEnd-to-end demo guide — 11 live curl demos, every lesson, real captured output
docs/LESSONS-LEARNED.md15 lessons building a real MCP server — war stories + pre-publish checklist
docs/LOCAL.mdLocal stdio + HTTP walkthrough
docs/REMOTE.mdCode Engine deploy + the 0-tools-discovered repro
docs/ADMIN-AND-SECURITY.mdAuth modes, API keys, tool gates
docs/BOB.mdIBM Bob specific setup
docs/PUBLISHING.mdnpm + MCP Registry + VS Code Marketplace publish steps
server/README.mdFull curl reference for every endpoint

Environment variables

VariableDefaultWhat it does
MCP_MODEstdiostdio or http
PORT8080HTTP only
HOST127.0.0.10.0.0.0 inside container (set automatically)
AUTH_MODEoffoff · write · all
ADMIN_USER / ADMIN_PASSWORDdemo / demo/admin login. Default disabled on a public bind until ADMIN_PASSWORD is set
CORS_ORIGINSunsetExtra Origin values allowed on /mcp. Localhost and same-host are always allowed
API_KEY / API_KEY_SCOPESunsetRegister one key at boot
MCP_API_KEYunsetstdio credential
MCP_USERNAME / MCP_PASSWORDunsetstdio basic auth
MCP_USERSunset"alice:secret:read,write" extra logins
RATE_LIMIT / RATE_LIMIT_WINDOW_MS60 / 60000Calls per window per caller
TENANT_IDunsetIf set, writes need x-tenant-id header

Honest limits

  • Tickets live in memory — a new container starts from seed data.
  • Admin auth is a session cookie, not SSO. Cookie is HttpOnly (+ Secure on HTTPS).
  • /health being green does not mean the ticket went to the right person.
  • Public /test does not create or close tickets. Use /test?write=1 after admin sign-in.

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