Next.js / Vercel
Next.js / Vercel
Make a Next.js app agent-ready: static files, route handlers, and OG metadata.
Next.js gives you typed APIs for every metadata signal AIScan looks at. App Router projects can move every fix from "a file you forgot to update" to "code reviewed in a PR".
Per-route metadata
Export metadata (or generateMetadata) per page and per layout:
// app/about/page.tsx
export const metadata = {
title: "About — Acme",
description: "How Acme came to be.",
alternates: { canonical: "https://acme.com/about" },
openGraph: {
title: "About — Acme",
description: "How Acme came to be.",
url: "https://acme.com/about",
type: "article",
},
};robots.ts / robots.txt
App Router supports a typed app/robots.ts that AIScan reads the same as a static file:
// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{ userAgent: "*", allow: "/" },
{ userAgent: ["GPTBot", "ClaudeBot", "PerplexityBot", "Google-Extended"], allow: "/" },
],
sitemap: "https://acme.com/sitemap.xml",
};
}sitemap.ts
// app/sitemap.ts
import type { MetadataRoute } from "next";
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts();
return [
{ url: "https://acme.com/", changeFrequency: "weekly", priority: 1.0 },
...posts.map((p) => ({
url: `https://acme.com/blog/${p.slug}`,
lastModified: p.updatedAt,
})),
];
}Public & .well-known files
Drop llms.txt, CLAUDE.md, aiscan-skill.json, and any .well-known/* files into public/. Next.js serves them at the matching site path. For dynamic content (an MCP server card derived from your DB), expose a route handler at app/.well-known/mcp/server-card.json/route.ts that returns JSON.
Edge headers (Vercel)
Add a Link response header in middleware.ts or vercel.json:
// vercel.json
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Link", "value": "</.well-known/api-catalog>; rel=\"api-catalog\"" }
]
}
]
}