{"id":50675635,"url":"https://github.com/hunkim/daum-mcp-toy","last_synced_at":"2026-06-08T15:33:08.114Z","repository":{"id":354943498,"uuid":"1226130801","full_name":"hunkim/daum-mcp-toy","owner":"hunkim","description":"Mock MCP servers for Daum Agent Portal — Tier 0 (4 servers, 14 tools, stdio + streamable-HTTP). Test endpoint: https://daum-mcp.toy.x.upstage.ai","archived":false,"fork":false,"pushed_at":"2026-05-01T03:04:19.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T05:05:28.612Z","etag":null,"topics":["agent","daum","korean-nlp","mcp","solar","upstage"],"latest_commit_sha":null,"homepage":"https://daum-mcp.toy.x.upstage.ai","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hunkim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-01T02:26:31.000Z","updated_at":"2026-05-01T03:04:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hunkim/daum-mcp-toy","commit_stats":null,"previous_names":["hunkim/daum-mcp-toy"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/hunkim/daum-mcp-toy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hunkim%2Fdaum-mcp-toy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hunkim%2Fdaum-mcp-toy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hunkim%2Fdaum-mcp-toy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hunkim%2Fdaum-mcp-toy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hunkim","download_url":"https://codeload.github.com/hunkim/daum-mcp-toy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hunkim%2Fdaum-mcp-toy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069491,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","daum","korean-nlp","mcp","solar","upstage"],"created_at":"2026-06-08T15:33:07.349Z","updated_at":"2026-06-08T15:33:08.102Z","avatar_url":"https://github.com/hunkim.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# daum-mcp-toy\n\nMock MCP servers for **Daum Agent Portal** — Tier 0 (Day 1-7 demo gate).\n**4 servers · 14 Korean-context tools · live at `https://daum-mcp.toy.x.upstage.ai`.**\n\n\u003e *Korea's Agent grounding layer. People's Portal → Agent's Portal.*\n\n---\n\n## ▶︎ Add to your Claude / Cursor / VS Code in 10 seconds\n\n### Claude.ai (web, Pro / Team / Enterprise) — Custom Connectors\n\n[![Open Claude.ai connector settings](https://img.shields.io/badge/Add%20to-Claude.ai-DA7756?logo=anthropic\u0026logoColor=white\u0026style=for-the-badge)](https://claude.ai/settings/connectors)\n\n1. Click the badge → **\"Add custom connector\"**\n2. Paste each URL below as a separate connector (name them anything):\n   ```\n   https://daum-mcp.toy.x.upstage.ai/meta/mcp\n   https://daum-mcp.toy.x.upstage.ai/search/mcp\n   https://daum-mcp.toy.x.upstage.ai/knowledge/mcp\n   https://daum-mcp.toy.x.upstage.ai/solar/mcp\n   ```\n3. No auth required (toy server). All 14 tools appear in your chat tools tray.\n\n### Claude Desktop (macOS / Windows)\n\nAppend the following block to `~/Library/Application Support/Claude/claude_desktop_config.json`\n(macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows), then restart Claude:\n\n```json\n{\n  \"mcpServers\": {\n    \"daum-meta\":      { \"type\": \"http\", \"url\": \"https://daum-mcp.toy.x.upstage.ai/meta/mcp\" },\n    \"daum-search\":    { \"type\": \"http\", \"url\": \"https://daum-mcp.toy.x.upstage.ai/search/mcp\" },\n    \"daum-knowledge\": { \"type\": \"http\", \"url\": \"https://daum-mcp.toy.x.upstage.ai/knowledge/mcp\" },\n    \"daum-solar\":     { \"type\": \"http\", \"url\": \"https://daum-mcp.toy.x.upstage.ai/solar/mcp\" }\n  }\n}\n```\n\n### Cursor — one-click install (4 buttons)\n\n[![Add daum-meta to Cursor](https://img.shields.io/badge/Cursor-Add%20daum--meta-000?logo=cursor\u0026style=flat-square)](cursor://anysphere.cursor-deeplink/mcp/install?name=daum-meta\u0026config=eyJ1cmwiOiJodHRwczovL2RhdW0tbWNwLnRveS54LnVwc3RhZ2UuYWkvbWV0YS9tY3AifQ==)\n[![Add daum-search to Cursor](https://img.shields.io/badge/Cursor-Add%20daum--search-000?logo=cursor\u0026style=flat-square)](cursor://anysphere.cursor-deeplink/mcp/install?name=daum-search\u0026config=eyJ1cmwiOiJodHRwczovL2RhdW0tbWNwLnRveS54LnVwc3RhZ2UuYWkvc2VhcmNoL21jcCJ9)\n[![Add daum-knowledge to Cursor](https://img.shields.io/badge/Cursor-Add%20daum--knowledge-000?logo=cursor\u0026style=flat-square)](cursor://anysphere.cursor-deeplink/mcp/install?name=daum-knowledge\u0026config=eyJ1cmwiOiJodHRwczovL2RhdW0tbWNwLnRveS54LnVwc3RhZ2UuYWkva25vd2xlZGdlL21jcCJ9)\n[![Add daum-solar to Cursor](https://img.shields.io/badge/Cursor-Add%20daum--solar-000?logo=cursor\u0026style=flat-square)](cursor://anysphere.cursor-deeplink/mcp/install?name=daum-solar\u0026config=eyJ1cmwiOiJodHRwczovL2RhdW0tbWNwLnRveS54LnVwc3RhZ2UuYWkvc29sYXIvbWNwIn0=)\n\n### VS Code (1.99+ Copilot MCP) — one-click install (4 buttons)\n\n[![Install daum-meta in VS Code](https://img.shields.io/badge/VS%20Code-Install%20daum--meta-007ACC?logo=visualstudiocode\u0026style=flat-square)](vscode:mcp/install?%7B%22name%22%3A%22daum-meta%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fdaum-mcp.toy.x.upstage.ai%2Fmeta%2Fmcp%22%7D)\n[![Install daum-search in VS Code](https://img.shields.io/badge/VS%20Code-Install%20daum--search-007ACC?logo=visualstudiocode\u0026style=flat-square)](vscode:mcp/install?%7B%22name%22%3A%22daum-search%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fdaum-mcp.toy.x.upstage.ai%2Fsearch%2Fmcp%22%7D)\n[![Install daum-knowledge in VS Code](https://img.shields.io/badge/VS%20Code-Install%20daum--knowledge-007ACC?logo=visualstudiocode\u0026style=flat-square)](vscode:mcp/install?%7B%22name%22%3A%22daum-knowledge%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fdaum-mcp.toy.x.upstage.ai%2Fknowledge%2Fmcp%22%7D)\n[![Install daum-solar in VS Code](https://img.shields.io/badge/VS%20Code-Install%20daum--solar-007ACC?logo=visualstudiocode\u0026style=flat-square)](vscode:mcp/install?%7B%22name%22%3A%22daum-solar%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fdaum-mcp.toy.x.upstage.ai%2Fsolar%2Fmcp%22%7D)\n\n### ChatGPT Desktop (Plus / Pro) · Gemini Enterprise · OpenClaw / agent SDKs\n\nAny MCP-compliant client takes URLs directly. Paste the four `/mcp` URLs above\ninto the client's \"MCP server\" / \"Connector\" / \"Tool extension\" UI.\n\n### Verify (no install)\n\n```bash\ncurl -s https://daum-mcp.toy.x.upstage.ai/health\n# → {\"status\":\"ok\",\"servers\":[\"daum-meta\",\"daum-search\",\"daum-knowledge\",\"daum-solar\"],\"mock\":true}\n```\n\n### Try it (sample prompts)\n\n\u003e *\"강남 날씨랑 환율 알려줘\"* \u0026nbsp;·\u0026nbsp; *\"'정산'을 영어로, 한자 어원도\"*  \u0026nbsp;·\u0026nbsp; *\"한강에 대해 한국어 격식체로 정리해줘\"*\n\n---\n\nThis package implements 4 MCP servers and 14 tools as defined in the\n`daum_mcp_specification.md` v1.0 spec. The mock layer is response-shape\nidentical to the production schema — swap the `mocks/data.py` fixtures\nwith live calls to `api.daum.upstage.ai` when the upstream is provisioned.\n\n| Server | Tools | Scopes |\n|--------|-------|--------|\n| `daum-meta` | `discover_servers`, `route_intent`, `bind_server` | `meta:*` |\n| `daum-search` | `daum_search_web`, `daum_search_news`, `daum_search_realtime_panel`, `daum_search_voice`, `daum_search_image_query` | `search.*:read` |\n| `daum-knowledge` | `dict_lookup`, `encyclopedia_lookup`, `translate_ko`, `korean_etymology` | `knowledge.*:read` |\n| `daum-solar` | `solar_korean_chat`, `solar_korean_embed` | `solar.*:execute` |\n\nAll responses include the canonical `_meta` block (request_id, tenant_id,\nconsent_status, data_freshness_ts, rate_limit_remaining, tokens_billed,\nkorean_score, license).\n\n---\n\n## Quickstart\n\n```bash\ngit clone \u003cthis-repo\u003e\ncd daum-mcp-wrapper\n\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e \".[dev]\"\n\n# smoke tests (25 cases)\npytest -q\n\n# inspector / dev UI\nmcp dev servers/search.py\n\n# stdio launch (for embedding in a host)\npython -m servers.search\npython -m servers.knowledge\npython -m servers.solar\npython -m servers.meta\n\n# HTTP launch — single host, all 4 servers under /{prefix}/mcp\npython -m servers.http_app                # 0.0.0.0:8989  (default)\nPORT=9000 python -m servers.http_app      # custom port\n\n# Or with uvicorn directly (e.g. behind a reverse proxy)\nuvicorn servers.http_app:app --host 0.0.0.0 --port 8989 --workers 4\n```\n\n## Server-side deployment (HTTP)\n\n```bash\n# Docker\ndocker build -t daum-mcp-wrapper:0.1.0 .\ndocker run --rm -p 8989:8989 daum-mcp-wrapper:0.1.0\n\n# Compose\ndocker compose up -d\ncurl http://127.0.0.1:8989/health\n```\n\nTest deployment is provisioned at **`https://daum-mcp.toy.x.upstage.ai`**\n(HTTPS reverse proxy in front of the container on port 8989).\n\nEndpoints once running:\n\n| Path | What it serves |\n|------|----------------|\n| `GET  /` | server inventory (id, endpoint, tool_count) |\n| `GET  /health` | liveness — used by k8s / docker healthcheck |\n| `POST /meta/mcp` | MCP JSON-RPC for daum-meta |\n| `POST /search/mcp` | MCP JSON-RPC for daum-search |\n| `POST /knowledge/mcp` | MCP JSON-RPC for daum-knowledge |\n| `POST /solar/mcp` | MCP JSON-RPC for daum-solar |\n\n### Connect a remote MCP client\n\n```python\nfrom mcp.client.streamable_http import streamablehttp_client\nfrom mcp.client.session import ClientSession\n\nasync with streamablehttp_client(\"https://daum-mcp.toy.x.upstage.ai/search/mcp\") as (r, w, _):\n    async with ClientSession(r, w) as s:\n        await s.initialize()\n        result = await s.call_tool(\n            \"daum_search_realtime_panel\",\n            {\"query\": \"강남 날씨\"},\n        )\n```\n\n### Claude Desktop with a remote endpoint\n\nOnce you have an HTTPS reverse proxy in front (nginx / caddy / cloudflare):\n\n```json\n{\n  \"mcpServers\": {\n    \"daum-meta\":      { \"url\": \"https://daum-mcp.toy.x.upstage.ai/meta/mcp\" },\n    \"daum-search\":    { \"url\": \"https://daum-mcp.toy.x.upstage.ai/search/mcp\" },\n    \"daum-knowledge\": { \"url\": \"https://daum-mcp.toy.x.upstage.ai/knowledge/mcp\" },\n    \"daum-solar\":     { \"url\": \"https://daum-mcp.toy.x.upstage.ai/solar/mcp\" }\n  }\n}\n```\n\n## Wire up to Claude Desktop (local stdio)\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"daum-meta\": {\n      \"command\": \"/absolute/path/daum-mcp-wrapper/.venv/bin/python\",\n      \"args\": [\"-m\", \"servers.meta\"],\n      \"cwd\": \"/absolute/path/daum-mcp-wrapper\"\n    },\n    \"daum-search\": {\n      \"command\": \"/absolute/path/daum-mcp-wrapper/.venv/bin/python\",\n      \"args\": [\"-m\", \"servers.search\"],\n      \"cwd\": \"/absolute/path/daum-mcp-wrapper\"\n    },\n    \"daum-knowledge\": {\n      \"command\": \"/absolute/path/daum-mcp-wrapper/.venv/bin/python\",\n      \"args\": [\"-m\", \"servers.knowledge\"],\n      \"cwd\": \"/absolute/path/daum-mcp-wrapper\"\n    },\n    \"daum-solar\": {\n      \"command\": \"/absolute/path/daum-mcp-wrapper/.venv/bin/python\",\n      \"args\": [\"-m\", \"servers.solar\"],\n      \"cwd\": \"/absolute/path/daum-mcp-wrapper\"\n    }\n  }\n}\n```\n\nRestart Claude Desktop. You should see all 14 tools available.\n\n## Try it (sample agent prompts)\n\n- *\"Daum의 MCP 서버 목록을 한 번에 알려줘.\"* → `discover_servers`\n- *\"강남 날씨와 환율을 한 번에 보여줘.\"* → `daum_search_realtime_panel`\n- *\"'정산'을 영어로 옮기면? 어원도 같이.\"* → `dict_lookup` + `korean_etymology`\n- *\"한강에 대해 한국어로 정리해주고 출처를 달아줘.\"* → `solar_korean_chat(grounding=[\"knowledge\"])`\n- *\"청계천 관련 최신 글 5개를 Tistory에서만.\"* → `daum_search_web(site_filter=\"tistory.com\")`\n\n## Architecture\n\n```\ndaum-mcp-wrapper/\n├── pyproject.toml          # package + entrypoints\n├── servers/\n│   ├── meta.py             # daum-meta — discovery + routing\n│   ├── search.py           # daum-search — 5 tools (web/news/panel/voice/image)\n│   ├── knowledge.py        # daum-knowledge — 4 tools (dict/wiki/translate/etymology)\n│   └── solar.py            # daum-solar — 2 tools (chat/embed)\n├── mocks/\n│   └── data.py             # deterministic fixtures (swap with live HTTP)\n└── tests/\n    └── test_smoke.py       # 25 cases — every tool, happy + error paths\n```\n\nEach server uses **FastMCP** so adding a tool is one decorated function.\nResponse shapes mirror `tier0_openapi.yaml` exactly, including the\n`_meta` envelope and standardized error paths (PII auto-block raises\n`-32008 pii_redaction_required` on the wire equivalent).\n\n## Going live\n\n1. **Replace fixtures** in `mocks/data.py` with HTTP calls (httpx) to\n   real Daum/Solar endpoints. Keep the function signatures identical.\n2. **Add OAuth 2.1 + PKCE-S256 + RFC 8707** middleware (FastMCP\n   exposes `mcp.run(transport=\"streamable-http\")` for HTTP transport).\n3. **Wire the audit log** — every `_meta.request_id` gets an\n   HMAC-signed entry per `hitl_ux_specification.md` §4.\n4. **Tighten PII**: replace the regex stub with KISA-grade patterns +\n   Solar Korean PII classifier.\n5. **Tier 1 onwards**: add the remaining 15 servers (101 more tools)\n   following the same FastMCP shape.\n\n## Acceptance criteria (Day 7 demo gate)\n\nSee `tier0_openapi.yaml` `x-acceptance-criteria` (AC-1 through AC-10).\nCurrently AC-1 to AC-5 are validated by `tests/test_smoke.py`; AC-6\nthrough AC-10 require the OAuth + audit middleware (Tier 0 W2).\n\n## License\n\nInternal — Upstage / Daum. See `LICENSE`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhunkim%2Fdaum-mcp-toy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhunkim%2Fdaum-mcp-toy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhunkim%2Fdaum-mcp-toy/lists"}