From 855b4e328afb910e748cca3b5be6d8533fed0549 Mon Sep 17 00:00:00 2001 From: TechnologicSingularity Date: Fri, 20 Feb 2026 17:21:31 +0000 Subject: [PATCH] feat: add MCP Apps catalog section for client applications Add a new catalog section at /mcp-catalog/apps that lists MCP client applications (apps that consume MCP servers), separate from the existing MCP servers catalog. Changes: - schemas.ts: Add McpAppCategorySchema, McpAppPricingSchema, McpAppPlatformSchema, and ArchestraMcpAppManifestSchema - types.ts: Export McpApp and related TypeScript types - data/mcp-apps.json: Initial dataset of 12 MCP client apps including Claude Desktop, Cursor, Zed, VS Code + GitHub Copilot, Windsurf, n8n, LangChain, Continue.dev, Cline, LibreChat, Archestra, Amazon Q - lib/apps.ts: Data loader with filtering/search utilities - components/McpAppCard.tsx: Card component for displaying MCP apps - components/McpAppsClient.tsx: Client-side filtering and search UI - app/mcp-catalog/apps/page.tsx: New page at /mcp-catalog/apps - components/Header.tsx: Add 'MCP Apps' nav link --- app/app/mcp-catalog/apps/page.tsx | 105 +++++++ app/app/mcp-catalog/components/McpAppCard.tsx | 142 ++++++++++ .../mcp-catalog/components/McpAppsClient.tsx | 117 ++++++++ app/app/mcp-catalog/data/mcp-apps.json | 266 ++++++++++++++++++ app/app/mcp-catalog/lib/apps.ts | 66 +++++ app/app/mcp-catalog/schemas.ts | 88 ++++++ app/app/mcp-catalog/types.ts | 12 +- app/components/Header.tsx | 15 + 8 files changed, 810 insertions(+), 1 deletion(-) create mode 100644 app/app/mcp-catalog/apps/page.tsx create mode 100644 app/app/mcp-catalog/components/McpAppCard.tsx create mode 100644 app/app/mcp-catalog/components/McpAppsClient.tsx create mode 100644 app/app/mcp-catalog/data/mcp-apps.json create mode 100644 app/app/mcp-catalog/lib/apps.ts diff --git a/app/app/mcp-catalog/apps/page.tsx b/app/app/mcp-catalog/apps/page.tsx new file mode 100644 index 00000000..9cf811a2 --- /dev/null +++ b/app/app/mcp-catalog/apps/page.tsx @@ -0,0 +1,105 @@ +import { Metadata } from 'next'; +import { Suspense } from 'react'; + +import Footer from '@components/Footer'; +import Header from '@components/Header'; +import McpAppsClient from '@mcpCatalog/components/McpAppsClient'; +import { getAppCategories, getAppPricingOptions, loadApps } from '@mcpCatalog/lib/apps'; + +export const metadata: Metadata = { + title: 'MCP Apps Catalog | Browse MCP Client Applications', + description: + 'Explore the catalog of applications that support the Model Context Protocol (MCP) as clients. Find IDEs, desktop apps, automation tools, and frameworks that connect to MCP servers.', + keywords: ['MCP apps', 'MCP clients', 'Model Context Protocol apps', 'Claude Desktop', 'Cursor', 'MCP IDEs'], + openGraph: { + title: 'MCP Apps Catalog | Browse MCP Client Applications', + description: + 'Explore apps that consume MCP servers – IDEs, desktop clients, automation platforms, and AI frameworks with native MCP support.', + type: 'website', + }, + twitter: { + card: 'summary_large_image', + title: 'MCP Apps Catalog | Browse MCP Client Applications', + description: + 'Explore apps that consume MCP servers – IDEs, desktop clients, automation platforms, and AI frameworks with native MCP support.', + }, +}; + +// Force dynamic rendering +export const dynamic = 'force-dynamic'; + +export default function McpAppsPage() { + const apps = loadApps(); + const categories = getAppCategories(apps); + const pricingOptions = getAppPricingOptions(apps); + + return ( +
+
+ +
+
+ +
+ {/* Page Header */} +
+
+

