Releases: Sunpeak-AI/sunpeak
Release list
v0.16.9
v0.16.7
v0.16.5
v0.16.4
v0.16.3
v0.16.2
v0.16.1
sunpeak is now a full-stack MCP App solution! With the addition of the tools/ directory to the framework, your entire MCP App can now be centralized entirely within sunpeak. To adopt these advantages, follow the migration instructions below, which includes some significant simplifications of the earlier Resource and Simulation abstractions.
Migration Instructions
1. Rename resource files
Drop the -resource suffix from each resource file:
src/resources/albums/albums-resource.tsx → src/resources/albums/albums.tsx
Update any imports referencing the old filename.
2. Remove name from resource configs
The name field is now auto-derived from the directory name. Remove it from your ResourceConfig exports:
Before:
export const resource: ResourceConfig = {
name: 'albums',
title: 'Albums',
description: 'Show photo albums widget',
mimeType: 'text/html;profile=mcp-app',
};After:
export const resource: ResourceConfig = {
title: 'Albums',
description: 'Show photo albums widget',
mimeType: 'text/html;profile=mcp-app',
};The name 'albums' is inferred from src/resources/albums/albums.tsx.
3. Create tool files
For each tool currently defined in your simulation JSON, create a file in src/tools/ named after the tool:
// src/tools/show-albums.ts
import { z } from "zod";
import type { AppToolConfig, ToolHandlerExtra } from "sunpeak/mcp";
export const tool: AppToolConfig = {
resource: "albums", // References the resource directory name
title: "Show Albums",
description: "Show photo albums",
annotations: { readOnlyHint: true },
_meta: { ui: { visibility: ["model", "app"] } },
};
// Convert "inputSchema" from JSON Schema to Zod (optional — omit if no validation needed)
export const schema = {
category: z.string().describe("Filter by category"),
search: z.string().describe("Search term"),
limit: z.number().describe("Max albums to return"),
};
// Tool handler — return structured data for the UI, or a plain string for text responses
// extra has authInfo, sessionId, signal (from MCP SDK's RequestHandlerExtra)
export default async function (args: Record<string, unknown>, extra: ToolHandlerExtra) {
return { structuredContent: { albums: [] } };
}Mapping from simulation JSON to tool file:
| Simulation JSON field | Tool file equivalent |
|---|---|
tool.name |
Filename (show-albums.ts) |
tool.description |
tool.description |
tool.title |
tool.title |
tool.inputSchema |
schema (rewrite as Zod) |
tool.annotations |
tool.annotations |
tool._meta |
tool._meta |
The resource field is a string matching the resource directory name (e.g., "albums" for src/resources/albums/). Multiple tools can reference the same resource.
4. Simplify simulation files
Move all simulation JSON files into a flat tests/simulations/ directory. Remove the tool metadata object and replace it with a tool string field referencing the tool filename:
Before (tests/simulations/albums/albums-show-simulation.json):
{
"userMessage": "Show me photos...",
"tool": {
"name": "show-albums",
"description": "Show photo albums",
"inputSchema": { "..." : "..." },
"title": "Show Albums",
"annotations": { "readOnlyHint": true },
"_meta": { "ui": { "visibility": ["model", "app"] } }
},
"toolInput": { "category": "food" },
"toolResult": { "structuredContent": { "..." : "..." } }
}After (tests/simulations/show-albums.json):
{
"tool": "show-albums",
"userMessage": "Show me photos...",
"toolInput": { "category": "food" },
"toolResult": { "structuredContent": { "..." : "..." } }
}You can have multiple simulations for the same tool (different fixture data) — just use different filenames.
5. (Optional) Add auth via src/server.ts
import type { IncomingMessage } from "node:http";
import type { AuthInfo } from "sunpeak/mcp";
export function auth(req: IncomingMessage): AuthInfo {
const token = req.headers.authorization?.replace("Bearer ", "") ?? "";
return { token, clientId: "my-app", scopes: [] };
}The returned AuthInfo is available as extra.authInfo in tool handlers (standard MCP SDK field).
Full Changelog: v0.15.5...v0.16.1
v0.15.4
v0.15.1
Claude is now first-class in sunpeak, alongside ChatGPT. Apps can be connected to and tested in Claude out-of-the-box. The sunpeak ChatGPTSimulator is now just the Simulator, and ChatGPT or Claude runtimes can be used in the simulator via the host dropdown or URL param.
To upgrade, users need to migrate styles to use the host-agnostic, MCP App approach to styling:
| Old | New |
|---|---|
| text-primary | text-[var(--color-text-primary)] |
| text-secondary | text-[var(--color-text-secondary)] |
| text-on-primary | text-white |
| bg-surface | bg-[var(--color-background-primary)] |
| bg-surface-secondary | bg-[var(--color-background-secondary)] |
| bg-primary | bg-[var(--color-ring-primary)] |
| border-subtle | border-[var(--color-border-tertiary)] |
| border-default | border-[var(--color-border-primary)] |
| border-primary | border-[var(--color-ring-primary)] |
| border-primary/10 | border-[var(--color-ring-primary)]/10 |
Users should also update any old references to ChatGPTSimulator to just Simulator.
This release also added a few missing MCP App APIs and ChatGPT-specific host APIs, see the sunpeak.ai docs for details.
Full Changelog: v0.14.3...v0.15.1