> ## Documentation Index
> Fetch the complete documentation index at: https://seilabs-docs-agent-skills-registry-and-templates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Skills registry

> Install Sei Foundation agent skills into your AI coding assistant with one command. Each skill teaches your assistant one area of Sei: contracts, frontend, precompiles, nodes, payments, security, bridges, or migration.

export const SkillsRegistry = () => {
  const SKILLS = [{
    id: 'sei-contracts',
    title: 'Smart Contracts',
    domain: 'Contracts',
    href: '/evm/evm-general',
    desc: 'Foundry and Hardhat setup, the Sei gas model, OCC-aware contract design, and verifying on Seiscan via Sourcify.'
  }, {
    id: 'sei-frontend',
    title: 'Frontend',
    domain: 'Frontend',
    href: '/evm/building-a-frontend',
    desc: 'wagmi + viem chain config, Sei Global Wallet, dual-address UX, and fast-finality patterns for 400ms blocks.'
  }, {
    id: 'sei-precompiles',
    title: 'Precompiles',
    domain: 'Precompiles',
    href: '/evm/precompiles/example-usage',
    desc: 'Call Sei precompiles — Staking, Governance, Distribution, JSON, P256, and Addr — from Solidity and viem, and skip the retired Oracle and IBC ones.'
  }, {
    id: 'sei-nodes',
    title: 'Nodes & Validators',
    domain: 'Infrastructure',
    href: '/node',
    desc: 'Run full nodes and validators: state sync, snapshots, monitoring, and the SeiDB storage backend.'
  }, {
    id: 'sei-payments',
    title: 'Payments',
    domain: 'Payments',
    href: '/ai/x402',
    desc: 'Accept and send payments on Sei with USDC and x402 HTTP-native micropayments.'
  }, {
    id: 'sei-security',
    title: 'Security',
    domain: 'Security',
    href: '/evm/debugging-contracts',
    desc: 'Simulate-before-write, safe randomness, address-association checks, and AI-agent safety guardrails.'
  }, {
    id: 'sei-bridges',
    title: 'Bridges',
    domain: 'Bridges',
    href: '/evm/bridging/layerzero',
    desc: 'Bridge assets to and from Sei with LayerZero V2 OFTs and Circle CCTP v2 for native USDC, and why IBC no longer moves assets.'
  }, {
    id: 'sei-migration',
    title: 'Migration',
    domain: 'Migration',
    href: '/evm/migrate-from-other-evms',
    desc: 'Port EVM and Solana apps to Sei — the behavioral deltas that break a naive port, plus a Solana-to-Sei concept map.'
  }];
  const INSTALL_CMD = 'npx skills add https://docs.sei.io';
  const FILTERS = ['All', 'Contracts', 'Frontend', 'Precompiles', 'Infrastructure', 'Payments', 'Security', 'Bridges', 'Migration'];
  const [isDark, setIsDark] = useState(true);
  useLayoutEffect(() => {
    const el = document.documentElement;
    const update = () => setIsDark(el.classList.contains('dark'));
    update();
    const obs = new MutationObserver(update);
    obs.observe(el, {
      attributes: true,
      attributeFilter: ['class']
    });
    return () => obs.disconnect();
  }, []);
  const [filter, setFilter] = useState('All');
  const [filterHover, setFilterHover] = useState(null);
  const Icon = ({domain, size = 22}) => {
    const common = {
      xmlns: 'http://www.w3.org/2000/svg',
      width: size,
      height: size,
      viewBox: '0 0 24 24',
      fill: 'none',
      stroke: 'currentColor',
      strokeWidth: 1.8,
      strokeLinecap: 'round',
      strokeLinejoin: 'round',
      'aria-hidden': true
    };
    if (domain === 'Contracts') return <svg {...common}>
					<path d="M16 18l6-6-6-6" />
					<path d="M8 6l-6 6 6 6" />
				</svg>;
    if (domain === 'Frontend') return <svg {...common}>
					<rect x="2" y="3" width="20" height="14" rx="2" />
					<path d="M8 21h8M12 17v4" />
				</svg>;
    if (domain === 'Precompiles') return <svg {...common}>
					<rect x="4" y="4" width="16" height="16" rx="2" />
					<path d="M9 9h6v6H9zM2 9h2M2 15h2M20 9h2M20 15h2M9 2v2M15 2v2M9 20v2M15 20v2" />
				</svg>;
    if (domain === 'Infrastructure') return <svg {...common}>
					<rect x="2" y="4" width="20" height="6" rx="2" />
					<rect x="2" y="14" width="20" height="6" rx="2" />
					<path d="M6 7h.01M6 17h.01" />
				</svg>;
    if (domain === 'Payments') return <svg {...common}>
					<rect x="2" y="5" width="20" height="14" rx="2" />
					<path d="M2 10h20" />
				</svg>;
    if (domain === 'Security') return <svg {...common}>
					<path d="M12 3l8 4v5c0 5-3.4 8-8 9-4.6-1-8-4-8-9V7z" />
					<path d="M9 12l2 2 4-4" />
				</svg>;
    if (domain === 'Bridges') return <svg {...common}>
					<path d="M2 17 Q12 6 22 17" />
					<path d="M2 17v3M22 17v3M8 12.5V20M16 12.5V20" />
				</svg>;
    if (domain === 'Migration') return <svg {...common}>
					<path d="M3 8h13M13 5l3 3-3 3" />
					<path d="M21 16H8M11 13l-3 3 3 3" />
				</svg>;
    return <svg {...common}>
				<circle cx="12" cy="12" r="9" />
			</svg>;
  };
  const CopyIcon = ({size = 14}) => <svg xmlns="http://www.w3.org/2000/svg" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
			<rect x="9" y="9" width="13" height="13" rx="2" />
			<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
		</svg>;
  const CheckIcon = ({size = 14}) => <svg xmlns="http://www.w3.org/2000/svg" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
			<path d="M20 6L9 17l-5-5" />
		</svg>;
  const ArrowRightIcon = ({size = 14, style}) => <svg xmlns="http://www.w3.org/2000/svg" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" style={style} aria-hidden="true">
			<path d="M5 12h14M12 5l7 7-7 7" />
		</svg>;
  const [SkillCard] = useState(() => ({skill, isDark}) => {
    const [hover, setHover] = useState(false);
    const [copied, setCopied] = useState(false);
    const [copyHover, setCopyHover] = useState(false);
    const [linkHover, setLinkHover] = useState(false);
    const copy = async () => {
      try {
        await navigator.clipboard.writeText(INSTALL_CMD);
        setCopied(true);
        setTimeout(() => setCopied(false), 1600);
      } catch (e) {}
    };
    const accent = isDark ? 'var(--sei-maroon-25)' : 'var(--sei-maroon-100)';
    const linkColor = isDark ? linkHover ? 'var(--sei-cream)' : 'var(--sei-maroon-25)' : 'var(--sei-maroon-100)';
    return <div onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} className="flex flex-col h-full p-5 transition-all duration-200" style={{
      backgroundColor: hover ? 'rgba(128,128,128,0.10)' : 'rgba(128,128,128,0.05)',
      border: '1px solid rgba(128,128,128,0.20)',
      borderRadius: '12px',
      transform: hover ? 'translateY(-2px)' : 'none'
    }}>
				<div className="flex items-center gap-3 mb-3">
					<span className="inline-flex items-center justify-center" style={{
      width: 40,
      height: 40,
      borderRadius: 10,
      backgroundColor: isDark ? 'rgba(185,155,161,0.14)' : 'rgba(96,0,20,0.08)',
      color: accent,
      flexShrink: 0
    }}>
						<Icon domain={skill.domain} />
					</span>
					<div className="flex flex-col">
						<h3 className="text-base font-semibold text-neutral-900 dark:text-neutral-100 leading-tight" style={{
      margin: 0
    }}>
							{skill.title}
						</h3>
						<code className="text-xs text-neutral-500 dark:text-neutral-400" style={{
      fontFamily: 'var(--sei-font-mono)'
    }}>
							{skill.id}
						</code>
					</div>
				</div>

				<p className="text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed flex-grow" style={{
      marginTop: 0
    }}>
					{skill.desc}
				</p>

				<div className="flex items-center justify-between gap-3 mt-4">
					<span className="inline-flex items-center text-xs font-medium px-2 py-0.5" style={{
      color: accent,
      backgroundColor: isDark ? 'rgba(185,155,161,0.12)' : 'rgba(96,0,20,0.07)',
      borderRadius: 999
    }}>
						{skill.domain}
					</span>
					<a href={skill.href} aria-label={`View ${skill.title} docs`} onMouseEnter={() => setLinkHover(true)} onMouseLeave={() => setLinkHover(false)} className="inline-flex items-center gap-1 text-sm font-medium no-underline" style={{
      color: linkColor,
      transition: 'color 0.2s'
    }}>
						<span>View docs</span>
						<ArrowRightIcon size={13} style={{
      transform: linkHover ? 'translateX(0.2rem)' : 'none',
      transition: 'transform 0.25s'
    }} />
					</a>
				</div>

				<button type="button" onClick={copy} onMouseEnter={() => setCopyHover(true)} onMouseLeave={() => setCopyHover(false)} className="inline-flex items-center justify-between gap-2 w-full mt-3 px-3 py-2 text-left" style={{
      backgroundColor: copyHover ? 'rgba(128,128,128,0.12)' : 'rgba(128,128,128,0.06)',
      border: '1px solid rgba(128,128,128,0.20)',
      borderRadius: 8,
      cursor: 'pointer'
    }} aria-label="Copy the Sei Foundation skills install command">
					<code className="text-xs text-neutral-700 dark:text-neutral-300 truncate" style={{
      fontFamily: 'var(--sei-font-mono)'
    }}>
						{INSTALL_CMD}
					</code>
					<span className="inline-flex items-center shrink-0" style={{
      color: copied ? isDark ? '#34d399' : '#059669' : accent
    }}>
						{copied ? <CheckIcon /> : <CopyIcon />}
					</span>
				</button>
			</div>;
  });
  const visible = filter === 'All' ? SKILLS : SKILLS.filter(s => s.domain === filter);
  return <div>
			{}
			<div className="flex flex-wrap gap-2 mb-6">
				{FILTERS.map(f => {
    const active = filter === f;
    const hovered = filterHover === f;
    return <button key={f} type="button" onClick={() => setFilter(f)} onMouseEnter={() => setFilterHover(f)} onMouseLeave={() => setFilterHover(null)} className="text-sm font-medium px-3 py-1.5 transition-colors" style={{
      borderRadius: 999,
      cursor: 'pointer',
      color: active ? '#ffffff' : isDark ? '#d4d4d4' : '#404040',
      backgroundColor: active ? 'var(--sei-maroon-100)' : hovered ? 'rgba(128,128,128,0.14)' : 'rgba(128,128,128,0.07)',
      border: '1px solid rgba(128,128,128,0.20)'
    }}>
							{f}
						</button>;
  })}
			</div>

			{}
			<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5">
				{visible.map(skill => <SkillCard key={skill.id} skill={skill} isDark={isDark} />)}
			</div>

			{visible.length === 0 && <div className="py-10 text-sm text-neutral-500 dark:text-neutral-400 italic">No skills in this category yet.</div>}
		</div>;
};

