bytemescan
이 제품, 정말 그 기능성으로 보고돼 있나
식약처 공개 명부(보고 + 심사)에 광고 표현을 대조하는 무료 MCP · CLI — MIT
광고와 상세페이지에는 "미백", "주름개선", "선크림" 같은 말이 흔하다. 그런데 그 제품이 식약처에
그 기능성으로 보고된 제품인지는 따로 확인해야 한다. 공개 명부는 누구나 볼 수 있지만, 그대로는 쓰기 어렵다.
그 입구를 한 줄로 줄인 것이 이 도구다 — 상품명과 표현을 주면 보고·심사 명부에 대조해
MATCH / MISMATCH / UNVERIFIABLE / NOT_FOUND / REVIEW 로 답하고, 근거 행(번호 · 업소 · 보고 효능)을 같이 돌려준다.
01왜 만들었나 — 공개 명부는 열려 있지만 그대로는 못 쓴다
식약처가 공개 중인 화장품 행정처분 198건을 한 건씩 열어 보면 137건이 광고 문구 때문이었다(2026년 10월 15일, 의약품안전나라 공개 목록). 가장 많은 건 "의약품처럼 보이는 말"(81건)인데, 이 도구는 그건 보지 않는다. 이 도구가 보는 자리는 그중 "기능성화장품이 아닌데 기능성처럼 광고한" 경우 — 7건이다. 수는 적어도 문구 하나로 그 제품의 광고가 대개 2~4개월 멈추는 건 같다.
그 7건을 미리 거르는 데 필요한 자료는 전부 공개돼 있다. 그런데 세 가지가 걸린다.
- 효능이 세 칸에 흩어져 있다. 보고 명부 195,799행(2026-09-21 스냅샷)에서 효능은 이름 칸·SPF 칸·효능효과 본문(XML) 세 곳에 나뉘어 있고, 셋을 다 읽어야 94.6%가 채워진다. 한 칸만 보면 1/3이다.
- 명부가 둘이다. 기능성화장품은 '보고' 또는 '심사' 중 한쪽에 등록된다. 심사 명부(20,692행)는 효능 본문이 90.8% 채워 있다. 둘을 같이 봐야 한다.
- 상품명은 식별자가 아니다. 보고 명부에서 같은 이름으로 여러 건이 신고된 이름이 2,930개(6,214행 · 이름의 공백을 전부 지우고 셈)다. 이름만으로 "그 제품"을 확정하면 틀린다.
그래서 이 도구는 두 명부를 같이 조회해 합치고, 확정 판정은 신고번호(report_no)를 줬을 때만 낸다. 상품명만 주면 후보 목록을 REVIEW 로 돌려준다.
02쓰는 순서 — 세 단계
- 찾기 — 상품명으로 후보를 받는다. 후보마다
report_no(보고번호 또는 심사 품목번호) · 업소 · 보고 효능 범주가 붙는다. - 고르기 — 업소명 · 보고일 · 효능으로 내 제품이 어느 행인지 고른다. 판매 페이지에는 보통 번호가 없어 이 단계는 사람이 한다.
- 확정 — 그
report_no로 표현을 대조하면MATCH / MISMATCH / UNVERIFIABLE가 나온다.
| 판정 | 뜻 |
|---|---|
| MATCH | 신고번호로 확정한 제품의 보고 효능 범위 안에 광고한 기능성이 있다 |
| MISMATCH | 확정한 제품을 찾았고 효능 정보도 있는데, 그 기능성으로는 보고돼 있지 않다 — 위법이라는 뜻이 아니다 |
| UNVERIFIABLE | 확정한 제품의 명부 행에 효능 정보가 비어 판정할 수 없다(보고 명부 행의 약 5%) |
| NOT_FOUND | 그 이름(또는 그 번호)의 보고 제품을 공개 명부에서 못 찾았다 |
| REVIEW | 사람이 봐야 한다 — 표현이 기능성 범주가 아니거나("보습"), 상품명만으로 제품을 확정하지 못했다(후보 목록 + 임시 판정) |
03설치와 등록
키는 data.go.kr 에서 무료로 받아, 기능성화장품 보고품목(FtnltCosmRptPrdlstInfoService01)과 심사품목(FtnltCosmSrngPrdlstInfoService05) 두 서비스를 "활용신청"하면 된다. 키는 쓰는 사람 것이고, 오류 문구에도 찍히지 않는다.
git clone https://github.com/caffreywlee-decaff/bytemescan.git && cd bytemescan
pip install -e . # CLI 명령 bytemescan
pip install "mcp[cli]" # MCP 서버도 쓸 때
cp .env.example .env # DATA_GO_KR_KEY 채우기
bytemescan lookup "선스틱" # 후보 + report_no
bytemescan check "<고른 상품명>" "미백" --no <report_no> # MATCH / MISMATCH / UNVERIFIABLE
Claude Code 에서는 한 줄로 등록된다. Claude Desktop · Cursor 는 설정 파일에 같은 명령을 적는다(README 에 그대로 있다).
claude mcp add bytemescan -e DATA_GO_KR_KEY=여기에_키 -- python3 -m bytemescan.server
등록되면 에이전트가 도구 둘을 쓴다 — lookup_functional_cosmetic(item_name), check_cosmetic_claim(item_name, claim, report_no=None). "이 선스틱 자외선차단 보고 있어? 번호는 ○○○이야" 라고 물으면 바로 확정 판정이 온다.
04한계 — 꼭 읽을 것
- 상품명은 식별자가 아니다. 상품명만으로는 확정하지 않고 후보를
REVIEW로 돌려준다. 확정은report_no로만. - 판매 페이지에는 보통 보고번호가 없다. "확정"은 당신이 고른 번호의 명부 행만 대조했다는 뜻이지, 그 페이지의 제품이 그 번호라는 것을 도구가 증명했다는 뜻이 아니다.
- 효능 정보가 빈 행이 있다. 그럴 땐
MISMATCH로 단정하지 않고UNVERIFIABLE로 돌려준다 — 라벨·보고서로 확인할 것. - 페이지·상세 이미지 판독(OCR), 여러 판매처의 같은 제품 묶기, 오탐 제거, 건기식·의약외품 정밀 대조는 하지 않는다. 공개 데이터 조회의 얇은 겉면이다.
- 위법 여부를 판단하지 않는다.
MISMATCH≠ 위법.
숫자의 출처 · 만든 곳
행정처분 198 · 광고 137 · 의약품 오인 81 · 기능성 오인 7 — 의약품안전나라 공개 행정처분 목록(2026-10-15 공개분, 근거 조항·위반 내용 글자로 분류). 보고 명부 195,799행 · 효능 정보 있는 행 94.6% · 같은 이름 2,930개(6,214행) — data.go.kr 보고품목 2026-09-21 스냅샷. 심사 명부 20,692행 · 90.8% — 같은 날 심사품목 스냅샷.
Lambency(데이터 · AI 컨설팅)가 만들었다. 판매 페이지 전체를 판매처까지 읽고 사진 속 글자까지 대조하는 일은 BYTEME 판매 페이지 건강검진에서 한다 — 이 도구는 그 일의 공개 데이터 입구만 떼어 낸 것이다. 리포에 문제를 올리거나 메일을 주면 고친다.
자기 브랜드 페이지의 기능성 표현을 하나씩 확인하는 데 쓰면 된다. 판매처 수십 곳의 페이지를 전부 읽고 고칠 자리까지 정리하는 건 다른 일이다.
github.com/caffreywlee-decaff/bytemescan · BYTEME 판매 페이지 건강검진