8000 docs: README 상단 이미지와 기존 구성 복원 by hmmhmmhm · Pull Request #246 · 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: 1 addition & 1 deletion .github/workflows/workers-invocations-chart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ jobs:
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add scripts/ops/README.md assets/analytics/workers-invocations.json assets/analytics/workers-invocations.png
git add README.md scripts/ops/README.md assets/analytics/workers-invocations.json assets/analytics/workers-invocations.png

if git diff --cached --quiet; then
echo "No chart changes to commit"
Expand Down
125 changes: 115 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,120 @@
[![MCP Toplist](https://mcptoplist.com/badge/glama%2Fhmmhmmhm%2Fdaiso-mcp.svg)](https://mcptoplist.com/server/glama%2Fhmmhmmhm%2Fdaiso-mcp)

<div align="center">

<img src="./assets/logo.svg" alt="Daiso MCP" width="120" height="120">

<br>
<br>

# Daiso MCP 및 Skill

다이소(제품/매장/재고), 상품 가격 비교, 주변 음식점/카페, 주유소/유가, 개발자 요청 제출, GS25(매장/상품/재고), 세븐일레븐(상품/매장/재고/인기검색어/카탈로그), CU(매장/재고), 이마트24(매장/상품/재고), 올리브영(매장/재고), 메가박스(지점/영화/시간표/좌석), 롯데시네마(지점/영화/좌석), CGV(극장/영화/시간표), 디트릭스(독립·예술영화관/상영작/잔여 좌석) 조회 기능을 MCP, CLI, Codex Skill로 AI에 연결합니다.

디트릭스의 지원 범위와 CLI 예시는 [독립·예술영화관 조회 가이드](docs/dtryx.md)를 참고하세요.

<br>

**MCP:** `https://mcp.aka.page` · **CLI:** `npx daiso` · **Skill:** `clawhub install daiso-cli`

**ClawHub:** [clawhub.ai/hmmhmmhm/daiso-cli](https://clawhub.ai/hmmhmmhm/daiso-cli)

한국 로컬 리테일, 생활 정보, 영화관 조회를 MCP, CLI, Codex Skill로 연결하는 도구입니다.
사용자는 별도 API 키를 준비하지 않고 바로 사용할 수 있습니다.

<br>

<h3>지원 서비스</h3>

<table>
<thead>
<tr>
<th>분류</th>
<th>서비스</th>
<th>조회 기능</th>
</tr>
</thead>
<tbody>
<tr>
<td>장소</td>
<td>네이버 지역 검색</td>
<td>음식점, 카페, 디저트, 주변 장소</td>
</tr>
<tr>
<td>교통</td>
<td>오피넷</td>
<td>전국 평균 유가, 최저가 주유소, 위치 기반 주유소, 주유소 상세정보</td>
</tr>
<tr>
<td>비교</td>
<td>다이소, GS25, 세븐일레븐, 이마트24</td>
<td>같은 상품의 판매처별 가격 후보 비교</td>
</tr>
<tr>
<td>운영</td>
<td>Supabase</td>
<td>MCP 오류, 개선 요청, 신규 기능 요청 저장</td>
</tr>
<tr>
<td>리테일</td>
<td>다이소, 올리브영</td>
<td>상품, 매장, 재고</td>
</tr>
<tr>
<td>편의점</td>
<td>GS25, 세븐일레븐, CU, 이마트24</td>
<td>상품, 매장, 재고, 인기검색어, 카탈로그</td>
</tr>
<tr>
<td>영화관</td>
<td>CGV, 메가박스, 롯데시네마</td>
<td>극장, 영화, 시간표, 잔여 좌석</td>
</tr>
</tbody>
</table>

<br>

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Cloudflare Workers](https://img.shields.io/badge/Cloudflare-Workers-F38020.svg)](https://workers.cloudflare.com/)
[![MCP](https://img.shields.io/badge/MCP-Protocol-8B5CF6.svg)](https://modelcontextprotocol.io/)
[![Code Coverage](https://img.shields.io/badge/Code%20Coverage-100%25-brightgreen.svg)](https://github.com/hmmhmmhm/daiso-mcp/actions/workflows/coverage.yml)
[![Coverage](https://github.com/hmmhmmhm/daiso-mcp/actions/workflows/coverage.yml/badge.svg?branch=main)](https://github.com/hmmhmmhm/daiso-mcp/actions/workflows/coverage.yml)
[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v2/monitor/2mmhx.svg)](https://aka-page.betteruptime.com/)

**[실시간 서비스 상태 보기](https://aka-page.betteruptime.com/)**

<!-- WORKERS_INVOCATIONS_CHART:START -->
<h3>Cloudflare 요청 수 (2026-09-07 ~ 2026-10-06, 30일)</h3>

<img src="./assets/analytics/workers-invocations.png?v=2026-10-06T20:21:54.180Z" alt="Cloudflare 요청 수 그래프 (2026-09-07 ~ 2026-10-06)" width="100%">

<sub>기준 워커: <code>daiso-mcp</code> · 마지막 갱신: 2026-10-07 05:21 KST</sub>
<br><sub>집계: Worker 실행 + 루트 GET 리디렉션 요청 · 사용자 수와 다릅니다.</sub>

</div>

> [!IMPORTANT]
> 최근 공개 서버 사용량이 크게 증가하여 2026년 7월 18일부터 올리브영·CGV·CU·GS25의 검색을 포함한 공개 GET API에 IP당 하루 합산 3,000회(KST 기준)의 호출 제한을 적용합니다. 한도를 초과하는 사용이 필요하다면 Daiso MCP는 오픈 소스이므로 이 저장소를 직접 배포해 이용해 주세요.

<div align="center">< 10BC8 /td>

<!-- WORKERS_INVOCATIONS_CHART:END -->

<br>

<br>

<img src="https://i.imgur.com/mPwS4Kv.png" width="400">&nbsp;&nbsp;<img src="https://i.imgur.com/MrndJ3g.png" width="400">

</div>

<br>

---

<br>

다이소·편의점 재고, 주변 장소, 주유소 가격, 영화 시간표를 AI에서 조회합니다.
**공개 원격 MCP에 연결하면 로컬 설치·빌드·API 키 준비 없이 바로 사용할 수 있습니다.**
에이전트는 [짧은 시작 안내](https://mcp.aka.page/llms.txt)를 참고하세요. 무설치 요청에는 npm 설치나 전체 스키마 탐색이 필요하지 않습니다.
Expand Down Expand Up @@ -65,16 +180,6 @@ GS25 mcp로 강남 근처 오감자 재고 알려줘
재고 조회는 먼저 상품을 검색해 ID를 확인한 뒤 진행합니다.
자세한 선택 규칙은 [AI 지시문](docs/ai-instruction.md)에 있습니다.

## 지원 서비스

| 분류 | 서비스 | 주요 조회 |
| :-------- | :---------------------------------- | :---------------------- |
| 리테일 | 다이소, 올리브영 | 상품·매장·재고 |
| 편의점 | GS25, 세븐일레븐, CU, 이마트24 | 상품·매장·재고 |
| 가격 비교 | 다이소, GS25, 세븐일레븐, 이마트24 | 같은 상품의 가격 후보 |
| 장소·유가 | 네이버 지역 검색, 오피넷 | 카페·음식점·주유소·유가 |
| 영화관 | CGV, 메가박스, 롯데시네마, 디트릭스 | 지점·영화·시간표·좌석 |

서비스별 지원 범위와 입력은 [서비스 레퍼런스](docs/service-reference.md)와
[디트릭스 가이드](docs/dtryx.md)를 참고하세요.
롯데마트는 지원이 종료되었습니다. 과거 분석과 호환 경로만 보존합니다.
Expand Down
18 changes: 14 additions & 4 deletions scripts/ops/update-workers-invocations-chart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,16 +274,16 @@ async function renderChart(points, summary, metadata) {
return sharp(Buffer.from(svg)).png().toBuffer();
}

async function updateReadme(section) {
const readme = (await fs.readFile(README_PATH, 'utf8')).replaceAll('\r\n', '\n');
async function updateReadme(section, readmePath = README_PATH) {
const readme = (await fs.readFile(readmePath, 'utf8')).replaceAll('\r\n', '\n');
const pattern = new RegExp(`${README_START}[\\s\\S]*?${README_END}`, 'm');
if (pattern.test(readme)) {
await fs.writeFile(README_PATH, readme.replace(pattern, section), 'utf8');
await fs.writeFile(readmePath, readme.replace(pattern, section), 'utf8');
return;
}
const next = `${readme.trimEnd()}\n\n${section}\n`;

await fs.writeFile(README_PATH, next, 'utf8');
await fs.writeFile(readmePath, next, 'utf8');
}

async function main() {
Expand Down Expand Up @@ -397,6 +397,16 @@ async function main() {
includesRootRedirect: Boolean(payload.rootRedirect),
});
await updateReadme(section);
const publicReadmePath = path.join(REPO_ROOT, 'README.md');
const publicReadme = await fs.readFile(publicReadmePath, 'utf8');
if (publicReadme.includes(README_START) && publicReadme.includes(README_END)) {
// 상단의 중앙 정렬은 차트 앞에서 시작하고 예시 이미지 뒤에서 끝납니다.
const publicSection = section
.replace('<div align="center">\n\n', '')
.replace('../../assets/analytics/', './assets/analytics/')
.replace(README_END, `<div align="center">\n\n${README_END}`);
await updateReadme(publicSection, publicReadmePath);
}

console.log(
`[workers-chart] script=${scriptName} days=${points.length} total=${formatNumber(payload.total)}`,
Expand Down
10 changes: 7 additions & 3 deletions tests/scripts/repository-config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ describe('repository maintenance configuration', () => {
expect(workflow).toContain('CLOUDFLARE_ZONE_ID');
expect(workflow).toContain('WORKERS_CHART_ROOT_REDIRECT_START');
expect(workflow).toContain(
'git add scripts/ops/README.md assets/analytics/workers-invocations.json assets/analytics/workers-invocations.png',
'git add README.md scripts/ops/README.md assets/analytics/workers-invocations.json assets/analytics/workers-invocations.png',
);
expect(workflow).toContain('git pull --rebase --autostash origin main');
expect(workflow).toContain('git push origin HEAD:main');
Expand Down Expand Up @@ -298,7 +298,11 @@ describe('repository maintenance configuration', () => {
expect(readme).toContain('Daiso MCP 및 Skill');
expect(readme).toContain('skills/daiso-cli/SKILL.md');
expect(readme).toContain('npx daiso');
const fastStart = readme.split('\n').slice(0, 100).join('\n');
const fastStart = readme
.slice(readme.indexOf('다이소·편의점 재고'))
.split('\n')
.slice(0, 100)
.join('\n');
expect(fastStart).toContain('https://mcp.aka.page');
expect(fastStart).toContain('Streamable HTTP');
expect(fastStart).toContain('API 키·토큰·OAuth 설정 불필요');
Expand All @@ -307,7 +311,7 @@ describe('repository maintenance configuration', () => {
expect(fastStart).toContain('"method":"tools/call"');
expect(fastStart).toContain('"name":"daiso_search_products"');
expect(fastStart).toContain('"query":"수납박스"');
expect(readme).not.toContain('WORKERS_INVOCATIONS_CHART:START');
expect(readme).toContain('WORKERS_INVOCATIONS_CHART:START');
expect(readme).toContain('scripts/ops/README.md');
});

Expand Down
20 changes: 20 additions & 0 deletions tests/scripts/workers-chart-entrypoint.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,24 @@ describe('workers chart entrypoint', () => {
expect(readme.endsWith('\n\n## Footer\n')).toBe(true);
expect(readme).toContain('Worker 실행 + 루트 GET 리디렉션 요청');
});
it('상단 README 차트도 갱신하며 기존 중앙 정렬과 뒤 이미지를 보존한다', async () => {
const { root, dataPath } = await fixture();
const prefix = '# Header\n<div align="center">\n';
const suffix = '\n<img src="example.png">\n</div>\n## Quick start\n';
await fs.writeFile(
path.join(root, 'README.md'),
prefix +
'<!-- WORKERS_INVOCATIONS_CHART:START -->\nold chart\n</div>\n> quota\n<div align="center">\n<!-- WORKERS_INVOCATIONS_CHART:END -->' +
suffix,
);
run(root, { WORKERS_CHART_INPUT_JSON: dataPath });
const readme = await fs.readFile(path.join(root, 'README.md'), 'utf8');
expect(readme.startsWith(prefix)).toBe(true);
expect(readme.endsWith(suffix)).toBe(true);
expect(readme).toContain('./assets/analytics/workers-invocations.png');
expect(readme).not.toContain('old chart');
expect(readme.match(/<div align="center">/g)).toHaveLength(2);
expect(readme.match(/<\/div>/g)).toHaveLength(2);
expect(readme).toContain('IP당 하루 합산 3,000회');
});
});
Loading
0