From memstack
Scans web pages for HTML meta tags, audits titles, descriptions, Open Graph, and canonicals, then generates SEO-optimized replacements. For improving SERP previews and click-through rates.
npx claudepluginhub cwinvestments/memstack --plugin memstackThis skill uses the workspace's default tool permissions.
*Scans all pages for existing meta tags, identifies issues, and generates optimized replacements β titles, descriptions, Open Graph, canonical URLs, and robots directives.*
Audits and corrects meta tags for SEO (title, description, canonical, viewport, lang) and social sharing (Open Graph, Twitter Cards) across website pages. Generates reports and ready-to-use HTML fixes.
Scans URLs or local HTML files to generate missing SEO, Open Graph, and Twitter Card meta tags using AI. Useful when improving social sharing previews and search rankings.
Audits and fixes HTML metadata including titles, meta descriptions, canonical URLs, Open Graph tags, Twitter cards, favicons, JSON-LD structured data, and robots directives. Use when adding or reviewing SEO and social metadata.
Share bugs, ideas, or general feedback.
Scans all pages for existing meta tags, identifies issues, and generates optimized replacements β titles, descriptions, Open Graph, canonical URLs, and robots directives.
When this skill activates, output:
π·οΈ Meta Tag Optimizer β Scanning pages for meta tag issues...
Then execute the protocol below.
| Context | Status |
|---|---|
| User says "optimize meta tags" or "fix meta tags" | ACTIVE |
| User says "title tags" or "meta description" or "og tags" | ACTIVE |
| Improving SEO for specific pages | ACTIVE |
| Running a full site audit (broader scope) | DORMANT β use site-audit |
| Adding structured data / JSON-LD | DORMANT β use schema-markup |
| Trap | Reality Check |
|---|---|
| "Same meta description on every page" | Duplicate descriptions get ignored by Google. Each page needs unique, relevant meta. |
| "Title = just the page name" | "About" tells Google nothing. "About [Company] - [Key Differentiator]" ranks. |
| "OG tags are optional" | Without og:image, your shared links look broken on social. No image = no clicks. |
| "Canonical URLs don't matter" | Duplicate content splits ranking signals. Canonical tags consolidate authority to one URL. |
| "Longer titles rank better" | Google truncates after ~60 chars. Truncated titles look unprofessional and lose clicks. |
Identify every page and its current meta tags:
# Find all page/route files
find app/ pages/ src/ -name "*.tsx" -o -name "*.jsx" -o -name "*.html" 2>/dev/null | grep -v node_modules | grep -v "_\|layout\|loading\|error\|not-found"
# Next.js metadata exports
grep -rn "export const metadata\|export function generateMetadata" --include="*.tsx" --include="*.ts" . | grep -v node_modules
# Check for global/shared metadata
cat app/layout.tsx 2>/dev/null | head -30
Build the page inventory:
| Page | Route | Has Title | Has Description | Has OG | Has Canonical |
|---|---|---|---|---|---|
| Homepage | / | ? | ? | ? | ? |
| About | /about | ? | ? | ? | ? |
| Pricing | /pricing | ? | ? | ? | ? |
| Blog index | /blog | ? | ? | ? | ? |
| Blog post | /blog/[slug] | ? | ? | ? | ? |
| ... | ... | ... | ... | ... | ... |
# Find all title definitions
grep -rn "title:" --include="*.tsx" --include="*.ts" . | grep -v node_modules | grep -v "\.test\.\|\.spec\."
Title tag rules:
| Rule | Requirement | Check |
|---|---|---|
| Unique per page | No two pages share the same title | Compare all titles |
| Length | 50-60 characters | Count characters |
| Keyword placement | Primary keyword in first 40 chars | Review keyword position |
| Brand suffix | " - [Brand]" or " | [Brand]" at end | Consistent format |
| No keyword stuffing | Keyword appears once, naturally | Read aloud test |
| Compelling | Would you click this in search results? | Subjective but critical |
Title optimization formula:
[Primary Keyword]: [Value Proposition] | [Brand]
Examples:
# Find all description definitions
grep -rn "description:" --include="*.tsx" --include="*.ts" . | grep -v node_modules | grep -v "\.test\.\|\.spec\."
Description rules:
| Rule | Requirement | Check |
|---|---|---|
| Unique per page | No duplicates | Compare all descriptions |
| Length | 150-155 characters | Count characters |
| Includes keyword | Primary keyword present | Keyword search |
| Includes CTA | Action-oriented language | Look for verbs |
| Matches page content | Description reflects actual content | Manual review |
| No truncation | Complete thought within limit | Check ending |
Description formula:
[What the page offers]. [Specific benefit or differentiator]. [CTA - action verb].
Examples:
# Find OG tag definitions
grep -rn "openGraph\|og:" --include="*.tsx" --include="*.ts" --include="*.html" . | grep -v node_modules
Required OG tags per page:
| Tag | Required | Specification |
|---|---|---|
og:title | Yes | Can differ from <title> β optimize for social, not search |
og:description | Yes | Can differ from meta description β more casual tone ok |
og:image | Yes | 1200x630px, < 5MB, shows product/brand/visual |
og:url | Yes | Canonical URL of the page |
og:type | Yes | website for homepage, article for blog posts |
og:site_name | Recommended | Brand name |
twitter:card | Recommended | summary_large_image for image-heavy shares |
twitter:title | Recommended | Can match og:title |
twitter:description | Recommended | Can match og:description |
twitter:image | Recommended | Can match og:image |
Common og:image issues:
/images/og.png) β must be absolute URL# Find canonical definitions
grep -rn "canonical\|alternates" --include="*.tsx" --include="*.ts" --include="*.html" . | grep -v node_modules
Canonical URL rules:
| Check | Rule | Common Mistake |
|---|---|---|
| Self-referencing | Every page canonicals to itself | Missing canonical = Google guesses |
| Consistency | Always use one format (www vs non-www, trailing slash vs not) | Mixed formats split authority |
| HTTPS | Canonical always uses https:// | http:// canonical on https:// page |
| Absolute URL | Full URL, not relative path | /about instead of https://domain.com/about |
| No noindex + canonical conflict | Don't canonical to a noindexed page | Contradictory signals |
| Pagination | Paginated pages canonical to themselves or page 1 | All pages canonical to page 1 (outdated pattern) |
Duplicate content scenarios requiring canonicals:
/products?sort=price β canonical to /productswww.example.com/about β canonical to example.com/abouthttp:// β canonical to https:///about/ β canonical to /about (pick one)/about/print β canonical to /about# Find robots meta directives
grep -rn "robots\|noindex\|nofollow" --include="*.tsx" --include="*.ts" --include="*.html" . | grep -v node_modules
Pages that SHOULD have noindex:
| Page Type | Directive | Why |
|---|---|---|
| Admin dashboard | noindex, nofollow | Internal tool, not for search |
| Login / register | noindex, follow | Auth pages waste crawl budget |
| Search results | noindex, follow | Dynamic pages with thin content |
| Thank you / confirmation | noindex, nofollow | Post-conversion, no search value |
| Staging / preview | noindex, nofollow | Duplicate content with production |
| User profiles (if private) | noindex, nofollow | Privacy concern |
Pages that should NOT have noindex:
noindex on important pages (common after staging β production migration)For every failing tag, generate the corrected version:
## Optimized Meta Tags
### / (Homepage)
**Current:**
- Title: "Home"
- Description: (missing)
- OG Image: (missing)
**Recommended:**
```tsx
export const metadata: Metadata = {
title: 'Acme - Project Management for Remote Teams',
description: 'Manage projects 3x faster with real-time collaboration, task tracking, and team dashboards. Built for remote teams. Start free today.',
openGraph: {
title: 'Acme - Project Management for Remote Teams',
description: 'All-in-one project management for distributed teams. Real-time collaboration, built-in reporting.',
images: [{ url: 'https://acme.com/og/homepage.png', width: 1200, height: 630 }],
url: 'https://acme.com',
type: 'website',
siteName: 'Acme',
},
twitter: {
card: 'summary_large_image',
},
alternates: {
canonical: 'https://acme.com',
},
};
Current:
Recommended:
export const metadata: Metadata = {
title: 'Pricing - Acme Plans Starting at $0/mo',
description: 'Compare Acme plans: Free, Pro ($19/mo), and Enterprise. All plans include unlimited projects and real-time collaboration. Start free today.',
// ... (full OG tags)
};
### Step 8: Output Tag Report
π·οΈ Meta Tag Optimizer β Complete
Pages scanned: [count] Issues found: [count]
Summary: Title tags: [X/count] optimized β [count] need fixing Descriptions: [X/count] optimized β [count] need fixing OG tags: [X/count] complete β [count] missing Canonical URLs: [X/count] correct β [count] missing or wrong Robots meta: [X/count] correct β [count] need review
Page-by-page comparison:
| Page | Title (current β recommended) | Description | OG | Canonical |
|---|---|---|---|---|
| / | "Home" β "Acme - PM for Remote Teams" | β missing | β missing | β missing |
| /about | "About" β "About Acme - Built by Devs" | β οΈ too short | β ok | β ok |
| /blog | β ok | β ok | β no image | β ok |
| /pricing | β οΈ too short | β οΈ generic | β ok | β missing |
Next steps:
## Level History
- **Lv.1** β Base: Page scanning, title tag audit (50-60 chars, keyword placement), meta description audit (150-155 chars, CTA), Open Graph tags (og:title/description/image), canonical URL verification, robots meta directives, optimized replacement generation, page-by-page comparison output. (Origin: MemStack Pro v3.2, Mar 2026)