Example MCP servers implementing the MCP Apps Extension specification and OpenAI Apps SDK using NestJS and mcp-nest. Exposes pizza-themed widget tools and resources with UI rendering capabilities.
This is a sample/demo MCP server showcasing NestJS integration patterns. Tool definitions are present with descriptions and some schema information, but fall short of production quality. Most tools have generic one-liner descriptions (8-20 chars) that fail to guide LLM selection. 5 tools (pizza-map, pizza-carousel, pizza-albums, pizza-list, pizza-video from pizzaz-mcp-apps-ext) have no input parameters, while their counterparts in pizzaz-openai-apps-sdk define required parameters, indicating inconsistent API surface. Schemas are partially documented but descriptions are minimal. The sample lacks error handling guidance, permission scoping, and output schema documentation. Tool naming (pizza-*) is non-standard, lacks action verbs like get_, show_, render_. Duplicate tool names across the two packages (same name with different parameter signatures) would cause confusion in a real agent.
Show Pizza Album
Show Pizza Album
Show Pizza Carousel
Show Pizza Carousel
Show Pizza List
Show Pizza List
Show Pizza Map
Show Pizza Map
Show Pizza Video
Tool names lack action verbs. All tools use 'pizza-*' pattern instead of verb_noun convention (e.g., show_pizza_map, render_pizza_carousel). LLMs rely on names to infer intent before reading descriptions.
Descriptions are critically short (8-20 characters). 'Show Pizza Map', 'Show Pizza Carousel', etc. fail to explain WHEN to use the tool, WHAT it returns, or WHY an LLM should select it over similar tools. Baseline for A+ tools is 50-200 chars minimum.
Duplicate tool names with different signatures across two packages. Both pizzaz-mcp-apps-ext and pizzaz-openai-apps-sdk define 'pizza-map', 'pizza-carousel', etc. The first set has no parameters; the second requires 'pizzaTopping' parameter. This creates ambiguity and could cause routing failures in production MCP clients.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 24 | - | v1 |
Show Pizza Video
Inconsistent parameter schemas across tool variants. pizzaz-mcp-apps-ext defines 'topping' as optional string, while pizzaz-openai-apps-sdk defines 'pizzaTopping' as required string. Agents cannot reliably call these tools without knowing which variant to use.
No output schema documentation. Tools return 'content' and optionally 'structuredContent' arrays, but the schema for these fields is not formally defined. LLMs cannot predict what fields to expect or how to chain calls.
No error handling or recovery guidance. Tools have no documented error cases, retry logic, or guidance for LLMs when calls fail. No information about timeout behavior, permission requirements, or prerequisites.
Parameter descriptions are minimal. 'Topping to filter when rendering the widget' and 'Topping to mention when rendering the widget' are vague. No format constraints, no valid value ranges, no guidance on what happens when the parameter is omitted.
UI metadata hardcoded with templating (e.g., 'ui://widget/pizza-carousel/{topping}'). No guidance on how LLM clients should interpret or handle these URIs, and no fallback for clients that do not support UI rendering.