Skip to main content
Glama
README.md
# ๐Ÿงช Open Cosmetics / ๅผ€ๆ”พ็พŽๅฆ†ๆ•ฐๆฎ

> **B2B ๅŒ–ๅฆ†ๅ“ๆ•ฐๆฎ MCP + Next.js** โ€” ไธญๅ›ฝ + ๆฌง็›Ÿ + ็พŽๅ›ฝ + ๅˆๆˆ็”Ÿ็‰ฉ ยท 8 ็ปดๅบฆๅŽŸๆ–™ๆ•ฐๆฎๅบ“ ยท 65 ้ฃŽ้™ฉ่ง„ๅˆ™ ยท Claude / GPT ๅฏ็›ดๆŽฅ่ฐƒ็”จ็š„ MCP server
>
> **B2B cosmetics data MCP + Next.js** โ€” China + EU + US + synthetic biology ยท 8-dim ingredient DB ยท 65 risk rules ยท MCP server callable from Claude / GPT

[![DuckDB](https://img.shields.io/badge/DuckDB-v4.0-yellow)]()
[![Next.js](https://img.shields.io/badge/Next.js-15-black)]()
[![MCP](https://img.shields.io/badge/MCP-v0.2-green)]()
[![License: CC-BY 4.0](https://img.shields.io/badge/License-CC--BY%204.0-blue.svg)](https://creativecommons.org/licenses/by/4.0/)
[![GitHub stars](https://img.shields.io/github/stars/AndyZhuang/opencosmetics)](https://github.com/AndyZhuang/opencosmetics)
[![i18n](https://img.shields.io/badge/i18n-ไธญ%2FEN-purple)]()

---

## ๐ŸŒ Bilingual / ๅŒ่ฏญ

The site supports **3 display modes**, switchable from the nav bar:
- ๐ŸŒ **ไธญ+EN** (default) โ€” both languages
- ๐Ÿ‡จ๐Ÿ‡ณ **ไธญๆ–‡** โ€” Chinese only
- ๐Ÿ‡บ๐Ÿ‡ธ **EN** โ€” English only

API responses include a `lang` field; pass `?lang=en` or `?lang=zh` (or `Cookie: opencosmetics_lang=...`) to switch.

---

## โœจ Features / ็‰นๆ€ง

| | EN | ไธญ |
|---|---|---|
| ๐Ÿ‡ช๐Ÿ‡บ **EU ๆณ•่ง„** | 50,169 CosIng + 1,927 regulatory (Annex II/III/IV/V/VI) | 50,169 CosIng + 1,927 ็›‘็ฎก (Annex II/III/IV/V/VI) |
| ๐Ÿ‡จ๐Ÿ‡ณ **ไธญๅ›ฝๆณ•่ง„** | 8,985 NMPA IECIC I + 2 IECIC II + 113 paragraphs adjustments | 8,985 NMPA IECIC I + 2 IECIC II + 113 ๆฎต่ฐƒๆ•ด |
| ๐Ÿ‡บ๐Ÿ‡ธ **FDA ไบ‹ไปถ** | 85,511 cosmetic events + 4-dim aggregation | 85,511 ๅŒ–ๅฆ†ๅ“ไบ‹ไปถ + 4 ็ปดๅบฆ่šๅˆ |
| ๐Ÿงฌ **ๅˆๆˆ็”Ÿ็‰ฉ** | 4 listed companies (Juzi/Jinbo/Huaxi/Chuangjian) | 4 ไธŠๅธ‚ (ๅทจๅญ/้”ฆๆณข/ๅŽ็†™/ๅˆ›ๅฅ) |
| โš–๏ธ **้ฃŽ้™ฉ่ง„ๅˆ™** | 65 rules ร— 7 categories (compat/pH/conc/pop/region/synbio/FDA) | 65 ่ง„ๅˆ™ ร— 7 ็ฑป (ๅ…ผๅฎน/pH/ๆต“ๅบฆ/็‰นๆฎŠไบบ็พค/ๅŒบๅŸŸ/ๅˆๆˆ็”Ÿ็‰ฉ/FDA) |
| ๐Ÿ“‹ **ๅคšๅœฐๅŒบๅˆ่ง„** | CN / EU / US / KR / JP / ASEAN | CN / EU / US / KR / JP / ASEAN |
| ๐Ÿ›ก๏ธ **GB 7916-2026** | First mandatory national standard (effective 2028-01-01) | ้ฆ–ไธชๅผบๅˆถๆ€งๅ›ฝๆ ‡ (2028-01-01 ๅฎžๆ–ฝ) |
| ๐Ÿค– **MCP** | TypeScript SDK stdio + HTTP, 4 tools | TypeScript SDK stdio + HTTP, 4 ๅทฅๅ…ท |

## ๐Ÿš€ Quick Start / ๅฟซ้€Ÿๅผ€ๅง‹

### 1. Web (5 minutes / 5 ๅˆ†้’Ÿ)
```bash
git clone https://github.com/AndyZhuang/opencosmetics.git
cd opencosmetics
npm install
npm run dev
# โ†’ http://localhost:3000
```

### 2. MCP server (Claude Desktop)
```json
// ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "opencosmetics": {
      "command": "node",
      "args": ["/path/to/opencosmetics/mcp-server/dist/index.js"]
    }
  }
}
```

### 3. Direct DuckDB
```bash
duckdb data/bebd.duckdb
> SELECT * FROM cn_iecic_i WHERE inci_name ILIKE '%RETINOL%' LIMIT 5;
> SELECT * FROM annex_ii_prohibited WHERE LOWER("Chemical name / INN") LIKE '%nitroglycerin%';
```

## ๐Ÿ“Š Data Scale / ๆ•ฐๆฎ่ง„ๆจก

| Table | Records | Source |
|---|---|---|
| `cosing` | 50,169 | EU CosIng (unified) |
| `cosing_lite` | 28,354 | beauteeru (PubChem) |
| `cosing_obf` | 24,127 | OBF CosIng full |
| `annex_ii_prohibited` | 1,431 | EU Banned |
| `annex_iii_restricted` | 309 | EU Restricted |
| `annex_iv_colorants` | 153 | EU Colorants |
| `annex_v_preservatives` | 56 | EU Preservatives |
| `annex_vi_uv_filters` | 31 | EU UV Filters |
| **`cn_iecic_i`** | **8,985** | **NMPA Existing** |
| **`cn_iecic_ii`** | **2** | **NMPA New Ingredients** |
| **`cn_iecic_adjustments`** | **113 paragraphs** | **NMPA 2025-06-23** |
| `fda_cosmetic_events_*` | 85,511 | FDA Cosmetic Events |
| `companies.json` | 4 | ๅทจๅญ/้”ฆๆณข/ๅŽ็†™/ๅˆ›ๅฅ |
| `rules.json` | 65 rules | compat/pH/conc/pop/region/synbio/FDA |

**Total: ~130K+ records** + 65 risk rules + 4 companies

## ๐Ÿค– MCP Tools / 4 ๅทฅๅ…ท

| Tool | Args | EN | ไธญ |
|---|---|---|---|
| `ingredient_query` | `q: string` | Cross-source query (CN + EU + INCI) | ่ทจๆบๆŸฅ่ฏข (CN + EU + INCI) |
| `formula_review` | `ingredients: string[], context: {population, region}` | 65-rule review | 65 ่ง„ๅˆ™ๅฎกๆŸฅ |
| `compliance_check` | `ingredient: string, regions: string[]` | Multi-region compliance | ๅคšๅœฐๅŒบๅˆ่ง„ๆ‰ซๆ |
| `synbio_company` | `id?: string` | 4 listed companies metadata | 4 ไธŠๅธ‚ๅ…ฌๅธๅ…ƒๆ•ฐๆฎ |

**Example / ็คบไพ‹ (curl):**
```bash
# Formula review / ้…ๆ–น้ฃŽ้™ฉๅฎกๆŸฅ
curl -X POST http://localhost:3000/api/risk/check \
  -H "Content-Type: application/json" \
  -d '{"ingredients": ["RETINOL", "AHA", "VITAMIN_C"], "context": {"population": "pregnant", "region": "CN"}}'
# โ†’ {"summary": "REJECT", "block_count": 3, "warn_count": 5, "findings": [...], "lang": "both"}
```

## ๐Ÿ“‚ Project Structure / ้กน็›ฎ็ป“ๆž„

```
opencosmetics/
โ”œโ”€โ”€ app/                          # Next.js 15 App Router
โ”‚   โ”œโ”€โ”€ page.js                   # Home: 5 sources + Killer Finding
โ”‚   โ”œโ”€โ”€ ingredients/              # Ingredients (50K)
โ”‚   โ”œโ”€โ”€ regulatory/               # EU Regulatory
โ”‚   โ”œโ”€โ”€ fda/                      # FDA 85K events
โ”‚   โ”œโ”€โ”€ china/                    # ๐Ÿ‡จ๐Ÿ‡ณ NMPA 8,985 + GB 7916-2026
โ”‚   โ”œโ”€โ”€ synbio/                   # ๐Ÿงฌ Juzi/Jinbo/Huaxi/Chuangjian
โ”‚   โ”œโ”€โ”€ risk/                     # โš–๏ธ 65-rule review
โ”‚   โ””โ”€โ”€ api/
โ”‚       โ”œโ”€โ”€ mcp/route.js          # MCP HTTP entry
โ”‚       โ”œโ”€โ”€ china/ingredient/     # Chinese ingredient query
โ”‚       โ”œโ”€โ”€ synbio/companies/     # Synbio companies
โ”‚       โ”œโ”€โ”€ risk/check/           # Risk review
โ”‚       โ”œโ”€โ”€ regions/              # Multi-region compliance
โ”‚       โ””โ”€โ”€ stats/                # Aggregate stats
โ”œโ”€โ”€ lib/
โ”‚   โ”œโ”€โ”€ db.js                     # DuckDB singleton + risk engine
โ”‚   โ””โ”€โ”€ i18n.js                   # i18n dictionary (zh/en/both)
โ”œโ”€โ”€ components/
โ”‚   โ”œโ”€โ”€ LangSwitcher.js           # 3-state language switcher
โ”‚   โ””โ”€โ”€ Bilingual.js              # Bilingual field component
โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ bebd.duckdb               # 17 MB โ€” 25 tables (EU+CN+US)
โ”‚   โ”œโ”€โ”€ companies.json            # 4 synbio companies
โ”‚   โ””โ”€โ”€ rules.json                # 65 risk rules
โ”œโ”€โ”€ mcp-server/                   # TypeScript stdio MCP server
โ”‚   โ”œโ”€โ”€ src/index.ts              # 4 tools
โ”‚   โ”œโ”€โ”€ dist/index.js             # 11.3 KB compiled
โ”‚   โ””โ”€โ”€ package.json
โ”œโ”€โ”€ scripts/                      # Data ingest pipeline
โ”‚   โ”œโ”€โ”€ 01_download_sources.py
โ”‚   โ””โ”€โ”€ 02_merge_duckdb.py
โ””โ”€โ”€ docs/
    โ”œโ”€โ”€ ARCHITECTURE.md
    โ””โ”€โ”€ MCP.md
```

## ๐Ÿ”— Links / ้“พๆŽฅ

- GitHub: https://github.com/AndyZhuang/opencosmetics
- Demo: deployment in progress
- MCP: TypeScript SDK, stdio + HTTP

## ๐Ÿ›ฃ๏ธ Roadmap / ่ทฏ็บฟๅ›พ

### Q3 2026 (v0.2.0 โ€” DONE / ๅทฒๅฎŒๆˆ โœ…)
- [x] 5 sources EU + NMPA + FDA + 4 synbio companies + 65 rules (v0.2.0)
- [x] **Bilingual UI (zh + en) + 3-mode language switcher (v0.2.1)**

### Q4 2026
- [ ] 1,284 banned + 109 plant/animal prohibited + STSC 2015 4 tables
- [ ] KR KCID 20,530 / JP JCIA 16,152 / ASEAN 1,870
- [ ] MCP Pro tier auth ($99/mo 100K req)
- [ ] Enterprise tier ($999/mo SLA)

### Q1 2027
- [ ] LLM-based auto-formulation
- [ ] Market-comp analysis + differentiation suggestions

## ๐Ÿ“œ License / ่ฎธๅฏ่ฏ

- **Data / ๆ•ฐๆฎ**: CC-BY 4.0 (per-source attribution in `data/sources.csv`)
- **Code / ไปฃ็ **: MIT
- **Docs / ๆ–‡ๆกฃ**: CC-BY 4.0

## ๐Ÿ™‹ Maintainer / ็ปดๆŠค

- [AndyZhuang](https://github.com/AndyZhuang) + [Mavis AI agent](https://MiniMax.com)
- Feedback: GitHub Issues / Discussion