+ MCP Apps Catalog +

+ + Beta + +
+ +

+ {apps.length} applications that consume MCP servers — IDEs, desktop clients, automation platforms, and AI + frameworks with native{' '} + + Model Context Protocol + {' '} + support. +

+ + {/* Breadcrumb navigation */} + + + {/* Info banner */} +
+

+ What is an MCP App? An MCP app is a client application that + connects to MCP servers to extend its AI capabilities. Unlike MCP servers (which provide tools and + context), MCP apps consume those servers — enabling your AI assistant, IDE, or automation + platform to access real-world data and actions. +

+
+
+ + Loading apps...
}> + + +
+
+ +
+
+ ); +} diff --git a/app/app/mcp-catalog/components/McpAppCard.tsx b/app/app/mcp-catalog/components/McpAppCard.tsx new file mode 100644 index 00000000..5b7ec945 --- /dev/null +++ b/app/app/mcp-catalog/components/McpAppCard.tsx @@ -0,0 +1,142 @@ +import Image from 'next/image'; + +import { ArchestraMcpApp } from '@mcpCatalog/types'; + +const PLATFORM_LABELS: Record = { + windows: 'Windows', + mac: 'macOS', + linux: 'Linux', + web: 'Web', +}; + +const PRICING_STYLES: Record = { + free: 'bg-green-100 text-green-800 border-green-200', + freemium: 'bg-blue-100 text-blue-800 border-blue-200', + paid: 'bg-orange-100 text-orange-800 border-orange-200', +}; + +const PRICING_LABELS: Record = { + free: 'Free', + freemium: 'Freemium', + paid: 'Paid', +}; + +type MpcFeatureKey = 'tools' | 'resources' | 'prompts' | 'sampling' | 'stdio_transport' | 'http_transport'; + +const MCP_FEATURE_ENTRIES: { key: MpcFeatureKey; label: string }[] = [ + { key: 'tools', label: 'Tools' }, + { key: 'resources', label: 'Resources' }, + { key: 'prompts', label: 'Prompts' }, + { key: 'sampling', label: 'Sampling' }, + { key: 'stdio_transport', label: 'STDIO' }, + { key: 'http_transport', label: 'HTTP' }, +]; + +function FeaturePill({ active, label }: { active: boolean; label: string }) { + const activeClass = 'bg-purple-50 text-purple-700 border-purple-200'; + const inactiveClass = 'bg-gray-50 text-gray-400 border-gray-200 line-through'; + return ( + + {label} + + ); +} + +export default function McpAppCard({ app }: { app: ArchestraMcpApp }) { + const pricingClass = PRICING_STYLES[app.pricing] ?? PRICING_STYLES.free; + + return ( +
+ {/* Header */} +
+
+ {`${app.display_name} +
+
+
+

{app.display_name}

+ {app.open_source && ( + + Open Source + + )} +
+
+ {app.category} + + {PRICING_LABELS[app.pricing]} + +
+
+
+ + {/* Description */} +

{app.description}

+ + {/* Supported Platforms */} +
+ {app.supported_platforms.map((platform) => ( + + {PLATFORM_LABELS[platform] ?? platform} + + ))} +
+ + {/* MCP Features */} +
+

MCP Features

+
+ {MCP_FEATURE_ENTRIES.map(({ key, label }) => ( + + ))} +
+
+ + {/* Footer Links */} +
+ + Website ↗ + + {app.mcp_docs_url && ( + + MCP Docs ↗ + + )} + {app.github_url && ( + + GitHub ↗ + + )} +
+
+ ); +} diff --git a/app/app/mcp-catalog/components/McpAppsClient.tsx b/app/app/mcp-catalog/components/McpAppsClient.tsx new file mode 100644 index 00000000..36845215 --- /dev/null +++ b/app/app/mcp-catalog/components/McpAppsClient.tsx @@ -0,0 +1,117 @@ +'use client'; + +import { useMemo, useState } from 'react'; + +import McpAppCard from '@mcpCatalog/components/McpAppCard'; +import { ArchestraMcpApp } from '@mcpCatalog/types'; + +interface McpAppsClientProps { + apps: ArchestraMcpApp[]; + categories: string[]; + pricingOptions: string[]; +} + +export default function McpAppsClient({ apps, categories, pricingOptions }: McpAppsClientProps) { + const [search, setSearch] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + const [selectedPricing, setSelectedPricing] = useState('All'); + const [openSourceOnly, setOpenSourceOnly] = useState(false); + + const filtered = useMemo(() => { + return apps.filter((app) => { + const q = search.toLowerCase(); + if (q && !app.display_name.toLowerCase().includes(q) && !app.description.toLowerCase().includes(q)) { + return false; + } + if (selectedCategory !== 'All' && app.category !== selectedCategory) { + return false; + } + if (selectedPricing !== 'All' && app.pricing !== selectedPricing) { + return false; + } + if (openSourceOnly && !app.open_source) { + return false; + } + return true; + }); + }, [apps, search, selectedCategory, selectedPricing, openSourceOnly]); + + const PRICING_LABELS: Record = { + free: 'Free', + freemium: 'Freemium', + paid: 'Paid', + }; + + return ( +
+ {/* Filters */} +
+ {/* Search */} + setSearch(e.target.value)} + className="flex-1 min-w-[180px] px-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> + + {/* Category filter */} + + + {/* Pricing filter */} + + + {/* Open Source toggle */} + +
+ + {/* Result count */} +

+ Showing {filtered.length} of{' '} + {apps.length} MCP apps +

+ + {/* Grid */} + {filtered.length > 0 ? ( +
+ {filtered.map((app) => ( + + ))} +
+ ) : ( +
+

No MCP apps found

+

Try adjusting your filters or search query

+
+ )} +
+ ); +} diff --git a/app/app/mcp-catalog/data/mcp-apps.json b/app/app/mcp-catalog/data/mcp-apps.json new file mode 100644 index 00000000..97c283fe --- /dev/null +++ b/app/app/mcp-catalog/data/mcp-apps.json @@ -0,0 +1,266 @@ +[ + { + "name": "claude-desktop", + "display_name": "Claude Desktop", + "description": "Anthropic's official desktop app for Claude. First-class MCP support with local server connections via STDIO and a built-in MCP server manager.", + "category": "Desktop Client", + "website_url": "https://claude.ai/download", + "logo_url": "/logo_claude.png", + "supported_platforms": ["windows", "mac"], + "mcp_features": { + "tools": true, + "resources": true, + "prompts": true, + "sampling": false, + "roots": true, + "stdio_transport": true, + "http_transport": false + }, + "github_url": null, + "pricing": "freemium", + "open_source": false, + "mcp_docs_url": "https://modelcontextprotocol.io/quickstart/user" + }, + { + "name": "cursor", + "display_name": "Cursor", + "description": "AI-first code editor with deep MCP integration. Connect MCP servers to give Cursor's AI context from your databases, APIs, and local files.", + "category": "IDE", + "website_url": "https://cursor.com", + "logo_url": "/logo_cursor.png", + "supported_platforms": ["windows", "mac", "linux"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": null, + "pricing": "freemium", + "open_source": false, + "mcp_docs_url": "https://docs.cursor.com/context/model-context-protocol" + }, + { + "name": "windsurf", + "display_name": "Windsurf", + "description": "Codeium's agentic IDE featuring Cascade, an AI agent that uses MCP servers for extended context, web search, and external integrations.", + "category": "IDE", + "website_url": "https://windsurf.com", + "logo_url": "https://windsurf.com/favicon.ico", + "supported_platforms": ["windows", "mac", "linux"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": null, + "pricing": "freemium", + "open_source": false, + "mcp_docs_url": "https://docs.windsurf.com/windsurf/mcp" + }, + { + "name": "vscode-github-copilot", + "display_name": "VS Code + GitHub Copilot", + "description": "Visual Studio Code with GitHub Copilot Chat supports MCP servers in agent mode, enabling tools and context from any MCP-compatible server.", + "category": "IDE", + "website_url": "https://code.visualstudio.com", + "logo_url": "https://code.visualstudio.com/favicon.ico", + "supported_platforms": ["windows", "mac", "linux"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/microsoft/vscode", + "pricing": "freemium", + "open_source": true, + "mcp_docs_url": "https://code.visualstudio.com/docs/copilot/chat/mcp-servers" + }, + { + "name": "zed", + "display_name": "Zed", + "description": "High-performance multiplayer code editor with native MCP support. Connect MCP servers directly to Zed's AI Assistant for context-aware coding.", + "category": "IDE", + "website_url": "https://zed.dev", + "logo_url": "https://zed.dev/favicon-32x32.png", + "supported_platforms": ["mac", "linux"], + "mcp_features": { + "tools": true, + "resources": true, + "prompts": true, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": false + }, + "github_url": "https://github.com/zed-industries/zed", + "pricing": "freemium", + "open_source": true, + "mcp_docs_url": "https://zed.dev/docs/assistant/model-context-protocol" + }, + { + "name": "n8n", + "display_name": "n8n", + "description": "Workflow automation platform that acts as an MCP client, letting you integrate AI agents with hundreds of apps via MCP server connections in your automations.", + "category": "Automation", + "website_url": "https://n8n.io", + "logo_url": "/logo_n8n.png", + "supported_platforms": ["web", "linux"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/n8n-io/n8n", + "pricing": "freemium", + "open_source": true, + "mcp_docs_url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.mcpclient/" + }, + { + "name": "langchain", + "display_name": "LangChain", + "description": "Popular LLM application framework with MCP adapter support. Use any MCP server as a tool source in your LangChain agents and chains.", + "category": "Framework", + "website_url": "https://langchain.com", + "logo_url": "/logo_langchain.png", + "supported_platforms": ["linux", "mac", "windows"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/langchain-ai/langchain", + "pricing": "free", + "open_source": true, + "mcp_docs_url": "https://python.langchain.com/docs/integrations/tools/mcp/" + }, + { + "name": "continue-dev", + "display_name": "Continue", + "description": "Open-source AI code assistant for VS Code and JetBrains. Supports MCP servers as context providers and tool sources for its AI agent.", + "category": "IDE", + "website_url": "https://continue.dev", + "logo_url": "https://continue.dev/img/favicon.ico", + "supported_platforms": ["windows", "mac", "linux"], + "mcp_features": { + "tools": true, + "resources": true, + "prompts": true, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/continuedev/continue", + "pricing": "free", + "open_source": true, + "mcp_docs_url": "https://docs.continue.dev/customize/context-providers" + }, + { + "name": "cline", + "display_name": "Cline", + "description": "Autonomous AI coding agent VS Code extension with extensive MCP support. Can use any MCP server as a tool and even install MCP servers on your behalf.", + "category": "IDE", + "website_url": "https://cline.bot", + "logo_url": "https://cline.bot/favicon.ico", + "supported_platforms": ["windows", "mac", "linux"], + "mcp_features": { + "tools": true, + "resources": true, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/cline/cline", + "pricing": "free", + "open_source": true, + "mcp_docs_url": "https://docs.cline.bot/mcp-servers/what-is-mcp" + }, + { + "name": "librechat", + "display_name": "LibreChat", + "description": "Open-source ChatGPT-style web app that supports MCP servers as tool providers for its AI agents, enabling self-hosted MCP-powered chat.", + "category": "Web App", + "website_url": "https://librechat.ai", + "logo_url": "https://librechat.ai/favicon.ico", + "supported_platforms": ["web"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/danny-avila/LibreChat", + "pricing": "free", + "open_source": true, + "mcp_docs_url": "https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/mcp_servers" + }, + { + "name": "openai-agents-sdk", + "display_name": "OpenAI Agents SDK", + "description": "OpenAI's Python SDK for building agentic applications. Includes native MCP client support so agents can connect to any MCP server as a tool source.", + "category": "Framework", + "website_url": "https://openai.github.io/openai-agents-python/", + "logo_url": "/logo_openai.png", + "supported_platforms": ["linux", "mac", "windows"], + "mcp_features": { + "tools": true, + "resources": false, + "prompts": false, + "sampling": false, + "roots": false, + "stdio_transport": true, + "http_transport": true + }, + "github_url": "https://github.com/openai/openai-agents-python", + "pricing": "free", + "open_source": true, + "mcp_docs_url": "https://openai.github.io/openai-agents-python/mcp/" + }, + { + "name": "archestra", + "display_name": "Archestra Desktop", + "description": "Enterprise MCP platform for AI agents. Manages MCP server lifecycle, enforces security guardrails, and provides a curated catalog of 900+ MCP servers.", + "category": "Desktop Client", + "website_url": "https://archestra.ai", + "logo_url": "/logo_archestra.svg", + "supported_platforms": ["mac"], + "mcp_features": { + "tools": true, + "resources": true, + "prompts": true, + "sampling": false, + "roots": true, + "stdio_transport": true, + "http_transport": true + }, + "github_url": null, + "pricing": "freemium", + "open_source": false, + "mcp_docs_url": "https://archestra.ai/docs" + } +] diff --git a/app/app/mcp-catalog/lib/apps.ts b/app/app/mcp-catalog/lib/apps.ts new file mode 100644 index 00000000..64cba2e0 --- /dev/null +++ b/app/app/mcp-catalog/lib/apps.ts @@ -0,0 +1,66 @@ +import fs from 'fs'; +import path from 'path'; + +import { ArchestraMcpApp } from '@mcpCatalog/types'; + +const DATA_DIR = path.join(process.cwd(), './app/mcp-catalog/data'); +const MCP_APPS_JSON_FILE_PATH = path.join(DATA_DIR, 'mcp-apps.json'); + +// Simple in-memory cache +let appsCache: ArchestraMcpApp[] | null = null; + +/** Clear the apps cache (useful in development) */ +export function clearAppsCache(): void { + appsCache = null; +} + +/** Load all MCP client apps from mcp-apps.json */ +export function loadApps(): ArchestraMcpApp[] { + if (appsCache) { + return appsCache; + } + + try { + const content = fs.readFileSync(MCP_APPS_JSON_FILE_PATH, 'utf-8'); + const apps = JSON.parse(content) as ArchestraMcpApp[]; + + // Sort: open-source first, then alphabetically by display name + appsCache = apps.sort((a, b) => { + if (a.open_source !== b.open_source) { + return a.open_source ? -1 : 1; + } + return a.display_name.localeCompare(b.display_name); + }); + + return appsCache; + } catch (error) { + console.error('Failed to load mcp-apps.json:', error); + return []; + } +} + +/** Get unique categories from apps, sorted by count */ +export function getAppCategories(apps: ArchestraMcpApp[]): string[] { + const counts = new Map(); + + for (const app of apps) { + counts.set(app.category, (counts.get(app.category) ?? 0) + 1); + } + + const sorted = Array.from(counts.entries()) + .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])) + .map(([cat]) => cat); + + return ['All', ...sorted]; +} + +/** Get unique pricing options present in apps */ +export function getAppPricingOptions(apps: ArchestraMcpApp[]): string[] { + const seen = new Set(); + for (const app of apps) { + seen.add(app.pricing); + } + const order = ['free', 'freemium', 'paid']; + const sorted = order.filter((p) => seen.has(p)); + return ['All', ...sorted]; +} diff --git a/app/app/mcp-catalog/schemas.ts b/app/app/mcp-catalog/schemas.ts index dff56da0..e5abc95a 100644 --- a/app/app/mcp-catalog/schemas.ts +++ b/app/app/mcp-catalog/schemas.ts @@ -233,3 +233,91 @@ export const ArchestraMcpServerManifestSchema = BaseManifestSchema.extend({ export const ArchestraMcpServerManifestWithScoreBreakdownSchema = ArchestraMcpServerManifestSchema.extend({ score_breakdown: ArchestraScoreBreakdownSchema, }).openapi('ArchestraMcpServerManifestWithScoreBreakdown'); + +// ─── MCP App (Client Application) Schemas ──────────────────────────────────── + +export const McpAppCategorySchema = z.enum([ + 'IDE', + 'Desktop Client', + 'Automation', + 'Framework', + 'CLI', + 'Web App', + 'Other', +]); + +export const McpAppPricingSchema = z.enum(['free', 'paid', 'freemium']); + +export const McpAppPlatformSchema = z.enum(['windows', 'mac', 'linux', 'web']); + +export const ArchestraMcpAppManifestSchema = z + .object({ + /** + * Machine-readable identifier (slug) + */ + name: z.string(), + + /** + * Human-friendly display name + */ + display_name: z.string(), + + /** + * Short description of what the app does + */ + description: z.string(), + + /** + * App category (IDE, Desktop Client, Automation, etc.) + */ + category: McpAppCategorySchema, + + /** + * Primary website / homepage URL + */ + website_url: z.string().url(), + + /** + * Relative path to logo in /public, or an https:// URL + */ + logo_url: z.string(), + + /** + * Platforms the app runs on + */ + supported_platforms: z.array(McpAppPlatformSchema), + + /** + * MCP protocol features the app supports as a CLIENT + */ + mcp_features: z.object({ + tools: z.boolean(), + resources: z.boolean(), + prompts: z.boolean(), + sampling: z.boolean(), + roots: z.boolean(), + stdio_transport: z.boolean(), + http_transport: z.boolean(), + }), + + /** + * GitHub repository URL (null for closed-source apps) + */ + github_url: z.string().url().nullable(), + + /** + * Pricing model + */ + pricing: McpAppPricingSchema, + + /** + * Whether the app is open source + */ + open_source: z.boolean(), + + /** + * Documentation URL for MCP integration + */ + mcp_docs_url: z.string().url().nullable(), + }) + .openapi('ArchestraMcpAppManifest'); diff --git a/app/app/mcp-catalog/types.ts b/app/app/mcp-catalog/types.ts index 017a5302..d230fd9b 100644 --- a/app/app/mcp-catalog/types.ts +++ b/app/app/mcp-catalog/types.ts @@ -1,16 +1,26 @@ import type { z } from 'zod'; import type { + ArchestraMcpAppManifestSchema, ArchestraMcpServerGitHubRepoInfoSchema, ArchestraMcpServerManifestSchema, ArchestraScoreBreakdownSchema, MCPDependencySchema, + McpAppCategorySchema, + McpAppPlatformSchema, + McpAppPricingSchema, McpServerCategorySchema, } from '@mcpCatalog/schemas'; -// Infer types from Zod schemas +// ─── MCP Server types ───────────────────────────────────────────────────────── export type McpServerCategory = z.infer; export type ArchestraScoreBreakdown = z.infer; export type ArchestraMcpServerGitHubRepoInfo = z.infer; export type ArchestraMcpServerManifest = z.infer; export type MCPDependency = z.infer; + +// ─── MCP App (Client Application) types ────────────────────────────────────── +export type McpAppCategory = z.infer; +export type McpAppPlatform = z.infer; +export type McpAppPricing = z.infer; +export type ArchestraMcpApp = z.infer; diff --git a/app/components/Header.tsx b/app/components/Header.tsx index eefba33d..d4b995a4 100644 --- a/app/components/Header.tsx +++ b/app/components/Header.tsx @@ -50,6 +50,13 @@ export default function Header() { MCP Catalog + + MCP Apps + + About Us @@ -117,6 +124,14 @@ export default function Header() { MCP Catalog + setIsMobileMenuOpen(false)} + > + MCP Apps + +