diff --git a/public/firecrawl-logo.png b/public/firecrawl-logo.png index 6c2cf36..a605a99 100644 Binary files a/public/firecrawl-logo.png and b/public/firecrawl-logo.png differ diff --git a/public/robots.txt b/public/robots.txt index e9e57dc..0400f5c 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,3 +1,11 @@ # https://www.robotstxt.org/robotstxt.html User-agent: * -Disallow: +Allow: / +Disallow: /chat +Disallow: /settings +Disallow: /runs +Disallow: /servers +Disallow: /api/ +Disallow: /login + +Sitemap: https://remotemcp.tech/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..eb709e2 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,9 @@ + + + + https://remotemcp.tech/ + 2024-12-01 + weekly + 1.0 + + diff --git a/src/components/AppLogo.tsx b/src/components/AppLogo.tsx index ab77870..3a91d47 100644 --- a/src/components/AppLogo.tsx +++ b/src/components/AppLogo.tsx @@ -21,6 +21,10 @@ export const AppLogo = ({ src={logo.url} alt={appName} className={className} + loading="lazy" + decoding="async" + width="40" + height="40" onError={(e) => { const target = e.target as HTMLImageElement; target.src = "/favicon.ico"; diff --git a/src/components/landing/AvailableAppsSection.tsx b/src/components/landing/AvailableAppsSection.tsx index 00f4c4e..b4eb3d6 100644 --- a/src/components/landing/AvailableAppsSection.tsx +++ b/src/components/landing/AvailableAppsSection.tsx @@ -200,10 +200,11 @@ export function AvailableAppsSection() { duration: 0.5, delay: categoryIndex * 0.1 + appIndex * 0.05, }} - viewport={{ once: true }} + viewport={{ once: true, margin: "100px" }} whileHover={{ scale: 1.05 }} onClick={() => setActive(app)} className="bg-neutral-900 border border-neutral-800 rounded-lg p-6 hover:border-neutral-700 transition-all duration-300 cursor-pointer group relative" + style={{ willChange: "transform" }} >
{/* Logo */} {/* Video Container */}
@@ -188,9 +190,9 @@ export function HeroSection() { {/* Overlay Text */}
-

+

See Remote MCP in Action -

+

Watch how to connect AI agents to external tools in minutes @@ -207,6 +209,7 @@ export function HeroSection() { autoPlay muted playsInline + preload="metadata" title="Demo: See Remote MCP in Action – how to connect AI agents to external tools in minutes" onEnded={() => { setIsVideoPlaying(false); diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 76ee84d..17bdc02 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -43,7 +43,20 @@ export const Route = createRootRouteWithContext()({ content: "width=device-width, initial-scale=1", }, { - title: "Remote Mcp", + title: "Remote MCP - Cloud MCP Servers for AI Assistants", + }, + { + name: "description", + content: + "Connect AI assistants like Claude and Cursor to your favorite apps. Create and manage MCP servers in the cloud with 159+ tools across GitHub, Slack, YouTube, PostgreSQL, and more.", + }, + { + name: "robots", + content: "index, follow", + }, + { + name: "theme-color", + content: "#000000", }, ], links: [ @@ -51,6 +64,14 @@ export const Route = createRootRouteWithContext()({ rel: "stylesheet", href: appCss, }, + { + rel: "icon", + href: "/favicon.ico", + }, + { + rel: "canonical", + href: "https://remotemcp.tech", + }, ], }), shellComponent: RootDocument, diff --git a/src/routes/_authed/chat.tsx b/src/routes/_authed/chat.tsx index a9d1654..8fdab73 100644 --- a/src/routes/_authed/chat.tsx +++ b/src/routes/_authed/chat.tsx @@ -5,6 +5,28 @@ import { Suspense } from "react"; export const Route = createFileRoute("/_authed/chat")({ component: ChatLayout, + head: () => ({ + meta: [ + { + title: "Chat - Remote MCP", + }, + { + name: "description", + content: + "Chat with AI assistants powered by Remote MCP servers. Test your MCP integrations with Claude, GPT-4, and other AI models.", + }, + { + name: "robots", + content: "noindex, nofollow", + }, + ], + links: [ + { + rel: "canonical", + href: "https://remotemcp.tech/chat", + }, + ], + }), }); const ChatSkeleton = () => ( diff --git a/src/routes/_authed/runs.tsx b/src/routes/_authed/runs.tsx index 7225927..b65365d 100644 --- a/src/routes/_authed/runs.tsx +++ b/src/routes/_authed/runs.tsx @@ -9,6 +9,28 @@ import { RunsTable } from "./-components/runs-table"; export const Route = createFileRoute("/_authed/runs")({ component: RunsPage, validateSearch: runsSearchSchema, + head: () => ({ + meta: [ + { + title: "Runs - Remote MCP", + }, + { + name: "description", + content: + "View and monitor your MCP server execution logs, track tool invocations, and debug AI assistant interactions.", + }, + { + name: "robots", + content: "noindex, nofollow", + }, + ], + links: [ + { + rel: "canonical", + href: "https://remotemcp.tech/runs", + }, + ], + }), }); function RunsPage() { diff --git a/src/routes/_authed/settings.tsx b/src/routes/_authed/settings.tsx index 3f070c8..99ce042 100644 --- a/src/routes/_authed/settings.tsx +++ b/src/routes/_authed/settings.tsx @@ -44,6 +44,28 @@ import { useLocalStorage } from "usehooks-ts"; export const Route = createFileRoute("/_authed/settings")({ component: RouteComponent, + head: () => ({ + meta: [ + { + title: "Settings - Remote MCP", + }, + { + name: "description", + content: + "Manage your Remote MCP account settings, configure AI providers, adjust MCP server preferences, and customize your experience.", + }, + { + name: "robots", + content: "noindex, nofollow", + }, + ], + links: [ + { + rel: "canonical", + href: "https://remotemcp.tech/settings", + }, + ], + }), }); function RouteComponent() { diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 89fcde5..0ebb7b5 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -88,6 +88,13 @@ export const Route = createFileRoute("/")({ content: "width=device-width, initial-scale=1", }, ], + links: [ + // Preconnect to external domains + { + rel: "preconnect", + href: "https://github.com", + }, + ], }; }, }); diff --git a/src/routes/login.tsx b/src/routes/login.tsx index 6c3cbfa..ce82aaa 100644 --- a/src/routes/login.tsx +++ b/src/routes/login.tsx @@ -39,6 +39,28 @@ export const Route = createFileRoute("/login")({ validateSearch: z.object({ from: z.string().optional(), }), + head: () => ({ + meta: [ + { + title: "Login - Remote MCP", + }, + { + name: "description", + content: + "Sign in to Remote MCP to manage your cloud MCP servers and connect AI assistants to your favorite apps. Login with GitHub or Google.", + }, + { + name: "robots", + content: "noindex, nofollow", + }, + ], + links: [ + { + rel: "canonical", + href: "https://remotemcp.tech/login", + }, + ], + }), }); // Schema for form validation diff --git a/vite.config.ts b/vite.config.ts index 7cd4e19..b3ca3d1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -19,6 +19,7 @@ const config = defineConfig({ externals: { inline: ['zod', 'nanoid'], }, + compatibilityDate: '2025-11-13' }), viteReact(), ],