| name | ipzitalk-hospital-proximity |
| description | 주소 또는 단지명을 입력받아, 가장 가까운 종합병원·대학병원까지의 직선거리를 기준으로 병세권 신호 배지(🟢인접/🟡근접/🟠다소이격/⬜이격)를 카드 + 지도로 생성한다. "병세권", "병세권이야?", "종합병원 가까워", "대학병원 근처", "응급실 접근성", "큰 병원 거리" 등의 표현이 있을 때 이 스킬을 사용한다. 사용자가 특정 주소/단지의 종합병원 접근성을 물으면 즉시 트리거한다.
|
| version | 1.0.4 |
| license | proprietary |
병세권 진단
주소/단지명 하나로 최근접 종합·대학병원까지 거리를 재서 병세권 신호 배지 + 지도를 만든다.
※ "참고 신호"다. 직선거리 기준이며 도보·응급 접근성은 미반영. 동네의원(HP8 일반)이 아니라 종합/대학병원만 대상.
입력
| 파라미터 | 필수 | 기본 | 설명 |
|---|
address 또는 complex_query | ✅(택1) | - | 주소 또는 단지명 |
radius_m | ✕ | 3000 | 병원 검색 반경(넓게) |
필수 도구
| 도구 | 용도 |
|---|
get_geocode / get_address | 좌표 확보 |
search_by_nearby_keyword | query="종합병원" + 동물병원 제외, 종합/대학병원만 |
get_static_map / get_map_embed_url | 지도 |
워크플로우
- 좌표 확보 (address→geocode / 단지명→get_address 주거시설 우선)
- 검증된 검색식:
search_by_nearby_keyword(center, radius_m=3000, query="종합병원", category_filter={exclude_contains:["동물병원"]})
→ 결과에서 대표는 category_name이 "병원 > 종합병원" 또는 "병원 > 대학병원"인 진짜 종합/대학병원만 채택.
- ⚠️ 부속시설 구분 주의: "○○ 종합건강증진센터" 등 category가 **'병원부속시설'**인 항목은
이름에 "종합"이 들어가도 순수 종합병원이 아니다 → 대표에서 제외(목록엔 참고로 표기 가능).
- 최근접 진짜 종합/대학병원까지 거리로 밴드 판정.
2b. 0건이면
search_by_nearby_category(hospital) 전체 조회 후 name/category로 보수적 재선별. 그래도 없으면 ⬜ 유보.
※ hospital 카테고리+"종합병원" 필터는 0건 위험 확인 → 키워드 방식 1차 사용(검증됨). 필터 병원은 동물병원까지 잡히니 금지.
- 배지 판정(아래) → 지도 생성
밴드(직선거리 m): ≤1000 🟢 인접 / 1000–2000 🟡 근접 / 2000–3000 🟠 다소 이격 / >3000 ⬜ 이격
출력 = 공통 카드 템플릿
templates/result.html의 ipzi-data JSON을 채운다(스킬 폴더 내부, self-contained). 배지별 차이:
iconId:"i-hospital", badgeTitle:"병세권 진단", axisMax:3000, radiusDefault:3000
signal:{label:"<밴드 라벨>",cls:"g|a|o|x"}
bands:[{max:1000,cls:"g",label:"≤1000 인접"},{max:2000,cls:"a",label:"1000–2000 근접"},{max:3000,cls:"o",label:"2000–3000 다소 이격"},{max:Infinity,cls:"x",label:">3000 이격"}]
hedge.verify: null
- SVG 아이콘:
i-hospital(rect+십자) · i-map · i-info. CDN·이모지 금지, 인라인 SVG만.
필수 단서 · 금지 표현
- 필수: 종합/대학병원 직선거리 기준 · 도보/응급 접근성 미확인 · (부속시설이 더 가까우면) 대표는 순수 종합병원 기준임을 명시
- 금지: "응급 대응 시간 N분 확정"
엣지
- 지오코딩 실패/
NOT_FOUND → 재입력 · 후보 다수/AMBIGUOUS → 후보 나열
- 반경 내 종합병원 0건 → ⬜ 데이터 부족(반경 넓혀 재시도 제안)
- 부속시설(건강증진센터 등)만 있고 순수 종합병원 없음 → 대표 없음으로 보수 판정, 부속시설은 참고 표기
검증된 사항 (2026-07-08 · 방배롯데캐슬아르떼)
- 사이트: 방배롯데캐슬아르떼아파트 · 서울 서초구 방배동 424-28.
- 검색식
query="종합병원", radius 3000, exclude=["동물병원"]로 실데이터 검증 완료.
- 결과: 가톨릭대 서울성모병원(대학병원) 2,765m · 강남고려병원 종합건강증진센터(병원부속시설) 2,391m
- 부속시설 필터 이슈: 강남고려병원 종합건강증진센터가 더 가까우나 category가 '병원부속시설' →
순수 종합병원 아님 → 대표는 서울성모(2.8km). 이 케이스가 부속시설 구분 규칙의 근거.
- 판정: 최근접 진짜 종합/대학병원 서울성모 2,765m → 🟠 다소 이격(2000–3000).
섹션마다 출처를 작게 단다
데이터 블록 하단에 .src 한 줄. 도구·API 이름은 쓰지 않는다. 사용자가 아는 기관명만.
| 블록 | 출처 표기 |
|---|
| 단지 개요·세대수·준공·주차·연차 | 공동주택관리정보시스템(K-apt) |
| 매매·전세·평당가·거래량 | 국토교통부 실거래가 |
| 학교·교통·생활·상권 등 장소 | 카카오맵 |
| 분양공고·분양가·주택형·입주월 | 청약홈 |
| 지도 (장소 마커) | 네이버 지도 · 카카오맵 |
| 지도 (분양공고 마커) | 네이버 지도 · 청약홈 |
- 🚨 출처 문자열은
ipzi-data JSON으로 받지 않고 템플릿 마크업에 직접 박는다.
어느 블록이 어디서 왔는지는 실행마다 달라지지 않는다. 데이터로 받으면 채우는 걸 잊거나 틀리게 쓸 여지만 생긴다.
- 🚨 한 블록에 두 출처가 섞이면 병기한다. 예:
세대수·주차 — 공동주택관리정보시스템(K-apt) · 위치 — 카카오맵.
하나로 뭉뚱그리면 어느 숫자가 어디서 왔는지 사용자가 알 수 없다.
- 🚨 쓰지 않은 기관을 출처로 적지 않는다. 우리가 부르는 곳은 위 다섯 곳뿐이다.
- 히어로·유의사항·푸터에는 달지 않는다. 데이터 블록에만.
디자인 정본
스킬 폴더 밖 문서에 의존하지 않도록 규칙을 여기 인라인으로 둔다.
- CDN·외부 폰트·이모지 금지. 아이콘은
<symbol> 인라인 + <use> 참조로 self-contained.
- 라이트/다크 양쪽.
prefers-color-scheme + :root[data-theme] 모두 대응.
- 토큰만 사용:
--g/--y/--o/--r/--x/--brand/--up/--down/--zebra (+ -s 배경 변형).
- 예외 상태:
null은 "정보없음"(0 아님) · 표본 부족은 판정 유보 · 45건 캡 도달은 "목록 불완전" 표기.
★·☆는 활자 기호이며 이모지가 아니다. 등급 표기에 사용 가능.
- 지도 카드 CSS:
.map{overflow-x:auto; overflow-y:hidden} + .map iframe{display:block; min-width:720px}.
overflow:hidden만 주면 iframe이 카드 폭에 짓눌려 지도가 최소 줌(한반도)으로 떨어진다.
- 🚨 지도 링크는 발급 후 7일 만료. 산출물 지도 캡션에 유효기간·재발급 필요를 반드시 적는다.
만료 시 iframe이 빈 화면이 되는데, 원인 표기가 없으면 리포트가 고장난 것처럼 보인다.
- 🚨 반경 눈금 마커를 넣지 않는다. 예전엔
fitBounds가 반경 원을 무시해 원이 잘리는 걸 막으려고
정북·남·동·서에 회색 더미 마커 4개를 심었다. 사용자에게는 정체를 알 수 없는 점으로 보여 혼란만 준다.
원이 잘리더라도 마커는 실제 장소만 찍는다. (근본 해결은 render.ts가 원을 bounds에 포함하도록 고치는 것 — 발견사항 6번)
🚨 이름에 '종합병원'이 들어가도 병원이 아닐 수 있다 (실측 2026-07-09)
위례 반경에서 실제로 걸러낸 것들:
한국나무종합병원 → 임업 (나무 치료)
카포스 자동차종합병원 → 자동차 정비
건강검진센터·암센터 같은 부속시설도 종합병원으로 세면 안 된다.
- 이름이 아니라
category_name 으로 판단한다. 애매하면 그 사실을 화면에 적는다.
- 위례 실측: 반경 3km 내 순수 종합/대학병원 0곳. 최근접은 성남중앙병원 3.7km(반경 밖)로 표기했다.
0곳이면 0곳이라고 쓴다. 반경을 늘려 억지로 채우지 않는다.
🚨 판정 대상은 종합병원 이름이 아니라 카테고리 3단계로 고른다 (실측 2026-07-10)
query="종합병원" 만으로 찾으면 국립·대학병원을 통째로 놓친다.
위례 실측에서 실제로 놓쳤다.
경찰병원 2,295m "의료,건강 > 병원 > 국립병원" ← 응급실 보유. 놓쳤다
경찰병원 응급실 2,295m "의료,건강 > 병원 > 응급실"
성남중앙병원 3,654m "의료,건강 > 병원 > 종합병원" ← 이것만 잡았다
그 결과 산출물이 "3km 내 종합병원 0곳 · 이격(⬜)" 이라고 말했다. 틀린 등급이었다.
경찰병원 2,295m 는 2000–3000 다소 이격(🟠) 이다.
검색
search_by_nearby_keyword(center, radius_m=3000, query="병원", grid=true, limit=200,
category_filter={exclude_contains:["동물병원","한의원","치과","한방병원","주차장","편의점","카페"]})
- 🚨
grid=true 필수. 위례 3km 에서 원본 769건 → 중복제거 251건이다. 격자 없이는 45건 캡에 걸린다.
- 🚨
limit=200 으로도 251건을 다 못 받는다. has_more 이면 offset 으로 이어 받는다.
실제로 첫 200건만 보고 "정확일치는 1곳뿐"이라고 잘못 판단한 적이 있다. 꼬리 51건에 경찰병원이 있었다.
3단계로 가른다
category_name 3단계 | 처리 |
|---|
종합병원 · 대학병원 · 국립병원 | ✅ 판정 대상 |
응급실 | ✅ 보조 신호 (해당 병원에 병기) |
| (3단계 없음) = 병원급 | 🔸 참고만 (aux:true) |
노인,요양병원 · 한방병원 · 한의원 · 치과 | ❌ 제외 |
내과·피부과·정형외과·일반의원 등 진료과 | ❌ 제외 (의원급) |
- 🚨 이름으로 판단하지 않는다.
한국나무종합병원(임업)·카포스 자동차종합병원(정비)이 실제로 걸린다.
- 반대도 마찬가지다.
굿모닝차내과의원 은 3단계가 없지만 이름이 ~의원 이다.
→ 3단계가 없고 이름이 의원 으로 끝나지 않는 것만 병원급 참고로 본다.
🚨 병원급은 목록에만 — 판정 제외 (2026-07-10 결정)
종합병원급이 멀어도 근처에 병원이 있으면 사용자는 지도를 보고 의아해한다. 그 병원을 보여주되 등급에는 넣지 않는다.
ipzi-data.pois 에 aux: true 로 넣는다.
{n:"경찰병원 (국립병원 · 응급실 보유)", d:2295},
{n:"서울세계로병원 (병원 · 종합병원 아님)", d:645, aux:true}
템플릿이 aux 항목을 이렇게 처리한다.
- 목록·지도에는 보인다.
참고 배지 + 회색 핀.
3km 내 종합병원급 개수에서 제외. 밴드 색도 회색 고정.
- 최근접 판정(
stat[0])에도 쓰지 않는다.
위례 검증: 참고 6곳(서울세계로 645m 등)을 넣어도 3km 내 종합병원급 = 1, 신호 다소 이격 불변.
- 🚨 병상 수·응급실 운영 여부는 카카오가 주지 않는다. "규모"를 직접 알 수 없다. hedge 에 명시한다.
- 반경 내 종합병원급이 0곳이면 0곳이라고 쓴다. 반경을 늘려 억지로 채우지 않는다.
🚨 include_contains 는 AND 다 — 배열로 넣으면 항상 0건 (실측 2026-07-10)
3단계 판정표를 그대로 배열로 옮기면 조용히 빈 결과를 받는다.
category_name 하나가 동시에 종합병원이면서 대학병원일 수는 없기 때문이다.
반포래미안아이파크 · radius 3000 · query="병원" · grid=true
include_contains:["종합병원","대학병원","국립병원","응급실"] → after_filter 0건 ← 함정
include_contains:["대학병원"] → 2건
include_contains:["종합병원"] → 3건
include_contains:["국립병원"] → 0건 (이 지역엔 실제로 없음)
include_contains:["응급실"] → 4건
- 🚨 축마다 따로 호출하고 합집합한다.
kakao_place_id 로 중복을 제거한다.
exclude_contains 는 OR 다(하나라도 걸리면 제외). 같은 필드의 두 키가 결합 규칙이 다르다.
실측: 제외어 7개로 1,222건 → 901건. AND였다면 하나도 안 걸러졌을 것이다.
- 🚨
offset 은 필터 뒤에 적용된다. 필터로 3건만 남은 상태에서 offset=200 을 주면 0건이 온다.
필터를 걸었으면 페이징이 필요 없을 만큼 결과가 작아진다. 필터 없이 훑을 때만 offset 을 쓴다.
- 근본 해결은 MCP 몫 — 코드개선방향
#N5.
그래서 검색은 이렇게 한다
# 판정 대상 — 3번 따로 부른다
A = keyword("병원", grid=true, include_contains:["종합병원"])
B = keyword("병원", grid=true, include_contains:["대학병원"])
C = keyword("병원", grid=true, include_contains:["국립병원"])
판정대상 = dedupe(A ∪ B ∪ C, by=kakao_place_id)
# 보조 신호
E = keyword("병원", grid=true, include_contains:["응급실"]) → 해당 병원에 "응급실 있음" 병기
# 병원급 참고(aux) — 필터 없이 훑고 3단계 없는 것만
R = keyword("병원", grid=true, limit=200, exclude_contains:[...]) → offset 으로 이어 받기
- 🚨 참고(
aux) 목록을 몇 건까지 훑었는지 화면에 적는다. 반포 실측은 534건 중 가까운 200건
(약 1.6km 안)만 봤다. 그 밖에도 병원급이 더 있을 수 있다. "전부"라고 쓰지 않는다.
반포 실측 (2026-07-10)
가톨릭대학교 서울성모병원 763m 대학병원 · 응급실 있음 ← 등급 기준 🟢
강남차병원 1,952m 종합병원 · 응급실 있음
기쁨병원 2,171m 종합병원 · 응급실 있음
강남을지대학교병원 2,364m 대학병원
강남베드로병원 2,833m 종합병원 · 응급실 있음
서울성모병원 암병원(757m)이 등급 기준보다 더 가깝다. 3단계가 없는 병원급이라 aux:true 로 뺐다.
안 뺐으면 최근접이 암병원이 됐을 것이다.
🚨 화면 문구는 일반인 언어로 (2026-07-10 결정)
진단 시리즈(초품아·역세권·병세권·쇼세권·숲세권)의 독자는 부동산 전문가가 아니다.
내부 용어를 그대로 화면에 쓰지 않는다. 임계값·색(cls)은 그대로 두고 라벨만 바꾼다.
| 쓰지 않는 말 | 대신 |
|---|
| 최근접 · (최근접·판정 기준) | 제일 가까운 곳 · (제일 가까움) |
| 판정 밴드 · 판정 기준 | 등급 기준 |
| 신호 등급 | 등급 |
| 인접 / 근접 | 아주 가까움 / 가까움 |
| 다소 이격 | 조금 먼 편 |
| 이격 · 역 이격 | 먼 편 · 역이 먼 편 |
| 보도권 | 가까움 |
| 판정 유보 | 자료 부족 |
| 판정창 | 기준 범위 |
| 참고 신호(진단 아님) | 참고용이며 확정 판단이 아닙니다 |
| 1km 내 · 슬라이더 반경 내 | 1km 안 · 선택한 반경 안 |
| 미확인 | 확인되지 않음 |
| 판정에서 제외 | 등급에서 제외 |
거리도 읽기 쉽게: 1313m → 1.3km.
문장도 사람 말로
✕ SITE(파랑) · 반경 3km 원 · 판정 기준 경찰병원(주황, 2.3km) · 서울세계로병원(회색)은 등급에 미반영
✓ 파란 점이 우리 집, 주황 점이 등급 기준이 된 경찰병원(2.3km)입니다.
회색 서울세계로병원(645m)은 종합병원이 아니라 등급에 넣지 않았습니다.
- 🚨 부드럽게 쓰되 사실은 그대로. "가까움"이 "좋음"이 되면 안 된다. 등급은 거리 밴드가 정한다.
- 🚨 숫자는 화면 전체에서 일치해야 한다.
aux 항목을 개수에서 뺐으면 본문 문장의 개수도 함께 고친다.
실제로 목록은 5곳인데 본문이 6곳이라고 적힌 적이 있다.
- 익숙한 말은 남긴다:
역세권·준역세권·초품아·상권.
🚨 운영 상태는 장소명 문자열에만 있다 — 폐업·휴업·개원예정 (2026-07-10)
카카오는 운영 상태 필드를 주지 않는다. 상태를 장소명에 괄호로 붙인다.
학교 "서울반포초등학교 (휴교)", 역 "위례호수공원역 (2026년12월예정)" 이 실측으로 확인됐다.
- 장소명에
폐업·폐원·휴업·이전·개원예정·이전예정·(20NN년 이 있으면
밴드 판정·최근접·개수에서 제외하고, 목록에만 꼬리표를 단다.
- 개원 시점·이전 위치를 지어내지 말 것. 장소명에 있는 문자열만 화면에 쓴다.
- 🚨 응급실 접근성이 걸린 지표다. 미개원 병원을 최근접으로 쓰면 "지금 갈 수 있는 병원"이 아닌 것으로 등급이 난다.
- ⚠️ 반포·위례 실측에서 병원에는 이 문자열이 관측되지 않았다(학교·역에서는 관측).
카카오가 같은 방식으로 표기하므로 예방 규칙으로 넣는다. 관측되면 이 줄을 실측 기록으로 바꿀 것.
재확인 (실측 2026-07-10, 반포래미안아이파크 · radius 5000 · query="종합병원")
exclude_contains:["동물병원"] 없이 부르면 최근접이 신반포동물병원(502m) 이다.
19건 중 7건이 동물병원(24시예스종합동물병원·충현동물종합병원·서울종합동물병원…),
금강아산병원 종합건진센터(카테고리 건강검진)도 섞인다. v1.0.2의 3단계 카테고리 판정이 이걸 막는다.
MCP 도구 네임스페이스와 출처
ipzitalk MCP 도구의 네임스페이스는 실행 환경(Codex, Claude Code, Hermes, claude.ai 커넥터 등)에 따라 다르다.
이 문서에 적힌 도구 이름(search_announcement_info, get_geocode, get_map_embed_url 등)은 접두사 없는 기본 도구명(base tool name) 이다.
- 먼저 연결된 도구 목록에서 같은 기본 도구명을 찾는다.
- 그중
ipzitalk-remote 플러그인의 ipzitalk 서버 provenance가 확인되는 도구만 우선 사용한다. Codex에서는 실제 도구 호출 이벤트의 server: ipzitalk과 기본 도구명을 기준으로 확인한다.
presale-mcp 또는 다른 로컬 MCP provenance의 동명 도구는 Remote Skill의 대체 수단으로 사용하지 않는다.
- provenance를 확인할 수 없거나 같은 기본 도구명이 여러 서버에 있어 모호하면 임의 선택하지 말고 중단하여 필요한 Remote 도구명을 안내한다.
클라이언트가 연결 도구 목록에 plugin/server provenance를 구조적으로 제공하지 않을 때만 다음 명시적 fallback을 사용한다.
mcp__plugin_ipzitalk-remote_ipzitalk__<도구명>
mcp__ipzitalk_mcp__<도구명>
mcp__ipzitalk__<도구명>
mcp__claude_ai_ipzitalk__<도구명>
fallback으로도 Remote 출처를 유일하게 확인할 수 없으면 값을 추정하지 말고, 사용자에게 ipzitalk Remote MCP 연결 상태를 확인하도록 안내한 뒤 중단한다.