Sei Foundation publishes **agent skills**: focused, installable knowledge packs that make your AI coding assistant Sei-aware. This docs site hosts them in the open [`skill.md`](https://www.mintlify.com/docs/ai/skillmd) format, so any assistant that supports agent skills, such as Claude Code or Cursor, can install them.

## Install

Run the `skills` CLI against this site:

```bash theme={null}
npx skills add https://docs.sei.io
```

The CLI lists every skill this site serves and installs the ones you choose.

## Foundation skills

Filter by area to find what fits your project. Every card copies the same install command, so you can pick only the skills you need and keep your assistant's context small.

<SkillsRegistry />

## How the skills work

Each Foundation skill is a single `SKILL.md` file. Its frontmatter tells an assistant **when** to use it, and the body is a focused playbook of Sei-specific facts, code, and pitfalls.

<CardGroup cols={2}>
  <Card title="Discoverable by agents" icon="rss">
    Agents can list every skill at `docs.sei.io/.well-known/agent-skills/index.json` (or the older `/.well-known/skills/index.json`) and fetch any `SKILL.md` directly, with no install step. Agents connected to the docs MCP server also get them as MCP resources.
  </Card>

  <Card title="Generated from sei-skill" icon="code-branch">
    Skill content comes from [`sei-protocol/sei-skill`](https://github.com/sei-protocol/sei-skill). A sync workflow regenerates the files in this repo and opens a pull request for review, and the site serves them once it merges. To fix or extend a skill, open a pull request in sei-skill.
  </Card>
</CardGroup>

## Focused skills or the full sei-skill

Each Foundation skill covers one area. To load one knowledge base that covers every area at once, install the full [sei-skill](/ai/sei-skill) from its repository instead.

| Use a Foundation skill when | Use the full [sei-skill](/ai/sei-skill) when |
| - | - |
| You work mostly in one area, such as contracts | You want every area in one install |
| You want to keep your assistant's context small | You're starting a Sei project from scratch |
| You're composing your own set of skills | You want the full reference files from the sei-skill repository |

## Publish your own skill

Ecosystem teams can publish skills for their own protocols. Any Mintlify site serves the skills in its `.mintlify/skills/` directory, and developers install them with `npx skills add` and your docs URL. Foundation skill content lives in [`sei-protocol/sei-skill`](https://github.com/sei-protocol/sei-skill).

## Next steps

<CardGroup cols={2}>
  <Card title="sei-skill" icon="brain" href="/ai/sei-skill">
    The full knowledge base, with per-assistant install steps and example prompts.
  </Card>

  <Card title="MCP Server" icon="plug" href="/ai/mcp-server">
    Give your assistant live on-chain access: read balances, send transactions, and query network state.
  </Card>
</CardGroup>
