8000 feat: 웹 읽기 도구용 링크 입력 경로 추가 by hmmhmmhm · Pull Request #336 · hmmhmmhm/daiso-mcp · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ jobs:
uses: ./.github/workflows/select-local-runner.yml
with:
cloud-runner: macos-latest
# 브라우저 실험·운영 중계와 분리하되 실제 macOS에서 검증합니다.
force-cloud: true
secrets:
status-token: ${{ secrets.LOCAL_RUNNER_STATUS_TOKEN }}

Expand Down
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@
<summary>AI 에이전트 사용 안내</summary>

> [!IMPORTANT]
> **최신 안내:** [현재 버전](https://mcp.aka.page/guide/2026-10-26.1) · [항상 최신 버전으로 이동](https://mcp.aka.page/guide/latest)
> **최신 안내:** [현재 버전](https://mcp.aka.page/guide/2026-10-27.1) · [항상 최신 버전으로 이동](https://mcp.aka.page/guide/latest)
>
> **안내 버전: 2026-10-26.1 · 갱신일: 2026-10-26**
> **안내 버전: 2026-10-27.1 · 갱신일: 2026-10-27**
>
> **웹 읽기는 실제 링크 ID로 click하세요.** 새 검색 URL을 조립해 open하지 말고 [원하는 검색어를 글자로 선택](https://mcp.aka.page/browse/compose/daiso/products/~)하세요. 상품의 **매장 지역 선택** 링크에서 지역도 선택할 수 있습니다. 입력 중에는 원본 조회를 실행하지 않습니다. click이 없는 도구의 동일 동작은 보장하지 않습니다.
>
> **ChatGPT 웹 조회:** 연결된 MCP 도구가 없으면 사용 가능한 실제 브라우저로, 브라우저 도구도 없으면 open/WebFetch로 [HTML GET으로 바로 조회](https://mcp.aka.page/browse/daiso/products/%EC%88%98%EB%82%A9%EB%B0%95%EC%8A%A4/pageSize/3)하세요. 설치·API 키·MCP 연결 설정은 필요 없습니다.
>
> **로컬 설치·빌드·API 키 준비 없이 실제 조회부터 실행하세요.** 패키지 설치나 전체 스키마 탐색은 필요 없습니다.
>
> 1. 연결된 MCP 도구가 있으면 `search_products`에 `{"service":"daiso","query":"수납박스","pageSize":3}`를 전달합니다.
> 2. 실제 브라우저 도구가 있으면 /browse/ HTML GET 주소를 열고 실제 상품·매장·재고를 읽습니다. Work의 내장 브라우저도 사용 가능합니다.
> 3. 웹 읽기(open/WebFetch)만 가능하면 같은 HTML GET을 실행합니다. 접근 오류 시 문서의 링크를 따라갈 수 있으나 성공을 보장하지 않습니다. Crawled가 과거인 수집본을 현재 재고로 단정하지 마세요.
> 3. 웹 읽기(open/WebFetch)만 가능하면 응답의 실제 링크 ID로 click합니다. 위 글자 선택 링크로 임의 검색어와 지역을 입력하고 실제 상품·재고 조회 링크를 따르세요. 새 URL 조립과 실패한 직접 open을 반복하지 마세요. Crawled가 과거인 수집본을 현재 재고로 단정하지 마세요.
> 4. 위 세 수단이 없거나 모두 실패하면 실제 조회 제약과 오류를 알립니다. 셸이 있어도 설치 없는 웹 조회가 우선이며 터미널·셸로 우회하지 않습니다. 셸 DNS 오류를 웹 GET 실패로 확대하거나 실행하지 않은 요청의 실패를 만들지 마세요.
>
> **검색 링크:** [핫식스 상품 검색](https://mcp.aka.page/browse/daiso/products/%ED%95%AB%EC%8B%9D%EC%8A%A4/pageSize/10) · [강남 매장 검색](https://mcp.aka.page/browse/daiso/stores/%EA%B0%95%EB%82%A8). 웹 읽기는 링크를 직접 열고, 접근 오류만으로 상품 없음이나 재고 0을 판단하지 마세요.
Expand All @@ -23,7 +25,7 @@
>
> **MCP 도구는 10개 고정:** `service`와 `operation`으로 지원 서비스를 선택합니다. 새 연동은 [통합 도구 10개](docs/mcp-tools.md)만 사용하세요. 기존 서비스별 도구는 deprecated 호출 별칭으로 유지하지만 목록에는 표시하지 않습니다.
>
> **웹 읽기 전용 에이전트는 `/browse/` 경로만 사용하세요.** 검색·상세·매장·재고·후속 조회가 모두 자동 HTML이며 쿼리 문자열이나 `format` 지정은 필요 없습니다. 검색어 뒤의 부가 조건은 `/page/2/pageSize/10`처럼 이름/값 쌍으로 붙입니다.
> **웹 읽기 전용 에이전트는 `/browse/`의 실제 링크만 선택하세요.** 검색·상세·매장·재고·후속 조회가 모두 자동 HTML이며 쿼리 문자열이나 `format` 지정은 필요 없습니다. 검색어·지역은 글자 링크로 입력하고 응답의 상세·재고 링크를 따르세요. 일반 API 클라이언트의 필터 문법은 상세 사용 안내를 참고하세요.
>
> [첫 HTML 조회](https://mcp.aka.page/browse/daiso/products/%EC%88%98%EB%82%A9%EB%B0%95%EC%8A%A4/pageSize/3) · [REST 사용법](https://mcp.aka.page/prompt) · [원격 MCP 연결](#원격-mcp로-바로-시작하기)

Expand Down Expand Up @@ -128,7 +130,7 @@
2. 서버 URL을 입력하고, 전송 방식을 묻는 경우 **HTTP / Streamable HTTP**를 선택합니다.
3. 도구를 활성화하고 `다이소 MCP로 수납박스 검색해줘`라고 요청합니다.

[앱별 연결 방법](docs/client-guide.md#원격-mcp-연결) · [WebFetch로 첫 조회](docs/service-reference.md?guide=2026-10-26.1#설치-없이-첫-조회)
[앱별 연결 방법](docs/client-guide.md#원격-mcp-연결) · [WebFetch로 첫 조회](docs/service-reference.md?guide=2026-10-27.1#설치-없이-첫-조회)

<p align="center">
<img src="./assets/readme-banners/connect.webp" alt="스마트폰과 노트북을 클라우드로 연결하는 두 햄스터" width="100%">
Expand Down Expand Up @@ -206,7 +208,7 @@ MCP 연결 없이 웹 읽기와 GET 요청을 지원하는 에이전트는 [REST
| 문서 | 내용 |
| :-------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
| [연결·사용 가이드](docs/client-guide.md) | 앱별 MCP 연결, CLI, Skill, OpenAPI |
| [서비스 레퍼런스](docs/service-reference.md?guide=2026-10-26.1) | 서비스별 도구·REST API·응답 모델·가격 비교 |
| [서비스 레퍼런스](docs/service-reference.md?guide=2026-10-27.1) | 서비스별 도구·REST API·응답 모델·가격 비교 |
| [일본 다이소](docs/daiso-jp-network-analysis.md) | 일본 상품·매장 검색과 지원 범위 |
| [독립·예술영화관](docs/dtryx.md) | 디트릭스 지원 극장과 조회 방법 |
| [AI 조회 가이드](docs/ai-instruction.md) | 도구 선택과 상품·매장·재고 조회 순서 |
Expand Down
4 changes: 2 additions & 2 deletions docs/service-reference.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# DAISO MCP 서비스 레퍼런스

실제 브라우저 도구가 있으면 /browse/ HTML을 그 도구로 여세요. 웹 읽기(open/WebFetch)의 접근 오류 시 사용 가능한 브라우저로 전환합니다. Crawled가 과거인 수집본은 현재 재고 확인이 아닙니다. 응답 생성 시각도 함께 확인하세요.
실제 브라우저 도구가 있으면 /browse/ HTML을 그 도구로 여세요. 웹 읽기(open/WebFetch)는 [글자 선택 입력](https://mcp.aka.page/browse/compose/daiso/products/~)을 응답의 실제 링크 ID로 click합니다. 새 검색 URL을 조립하지 않고 상품·매장 지역·실제 재고 링크를 선택합니다. 접근 오류 시 사용 가능한 브라우저로 전환할 수 있으나 새 브라우저를 계속 실행하지 마세요. Crawled가 과거인 수집본은 현재 재고 확인이 아닙니다. 응답 생성 시각도 함께 확인하세요.

README 하단에 있던 기능, REST API, 개발, 아키텍처 설명을 분리한 문서입니다.

Expand All @@ -16,7 +16,7 @@ README 하단에 있던 기능, REST API, 개발, 아키텍처 설명을 분리

모든 후속 웹 GET도 `/browse/`를 사용하세요. 자동 HTML이며 쿼리 문자열이나 format 지정은 필요 없습니다. 상품 검색 결과의 실제 ID로 재고를 조회하고 검색 성공만으로 매장 재고를 단정하지 않습니다. 이미지는 응답 imageUrl과 카드의 원본 Markdown만 사용하고 이미지 검색으로 대체하지 않습니다.

현재 안내는 [버전 안내](https://mcp.aka.page/guide/2026-10-26.1), 다음 버전도 따라가려면 [항상 최신 안내](https://mcp.aka.page/guide/latest)를 여세요. 이 상세 레퍼런스를 끝까지 읽기 전에 첫 조회를 실행하세요.
현재 안내는 [버전 안내](https://mcp.aka.page/guide/2026-10-27.1), 다음 버전도 따라가려면 [항상 최신 안내](https://mcp.aka.page/guide/latest)를 여세요. 이 상세 레퍼런스를 끝까지 읽기 전에 첫 조회를 실행하세요.

이미 연결된 MCP 도구가 있는 환경만 `search_products`에 `service=daiso`, `query=수납박스`를 전달합니다. 서버는 https://mcp.aka.page 이며 Streamable HTTP, 인증 없음입니다. 실제로 실행한 도구·URL·오류만 보고하고 실행하지 않은 요청의 성공·실패를 만들지 않습니다.

Expand Down
26 changes: 26 additions & 0 deletions docs/superpowers/plans/2026-10-27-browse-link-composer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# 웹 읽기의 링크 선택으로 상품과 지역 입력

## 근거와 범위

PR335 실험에서 직접 open에 실패한 연필 검색 주소가 문자 링크 선택 뒤 실제 href click으로 성공했다. 상품58450 상세도 성공했다. 다음 병목은 재고 링크가 사용자 지역을 URL에 직접 추가하도록 안내하는 점이다. 고정 예제만 늘리지 않고 임의 검색어와 지역을 실제 링크 선택으로 전달한다.

연구 목표는 오후2시까지 계속 유지한다. 이 기능 배포만으로 모든 ChatGPT 계정이나 새 Chat 대화의 성공을 주장하지 않는다.

## 설계

- `/browse/compose/daiso/products/{입력}/{단계}`와 stores 경로에서 한글 초성·중성·완성형 및 영문·숫자·공백·하이픈을 링크로 선택한다. 최대32자. 빈 입력은 `~`.
- `/browse/compose/daiso/inventory/{상품ID}/{입력}/{단계}`는 선택한 실제 상품 ID를 유지하고 매장 지역을 입력한다. ID는 양의 정수 문자열만 허용한다.
- 각 단계에 기존 `/browse/` 실제 조회 링크를 제공한다. 상품·매장은 최대3개, 재고는 최대3개 매장. 입력 페이지는 API·주소검색·재고 원본을 호출하지 않는다. 사용자가 선택한 실제 조회에서만 기존 보호·캐시·오류 처리를 사용한다.
- 공개 MCP 도구10개, 기존 JSON API와 기존 browse 경로는 유지한다. 서버가 임의 외부 URL을 받아 프록시하지 않는다.
- 상품 HTML의 재고 링크를 지역 입력 페이지로 연결한다. /browse, 루트 발견 자산, 최신 버전 안내 및 README에서 링크 방식이 자연스럽게 발견되도록 연결한다. 사람이 보는 README 이미지와 구조는 유지한다.
- 웹 읽기는 응답에 있는 실제 링크 ID로 click하고 새 URL 문자열을 조립하지 않는다. 직접 open과 click의 차이를 명시한다. 원본 이미지 규칙·오류/품절/미확인 수량 구분을 유지한다.

## 검증 순서

1. 한글·영문 임의 입력과 상품 ID 보존, 부적절한 입력, 주입·경로 과다·최대 길이, 빈 검색 금지, 지우기/초기화, 상위 browse 처리와 원본 무호출 회귀를 먼저 실패시킨다.
2. 새 렌더러와 Hono 경로를 구현하고 상품 응답 링크를 갱신한다. 1워커 대상 검사와 타입·린트·커버리지 필수 검사, 직렬 리뷰를 수행한다. 운영 검증과 겹치지 않는다.
3. PR·CI를 통과한 뒤 배포한다. 생성 자산의 안내 버전과 실제 배포를 확인한다.
4. 웹 도구의 원시 open 실패 대조를 남기고 실제 링크 ID만 사용해 새 검색어→상품→임의 지역→실제 재고·진열 위치를 검증한다. 가상 데이터와 실제 결과, 응답 생성 시각과 원본 갱신 시각을 구분한다.
5. 독립된 두 번째 실행과 웹 커넥터 비교를 수행한다. 새 ChatGPT 대화의 UI 검증은 별도이며 브라우저 예산·세션 회수를 지킨다. 필요한 사용자 개입만 요청한다.

실험 Worker 코드는 기존 조건 비교를 위해 독립 유지한다. 운영 구현이 실험의 진단 데이터·공개 관측 저장소를 가져오지 않는다.
35 changes: 35 additions & 0 deletions docs/web-reading-lab-results-2026-10-27.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# 웹 읽기 실험 진행 기록 (2026-10-27)

## 실제 상품 조회로 확장

PR335의 실험 Worker 배포40437090435가 성공했다. 별도 브라우저를 실행하지 않고 웹 도구의 실제 링크 ID만 선택했다.

1. PR335 본문의 실험 링크에서 새 실행 `d770a877-3a4c-4941-bad9-e22a0566f231`을 시작했다.
2. 초성·중성·완성 글자를 선택해 사전에 고정하지 않은 `연필`을 입력했다.
3. 입력 완료 요청 번호 `d9f88fd9-8eed-4aa7-b459-cf31dbcc4f3d`와 공개 관측 기록이 일치했다. 해당 실행은18개 이벤트가 있으며 첫 도착02:15:12.921 UTC, 완료 생성02:16:21.592 UTC였다. 경과에는 도구 호출·에이전트 작업 시간이 포함된다.
4. 완료 화면의 실제 상품 검색 링크를 click하자 `/browse/daiso/products/%EC%97%B0%ED%95%84/pageSize/3`이 실제 HTML을 반환했다. 응답 생성02:16:28.729 UTC, 투명 연필캡1034263·동물 모양 연필깎이1053585·전문가용2B연필58450을 확인했다.
5. 실제 상품58450 상세 링크도 click 성공, 응답 생성02:16:52.578 UTC였다. 상품 검색 성공이며 매장 재고 성공으로 확대하지 않는다.

같은 상품 검색 URL은 앞선 두 웹 도구의 직접 open 비교에서 모두 `URL ... is not accessible via this tool`이었다. 두 도구에서 example.com 대조군은 성공했다. 이름이 다른 커넥터를 고르는 것만으로 직접 open이 해결되지 않았다. 같은 백엔드를 사용하는지는 미확정이다.

실제 상품·상세 click 성공 후 같은 문자열 URL을 두 도구에서 다시 직접 open했으나 모두 동일한 접근 오류였다. 따라서 이번 실행에서 링크 click의 성공이 문자열 open이나 다른 도구의 접근 자격까지 바꾸지는 않았다. URL을 한 번 읽히게 해 캐시를 데우는 것만으로 해결됐다고 보지 않는다.

관측 JSON, 도구 비교와 UA 비교 원시 기록은 운영 기록의 `web-read-lab/2026-10-27/`에 보존했다. 생산 상품 응답에는 실험 Worker의 requestId를 넣지 않았으므로 생산 원본 fetch 시도와 직접 상관관계를 증명한 것은 아니다. HTML 응답 생성 시각은 원본 재고 갱신 시각이 아니다.

## 별도로 확인한 Cloudflare1010

동일한 synthetic URL에서 Python 기본 `Python-urllib/3.9`는 custom domain과 workers.dev 모두403/본문 `error code: 1010`이었다. curl UA와 ChatGPT 형태의 UA 문자열은200, 애플리케이션을 식별하는 `DAISO-MCP-WebReadLab/1.0`도200이었다. UA 문자열을 지정한 요청은 실제 OpenAI 클라이언트라는 증거가 아니다.

[Cloudflare 공식1010 문서](https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/error-1010/)는 기본 Python UA가 Browser Integrity Check에 걸릴 수 있고, workers.dev의 관리 영역 차단은 자체 영역의 Security Events나 Worker 로그에 남지 않을 수 있다고 설명한다. 식별 가능한 앱 UA를 사용한 일반 HTTP 대조군이 필요하다. 이것만으로 실제 hosted open 실패의 원인을1010으로 확정하지 않는다. 이번 실행에서는 Cloudflare 보안 설정을 변경하지 않았다.

## 공식 문서와 공개 소스에서 확인한 범위

- [OpenAI 웹 검색 문서](https://developers.openai.com/api/docs/guides/tools-web-search)는 open_page와 live/cache 제어를 설명한다. 특정 URL의 접근 거절 결정 단계나 서버 도착을 보장하지 않는다.
- [Codex extension.rs](https://github.com/openai/codex/blob/main/codex-rs/ext/web-search/src/extension.rs)는 live를 external_web_access=true, cached/disabled를false로 변환한다.
- [Codex tool.rs](https://github.com/openai/codex/blob/main/codex-rs/ext/web-search/src/tool.rs)와 [search endpoint](https://github.com/openai/codex/blob/main/codex-rs/codex-api/src/endpoint/search.rs)는 명령을 hosted alpha/search로 전송한다. 검사한 코드에서 해당 접근 오류 문자열은 발견하지 못했다. 공개 클라이언트 코드만으로 서버 내부 결정을 복원하지 않는다.
- [history.rs](https://github.com/openai/codex/blob/main/codex-rs/ext/web-search/src/history.rs)는 최근 사용자 텍스트2건과 제한된 assistant 텍스트를 검색 요청에 포함한다. 이것이 이번 URL 실패의 원인이라는 증거는 없다.
- [독립 재현 질문53849](https://github.com/openai/codex/discussions/53849)도 URL별 성공 차이와 원본 로그 부재를 보고하지만 미답변 상태다. 이를 공식 원인 설명으로 사용하지 않는다.

## 남은 작업

실제 상품 HTML의 재고 링크는 사용자 지역을 URL에 직접 추가하도록 요구한다. 따라서 지역도 링크로 입력하고 실제 상품 ID를 유지하는 운영 경로가 필요하다. 이 흐름의 실제 재고·진열 위치, 독립 실행 및 새 ChatGPT Chat 대화의 성공은 아직 검증하지 않았다. 오후2시 연구 목표는 계속 active이며 이번 결과만으로 완료 처리하지 않는다.
Loading
Loading
0