Skip to content

feat: new design for mcp page - #1353

Merged
Woody4618 merged 13 commits into
solana-foundation:masterfrom
hoodieshq:feat/hoo-1564-update-design-for-mcp-page
Oct 14, 2026
Merged

Woody4618 merged 13 commits into
solana-foundation:masterfrom
hoodieshq:feat/hoo-1564-update-design-for-mcp-page

Conversation

@C0mberry

@C0mberry C0mberry commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Description

  • updating the design of mcp page
  • adding a hook for navigation via keyboard

Type of change

  • New feature

Screenshots

Screenshot 2026-09-29 at 15 25 45 Screenshot 2026-09-29 at 15 25 56

Testing

mcp page

Related Issues

HOO-1564

Checklist

  • My code follows the project's style guidelines
  • I have added tests that prove my fix/feature works
  • All checks pass locally (pnpm test, pnpm lint, pnpm typecheck)
  • I have run build:info script to update build information
  • CI/CD checks pass on the PR
  • Screenshots included — required for protocol screens, recommended for other UI changes

@vercel

vercel Bot commented Sep 29, 2026

Copy link
Copy Markdown

@C0mberry is attempting to deploy a commit to the Solana Foundation Team on Vercel.

A member of the Team first needs to authorize it.

@vercel

vercel Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
explorer Ready Ready Preview Oct 12, 2026 12:26pm UTC

Request Review

@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Medium impact] The PR appears safe to merge, with four non-blocking findings from earlier reviews still open.

Findings

  1. P2 CTA dots seed off-screen ▶
  2. P2 Answer pulls readers back ▶
  3. P2 Tool tabs lose panel access ▶
  4. P2 Completed answer restarts ▶

Summary

The PR redesigns the MCP setup page with a full-width layout, client setup cards, tool details, and animated example answers.

  • The MCP start page guides visitors through setup and instructions in a new full-width layout.
  • Tool cards show request and response examples for each MCP tool.
  • Example questions open prepared answers in a chat-style view.
  • Green particles pull toward the page's setup calls to action.
  • Tabs work with keyboard input and track the section in view.

Reviews (4) · Last reviewed commit: "docs(shared): shorten the useEdgeFades J..." · Reviewed by Greptile

