Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified public/firecrawl-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 9 additions & 1 deletion public/robots.txt
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions public/sitemap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://remotemcp.tech/</loc>
<lastmod>2024-12-01</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
</urlset>
4 changes: 4 additions & 0 deletions src/components/AppLogo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ export const AppLogo = ({
src={logo.url}
alt={appName}
className={className}
loading="lazy"
decoding="async"
width="40"
height="40"
Comment on lines +26 to +27
Copy link

Copilot AI Nov 14, 2025

Choose a reason for hiding this comment

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

The hardcoded width="40" and height="40" attributes may not match all use cases of the AppLogo component. If the component is used with different sizes via the className prop, these fixed dimensions could cause aspect ratio issues or conflict with CSS sizing. Consider making these dimensions configurable via props or ensuring they match the default CSS dimensions defined in className.

Copilot uses AI. Check for mistakes.
onError={(e) => {
const target = e.target as HTMLImageElement;
target.src = "/favicon.ico";
Expand Down
3 changes: 2 additions & 1 deletion src/components/landing/AvailableAppsSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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" }}
Copy link

Copilot AI Nov 14, 2025

Choose a reason for hiding this comment

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

[nitpick] The margin: "100px" viewport option causes animations to trigger 100px before elements enter the viewport. While this creates a smoother user experience, it may cause performance issues on pages with many animated elements, as animations will start rendering off-screen. Consider reducing this value (e.g., "50px") or measuring the performance impact on lower-end devices.

Suggested change
viewport={{ once: true, margin: "100px" }}
viewport={{ once: true, margin: "50px" }}

Copilot uses AI. Check for mistakes.
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" }}
>
<div className="flex items-center space-x-4 mb-4 relative z-10">
<AppLogo
Expand Down
7 changes: 5 additions & 2 deletions src/components/landing/HeroSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export function HeroSection() {
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.8 }}
className="text-left space-y-8"
style={{ willChange: "opacity, transform" }}
>
{/* Logo */}
<motion.div
Expand Down Expand Up @@ -159,6 +160,7 @@ export function HeroSection() {
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.8, delay: 0.4 }}
className="relative"
style={{ willChange: "opacity, transform" }}
>
{/* Video Container */}
<div className="relative bg-gradient-to-br from-gray-900 to-gray-800 rounded-2xl border border-gray-700 overflow-hidden shadow-2xl">
Expand Down Expand Up @@ -188,9 +190,9 @@ export function HeroSection() {
{/* Overlay Text */}
<div className="absolute bottom-4 left-4 right-4">
<div className="bg-black/40 backdrop-blur-sm rounded-lg p-3 border border-white/20">
<h3 className="text-white font-semibold text-sm mb-1">
<p className="text-white font-semibold text-sm mb-1">
See Remote MCP in Action
</h3>
</p>
<p className="text-gray-300 text-xs">
Watch how to connect AI agents to external tools in
minutes
Expand All @@ -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);
Expand Down
23 changes: 22 additions & 1 deletion src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,35 @@ export const Route = createRootRouteWithContext<MyRouterContext>()({
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: [
{
rel: "stylesheet",
href: appCss,
},
{
rel: "icon",
href: "/favicon.ico",
},
{
rel: "canonical",
href: "https://remotemcp.tech",
},
],
}),
shellComponent: RootDocument,
Expand Down
22 changes: 22 additions & 0 deletions src/routes/_authed/chat.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 = () => (
Expand Down
22 changes: 22 additions & 0 deletions src/routes/_authed/runs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
22 changes: 22 additions & 0 deletions src/routes/_authed/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
7 changes: 7 additions & 0 deletions src/routes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
},
Comment on lines +93 to +96
Copy link

Copilot AI Nov 14, 2025

Choose a reason for hiding this comment

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

[nitpick] Preconnecting to https://github.com without a crossorigin attribute may not be effective if GitHub resources are served from a different subdomain or require CORS. Consider adding the crossorigin attribute if this is intended for loading resources from GitHub's CDN or API endpoints. Additionally, verify that GitHub resources are actually loaded on the homepage to justify this preconnect hint.

Suggested change
{
rel: "preconnect",
href: "https://github.com",
},

Copilot uses AI. Check for mistakes.
],
};
},
});
Expand Down
22 changes: 22 additions & 0 deletions src/routes/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const config = defineConfig({
externals: {
inline: ['zod', 'nanoid'],
},
compatibilityDate: '2025-11-13'
}),
viteReact(),
],
Expand Down
Loading