Skip to content
Merged
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
8 changes: 2 additions & 6 deletions packages/landing/src/app/docs/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
import { DocPageView } from '@/docs/components/doc-page-view';
import { docSlugs, getDoc } from '@/docs/registry';
import { docMetadata } from '@/docs/seo';

export function generateStaticParams(): { slug: string }[] {
return docSlugs().map((slug) => ({ slug }));
Expand All @@ -15,12 +16,7 @@ export async function generateMetadata({
const { slug } = await params;
const doc = getDoc(slug);
if (!doc) return {};
return {
title: `${doc.title} - Docs`,
description: doc.lede,
alternates: { canonical: `/docs/${slug}` },
openGraph: { url: `/docs/${slug}` },
};
return docMetadata(doc);
}

export default async function DocSlugPage({
Expand Down
8 changes: 2 additions & 6 deletions packages/landing/src/app/docs/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@ import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
import { DocPageView } from '@/docs/components/doc-page-view';
import { getDoc } from '@/docs/registry';
import { docMetadata } from '@/docs/seo';

const doc = getDoc('');

export const metadata: Metadata = {
title: 'Docs - Agentage Memory',
description: doc?.lede,
alternates: { canonical: '/docs' },
openGraph: { url: '/docs' },
};
export const metadata: Metadata = doc ? docMetadata(doc) : {};

export default function DocsIndexPage() {
if (!doc) notFound();
Expand Down
2 changes: 2 additions & 0 deletions packages/landing/src/docs/components/doc-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Code,
MousePointerClick,
Bot,
Sparkles,
Wrench,
BookOpen,
Search,
Expand All @@ -29,6 +30,7 @@ const ICONS: Record<string, LucideIcon> = {
'VS Code': Code,
Cursor: MousePointerClick,
ChatGPT: Bot,
Grok: Sparkles,
CLI: Terminal,
'MCP tools': Wrench,
};
Expand Down
14 changes: 14 additions & 0 deletions packages/landing/src/docs/content/clients.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,19 @@ VS Code opens the browser for the OAuth sign-in on first use.`,

Paste \`${ENDPOINT}\` and sign in when prompted.`,
},
{
slug: 'grok',
nav: 'Grok',
title: 'Grok',
lede: 'Add Agentage Memory to Grok by pasting the MCP server URL.',
setup: `In Grok, add a custom MCP server and paste the endpoint URL:

\`\`\`text
${ENDPOINT}
\`\`\`

Grok opens the browser for the OAuth sign-in on first use - no API key.`,
},
];

const clientHref = (slug: string): string => `/docs/${slug}`;
Expand All @@ -93,6 +106,7 @@ export const clientDocs: DocPage[] = CLIENTS.map((c) => ({
slug: c.slug,
title: c.title,
lede: c.lede,
keywords: [c.nav, `${c.nav} MCP`, `connect ${c.nav}`, `${c.nav} memory`, `${c.nav} MCP server`],
sections: [
{
id: 'setup',
Expand Down
8 changes: 8 additions & 0 deletions packages/landing/src/docs/content/connect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ export const connectDoc: DocPage = {
slug: 'connect',
title: 'Connect any MCP client',
lede: 'A vendor-neutral guide to wiring any MCP-capable agent to Agentage Memory. The same endpoint and OAuth flow work everywhere - no API key.',
keywords: [
'connect MCP client',
'add MCP server',
'MCP setup',
'OAuth MCP',
'how to connect MCP',
'MCP server URL',
],
sections: [
{
id: 'basics',
Expand Down
8 changes: 8 additions & 0 deletions packages/landing/src/docs/content/mcp-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ export const mcpServerDoc: DocPage = {
slug: 'mcp-server',
title: 'MCP server',
lede: 'One cloud endpoint that every AI tool connects to over the Model Context Protocol. Sign in with OAuth - no API key - and read and write your memory through six tools.',
keywords: [
'MCP server',
'MCP endpoint',
'Streamable HTTP MCP',
'OAuth 2.1 MCP',
'memory tools',
'memory__search',
],
sections: [
{
id: 'endpoint',
Expand Down
7 changes: 7 additions & 0 deletions packages/landing/src/docs/content/overview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ export const overviewDoc: DocPage = {
slug: '',
title: 'Agentage Memory',
lede: 'One memory. Every AI. Owned by you. A shared markdown memory that all of your AI tools read and write through a single MCP endpoint.',
keywords: [
'one memory every AI',
'cross-vendor AI memory',
'files-first memory',
'own your AI memory',
'Claude ChatGPT Cursor memory',
],
sections: [
{
id: 'what-it-is',
Expand Down
36 changes: 36 additions & 0 deletions packages/landing/src/docs/seo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type { Metadata } from 'next';
import type { DocPage } from './types';

// Keywords shared by every docs page; per-page `keywords` are merged on top.
const BASE_KEYWORDS = [
'Agentage Memory',
'MCP',
'Model Context Protocol',
'shared memory',
'AI memory',
'markdown memory',
'memory.agentage.io',
];

export const docPath = (doc: DocPage): string => (doc.slug === '' ? '/docs' : `/docs/${doc.slug}`);

// Full, crawl-ready metadata for a docs page: title, description, merged
// keywords, self-canonical, and OpenGraph (the file-based OG image still
// applies). Used by both the index route and the [slug] route.
export function docMetadata(doc: DocPage): Metadata {
const path = docPath(doc);
const title = doc.slug === '' ? 'Docs - Agentage Memory' : `${doc.title} - Agentage Memory docs`;
const keywords = [...new Set([...BASE_KEYWORDS, ...(doc.keywords ?? [])])];
return {
title,
description: doc.lede,
keywords,
alternates: { canonical: path },
openGraph: {
title,
description: doc.lede,
url: path,
type: 'article',
},
};
}
2 changes: 2 additions & 0 deletions packages/landing/src/docs/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ export interface DocPage {
title: string;
/** One-line intro under the H1. */
lede: string;
/** Page-specific SEO keywords (merged with the shared docs keywords). */
keywords?: string[];
sections: DocSection[];
}

Expand Down