feat(test-servers): mcp_app_demo preset + _meta on tool/resource defs (closes #1557)

Add an `mcp_app_demo` tool/resource preset — a self-contained MCP App widget
that exercises size-changed, ui/message, log notifications, and host-context
rendering with no external server. Requires plumbing an optional `_meta` field
through the composable test server's `ToolDefinition` and `ResourceDefinition`
so clients can read tool-level `_meta.ui.resourceUri` and resource-level
`_meta.ui.csp`.

- composable-test-server: optional `_meta` on ToolDefinition/ResourceDefinition,
  passed through to registerTool config and the resource content item.
- test-server-fixtures: `createMcpAppDemoTool()`, `createMcpAppDemoResource()`,
  inline `MCP_APP_DEMO_HTML` widget; wired into getDefaultServerConfig.
- preset-registry: `mcp_app_demo` tool + `mcp_app_demo_widget` resource presets.
- integration test asserting the `_meta` plumbing end-to-end.

Wave 1 of PR #1510 decomposition.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3fTN8H3R8YV4yUGvZjYnX
This commit is contained in:
cliffhall 2026-07-01 18:22:25 -04:00
commit 0d50b908a3

View file

@ -40,6 +40,8 @@ import {
createOptionalTaskTool,
createForbiddenTaskTool,
createImmediateReturnTaskTool,
createMcpAppDemoTool,
createMcpAppDemoResource,
createArchitectureResource,
createTestCwdResource,
createTestEnvResource,
@ -153,6 +155,8 @@ function resolveToolPreset(
get("name") as string | undefined,
Number(get("delayMs")) || undefined,
);
case "mcp_app_demo":
return createMcpAppDemoTool();
default:
throw new Error(`Unknown tool preset: ${name}`);
}
@ -175,6 +179,8 @@ function resolveResourcePreset(
return createTestArgvResource();
case "numbered_resources":
return createNumberedResources(Number(get("count")) || 3);
case "mcp_app_demo_widget":
return createMcpAppDemoResource();
default:
throw new Error(`Unknown resource preset: ${name}`);
}