MetaForge Pro
Free SEO Meta Tag & Schema Generator
Enter any URL and keyword to get SEO/AIO/GEO optimized meta titles, descriptions, and custom JSON-LD schema markup — all under character limits.
Meta Titles
Click any variation to select it for preview and export. All titles are 60 characters or less.
Meta Descriptions
SEO + AIO + GEO optimized descriptions — all 160 characters or less.
Custom JSON-LD Schema
Paste this into your page’s <head> section.
Page SEO Analysis
Issues & Recommendations
Export Ready-to-Use Code
Copy the selected meta tags and schema, ready to paste into your page <head>.
n';mf$('mfExpCode').textContent=c}
function mfCopySchema(){mfCopy(mfGenSch)}
function mfCopyExport(){mfCopy(mf$('mfExpCode').textContent)}
function mfDl(fmt){var c,fn,tp;if(fmt==='html'){c=mf$('mfExpCode').textContent;fn='meta-tags.html';tp='text/html'}else if(fmt==='json'){c=mfGenSch;fn='schema.json';tp='application/json'}else{c='META TITLE:n'+mfSelT+'nnMETA DESCRIPTION:n'+mfSelD+'nnSCHEMA:n'+mfGenSch;fn='meta-export.txt';tp='text/plain'}var bl=new Blob([c],{type:tp}),lk=document.createElement('a');lk.href=URL.createObjectURL(bl);lk.download=fn;lk.click();URL.revokeObjectURL(lk.href);mfToast('Downloaded '+fn)}
async function mfGenerate(){var url=mf$('mfUrl').value.trim(),kw=mf$('mfKw').value.trim();if(!url||!kw){mfToast('Enter both URL and keyword');return}var btn=mf$('mfGenBtn'),ld=mf$('mfLoader');btn.disabled=true;ld.classList.add('active');mf$('mfResults').classList.remove('visible');mf$('mfLdTxt').textContent='Fetching page content...';
try{var html=await mfFetch(url);mf$('mfLdTxt').textContent='Analyzing page content...';mfPD=mfParse(html,url);var pt=mf$('mfPt').value;if(pt==='auto'){pt=mfDetect(mfPD,url);mf$('mfPt').value=pt}var loc=mf$('mfLoc').value.trim(),bn=mf$('mfBn').value.trim();mf$('mfLdTxt').textContent='Generating optimized meta tags...';
var titles=mfGenTitles(mfPD,kw,loc,bn,pt);mfRenderT(titles);if(titles.length>0)mfSelT=titles[0].text;
var descs=mfGenDescs(mfPD,kw,loc,bn,pt);mfRenderD(descs);if(descs.length>0)mfSelD=descs[0].text;
mf$('mfLdTxt').textContent='Building custom schema...';mfGenSch=mfGenSchema(mfPD,kw,loc,pt);mf$('mfSchCode').textContent=mfGenSch;mfUpdPreview();var an=mfAnalyze(mfPD,kw);mfRenderAn(an);mfUpdExport();
ld.classList.remove('active');mf$('mfResults').classList.add('visible');mf$('mfResults').scrollIntoView({behavior:'smooth',block:'start'})}catch(e){ld.classList.remove('active');mfToast('Error: '+e.message)}btn.disabled=false}