
Mfds Drug Safety
Wire an agent to Korean MFDS-oriented drug-safety Q&A through the k-skill proxy instead of hand-rolling HTTP and interview payloads.
Overview
mfds-drug-safety is an agent skill for the Build phase that formats drug-safety questions and symptoms and calls the k-skill proxy for MFDS-oriented responses.
Install
npx skills add https://github.com/nomadamas/k-skill --skill mfds-drug-safetyWhat is this skill?
- Builds structured drug-domain interview payloads (question + symptoms) for the k-skill proxy
- Resolves KSKILL_PROXY_BASE_URL with a documented default proxy host and disable tokens
- Normalizes HTML-heavy API text into plain summaries for agent consumption
- Python helpers for argparse-driven CLI-style invocation inside the skill package
Adoption & trust: 1.8k installs on skills.sh; 5.4k GitHub stars; 1/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need drug-safety answers in your agent product but do not have a maintained proxy client, payload schema, or HTML cleanup for Korean regulatory drug APIs.
Who is it for?
Indie builders adding a drug-safety or symptom-check integration behind a Korean proxy endpoint in an API or agent backend.
Skip if: Teams that need clinical diagnosis, offline-only workflows, or jurisdictions with no proxy access—skip when you cannot use network APIs or lack legal review for health claims.
When should I use this skill?
User asks for MFDS or Korean drug-safety lookups, medication risk context, or k-skill proxy drug interviews in a build or support flow.
What do I get? / Deliverables
Your agent sends normalized drug interviews through the configured proxy and receives summarized text suitable for downstream UI or reasoning steps.
- Normalized drug interview request object
- Summarized proxy response text for the agent
Recommended Skills
Journey fit
Canonical shelf is Build → integrations because the skill is a callable backend bridge (proxy URL, drug-domain interview JSON) meant to be embedded in a product or agent workflow. It is not general docs or frontend work—it packages external drug-safety domain calls, symptom/question shaping, and proxy configuration as an integration capability.
How it compares
Use as a skill-packaged HTTP integration pattern, not as a general medical MCP server or static compliance checklist.
Common Questions / FAQ
Who is mfds-drug-safety for?
Solo and indie developers embedding medication or drug-safety Q&A into agents or small APIs that already plan to use the Nomadamas k-skill proxy.
When should I use mfds-drug-safety?
During Build → integrations when you are connecting Claude Code or Cursor to drug-domain endpoints, or when Operate → support flows need a consistent proxy payload for safety lookups.
Is mfds-drug-safety safe to install?
Treat it like any network integration: review the Security Audits panel on this Prism page, verify proxy host and env vars in your deployment, and do not ship health advice without your own compliance review.
SKILL.md
READMESKILL.md - Mfds Drug Safety
from __future__ import annotations import argparse import json import os import re import sys import urllib.error import urllib.parse import urllib.request from html import unescape from typing import Any PROXY_BASE_URL_ENV_VAR = "KSKILL_PROXY_BASE_URL" DEFAULT_PROXY_BASE_URL = "https://k-skill-proxy.nomadamas.org" class ApiError(RuntimeError): def __init__(self, message: str, *, status_code: int | None = None, url: str | None = None): super().__init__(message) self.status_code = status_code self.url = url def summarize_text(value: Any) -> str: if value is None: return "" text = unescape(str(value)) text = re.sub(r"<[^>]+>", " ", text) text = re.sub(r"\s+", " ", text).strip() return text def resolve_proxy_base_url(explicit_base_url: str | None = None, env: dict[str, str] | None = None) -> str: env = env or os.environ candidate = summarize_text(explicit_base_url or env.get(PROXY_BASE_URL_ENV_VAR)) if candidate.casefold() in {"off", "false", "0", "disable", "disabled", "none"}: raise ValueError("KSKILL_PROXY_BASE_URL 가 비활성화되어 있습니다.") if candidate and candidate != "replace-me": return candidate.rstrip("/") return DEFAULT_PROXY_BASE_URL def build_drug_interview(question: str | None = None, symptoms: str | None = None) -> dict[str, Any]: return { "domain": "drug", "question": summarize_text(question), "symptoms": summarize_text(symptoms), "must_ask": [ "누가 복용하려는지 알려주세요. (본인/아이/임산부/고령자)", "무슨 약을 이미 먹었거나 지금 먹으려는지, 제품명/성분명을 각각 알려주세요.", "언제부터, 얼마나 자주, 한 번에 얼마나 복용했는지 알려주세요.", "지금 있는 증상과 언제 시작됐는지 알려주세요.", "복용 중인 약, 기저질환, 알레르기 여부를 알려주세요.", ], "red_flags": [ "호흡곤란 또는 숨쉬기 힘듦", "의식저하, 실신, 혼동", "입술·혀 붓기 또는 심한 전신 발진", "지속되는 구토, 경련, 심한 흉통", ], "urgent_action": "red flag 가 하나라도 있으면 약 정보 조회보다 즉시 119·응급실·의료진 연결을 우선하세요.", "policy": "이 helper 는 진단이나 복용 지시를 하지 않고, 공식 식약처 안전정보 확인 전에 반드시 되묻기 흐름을 제공합니다.", } EASY_FIELD_MAP = { "item_name": "item_name", "company_name": "company_name", "efficacy": "efficacy", "how_to_use": "how_to_use", "warnings": "warnings", "cautions": "cautions", "interactions": "interactions", "side_effects": "side_effects", "storage": "storage", "item_seq": "item_seq", } SAFE_STAD_FIELD_MAP = { "item_name": "item_name", "company_name": "company_name", "efficacy": "efficacy", "how_to_use": "how_to_use", "warnings": "warnings", "cautions": "cautions", "interactions": "interactions", "side_effects": "side_effects", } def normalize_easy_drug_item(item: dict[str, Any]) -> dict[str, Any]: normalized = {key: summarize_text(item.get(source_key)) for key, source_key in EASY_FIELD_MAP.items()} normalized["source"] = "drug_easy_info" return normalized def normalize_safe_stad_item(item: dict[str, Any]) -> dict[str, Any]: normalized = {key: summarize_text(item.get(source_key)) for key, source_key in SAFE_STAD_FIELD_MAP.items()} normalized["source"] = "safe_standby_medicine" return normalized def read_json_response(request: urllib.request.Request | str) -> dict[str, Any]: try: with urllib.request.urlopen(request, timeout=30) as response: return json.loads(response.read().decode("utf-8")) except urllib.error.HTTPError as error: body = error.read().decode("utf-8", errors="replace") try: payload = json.loads(body) except json.JSONDecodeError: payload = None if isinstance(payload, dict) and payload.get("message"): raise ApiError(str(payload["message"]), status_code=error.code, url=getattr(error, "url", None)) from error raise ApiError( f"MFDS drug proxy request failed with HTTP {error.code}", status_code=error.code, url=getat