Skip to content

Releases: Sunpeak-AI/sunpeak

v0.16.9

Choose a tag to compare

@abewheel abewheel released this 05 Mar 23:34

Full Changelog: v0.16.8...v0.16.9

v0.16.7

Choose a tag to compare

@abewheel abewheel released this 05 Mar 22:11

Full Changelog: v0.16.6...v0.16.7

v0.16.5

Choose a tag to compare

@abewheel abewheel released this 04 Mar 20:48

Full Changelog: v0.16.4...v0.16.5

v0.16.4

Choose a tag to compare

@abewheel abewheel released this 04 Mar 17:07

Full Changelog: v0.16.3...v0.16.4

v0.16.3

Choose a tag to compare

@abewheel abewheel released this 04 Mar 00:37

Full Changelog: v0.16.2...v0.16.3

v0.16.2

Choose a tag to compare

@abewheel abewheel released this 03 Mar 22:53

Full Changelog: v0.16.1...v0.16.2

v0.16.1

Choose a tag to compare

@abewheel abewheel released this 02 Mar 20:19

⚠️ BREAKING CHANGES ⚠️

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

Choose a tag to compare

@abewheel abewheel released this 27 Feb 16:56

Full Changelog: v0.15.3...v0.15.4

v0.15.1

Choose a tag to compare

@abewheel abewheel released this 26 Feb 21:06

⚠️ BREAKING CHANGES ⚠️

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

v0.14.3

Choose a tag to compare

@abewheel abewheel released this 22 Feb 02:35

Full Changelog: v0.14.2...v0.14.3