smithery-ai/cli/smithery-homepage
- community
- ext:[{"type":"config","description":"Configuration overrides"}]
Checking that the SKILL.md file is still in the repository.
Build and edit the Smithery homepage app -- a TanStack Start + shadcn/ui web app at ~/.smithery/homepage that connects to MCP servers through the Smithery Connect API. Use this skill whenever the user wants to create, modify, or add features to the Smithery homepage, build pages that display data from MCP tools (Linear issues, Gmail, Notion, etc.), or asks about editing anything in ~/.smithery/homepage. Also triggers for requests like 'add a page to the homepage', 'show my Linear issues on the homepage', 'update the homepage UI', or any task involving the ~/.smithery/homepage project.
Install
npx vskill@latest install smithery-ai/cli/smithery-homepageSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
Smithery Homepage
The Smithery homepage is a TanStack Start app at ~/.smithery/homepage that serves as a personal dashboard connecting to MCP servers via the Smithery Connect API.
Project Initialization
If ~/.smithery/homepage does not exist, scaffold it from scratch:
- Create the directory if needed and scaffold the app in place:
``bash mkdir -p ~/.smithery cd ~/.smithery && npx shadcn@latest init --preset b1FSjVe3E --template start --name homepage ``
- Install additional dependencies:
``bash cd ~/.smithery/homepage npm install @smithery/api @modelcontextprotocol/sdk @tanstack/react-query @tanstack/react-query-devtools ``
- Initialize git:
git init && git add -A && git commit -m "feat: initial commit" - Create
.envwith the user's Smithery API key and namespace (read from~/Library/Application Support/smithery/settings.jsonon macOS — fieldsapiKeyandnamespace)
If ~/.smithery/homepage already exists, work within the existing project — read the current code before making changes.
Tech Stack
- Framework: TanStack Start (Vite 7, React 19, file-based routing)
- Styling: Tailwind CSS v4 + shadcn/ui (radix-nova style, taupe base). Always use shadcn components with their default styling unless absolutely necessary or explicitly requested otherwise. This applies especially to charts — use shadcn's chart components (built on Recharts) rather than custom chart implementations.
- Data Fetching:
@tanstack/react-query(React Query) — ALL API requests MUST use React Query - MCP Integration:
@smithery/api+@modelcontextprotocol/sdk - Server functions:
createServerFnfrom@tanstack/react-startfor server-side MCP calls
CRITICAL: React Query for ALL API Requests
Every API request in the app MUST use React Query (`@tanstack/react-query`). Do not use raw fetch, useEffect + useState, or route loaders alone for data fetching. React Query provides caching, background refetching, loading/error states, and stale-while-revalidate — all of which are essential for a good dashboard UX.
QueryClient Setup
The QueryClient must be configured in the router and provided at the root layout. The scaffold generates getRouter() — update it to add the QueryClient:
The scaffold generates __root.tsx with createRootRoute and a shellComponent for the HTML document wrapper. Replace createRootRoute with createRootRouteWithContext to pass QueryClient, keep the shellComponent, and add a component with QueryClientProvider:
Project Structure
How to Connect to MCP Servers
The app uses @smithery/api/mcp to create MCP connections through Smithery Connect. This runs server-side via TanStack Start server functions — the API key never reaches the browser.
Pattern: Shared MCP helper
Create a shared src/lib/mcp.ts that handles MCP connections for any server:
Pattern: Creating a tool caller module
CRITICAL: Always use cached tool schemas for type safety. The Smithery CLI caches Zod schemas for tool inputs and outputs at ~/.smithery/<connection>__<tool_name>.ts after each successful tool call. These schemas contain the real input and output types — never hand-write or guess tool response types. Never use `as` type casting on tool results. Always parse results through the cached outputSchema to get proper types at runtime.
Step 1: Ensure the schema exists
Before writing a tool caller module, check if the cached schema file exists at ~/.smithery/<connection>__<tool_name>.ts. If it does NOT exist, you MUST run the tool first to generate it:
This creates the schema file with accurate inputSchema, Input, outputSchema, and Output types inferred from the real tool response. You must always run the tool to generate the schema before writing code that depends on it — do not guess or hallucinate tool response shapes.
Step 2: Copy the schema into the homepage project
Copy the cached schema file into the homepage's src/lib/schemas/ directory so it's part of the project and available to the TypeScript compiler:
Also ensure zod is installed in the homepage project (npm install zod if needed).
Step 3: Import schemas and parse tool results
For each MCP server, create a helper in src/lib/ that imports the shared MCP helper AND the cached schemas. Import outputSchema (the Zod schema) to parse results, and type Input for compile-time argument checking:
Key points:
- Use
satisfies Inputon the args object to catch invalid tool inputs at compile time - Always parse results with `outputSchema.parse(raw)` — this validates the data at runtime AND gives you the correct TypeScript type. Never use
ascasting on tool results. - Never hand-write tool response types — always derive them from the cached schema
- If a schema file seems stale, re-run the tool (
smithery mcp call ...) to regenerate it
Server functions with input parameters
IMPORTANT: .validator() does NOT exist in TanStack Start. For server functions that accept input:
- For GET server functions, type the handler's
{ data }parameter directly:
``typescript export const fetchItem = createServerFn({ method: "GET" }).handler( async ({ data }: { data: { id: string } }) => { return callMcpTool("service", "get_item", { item_id: data.id }) }, ) // Call: fetchItem({ data: { id: "123" } }) ``
- For POST mutations, use
.inputValidator()(not.validator()):
``typescript export const createItem = createServerFn({ method: "POST" }) .inputValidator((data: { title: string }) => data) .handler(async ({ data }) => { return callMcpTool("service", "create_item", { title: data.title }) }) ``
Pattern: Using React Query in routes
Use queryOptions + useQuery for data fetching. Prefetch in the route loader for instant navigation, then read via React Query in the component. Always destructure isLoading, error, and refetch alongside data to handle all states.
CRITICAL: Loading & Error Handling
Every component that uses `useQuery` MUST handle loading and error states. Never render only the success case.
Standard loading/error pattern
Use isLoading and error from useQuery, plus a skeleton loader and an error component with retry:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 91 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/smithery-homepage/SKILL.md
Popularity
- Repository stars
- 754
- Repository forks
- 91
- 7-day trend score
- 33
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Extension points
configConfiguration overrides
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/smithery-ai/cli/smithery-homepage)