setStatus({
ms: Math.round(performance.now() - started),
state: probeState(response.status),
state: response.status === 503 ? 'disabled' : 'ready',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Restricted endpoints appear ready

If a deployment requires an MCP access key, GET /mcp returns 401; a blocked IP gets 403. This probe labels both responses ready, while the page says no key is needed and offers only keyless configurations. Those configurations cannot connect. Preserve the restricted and blocked states and their setup guidance.

Knowledge Base Used: MCP service and telemetry

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

setStatus({
ms: Math.round(performance.now() - started),
state: probeState(response.status),
state: response.status === 503 ? 'disabled' : 'ready',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Server failures appear ready

If MCP handler construction or processing fails, GET /mcp can return 500. The new probe maps that response to ready, so visitors see a green “Ready” indicator for a service that cannot handle requests. Server errors need to be shown as unavailable.

Knowledge Base Used: MCP service and telemetry

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment thread app/features/mcp-docs/ui/CodeCard.tsx Outdated
onClick={() => setExpanded(value => !value)}
className={cn(
'flex w-full cursor-pointer items-center justify-center border-0 border-t border-solid border-dark-border',
'bg-transparent py-3 font-mono text-xs uppercase tracking-widest text-heavy-metal-300 hover:text-dark-foreground sm:hidden',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Tablet instructions cannot expand

At widths from roughly 577 to 767px, isMobile limits the agent-instructions snippet to 168px, but sm:hidden hides its “Show more” button. Readers at those widths cannot view the rest of the instructions. The content clamp and its control need matching breakpoints.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment on lines +20 to +26
<CodeCard
code={active.snippet(origin)}
header={<CardTabs items={SETUP_CLIENTS} onChange={setClient} value={client} />}
/>
<p className="m-0 flex w-full items-start gap-2.5 text-sm leading-5 text-heavy-metal-300">
<Check size={14} aria-hidden className="mt-1 shrink-0 text-dark-accent" />
{active.verify}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Setup destinations are missing

The setup card displays the snippet and verification text but no longer displays active.where. That field contains the config-file paths for Cursor and Windsurf and the UI steps for VS Code. Visitors receive a configuration or URL without being told where to put it, leaving those setup instructions incomplete.

Knowledge Base Used: MCP service and telemetry

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment on lines +64 to +70
['metadataPointer', 'points at the mint itself', 'authority: null — nobody'],
['tokenMetadata', 'name, symbol, uri; no extra fields', 'updateAuthority: null — nobody'],
],
},
{
kind: 'text',
text: 'Mint and freeze authorities are null too, and the extensions that carry real issuer power — permanentDelegate, transferHook, transferFeeConfig, confidential transfers — are simply absent.',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Metadata caveat was removed

The Token-2022 answer says nobody can change the metadata and lists absent issuer powers, but no longer explains that control of the referenced off-chain metadata domain can still change the displayed name, image, and description. Restoring that distinction would keep readers from mistaking renounced on-chain authority for immutable presentation metadata.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment on lines +22 to +25
const handleReset = () => {
pendingBottom.current = boxRef.current?.getBoundingClientRect().bottom;
setPicked(undefined);
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Reset loses keyboard focus

Activating “Ask other question” removes the focused button and replaces its answer view with the picker, but focus is not moved to a new control. Keyboard users lose their place and must navigate back to the question buttons. Restore focus to the picker or its first choice after reset.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment on lines +22 to +25
const { onKeyDown, tabRefs } = useTablistKeyboard<HTMLAnchorElement>(
SECTIONS.length,
SECTIONS.findIndex(section => section.id === active),
index => scrollToSection(SECTIONS[index].id),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Rapid arrows repeat sections

Arrow navigation calculates the next section from the scroll-spy selection, which updates only as smooth scrolling progresses. Two quick ArrowRight presses can therefore target the same section twice instead of advancing twice. Use the focused tab as the starting point, or update selection when navigation begins.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment thread app/features/mcp-docs/ui/GravityCta.tsx Outdated
Comment on lines +248 to +252
const seed = () => {
const cap = restingCap(resolveCtaField(phone ? 'base' : desktopScope).density);
while (dots.length < cap) spawn(true);
};
seed();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 CTA dots seed off-screen

Both full-width CTAs seed hundreds to thousands of dots as soon as the page mounts, including the off-screen closing CTA. When visible, each also draws and processes its dots every animation frame. This adds initial work and risks scroll jank on constrained devices; defer seeding until visible and reduce the per-frame workload.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment thread app/shared/ui/navigation-tabs/model/useScrollSpy.ts Outdated
Comment thread app/shared/ui/navigation-tabs/ui/BaseNavigationTabs.tsx
Comment thread app/features/mcp-docs/lib/useStickToBottom.ts Outdated
Comment thread app/features/mcp-docs/lib/useStickToBottom.ts Outdated
Comment thread app/features/mcp-docs/lib/cta-field-tuning.ts
Comment thread app/shared/lib/use-edge-fades.ts Outdated
Comment thread app/shared/lib/use-tablist-keyboard.ts
…r/1353/feat/hoo-1564-update-design-for-mcp-page

# Conflicts:
#	app/shared/ui/navigation-tabs/ui/BaseNavigationTabs.tsx
Comment on lines +31 to +33
window.addEventListener('wheel', takeOver, { passive: true });
window.addEventListener('touchmove', takeOver, { passive: true });
window.addEventListener('keydown', onKey);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Answer pulls readers back

While an example answer is appearing, clicking a section tab or dragging the scrollbar does not stop useStickToBottom. It only stops for wheel, touch, and certain key events. Its next frame scrolls back toward the answer, fighting the reader's navigation.

Stop following when the reader uses those other controls, while distinguishing the hook's own scrolling.

<div className="flex w-full items-stretch gap-2.5 border-0 border-b border-solid border-dark-border px-5">
<CardTabs items={TOOL_VIEWS} onChange={setView} value={view} />
</div>
<div className="w-full">{view === 'request' ? request : response}</div>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Tool tabs lose panel access

The replacement for the Radix tabs gives the buttons role="tab", but the content in Tools is a plain, unfocusable div. No IDs link the tabs to their content. Screen readers lose the named tab panel, and pressing Tab skips the static request or response content.

Give each panel role="tabpanel", a focus target, and matching aria-controls and aria-labelledby links.

Comment on lines +140 to +146
const toThinking = setTimeout(() => setPhase('thinking'), SENDING_MS);
const toTyping = setTimeout(() => setPhase('typing'), SENDING_MS + THINKING_MS);
return () => {
clearTimeout(toThinking);
clearTimeout(toTyping);
};
}, [reduced]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Completed answer restarts

Turning reduced motion off while an answer is open schedules thinking and typing again, even if the answer is complete. The typing loop then starts from zero, hiding and replaying the answer.

Keep completed answers in done; changing the motion preference should not restart them.

@Woody4618
Woody4618 added this pull request to the merge queue Oct 14, 2026
Merged via the queue into solana-foundation:master with commit 9b96adf Oct 14, 2026
12 checks passed

This branch was successfully deployed

1 active deployment
Preview — 19b23bcd Deployed Oct 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants