Atlas / MCP servers / alignbase / sunpeak

sunpeakBLOCK

mcp/alignbase/sunpeak

Server-agnostic MCP testing framework and full-stack MCP App framework for ChatGPT Apps, Claude Connectors, and more.

Verdict
BLOCK
Grade
F
Trust score
47 /100
Exposed tools
1 1r · 0w · 0d
Transport
streamable-http
License
MIT
Stars
217
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Official documentation for sunpeak - The MCP Apps framework.

Local Development

Install the Mintlify CLI:

npm i -g mint

Start the dev server:

mint dev

View your local preview at http://localhost:3000.

Style Guide

Less is more, aim for brevity and clarity. Include simple examples, but only in places where an example makes a subject significantly clearer.

End sentences, descriptions, comments, etc. with a period, except where ending with a colon.

For icons on links, use the link icon for external resources, the page icon for a page on the documentation tab, and the code icon for a page on the API Reference tab.

Keep page names and file names in sync.

Follow the same general styles and page structures as other pages in the same group.

Contributing

We welcome your contributions!

Run mint dev from this directory to preview documentation changes locally.

Resources

Read from source at commit 0b7af9d476c9OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add sunpeak-app --env SUNPEAK_ALLOW_HOSTED_OAUTH=${SUNPEAK_ALLOW_HOSTED_OAUTH} --env SUNPEAK_AUTH_FILE=${SUNPEAK_AUTH_FILE} --env SUNPEAK_INSECURE_FILE_KEY_STORE=${SUNPEAK_INSECURE_FILE_KEY_STORE} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "sunpeak-app": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "SUNPEAK_ALLOW_HOSTED_OAUTH": "${SUNPEAK_ALLOW_HOSTED_OAUTH}",
        "SUNPEAK_AUTH_FILE": "${SUNPEAK_AUTH_FILE}",
        "SUNPEAK_INSECURE_FILE_KEY_STORE": "${SUNPEAK_INSECURE_FILE_KEY_STORE}"
      }
    }
  }
}
03

Exposed tools (1)

1 read · 0 write · 0 destructive.

ToolRiskDescription
get-selectionreadGet the current selection
04

Trust audit

BLOCKgrade F · trust 47/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (8 observation(s))
Shell
declared (9 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sunpeak/bin/lib/extract-resource.mjs:52
new Function('module', 'exports', 'require', code)(mod, mod.exports, () => ({}));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sunpeak/bin/lib/extract-tool.mjs:59
const fn = new Function(code + '\nreturn tool;');
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sunpeak/bin/lib/extract-tool.mjs:66
tool = new Function('return ' + toolMatch[1])();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sunpeak/src/lib/extract-resource.ts:54
new Function('module', 'exports', 'require', code)(mod, mod.exports, () => ({}));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
packages/sunpeak/DEVELOPMENT.md:46
- Developer mode enabled from the bottom-left user menu under `Settings > Security and login > Developer mode`
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/sunpeak/bin/commands/inspect.mjs:732
const callbackUrl = `http://127.0.0.1:${callbackPort}/oauth/callback`;
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/sunpeak/bin/lib/inspect/inspect-config.mjs:87
healthUrl: `http://127.0.0.1:${port}/health`,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/sunpeak/bin/lib/live/live-config.mjs:101
url: `http://127.0.0.1:${vitePort}/health`,
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
packages/sunpeak/src/mcp/favicon.ts:3
'iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAAA6BJREFUeAHtm09ME0EUxr+lqIDVlMQEI8aAaPRUmwgmeLEcTLx
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/sunpeak/tests/e2e/inspector-modes.spec.ts:686
const secret = 'sk-test-secret-that-must-not-render';
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
packages/sunpeak/.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.symlink · CWE-1104
README.md
README.md
Why it matters. link not followed
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sunpeak/src/inspector/inline-helper-runtime.test.ts:41
const fn = new Function('window', 'document', SUNPEAK_INLINE_HELPER_SCRIPT);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/review-example/src/resources/review/review.test.tsx:57
vi.mock('../../components/button', () => ({
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/review-example/src/resources/review/review.test.tsx:89
vi.mock('../../components/icon', () => ({
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/sunpeak/bin/lib/inspect/inspect-server.mjs:11
export { inspectServer } from '../../commands/inspect.mjs';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/sunpeak/src/cli/chatgpt-page.test.ts:4
import { ChatGPTPage, CHATGPT_SELECTORS, CHATGPT_URLS } from '../../bin/lib/live/chatgpt-page.mjs';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/sunpeak/src/cli/commands.test.ts:7
const importUpgrade = () => import('../../bin/commands/upgrade.mjs');
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/sunpeak/src/cli/inspect.test.ts:432
expect(_securityTestExports.isPrivateNetworkAddress('169.254.169.254')).toBe(true);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/sunpeak/src/cli/inspect.test.ts:452
_securityTestExports.assertHttpServerUrlAllowed('http://169.254.169.254/latest')
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/sunpeak/src/cli/inspect.test.ts:644
await expect(guardedFetch('http://169.254.169.254/latest/meta-data')).rejects.toThrow(
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/app-framework/guides/deployment.mdx:325
proxy_pass http://127.0.0.1:8000;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/app-framework/guides/deployment.mdx:332
proxy_pass http://127.0.0.1:8000;
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
examples/albums-example/package.json
clsx, embla-carousel-react, embla-carousel-wheel-gestures, sunpeak, tailwind-merge, zod, @rolldown/pluginutils, @tailwindcss/vite
Why it matters. 21 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 0b7af9d476c9full audit observations/trust-audit/mcp-server/alignbase__sunpeak.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-120b7af9d476c9BLOCKF47first audit
06

Questions

What is the sunpeak MCP server?

Server-agnostic MCP testing framework and full-stack MCP App framework for ChatGPT Apps, Claude Connectors, and more.

What tools does sunpeak expose?

1 in total: 1 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is sunpeak safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (47/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does sunpeak need?

It reads SUNPEAK_ALLOW_HOSTED_OAUTH, SUNPEAK_AUTH_FILE and SUNPEAK_INSECURE_FILE_KEY_STORE from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does sunpeak run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as sunpeak-app at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (0b7af9d476c9), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement