| name | ipzitalk-park-proximity |
| description | 주소 또는 단지명을 입력받아, 가장 가까운 공원까지의 직선거리를 기준으로 숲세권 신호 배지 (🟢인접/🟡근접/🟠이격/⬜없음)를 카드 + 지도로 생성한다. "숲세권", "숲세권이야?", "공원 가까워", "공원 근처", "녹지 있어?", "공원까지 거리" 등의 표현이 있을 때 이 스킬을 사용한다. 사용자가 특정 주소/단지의 공원·녹지 접근성을 물으면 즉시 트리거한다.
|
| version | 1.0.0 |
| license | proprietary |
숲세권 진단
주소/단지명 하나로 최근접 공원까지 거리를 재서 숲세권 신호 배지 + 지도를 만든다.
※ "참고 신호"다. 직선거리 기준이며 조망·접근성·공원 규모는 미반영.
입력
| 파라미터 | 필수 | 기본 | 설명 |
|---|
address 또는 complex_query | ✅(택1) | - | 주소 또는 단지명 |
radius_m | ✕ | 1500 | 공원 검색 반경 |
필수 도구
| 도구 | 용도 |
|---|
get_geocode / get_address | 좌표 확보 (resolve-site) |
search_by_nearby_keyword | query="공원" + 필터(공원시설물 제외) |
get_static_map / get_map_embed_url | 지도 |
워크플로우
- 좌표 확보 (resolve-site): address→
get_geocode / 단지명→get_address(주거시설 우선).
지오코딩 실패/NOT_FOUND → 재입력, 후보 다수/AMBIGUOUS → 후보 나열 후 확인.
- 공원 검색 (검증된 검색식):
search_by_nearby_keyword(
center,
radius=1500,
query="공원",
category_filter={ include_contains:["공원"], exclude_contains:["공원시설물"] }
)
→ 실제 공원만(음수대·자전거대여소·모래사장 등 시설물 제외) → 최근접 + 거리순 정렬.
※ 카카오 park 카테고리(AT4=관광명소)는 공원 커버가 약해 0건 위험 → 키워드 방식 사용(검증됨).
- 배지 판정(아래 밴드) → 지도 생성 → 카드 출력.
밴드(직선거리 m): ≤300 🟢 공원 인접 / 300–700 🟡 근접 / 700–1200 🟠 다소 이격 / >1200 ⬜ 이격
출력 = 공통 카드 템플릿
templates/result.html 구조를 그대로 두고 ipzi-data 비실행 JSON 블록만 채운다(self-contained, CDN·이모지 금지, SVG 인라인). 배지별 값:
iconId:"i-park", badgeTitle:"숲세권 진단", axisMax:1500, radiusDefault:1000
signal:{ label:"공원 인접", cls:"g" } (판정 결과에 따라 label/cls 교체)
bands:[{max:300,cls:"g",label:"≤300 공원 인접"},{max:700,cls:"a",label:"300–700 근접"},{max:1200,cls:"o",label:"700–1200 다소 이격"},{max:Infinity,cls:"x",label:">1200 이격"}]
stat:[{n:"<최근접>m",l:"최근접(<공원명>)",cls:<밴드>},{n:"__COUNT__",l:"1.2km 내 공원"},{dot:<밴드>,l:"신호 등급"}]
pois: 공원명 + d(거리 m), 거리순
hedge.verify: null (공원은 공식 배정/확인 링크 없음)
mapUrl: get_map_embed_url 결과
필수 단서 · 금지 표현
- 필수: 공원 직선거리 기준 · 조망/접근성/규모 미확인 · 어린이공원(소규모) 다수일 수 있음
- 금지: 근거 없는 "숲세권 확정" 단정, 값 지어내기
엣지
- 지오코딩 실패/
NOT_FOUND → 재입력 · 후보 다수/AMBIGUOUS → 후보 나열
- 반경 내 공원 0건 → ⬜ 데이터 부족
검증된 사항 (방배롯데캐슬아르떼, 2026-07-08)
- 사이트: 방배롯데캐슬아르떼아파트 · 서울 서초구 방배동 424-28.
- 검색식:
search_by_nearby_keyword(query="공원", radius=1500, category_filter include=["공원"] exclude=["공원시설물"])
- 결과: 햇님어린이공원 137m · 청두어린이공원 324m · 까치어린이공원 466m · 도구머리공원 599m · 가꿀공원 623m · 새우촌공원 691m · 사당만남의공원 760m
- 판정: 최근접 137m → 🟢 공원 인접. 단 반경 내 다수가 어린이공원(소규모) → hedge에 규모·조망 미확인 명시 필수.
섹션마다 출처를 작게 단다
데이터 블록 하단에 .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번)
🚨 categories:['park'] 는 0건을 반환한다 (실측 2026-07-09)
반경 1000m · categories:['park'] → 0건 ← 죽은 검색식
카카오 카테고리 그룹에 공원이 없다. attraction·구청 과 같은 부류다. 공원은 키워드 검색으로만 찾는다.
그리고 키워드 "공원" 은 상호명이 상위를 도배한다. 실측 상위 5건:
뻥튀기공작소 위례호수공원점 187m · 컴포즈커피 위례호수공원점 194m · 오마뎅 위례호수공원점 194m
파리바게뜨 위례호수공원점 194m · 뉴메이킹코딩학원 위례 호수공원센터 213m
도구도 경고를 낸다 — "Short keyword 공원 can return noisy or incomplete Kakao results."
→ category_filter 로 반드시 거른다. include_contains:["공원"] + exclude_contains:["공원시설물"].
category_name 이 음식점·카페·학원이면 공원이 아니다.
🚨 화면 문구는 일반인 언어로 (2026-07-10 결정)
진단 시리즈(초품아·역세권·병세권·쇼세권·숲세권)의 독자는 부동산 전문가가 아니다.
내부 용어를 그대로 화면에 쓰지 않는다. 임계값·색(cls)은 그대로 두고 라벨만 바꾼다.
| 쓰지 않는 말 | 대신 |
|---|
| 최근접 · (최근접·판정 기준) | 제일 가까운 곳 · (제일 가까움) |
| 판정 밴드 · 판정 기준 | 등급 기준 |
| 신호 등급 | 등급 |
| 인접 / 근접 | 아주 가까움 / 가까움 |
| 다소 이격 | 조금 먼 편 |
| 이격 · 역 이격 | 먼 편 · 역이 먼 편 |
| 보도권 | 가까움 |
| 판정 유보 | 자료 부족 |
| 판정창 | 기준 범위 |
| 참고 신호(진단 아님) | 참고용이며 확정 판단이 아닙니다 |
| 1km 내 · 슬라이더 반경 내 | 1km 안 · 선택한 반경 안 |
| 미확인 | 확인되지 않음 |
| 판정에서 제외 | 등급에서 제외 |
거리도 읽기 쉽게: 1313m → 1.3km.
문장도 사람 말로
✕ SITE(파랑) · 반경 3km 원 · 판정 기준 경찰병원(주황, 2.3km) · 서울세계로병원(회색)은 등급에 미반영
✓ 파란 점이 우리 집, 주황 점이 등급 기준이 된 경찰병원(2.3km)입니다.
회색 서울세계로병원(645m)은 종합병원이 아니라 등급에 넣지 않았습니다.
- 🚨 부드럽게 쓰되 사실은 그대로. "가까움"이 "좋음"이 되면 안 된다. 등급은 거리 밴드가 정한다.
- 🚨 숫자는 화면 전체에서 일치해야 한다.
aux 항목을 개수에서 뺐으면 본문 문장의 개수도 함께 고친다.
실제로 목록은 5곳인데 본문이 6곳이라고 적힌 적이 있다.
- 익숙한 말은 남긴다:
역세권·준역세권·초품아·상권.
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 연결 상태를 확인하도록 안내한 뒤 중단한다.