Claude Artifacts MCP: 보는 사람이 열 때마다 갱신되는 실시간 경쟁사 대시보드
게시된 Claude 아티팩트는 보는 사람 각자의 계정으로 MCP 커넥터를 호출합니다. TikTok, YouTube, Instagram에서 9개 브랜드를 테스트하고 페이지를 한 번 열 때마다 드는 비용을 계산했습니다.

2026년 7월, Claude는 게시된 아티팩트에 새 기능을 추가했습니다. 누군가 페이지를 열 때마다 페이지가 보는 사람 본인의 claude.ai 연결을 통해 MCP 커넥터를 호출할 수 있습니다(Claude Code 29주 차 다이제스트). 여는 사람 모두에게 최신 데이터를 보여 주는 경쟁사 대시보드에 잘 맞는 기능입니다. 2026-11-05 싱가포르 시간 00:18~01:05에 EveryInfra 원격 MCP 서버로 9개 브랜드의 최근 게시물을 가져왔습니다. 데이터 호출은 39건이었고, 그중 38건이 과금되고 1건은 환불되어 총 $0.021128이 들었습니다.
대시보드에는 3개 브랜드(GoPro, Insta360, DJI)의 데이터가 들어갑니다. 나머지 6개 브랜드(Zara, Bershka, Mango, Garmin, Whoop, Oura)는 더 다양한 계정 유형을 보여 주기 위해 2차로 실행했습니다. 지연 시간 데이터와 데이터 함정 섹션에서 이 결과를 사용합니다.
이 글의 Claude 관련 내용은 모두 구성 예시입니다. 대시보드 페이지 코드를 작성하고 실제 응답을 저희 컴퓨터에서 이 코드로 재생했습니다. claude.ai에는 게시하지 않았습니다.
가장 유용한 발견은 저희 도구의 어노테이션에 관한 것입니다. EveryInfra 데이터 도구 everyinfra_call_api는 현재 readOnlyHint: false와 destructiveHint: true를 선언합니다. 이는 저희 도구의 현재 어노테이션이며, 데이터 도구에 대한 Claude 플랫폼 규칙이 아닙니다.
실제 영향은 다음과 같습니다. Claude 페이지 런타임은 이 도구의 결과를 캐시하지 않습니다. 페이지는 자동 새로 고침용 watch 메서드로 이 도구를 호출할 수도 없습니다. 따라서 페이지가 자체 캐시를 유지해야 합니다.
따라서 자체 캐시가 없는 페이지는 열 때마다 비용이 발생합니다. 10명이 하루 3번씩 열면 한 달에 900회 열람, 과금 호출 8,100건, $4.50가 됩니다. 결과를 아티팩트의 공유 저장소에 보관하고 6시간마다 새로 고치면 같은 사용량에 한 달 $0.60가 듭니다.
금액은 크지 않습니다. 실제 비용은 대기 시간과 분당 한도입니다. 가장 느린 동기 호출은 69초가 걸렸습니다. 또한 스탠드업 직전에 10명이 페이지를 열면 공유 키 하나에 1분 동안 90건의 호출이 몰립니다.

Claude Artifacts MCP란? 페이지가 열릴 때 데이터를 가져오는 구조
아티팩트는 Claude가 만들어 다른 사람에게 보여 줄 수 있는 결과물입니다. 문서, 슬라이드, 디자인, 대시보드, 작은 도구가 모두 해당합니다. 고객 센터에 따르면 아티팩트를 공유하고, 아티팩트에 데이터를 저장하고, 앱과 연결할 수 있습니다(What are artifacts?, 2026-11-05 확인). 2026-09-16 이전에 만든 아티팩트는 이제 "레거시 아티팩트"로 분류됩니다. 이 글은 "앱 연결" 부분을 다룹니다. 페이지가 열리면 claude.ai 커넥터를 통해 MCP 서버의 도구를 호출하고 그 결과를 화면에 그립니다.
가장 자세한 내용은 Claude Code 문서에 있습니다(Artifacts, 2026-11-05 확인). 게시된 페이지는 누군가 볼 때마다 MCP 커넥터를 호출할 수 있습니다. 따라서 페이지는 만든 세션의 스냅샷이 아니라 현재 데이터를 보여 줍니다. 페이지는 로드될 때 데이터를 가져옵니다. 일정 간격으로, 또는 보는 사람이 새로 고침 컨트롤을 사용할 때 새로 고칠 수도 있습니다. 응답은 보는 사람의 브라우저에 캐시되므로, 다시 연 페이지는 먼저 캐시된 데이터를 그린 다음 업데이트합니다.
Claude는 페이지를 게시할 때 페이지가 호출할 수 있는 커넥터를 선언합니다. 페이지는 이 선언에 없는 것을 호출할 수 없습니다. 대상은 claude.ai 계정의 커넥터뿐입니다. Claude Code의 .mcp.json에 있는 로컬 서버는 Claude가 페이지를 만드는 동안 데이터를 제공할 수 있습니다. 게시된 페이지는 이 서버를 호출할 수 없습니다.
Claude Code에서는 이 기능이 2026년 7월 13~17일 주간(v2.1.207~v2.1.212)에 출시되었습니다. 다이제스트에 따르면 페이지는 "누군가 볼 때마다" 커넥터를 호출할 수 있고, 각 호출은 보는 사람 본인의 연결을 통해 실행됩니다(29주 차 다이제스트). claude.ai 채팅 안의 아티팩트는 이보다 앞선 2025-10-21에 MCP와 영구 저장소를 지원하기 시작했습니다(Turn ideas into interactive AI-powered apps). 2026-09-16 릴리스 노트 항목에 따르면 이제 디자인, 슬라이드, 문서를 모든 대화에서 사용할 수 있습니다(릴리스 노트).
| 항목 | 출처 내용 | 출처 및 확인일 |
|---|---|---|
| 아티팩트에서 커넥터 호출이 가능한 플랜 | 웹과 데스크톱의 Pro, Max, Ultra, Team, Enterprise | support.claude.com 17153992, 2026-11-05 |
| 이런 페이지를 게시하는 데 필요한 최소 Claude Code 버전 | v2.1.209 | code.claude.com/docs/en/artifacts, 2026-11-05 |
| 보는 사람이 사용하는 연결 | 본인의 커넥터, 페이지는 자격 증명을 볼 수 없음 | code.claude.com/docs/en/artifacts, 2026-11-05 |
| 첫 호출 | 보는 사람마다 첫 커넥터 호출 전에 승인 | 같은 페이지 |
| 액션마다 승인이 필요한 도구 | 아티팩트에서 사용 불가 | support.claude.com 17153992, 2026-11-05 |
| 페이지 저장소 | 아티팩트당 최대 20 MB, 텍스트만, 개인 및 공유 | support.claude.com 17153992, 2026-11-05 |
| 공개 링크 | 고객 센터: 앱에 연결된 아티팩트는 "Anyone with the link" 불가. Claude Code 문서: 공개 공유는 가능하지만 로그인하지 않은 사용자와 외부 사용자에게는 실시간 섹션이 표시되지 않음 | support.claude.com 9547008 및 code.claude.com, 2026-11-05 |
| 조직 스위치 | Organization settings의 "Enable artifact connectors" | code.claude.com 및 support.claude.com 16994751, 2026-11-05 |
누가 쓸 수 있나: 플랜, 앱, 관리자 스위치
고객 센터의 "Connect your apps to an artifact" 섹션에는 Pro, Max, Ultra, Team, Enterprise가 나와 있습니다. 앱으로는 웹과 데스크톱의 Claude를 명시합니다(support 17153992). 같은 페이지에 따르면 아티팩트를 쓰려면 "Cloud code execution and file creation" 설정이 필요합니다. Free 플랜은 목록에 없습니다.
커스텀 커넥터는 모든 플랜에서 사용할 수 있으며, Free 플랜에서는 1개로 제한됩니다(“Get started with custom connectors using remote MCP”). 하지만 Free 계정으로는 커넥터를 호출하는 아티팩트를 만들 수 없습니다. 따라서 이 대시보드를 사용하려면 최소한 유료 플랜이 하나 필요합니다.
가격은 2026-11-05에 확인한 Claude 요금 페이지 기준입니다(claude.com/pricing). Pro는 연간 플랜 기준 월 $17, 월간 결제 시 $20입니다. Max는 $100부터 시작합니다. Ultra는 $200입니다.
Team 표준 시트는 연간 플랜 기준 월 $20, 월간 결제 시 $25이며, 프리미엄 시트는 $100 또는 $125입니다. Enterprise는 시트당 $20에 API 요금 기준 사용료가 추가됩니다. 10명 팀이 Team 표준 시트를 월간 결제하면 시트 비용은 월 $250입니다. 이 금액에 비하면 아래의 데이터 비용은 매우 작습니다.
Team과 Enterprise에는 스위치가 2개 더 있습니다. 첫 번째 스위치는 조직 전체의 아티팩트를 켜거나 끕니다. 두 번째 스위치는 아티팩트의 커넥터 호출을 제어합니다. Claude Code 문서에 따르면 이 스위치는 Organization settings > Capabilities의 "Enable artifact connectors"에 있습니다(Artifacts).
같은 스위치가 claude.ai 채팅에서 만든 페이지에도 적용됩니다. 관리자 가이드에는 놓치기 쉬운 내용이 하나 더 있습니다. 관리자는 아티팩트가 접근할 수 있는 앱을 제한할 수 없습니다. 사용량은 각 사용자 본인의 한도에 포함됩니다(Artifacts admin guide for Team and Enterprise plans).
게시 후에는 누구의 연결로 실행될까
가장 중요한 규칙이며, 출처의 설명도 명확합니다. 게시된 페이지가 커넥터를 호출하면, 호출은 페이지를 보는 사람의 계정을 사용합니다. 게시자의 계정은 사용하지 않습니다. 같은 대시보드를 연 두 사람이 서로 다른 데이터를 볼 수 있습니다. 각자의 계정이 접근할 수 있는 대상이 다르기 때문입니다. 페이지는 누구의 자격 증명도 볼 수 없습니다. 호출은 claude.ai가 페이지를 대신해 실행합니다.
보는 사람은 페이지의 첫 커넥터 호출 전에 각자 승인합니다. 승인을 거부하거나 해당 커넥터를 연결하지 않은 사람에게도 페이지는 표시되지만, 실시간 섹션은 빠집니다(Artifacts, "How connector calls work for viewers", 2026-11-05 확인). 고객 센터도 같은 내용을 설명합니다. 공유되거나 게시된 아티팩트라도 모든 사람이 각자 자신의 앱을 연결합니다(support 17153992).

이 대시보드에서 "보는 사람 본인의 연결"은 두 가지 의미일 수 있습니다. 어느 경우인지에 따라 비용과 요청 속도 제한을 부담하는 사람이 달라집니다. 첫 번째 경우 커넥터는 OAuth 로그인을 사용합니다. 각자 커넥터를 추가할 때 자신의 EveryInfra 계정에 로그인합니다. 이후 페이지의 모든 호출은 그 사람의 잔액에서 차감되고, 그 사람의 분당 한도에 포함됩니다.
두 번째 경우 커넥터는 공유 API 키 하나를 사용합니다. Team 또는 Enterprise Owner가 커넥터를 추가하고 요청 헤더에 키를 입력합니다. 고객 센터에 따르면 이렇게 하면 커넥터를 사용하는 모든 사람이 해당 키의 권한을 갖게 됩니다(support 11175166). 형식상으로는 각자 "자신의 연결"을 사용합니다. 실제로는 모든 비용과 호출이 하나의 EveryInfra 계정에 몰립니다.
실시간 데이터를 볼 수 없는 사람은 두 부류입니다. 규칙은 고객 센터의 공유 문서에 나와 있습니다(Share artifacts, 2026-11-05 확인). 앱에 연결되거나 Claude를 사용하는 아티팩트에는 "Anyone with the link" 링크 공유를 쓸 수 없습니다. 조직 외부에서 초대한 사람에게는 Claude나 커넥터를 사용하는 부분이 작동하지 않습니다. 외부 사용자는 아티팩트당 최대 50명까지 초대할 수 있습니다.
Claude Code 문서에는 커넥터 기반 페이지를 공개로 공유할 수 있다고 나와 있습니다. 하지만 claude.ai에 로그인하지 않았거나 조직 외부에 있는 사람에게는 커넥터 호출이 실행되지 않습니다. 두 출처는 공개 링크에 대해 서로 다르게 설명합니다. 그러나 외부 사용자가 실시간 데이터를 볼 수 없다는 결과는 같습니다. 이 글은 더 엄격한 고객 센터 규칙을 따라 대시보드를 조직 내부에서만 공유합니다.
최근 여러 Reddit 스레드에서 이 문제를 묻고 있습니다. 한 사용자는 Claude Code로 데이터베이스 기반 채용 대시보드를 만들었습니다. 이 사용자는 Claude 라이선스가 없는 관리자들에게 대시보드를 보여 줄 방법을 물었습니다. 한 답변은 조직 공유에는 로그인한 멤버가 필요하고 공개 링크에서는 커넥터 호출이 실행되지 않는다고 설명합니다(r/ClaudeCode 스레드). 다른 스레드에서는 모든 팀원에게 대시보드가 비어 있었습니다(r/ClaudeAI 스레드).
원인은 같은 규칙이었습니다. 각자 페이지가 쓰는 모든 커넥터를 연결하고 승인해야 합니다. 따라서 각 실시간 섹션에 연결해야 할 커넥터 이름을 적은 짧은 안내를 넣으십시오. Claude Code 문서도 같은 방법을 권장합니다.
호출 한도: 출처에 나온 것과 나오지 않은 것
2026-11-05에 claude.com, support.claude.com, code.claude.com, docs.claude.com의 아티팩트 커넥터 관련 페이지를 확인했습니다. 어느 페이지에도 아티팩트 커넥터 호출에 대한 "분당 호출 수"나 "일일 호출 수" 같은 수치는 없습니다. 관리자 가이드에는 아티팩트 사용량이 각 사용자의 한도에 포함된다는 내용만 있습니다. 로컬에 설치한 Claude Code에 포함된 런타임 타입 정의에는 rate_limited 오류 코드가 있으며, "reserved, never returned today"라는 주석이 달려 있습니다.
따라서 정확한 답은 다음과 같습니다. Claude는 이런 페이지의 호출 상한을 공개하지 않습니다. 실제로 걸릴 수 있는 한도는 아래에 문서화된 한도와 커넥터 서버 자체의 요청 속도 제한입니다.
| 한계 | 값 | 출처 | 대시보드에 미치는 영향 |
|---|---|---|---|
| claude.ai 및 데스크톱의 도구 결과 크기 | 약 150,000자 | claude.com/docs/connectors/building, 2026-11-05 | TikTok 게시물 20개는 약 50,000바이트 |
| claude.ai 및 데스크톱의 도구 호출 타임아웃 | 240초 | 같은 페이지 | 가장 느린 동기 호출은 69초 |
| 페이지 런타임 응답 대기 한도 | 약 130초 | 로컬에 설치한 Claude Code 2.1.309의 런타임 타입 정의, 버전 0.2.96(공개 문서가 아니며 변경될 수 있음) | 느린 플랫폼은 비동기 호출과 폴링 필요 |
| 아티팩트 저장소 | 아티팩트당 20 MB, 텍스트만 | support.claude.com 17153992 | 필요한 필드만 추려서 저장 |
| 외부 초대 | 아티팩트당 최대 50명, 외부 초대자에게는 실시간 섹션 미제공 | support.claude.com 9547008 | 조직 내부에 공유 |
| EveryInfra 분당 한도 | 기본값: 계정당 분당 60회(모든 키 합산) | everyinfra.com/pricing, 2026-11-05 | 공유 키를 쓰면 팀 전체가 분당 60회 |
| EveryInfra 키별 한도 | 키별로 더 낮은 한도를 둘 수 있으며, 테스트 키는 분당 10회였음 | 2026-11-05 싱가포르 시간 00:19:51의 429 응답 | 대시보드에 별도 키 부여 |
세 번째 행은 짧은 설명이 필요합니다. Claude Code에는 아티팩트 런타임 타입 정의의 로컬 사본이 함께 제공됩니다. 저희는 Claude Code 2.1.309에 포함된 0.2.96 버전을 확인했습니다. 이 정의에 따르면 페이지는 claude.use("mcp")에서 호출 함수를 받아 오고, 응답을 약 130초 동안 기다립니다.
이 파일은 공개 웹페이지가 아니며 바뀔 수 있습니다. 따라서 현재 동작으로만 간주합니다. 같은 규칙을 다루는 공개 문서가 있으면 공개 문서를 우선합니다.
대시보드에 필요한 데이터: 플랫폼 3개, 기능 3개
대시보드는 작게 유지했습니다. 브랜드마다 TikTok, YouTube, Instagram 세 개의 행이 있습니다. 각 행에는 일일 게시 수, 조회수 중앙값 또는 좋아요 중앙값, TikTok 참여율, 팔로워 수, 최신 게시물의 경과 시간이 표시됩니다. 표 아래에는 최근 30일간 TikTok 게시물별 조회수를 차트로 그립니다. 데이터는 EveryInfra 기능 3개에서 가져옵니다. 가격은 2026-11-05 싱가포르 시간 00:15에 확인한 카탈로그의 price_usd 값입니다(카탈로그).
| 플랫폼 | 기능 | 전송한 파라미터 | 호출당 가격 | 동기/비동기 | 페이지에서 쓰는 필드 |
|---|---|---|---|---|---|
| TikTok | tiktok/user_videos | username, limit 20 (최대 50) | $0.000556 | 동기 | 게시 시간, 조회수, 좋아요, 댓글, 공유, 고정 여부, 팔로워, 인증 여부 |
| YouTube | youtube/user_posts | 채널 url, limit 20 (최대 50) | $0.000556 | 동기 | 제목, 상대적 게시 시간, 조회수, 구독자 수 |
instagram/user_posts | username, limit 20 (기본값 30, 최대 200) | $0.000556 | 비동기: 제출 시 과금, 폴링은 무료 | 게시 시간, 미디어 유형, 좋아요, 댓글 |
세 기능 모두 행 단위가 아닌 호출 단위로 과금됩니다. 1행이든 50행이든 비용은 같고, 결과가 비어 있으면 환불됩니다. 플랫폼별 페이지는 TikTok 데이터 API, YouTube 데이터 API, Instagram 데이터 API입니다.
각 플랫폼의 자체 API를 쓰지 않는 이유는 무엇일까요? YouTube Data API의 기본 할당량은 하루 10,000 유닛입니다(YouTube quota costs, 페이지 업데이트: 2026-11-03). 다른 채널도 읽을 수 있지만 본인의 Google Cloud 프로젝트가 필요합니다. Instagram Business Discovery로는 다른 프로페셔널 계정의 팔로워 수, 좋아요 수, 댓글 수를 읽을 수 있습니다. 대신 본인의 프로페셔널 계정과 액세스 토큰이 필요합니다(Meta developer docs).
TikTok /v2/video/list/는 접근 권한을 부여한 사용자의 공개 동영상만 나열하며, 페이지당 최대 20개입니다(TikTok developer docs). 경쟁사 계정은 읽을 수 없습니다. 동료 모두가 여는 페이지 하나에 계정과 토큰이 세 벌 필요한 셈입니다. 커넥터 하나가 운영하기 더 쉽습니다.
각 셀의 계산 방식: 게시 주기, 중앙값, 참여율
페이지는 렌더링할 때 모든 수치를 계산합니다. 캐시에는 원본 필드만 저장하므로 다시 가져오지 않고도 수식을 바꿀 수 있습니다. "일일 게시 수"는 고정되지 않은 게시물 수를, 그중 가장 오래된 게시물부터 가져온 시점까지의 일수로 나눈 값입니다. YouTube는 "3w ago", "2mo ago" 같은 상대적 게시 시간을 제공합니다. 이를 일 단위로 바꾸면 정밀도는 1주 또는 1개월입니다. 그래서 YouTube 셀은 대략적인 규모만 보여 줍니다.
"최근 30일 게시 수"는 쓰지 않습니다. 이유는 아래 테스트 2에서 드러납니다. 게시가 잦은 계정에서는 20행으로 30일을 채우지 못합니다.
이 페이지는 조회수와 좋아요 수에 평균이 아닌 중앙값을 사용합니다. 소셜 게시물의 조회수는 편차가 매우 큽니다. GoPro YouTube 최신 동영상 20개 중 조회수가 가장 높은 동영상은 4.4M회였고, 정상 범위에서 가장 낮은 동영상은 21,000회였습니다. 히트작 한두 개만으로도 평균이 크게 올라가고, 평균값은 날마다 크게 달라집니다. TikTok 참여율은 게시물별로 좋아요, 댓글, 공유 수를 더한 값을 조회수로 나눈 값입니다. 셀에는 이 참여율의 중앙값이 표시됩니다.
YouTube 기능은 좋아요 수를, Instagram 기능은 조회수를 반환하지 않습니다. 해당 셀은 비워 두며, 다른 수치로 채우지 않습니다. "팔로워"는 첫 번째 행의 작성자 팔로워 수에서 가져옵니다. Instagram 기능은 이 값을 반환하지 않으므로 이 셀도 비어 있습니다.
빈 셀은 의도한 것입니다. 10명이 매일 확인하는 페이지에는 큰 위험이 하나 있습니다. 셀의 의미가 바뀌어도 아무도 알아채지 못할 수 있다는 점입니다. 어느 날 Instagram 기능이 조회수를 반환하기 시작했다고 가정해 보겠습니다.
그러면 참여율 셀이 빈 칸에서 값으로 바뀌고, 사람들은 경쟁사가 전략을 바꿨다고 생각할 것입니다. 그래서 페이지는 각 열 머리글 아래에 필드 이름과 해당 플랫폼을 표시합니다. 데이터가 없는 셀에는 대시(—)를 표시합니다.
1단계: EveryInfra를 Claude 커넥터로 추가하기(구성 예시)
EveryInfra는 결제 방식에 따라 두 가지 원격 MCP 주소를 제공합니다. 아래 단계는 구성 예시입니다. 이번 테스트에서는 웹의 Claude에 로그인하지 않았습니다. 화면 항목 이름은 2026-11-05 기준 Claude 고객 센터 문서에서 가져온 것이므로 실제 화면과 대조해 확인하십시오.
첫 번째 방법은 사람마다 자신의 EveryInfra 계정을 쓰는 것입니다. 주소는 https://api.everyinfra.com/mcp/all을 사용합니다. 자격 증명 없이 요청하면 401과 함께 WWW-Authenticate 헤더가 반환됩니다. 이 헤더는 메타데이터 문서를 가리키며, 문서의 authorization_servers 필드에 EveryInfra 로그인 서비스가 명시되어 있습니다.
2026-11-05 싱가포르 시간 00:12에 테스트했습니다(메타데이터 문서). 이는 표준 MCP 흐름입니다. 서버는 RFC 9728에 따라 보호된 리소스 메타데이터를 게시하고, 클라이언트는 이를 이용해 인가 서버를 찾습니다(MCP authorization, 2025-11-25, RFC 9728).
Claude 커넥터 문서에 따르면 Claude의 OAuth 클라이언트는 2025-03-26, 2025-06-18, 2025-11-25 인가 사양을 따릅니다. 콜백 주소는 https://claude.ai/api/mcp/auth_callback입니다(Build an MCP server for Claude). 이 주소에는 도구 24개가 나열됩니다.
두 번째 방법은 팀 전체가 키 하나를 쓰는 것입니다. 주소는 https://api.everyinfra.com/mcp를 사용합니다. 커넥터를 추가할 때 "Request headers"에 Authorization: Bearer <EVERYINFRA_API_KEY>를 입력합니다. 이 주소에는 도구 12개가 나열되며, 키 인증만 받습니다. 여기서 한 가지 제약에 유의하십시오.
Claude 커넥터 문서는 정적 헤더 자격 증명을 일부 조직 대상 베타로 표시합니다(Authentication for connectors, 2026-11-05 확인). 다른 조직의 Owner에게는 "Request headers" 섹션 자체가 보이지 않습니다. 문서는 또한 이 키가 개인이 아닌 조직의 자격 증명이라고 밝힙니다. 모든 구성원의 요청에 같은 키가 실립니다.
| `/mcp/all`의 OAuth | `/mcp`의 공유 키 | |
|---|---|---|
| 과금 대상 | 각 열람자의 EveryInfra 계정 | 키를 소유한 계정 하나 |
| 분당 한도 | 열람자 계정당 60회 | 팀 전체 60회 또는 키에 설정된 더 낮은 한도 |
| 나열되는 도구 | 24 | 12 |
| 설정 가능한 사람 | Claude 유료 사용자 누구나 | Team 또는 Enterprise Owner, 베타 "Request headers" 필드가 켜져 있는 경우에만 |
| 주요 위험 | 사람마다 EveryInfra 계정과 잔액이 필요 | 모든 구성원의 호출에 같은 키 사용 |
Configuration example (Claude web or desktop, Pro or Max account)
1. Customize > Connectors > + Add > Add custom connector
2. Name: EveryInfra <- the page code must use this exact server name
3. URL: https://api.everyinfra.com/mcp/all
4. Authentication: Sign in when needed <- each person signs in to their own EveryInfra account
5. Add. In the connector's tool permissions, set everyinfra_call_api to Always allow
(the Help Center says tools that need approval for each action do not work in artifacts)
Configuration example (Team or Enterprise, one Owner adds it, one shared key)
1. Organization settings > Connectors > Add custom connector
2. URL: https://api.everyinfra.com/mcp
3. Request headers: Authorization: Bearer <EVERYINFRA_API_KEY>
(beta, only some organizations see this field; make a separate key with its own per-minute limit)
4. Organization settings > Capabilities > turn on Enable artifact connectors
5. Each member clicks Connect under Customize > Connectors대부분의 문제는 5단계에서 시작됩니다. Claude는 각 커넥터의 도구를 "읽기 전용"과 "쓰기/삭제" 두 그룹으로 나눕니다. 그룹마다 Always allow, Needs approval, Blocked 중 하나로 설정할 수 있습니다(Use connectors to extend Claude's capabilities). everyinfra_call_api의 도구 선언에는 readOnlyHint: false, destructiveHint: true, openWorldHint: true가 지정되어 있습니다. 2026-11-05 싱가포르 시간 00:12에 원본 tools/list 응답을 확인했습니다. 이것이 현재 저희 도구의 어노테이션입니다. MCP 사양에서는 도구가 자신의 동작에 대한 힌트로 이 필드들을 직접 선언합니다(MCP schema, 2026-07-28).
도구가 어느 그룹에 속하는지는 각자의 권한 페이지에서 확인할 수 있습니다. 이 구성 예시에서는 claude.ai의 해당 페이지를 열어 보지 않았습니다. 방법은 다음과 같습니다. 커넥터를 추가한 뒤 도구 권한을 엽니다. everyinfra_call_api가 속한 그룹을 찾아 그 그룹을 Always allow로 설정합니다.
고객 센터 문서에 따르면 액션마다 승인이 필요한 커넥터 도구는 아티팩트에서 사용할 수 없습니다. 따라서 도구가 "Needs approval" 상태로 남아 있으면 대시보드는 계속 비어 있습니다. 폴링 도구 everyinfra_get_job은 읽기 전용으로 표시되어 있어 이 영향을 받지 않습니다.
2단계: Claude Code 아티팩트 MCP 페이지의 기본 구조 만들기
페이지의 핵심 동작은 세 가지입니다. 호출할 커넥터 도구를 선언합니다. 공유 캐시를 먼저 확인합니다. 캐시가 너무 오래됐을 때만 비용을 내고 호출합니다.
아래는 대시보드의 데이터 가져오기 부분입니다. 전체 페이지는 약 110줄이며, 표와 차트 코드는 생략했습니다. claude.use("mcp")와 claude.use("db")는 페이지 런타임이 제공하는 두 진입점입니다. 둘 다 해당 뷰에서 사용할 수 없으면 null을 반환하므로, 페이지는 이 둘이 없어도 렌더링되어야 합니다.
// Capability declaration that Claude submits at publish time.
// The page cannot call tools outside it.
// capabilities: { mcp: { servers: [{ server: "EveryInfra",
// tools: ["everyinfra_call_api", "everyinfra_get_job"] }] },
// db: {} }
const SERVER = "EveryInfra", CALL = "everyinfra_call_api", JOB = "everyinfra_get_job";
const TTL_MS = 6 * 3600 * 1000; // shared cache: 6 hours
const req = (b, p) => ({
tiktok: { platform: "tiktok", action: "user_videos", params: { username: b.tiktok, limit: 50 } },
youtube: { platform: "youtube", action: "user_posts", params: { url: b.youtube, limit: 50 } },
instagram: { platform: "instagram", action: "user_posts", params: { username: b.instagram, limit: 50 } },
}[p]);
const KEEP = ["id", "post_id", "posted_at", "view_count", "like_count", "comment_count",
"share_count", "is_pinned", "author_follower_count", "author_is_verified"];
const trim = (rows) => rows.map((r) => Object.fromEntries(KEEP.filter((k) => k in r).map((k) => [k, r[k]])));
let mcp = null, db = null;
async function fetchRows(b, p, force) {
const key = `cache/${b.name}-${p}`.toLowerCase();
if (db && !force) { // 1. read the shared cache first
const snap = await db.doc(key).get().catch(() => null);
if (snap?.exists && Date.now() - snap.data().fetchedAt < TTL_MS) return snap.data();
}
if (!mcp) throw { code: "no_mcp" };
let out = (await mcp.callTool(SERVER, CALL, req(b, p))).payload; // 2. one paid call
for (let i = 0; out.job_id && out.status !== "succeeded" && i < 20; i++) {
if (["failed", "cancelled"].includes(out.status)) throw { code: "job_" + out.status };
await new Promise((r) => setTimeout(r, 15000)); // Instagram is async; polling is free
out = (await mcp.callTool(SERVER, JOB, { job_id: out.job_id })).payload;
}
const doc = { fetchedAt: Date.now(), rows: trim(out.results || []) }; // 3. keep only the fields we use
if (db) db.doc(key).set(doc).catch(() => {}); // view-only members cannot write; they still see data
return doc;
}
(async () => { [mcp, db] = await Promise.all([claude.use("mcp"), claude.use("db")]); load(false); })();이 코드의 여러 부분은 실제 응답을 보고 정했습니다. 첫째, payload는 도구 결과의 첫 번째 텍스트 블록을 런타임이 JSON으로 파싱한 값입니다. EveryInfra는 JSON 텍스트를 반환하므로 페이지는 payload.results를 바로 읽습니다.
둘째, 모든 응답에는 billing과 quota 블록도 들어 있습니다. 여기에는 이번 호출의 청구 금액과 계정 잔액이 담깁니다. 공유 키를 쓰면 페이지 코드가 조직 계정의 잔액을 읽을 수 있습니다. 그래서 trim은 페이지에 필요한 필드 10개만 남깁니다. 잔액은 공유 저장소에 쓰지 않고 화면에도 표시하지 않습니다.
셋째, 페이지는 실패한 호출을 스스로 재시도하지 않습니다. 로컬 타입 정의에 따르면 읽기 전용이 아닌 도구에서 타임아웃이나 연결 끊김이 발생하면 결과를 알 수 없는 상태가 됩니다. 새 호출은 열람자가 다시 조작할 때까지 기다려야 합니다. EveryInfra의 429 응답은 과금되지 않으므로, 페이지는 이 오류 옆에 "다시 시도" 버튼을 둘 수 있습니다.
페이지 런타임은 오류 코드를 반환하며, 코드마다 다른 메시지가 필요합니다. 아래 표는 런타임 타입 정의의 오류 코드와 저희 페이지에 표시되는 내용을 대응시킨 것입니다.
| 오류 코드 | 의미 | 페이지 표시 내용 |
|---|---|---|
server_not_connected | 열람자에게 이 이름의 커넥터가 없음 | "EveryInfra 커넥터를 추가하세요" |
approval_required | 호출에 열람자의 승인이 필요함 | 같은 호출을 한 번 실행하는 버튼 |
needs_reauth | 커넥터 로그인이 만료됨 | "설정 > 커넥터에서 EveryInfra를 다시 연결하세요" |
tool_error | 도구가 실행되었으나 429 등 실패를 보고함 | 오류 메시지와 "다시 시도" 버튼 |
server_unavailable | 제한 시간 내 응답 없음 또는 서버 오류 | "사용 불가" 표시, 유료 도구이므로 자동 재시도 없음 |

이 스크린샷은 claude.ai에서 찍은 것이 아닙니다. 이 글의 Claude 관련 내용은 구성 예시일 뿐이며, 이 대시보드를 claude.ai에 게시하지도 않았습니다. 저희 컴퓨터에서는 간단한 claude.use() 모의 구현을 사용해 저장해 둔 실제 응답을 같은 페이지 코드에 전달했습니다. 스크린샷은 페이지 코드와 응답 구조가 서로 맞는다는 것을 보여 줍니다. 수치가 정확하다는 것도 보여 줍니다.
JavaScript가 계산한 모든 셀이 별도의 Python 스크립트 결과와 일치합니다. 스크린샷으로는 claude.ai의 권한 프롬프트, 첫 승인, 캐시 동작을 확인할 수 없습니다. 이는 각자의 계정에 게시한 뒤에야 확인할 수 있습니다.
실제 왕복 한 번: 플랫폼별 1회 호출
먼저 TikTok의 실제 요청과 원본 응답입니다. 2026-11-05 싱가포르 시간 00:18:50에 https://api.everyinfra.com/mcp로 tools/call을 보냈습니다. 도구는 everyinfra_call_api였고, GoPro의 TikTok 사용자 이름과 limit 20을 지정했습니다. 22.22초 뒤 49,956바이트의 JSON이 돌아왔습니다.
동영상은 20개였습니다. 그중 하나는 2025년의 고정 광고였습니다. 나머지 19개는 최신순이었고, 가장 최신 동영상은 가져오기 2.3시간 전인 2026-11-04에 게시되었습니다. 각 행에는 필드가 35개 있었고, billing.charged_usd는 0.000556이었습니다.

YouTube API 호출은 00:19:16에 보냈습니다. 응답은 11.66초 만에 13,047바이트로 돌아왔습니다. 응답에는 동영상 20개의 제목, 조회수, 채널 구독자 수(GoPro는 11.3M명)가 담겨 있었습니다. 좋아요 수는 없었습니다. 게시 시간은 "4d ago", "3w ago", "1mo ago"처럼 상대 시간이었습니다. 조회수는 125,000, 300,000처럼 반올림된 값이었습니다.
20행 중 2행이 이상했습니다. 게시 시간 필드에 "and NASA" 또는 "and"와 파트너 이름이 들어 있었고, 조회수는 0이었습니다. GoPro가 파트너와 함께 게시한 동영상입니다. 페이지는 이런 행을 따로 분리해 중앙값 계산에서 빼야 합니다. 그렇지 않으면 조회수 중앙값이 낮아집니다.
Instagram은 비동기입니다. GoPro 요청을 00:19:28에 제출했습니다. 8.48초 뒤 status: running과 함께 작업 ID가 돌아왔고, everyinfra_get_job으로 결과를 읽으라는 안내가 있었습니다. 과금은 제출 시점에 이루어지며, 폴링은 무료입니다.
1라운드에서는 세 브랜드를 모두 제출한 뒤에야 작업을 조회했습니다. GoPro 작업은 제출 23초 후에도 실행 중이었습니다. 223초 시점에는 완료되어 게시물 20개, 34,031바이트가 반환되었습니다.
DJI 작업은 15초마다 폴링했습니다. 00:23:27에 running, 00:23:43에 finalizing, 00:23:58에 succeeded로 표시되어 총 약 56초가 걸렸습니다. Instagram 응답에는 좋아요와 댓글이 있습니다. 조회수와 팔로워 수는 없습니다. 카탈로그의 필드 설명도 같습니다. 이 기능은 둘 다 반환하지 않으며, 게시물은 최대 48개까지 반환합니다.
테스트 1: 호출마다 시간이 얼마나 걸리나
페이지를 한 번 열면 호출이 9회 발생합니다. 각 호출의 소요 시간에 따라 첫 화면이 비어 있는 시간이 정해집니다. 아래 차트는 1~3라운드의 호출 36회를 호출당 점 하나로 모두 보여 줍니다. TikTok 동기 호출의 중앙값은 21.23초, YouTube 호출의 중앙값은 14.00초였습니다. 둘 다 50~70초까지 이어지는 긴 꼬리가 있습니다.
Insta360 YouTube 호출은 66.58초가 걸렸습니다. Oura YouTube 호출은 69.16초가 걸린 뒤 0행을 반환했고, 자동으로 환불되었습니다. Instagram 제출은 빠르며 중앙값은 2.12초입니다. 결과는 그 뒤로 1분에서 몇 분이 더 걸립니다.
| 호출 | 호출 수 | 중앙값(초) | 최단(초) | 최장(초) |
|---|---|---|---|---|
| TikTok 동기 | 12 | 21.23 | 8.62 | 52.78 |
| YouTube 동기 | 12 | 14.00 | 8.71 | 69.16 |
| Instagram 제출 | 12 | 2.12 | 1.90 | 12.19 |
| Instagram 완료(상한) | 12 | 143 | 47 | 510 |
이 수치를 반영하려면 페이지 설계를 세 가지 측면에서 바꿔야 합니다. 첫째, 페이지는 9회 호출을 병렬로 보내야 합니다. 순차로 보내면 최악의 경우 첫 화면이 완성되기까지 5~6분이 걸립니다. 병렬로 보내도 가장 느린 셀은 1분 넘게 걸립니다. 따라서 셀마다 별도의 "로딩" 상태가 필요합니다.
둘째, Instagram은 제출, 작업 ID, 폴링 방식을 써야 합니다. 동기 호출 한 번으로는 안 됩니다. 페이지 런타임은 응답을 약 130초 기다리고, Claude 호스팅 앱은 도구 호출을 240초에 중단합니다. 2라운드에서 가장 느린 Instagram 작업은 제출부터 성공을 확인한 첫 폴링까지 510초가 걸렸습니다.
그중 일부는 저희가 폴링을 늦게 한 탓이었습니다. 3라운드에서는 15초마다 폴링했고, 세 작업 모두 47~59초 안에 완료되었습니다. 셋째, 캐시를 쓰면 이런 대기가 모두 사라집니다. 공유 저장소에서 셀 9개를 읽는 데는 밀리초 단위의 시간밖에 걸리지 않습니다.
테스트 2: 20행으로 얼마나 과거까지 볼 수 있나
1, 2라운드에서는 limit 20을 사용했습니다. 게시가 잦은 계정은 20행으로 30일 구간을 채우지 못합니다. 이 글의 웨어러블 브랜드는 결과가 엇갈렸습니다. WHOOP의 TikTok 동영상 20개는 37.1일을 포괄했지만, Instagram 게시물 20개는 14.3일에 그쳤습니다. Oura는 게시가 적어 TikTok 동영상 19개가 83.9일, Instagram 게시물 20개가 27.0일을 포괄했습니다. Garmin의 YouTube 동영상 20개는 약 60일 전까지 거슬러 올라갔고, Instagram 게시물 20개는 40.1일을 포괄했습니다.
카메라 브랜드는 게시가 더 잦습니다. Insta360의 고정되지 않은 TikTok 동영상 17개는 7.2일만 포괄했습니다. 그래서 페이지는 30일 게시 수가 아닌 일일 게시 수를 표시합니다.
더 나은 해결책은 limit을 늘리는 것입니다. 세 기능 모두 호출당 과금됩니다. TikTok과 YouTube는 최대 50행, Instagram은 최대 200행까지 허용합니다. 행이 늘어도 비용은 같습니다. 싱가포르 시간 01:03~01:05에 limit 50으로 3회 더 호출했습니다.
Insta360 TikTok은 20행 7.2일에서 50행 24.0일로 늘었습니다. Mango TikTok은 14.1일에서 56.1일로 늘었습니다. GoPro YouTube는 약 150일에서 약 365일로 늘었습니다. 호출당 비용은 여전히 $0.000556이었습니다.
대가는 크기입니다. TikTok 행 하나에는 필드가 35개 있습니다. 20행은 약 50,000바이트이고, 50행은 137,072바이트였습니다. 그러면 Claude 호스팅 앱의 도구 결과 1건당 150,000자 제한까지 약 13,900자밖에 남지 않습니다(Insta360 호출은 136,062자를 반환했습니다).
이번 테스트에서 가장 강조하고 싶은 점입니다. 확인 없이 limit을 최댓값으로 올리지 마십시오. TikTok은 50행에서 이미 제한에 가깝습니다. 그 이상이 필요하면 페이지네이션이나 비동기 모드를 사용하십시오.
| 호출(2026-11-05, 싱가포르 시간) | 20행 포괄 일수 | 50행 포괄 일수 | 반환 문자 수 | 150,000까지 남은 여유 | 초 |
|---|---|---|---|---|---|
| Insta360 TikTok, 01:03:59 | 7.2 | 24.0 | 136,062 | 13,938 | 19.75 |
| Mango TikTok, 01:04:27 | 14.1 | 56.1 | 121,794 | 28,206 | 30.70 |
| GoPro YouTube, 01:05:06 | 150 | 365 | 31,212 | 118,788 | 11.52 |
웨어러블 브랜드 3곳의 2라운드 수치입니다. Oura의 최신 TikTok 동영상과 최신 Instagram 게시물은 모두 2026-11-02에 게시되었습니다. Garmin의 최신 Instagram 게시물은 2026-10-31에 게시되었습니다.
| 브랜드 및 플랫폼 | 일평균 게시물 | 조회수 중앙값 | 좋아요 중앙값 | 참여율 | 팔로워 |
|---|---|---|---|---|---|
| Oura, TikTok | 0.23 | 20,700 | — | 1.09% | 161,600 |
| Oura, YouTube | — (0행, 환불됨) | — | — | — | — |
| Oura, Instagram | 0.74 | — | 1,785 | — | — |
| WHOOP, TikTok | 0.54 | 17,250 | — | 2.82% | 415,900 |
| WHOOP, YouTube | 0.19 | 7,100 | — | — | 165,000 |
| WHOOP, Instagram | 1.40 | — | 3,412 | — | — |
| Garmin, TikTok | — (플레이스홀더 계정) | — | — | — | 21 |
| Garmin, YouTube | 0.33 | 22,500 | — | — | 368,000 |
| Garmin, Instagram | 0.50 | — | 7,228 | — | — |
테스트 3: TikTok 조회수 추이
대시보드 하단에는 최근 30일간 TikTok 게시물별 조회수가 그려집니다. 아래 차트는 웨어러블 브랜드의 실제 2라운드 응답을 로그 스케일로 보여 줍니다. WHOOP은 약 이틀에 한 번 게시합니다. 동영상 대부분의 조회수는 5,000~20,000회이며, 가장 높은 것은 65,000회입니다.
Oura는 게시 빈도가 더 낮아, 이 기간의 동영상 5개가 조회수 3,040~25,900회를 기록했습니다. 조회수 중앙값은 20,700회, 참여율 중앙값은 1.09%였습니다. WHOOP의 조회수 중앙값은 17,250회, 참여율 중앙값은 2.82%였습니다.
이 차트는 주의해서 읽어야 합니다. 각 점은 가져온 시점의 누적 조회수입니다. 일정 기간의 조회수가 아닙니다. 어제 올린 동영상과 3주 전 동영상은 공정한 비교 대상이 아니며, 최신 동영상이 항상 더 약해 보입니다. "이번 주에 누가 더 잘했나"를 보려면 게시 후 첫 48시간 조회수를 비교하세요. 그러려면 페이지가 동영상을 처음 발견했을 때 조회수를 저장하고, 48시간 뒤 다시 가져와야 합니다.
공유 스토리지로는 가능하지만 기본 제공 캐시로는 불가능합니다. 공유 스토리지는 이력을 보관할 수 있고, 브라우저 캐시는 마지막 결과만 보관합니다.
테스트 4: 41분 동안 데이터는 얼마나 바뀌었나
적절한 캐시 유지 시간은 데이터가 얼마나 빨리 바뀌는지에 달려 있습니다. 싱가포르 시간 01:00~01:03에 카메라 브랜드 3곳의 1라운드 호출을 세 플랫폼 모두에서 반복했습니다. 1라운드와의 간격은 약 41분(0.7시간)이었습니다. 같은 게시물의 조회수 또는 좋아요 수를 비교했습니다.
두 라운드 사이에 9개 셀 어디에도 새 게시물은 없었습니다. 변화는 거의 모두 최근 하루 이틀 내에 올라온 게시물에 몰려 있습니다. TikTok에서는 Insta360 동영상 15개의 조회수가 변했지만 증가율 중앙값은 0.18%에 불과했습니다. 증가 폭이 가장 큰 동영상은 2026-11-03에 게시된 것으로, 조회수가 247,300회에서 259,800회로 늘었습니다(+5.05%).
DJI에서 증가 폭이 가장 큰 동영상은 2026-11-04에 게시된 것이었습니다(+5.37%). GoPro는 동영상 5개의 조회수만 변했습니다. 증가 폭이 가장 큰 동영상은 2026-11-04에 게시된 것으로, 조회수가 1,532회에서 1,626회로 늘었습니다.
Instagram에서는 좋아요 수가 변한 게시물이 20개 중 12~17개로 더 많았지만 증가율 중앙값은 약 0.1%였습니다. 증가 폭이 가장 큰 두 건은 모두 2026-11-04에 올라온 새 게시물이었습니다. Insta360 게시물 하나는 좋아요가 742개에서 916개로(+23.4%), DJI 게시물 하나는 2,406개에서 2,700개로(+12.2%) 늘었습니다. YouTube에서는 채널별로 조회수가 변한 동영상이 20개 중 최대 1개였습니다. 조회수가 반올림된 값(예: 125,000)이라 작은 증가는 드러나지 않습니다.
| 브랜드 및 플랫폼 | 필드 | 20행 중 변경된 행 | 변화율 중앙값 | 최대 변화율 |
|---|---|---|---|---|
| GoPro TikTok | 조회수 | 5 | 0.00% | 6.14% |
| GoPro YouTube | 조회수 | 1 | 0.00% | 0.26% |
| GoPro Instagram | 좋아요 | 16 | 0.06% | 0.46% |
| Insta360 TikTok | 조회수 | 15 | 0.18% | 5.05% |
| Insta360 YouTube | 조회수 | 0 | 0.00% | 0.00% |
| Insta360 Instagram | 좋아요 | 12 | 0.10% | 23.45% |
| DJI TikTok | 조회수 | 14 | 0.36% | 5.37% |
| DJI YouTube | 조회수 | 1 | 0.00% | 1.20% |
| DJI Instagram | 좋아요 | 17 | 0.10% | 12.22% |
결과는 명확합니다. 일일 게시물 수나 조회수 중앙값 같은 셀은 6시간 공유 캐시를 써도 잃는 것이 거의 없습니다. 오래된 게시물은 41분 동안 1% 미만으로 바뀌었습니다. 변하는 것은 최근 24시간 내 게시물입니다.
페이지에서 새 게시물의 성장 속도를 추적하나요? 그렇다면 최근 48시간을 별도 행으로 두세요. 이 행에는 1시간처럼 더 짧은 캐시를 적용합니다. 나머지 셀은 6~24시간 주기로 갱신합니다.
테스트 5: 응답 크기와 공유 스토리지
아티팩트 스토리지는 아티팩트당 20 MB이며 텍스트만 저장할 수 있습니다(support 17153992). 페이지를 한 번 열 때 받는 원본 응답 9건은 합계 약 326 KB입니다. trim으로 필드 10개만 남기면 원본의 8.5%인 27.6 KB로 줄어듭니다. 6시간마다 사본 하나를 이력으로 보관해도 한 달에 사본 120개, 총 3.3 MB에 불과합니다.
20 MB에 한참 못 미칩니다. 그래도 원본 응답 전체를 저장하지는 마세요. 크기가 한 가지 이유입니다. 다른 이유는 그 안에 든 계정 잔액입니다. 공유 스토리지는 모든 구성원이 읽을 수 있습니다.
데이터 함정: 플레이스홀더 계정, 파트너 동영상, 빈 결과
이번 테스트의 데이터 셀 27개 중 3개는 그대로 대시보드에 올릴 수 없었습니다. 원인은 각각 달랐고, 페이지는 이를 모두 감지해야 합니다.
| 사례 | 실제 예(2026-11-05, 싱가포르 시간) | 과금 | 페이지 처리 방식 |
|---|---|---|---|
| 사용자 이름이 다른 사람의 것임 | Garmin TikTok: 브랜드명으로 추측한 핸들을 사용하자 팔로워 21명인 미인증 계정에서 행 1개가 반환됨 | $0.000556 | 팔로워 수가 매우 적거나 author_is_verified가 false이면 "계정 확인"으로 표시하고 비교에서 제외 |
| 파트너 동영상 행 | YouTube의 GoPro, Insta360, DJI에서 게시 시간이 "and"이고 파트너 이름이 있으며 조회수가 0인 행이 각각 2~4개 발견됨 | 정상 과금 | 게시 시간을 읽을 수 없는 행은 중앙값에서 제외하고 "파트너 게시물"로 표시 |
| 빈 결과 | Oura YouTube 채널 주소를 조회했으나 69.16초 후 반환된 행이 0개였음 | 환불, $0 | "이 주소에서 게시물을 찾을 수 없습니다"를 표시하고 사용자에게 채널 주소 확인 요청 |
| 고정 게시물 | TikTok 계정 9개 중 5개에 고정 게시물이 있었고, Insta360과 DJI는 각각 3개 | 정상 과금 | 게시 주기와 중앙값 계산 전에 고정 게시물 제외 |
| 분당 한도 도달 | 1라운드에서 429 응답 4건, 그중 3건이 00:19:51에 발생, 메시지에 키 자체 한도가 분당 10회라고 명시 | 과금 없음 | retry_after 초와 "다시 시도" 버튼 표시 |
가장 놓치기 쉬운 것은 첫 번째 행입니다. 브랜드의 TikTok 사용자 이름이 항상 브랜드명과 같지는 않습니다. 저희가 시도한 핸들은 소규모 개인 계정의 것이었습니다. API가 실제로 콘텐츠를 반환했으므로 호출은 정상 과금됩니다. 브랜드를 처음 추가할 때는 채팅에서 Claude에게 tiktok/profile 같은 프로필 기능으로 계정을 확인해 달라고 요청하세요. 인증 여부와 팔로워 수를 확인한 뒤에 핸들을 페이지에 넣으세요.
열람 1회당 비용: 10명이 하루 3번 열 때
2026-11-05 카탈로그 가격 기준으로 세 기능은 모두 호출당 $0.000556입니다. 대시보드는 브랜드 3곳, 브랜드당 플랫폼 3개이므로 한 번 열면 9회 호출에 $0.005004입니다. Instagram 폴링 도구 everyinfra_get_job은 무료입니다. 빈 결과는 환불되고, 429 응답은 과금되지 않습니다.
| 요금제 | 월간 가져오기 횟수 | 과금 호출 수 | 월간 데이터 비용 | 비고 |
|---|---|---|---|---|
| 캐시 없음 | 900회 열람 전부 | 8,100 | $4.50 | 10명 × 3회 × 30일 × $0.005004 |
| 개인별, 24시간 | 1인당 하루 1회, 300 | 2,700 | $1.50 | 현재 저희 도구가 읽기 전용이 아닌 것으로 표시되어 있어 기본 제공 캐시로는 불가능하므로 개인 스토리지 사용 |
| 공유, 6시간 | 하루 4회, 120 | 1,080 | $0.60 | 아티팩트 공유 스토리지에 보관하며, 만료 후 처음 연 사람이 가져옴 |
| 공유, 24시간 | 하루 1회, 30 | 270 | $0.15 | 주간 회의에서 확인하는 페이지에 적합 |
| 참고: Team 스탠다드 좌석 10개, 월 기준 | — | — | $250 | claude.com/pricing, 2026-11-05 |
금액은 모두 작습니다. 가장 비싼 방식도 월 $5 미만으로, Team 좌석 10개의 월 $250와 비교하면 매우 적습니다. 다만 먼저 두 가지를 고려해야 합니다. OAuth를 쓰면 캐시가 만료된 뒤 페이지를 처음 여는 사람이 해당 조회 비용을 냅니다. 따라서 매일 아침 가장 먼저 출근한 동료가 모두의 비용을 내게 됩니다.
금액은 아주 작지만 페이지에 이 사실을 명시하세요. 공유 키를 쓰면 모든 요금이 조직의 계정 하나에서 차감됩니다. 잔액이 바닥나면 팀 전체의 대시보드가 한꺼번에 비게 됩니다. EveryInfra 콘솔에서 해당 계정에 잔액 부족 알림을 설정하세요.
페이지를 열 때마다 과금되지 않도록 캐시하는 방법
Claude 페이지 런타임에는 자체 호출 캐시가 있습니다. 읽기 전용으로 선언된 도구(readOnlyHint: true)의 결과는 기본적으로 5분간 캐시되며, 이 기간을 최대 7일까지 늘릴 수 있습니다. Artifacts 문서에도 페이지를 다시 열면 캐시된 응답으로 먼저 렌더링한다고 나와 있습니다. 그런데 저희가 로컬에 설치한 Claude Code 2.1.309의 런타임 타입 정의(버전 0.2.96, 공개 문서 아님)에는 규칙이 하나 더 있습니다. readOnlyHint: false를 선언한 도구는 캐시 옵션이 무시되며 호출 결과가 전혀 캐시되지 않습니다. 또한 페이지에서는 이 도구에 대해 자동 새로 고침 메서드인 watchTool도 사용할 수 없습니다.
현재 everyinfra_call_api의 어노테이션이 이 규칙에 해당합니다. 따라서 런타임이 결과를 대신 재사용해 주지 않으며, 호출할 때마다 과금됩니다. 해결 방법은 간단합니다. 페이지가 자체 캐시를 유지하도록 하면 됩니다. 저희 방식은 다음과 같습니다.
저희는 아티팩트의 공유 스토리지(db 기능)를 권장합니다. 셀마다 필드를 줄인 결과와 데이터를 가져온 시각을 저장하세요. 페이지를 열면 먼저 저장된 값을 읽고, 6시간이 지난 경우에만 다시 조회합니다. 이 방식은 세 가지 면에서 도움이 됩니다.
월 비용이 $4.50에서 $0.60으로 줄어듭니다. 캐시가 유효하면 첫 화면이 1분이 아니라 밀리초 만에 렌더링됩니다. 또한 다음 차트에서 보듯 분당 부하도 줄어듭니다.
기본적으로 Contributor 이상은 공유 스토리지에 쓸 수 있고, 보기 전용 구성원은 읽기만 할 수 있습니다. 따라서 보기 전용 구성원이 만료된 페이지를 열면 조회 1회 비용을 내고 최신 데이터를 봅니다. 하지만 이 구성원은 결과를 다시 기록할 수 없으므로 다음 사람이 또 조회합니다. 코드는 이 경우를 감안해야 합니다.
분당 한도는 공유 키를 쓸 때만 문제가 됩니다. EveryInfra는 기본적으로 모든 키를 합산해 계정당 분당 60회 호출을 허용합니다(요금 페이지). 스탠드업 회의 직전 같은 1분 안에 10명이 캐시 없는 페이지를 연다고 가정해 보겠습니다. 한 계정에서 90회 호출이 발생하고, 마지막 30회는 429를 받습니다. 이 호출에는 과금되지 않지만 해당 셀은 빈 채로 남습니다.
이 글의 테스트 키에는 분당 10회라는 자체 한도가 있었습니다. 1회차 테스트에서 이 한도에 4번 걸렸고, 그중 3번은 00:19:51에 발생했습니다. 응답 텍스트에는 키 자체 한도를 모두 사용했으니 9초 뒤 재시도하라고 적혀 있었습니다. 따라서 대시보드에는 계정 한도보다 낮은 분당 한도를 둔 전용 키를 발급하세요. 그러면 같은 계정의 다른 프로그램이 써야 할 호출을 대시보드가 다 써 버리는 일이 없습니다.
공유 캐시에도 대가가 있습니다. HaloPSA 서비스 데스크 대시보드에 관한 Reddit 게시물과 댓글이 이를 잘 설명합니다(r/halopsa 스레드). 첫 번째 대가는 접근 권한입니다. 캐시된 데이터는 처음 조회한 사람의 접근 권한으로 가져온 것입니다.
이후 열람자는 자신의 권한 밖에 있는 데이터를 볼 수도 있습니다. 경쟁사의 공개 소셜 데이터는 누구에게나 같으므로 저희에게는 문제가 되지 않습니다. 하지만 내부 데이터라면 실제로 문제가 됩니다.
두 번째 대가는 신뢰입니다. 기본 규칙에서는 어떤 Contributor든 공유 저장소의 캐시 문서를 변경할 수 있습니다. 누군가 가짜 숫자를 기록하면 모든 열람자가 그 숫자를 보게 됩니다. 이를 막으려면 캐시 경로의 쓰기 권한을 Editor로 제한하세요. 대신 일반 멤버는 만료된 페이지를 열 때마다 조회하게 됩니다.
최근 변경 사항
2026-10-28에 Anthropic은 Claude for Legal에 바로 쓸 수 있는 법률 아티팩트 갤러리를 추가했습니다. 해당 글은 아티팩트를 "트래커와 대시보드 같은 인터랙티브 도구"라고 부르며, 커넥터가 팀이 이미 쓰는 소스를 가져온다고 설명합니다(Introducing artifacts for legal work with Claude). 출시 파트너 중 하나인 Harvey도 같은 날 글을 올렸습니다. Harvey의 Intake 아티팩트는 Harvey MCP 서버를 통해 Harvey에 연결됩니다(Harvey 블로그). 2026-10-21에는 Help Center 릴리스 노트에 Claude Duet 등의 업데이트가 기록되었습니다(릴리스 노트). 같은 릴리스 노트에 따르면 2026-10-15부터 Enterprise 요금제에서 아티팩트 템플릿이 기본으로 활성화되었습니다.
2026-10-08에 Claude Dashboards와 Claude Motion이 베타로 출시되었습니다. Dashboards는 유료 요금제에서 제공되며 BigQuery, Snowflake 같은 데이터 플랫폼에 연결됩니다. 다른 커넥터와도 함께 작동하며, 차트마다 데이터가 마지막으로 새로 고쳐진 시점이 표시됩니다(Claude 블로그, Get started with Claude dashboards). 같은 날 나온 The New Stack 기사는 Anthropic 대변인의 말을 인용합니다.
기본적으로 공유 대시보드의 쿼리는 각 열람자 본인의 연결을 통해 실행됩니다(The New Stack). Dashboards는 데이터 웨어하우스에서 SQL을 실행하는 용도에 더 적합합니다. 이 글처럼 소셜 데이터 API를 호출하는 페이지라면 일반 아티팩트에 MCP 커넥터를 붙이는 편이 더 간단합니다.
Claude Code 쪽에서는 v2.1.209에서 커넥터가 노출하지 않는 커넥터 도구 이름을 게시 시 받아들이던 문제가 수정되었습니다. v2.1.265부터는 게시 시 페이지가 선언한 도구 이름을 확인하고, 일치하는 이름이 하나도 없으면 게시를 거부합니다(Claude Code changelog, Artifacts). 2026-11-05에 저희가 확인한 최신 버전은 v2.1.318입니다.
GitHub 이슈 하나는 아직 열려 있습니다. 2026-08-06에 한 사용자가 클라우드 세션에서 업데이트하면 커넥터 권한 부여가 초기화된다고 보고했습니다. 앱에는 권한을 다시 부여할 곳이 없습니다(claude-ai-mcp #787). 한 Reddit 사용자도 같은 "not in this artifact's mcp_tools allowlist" 오류를 겪었습니다(r/ClaudeAI 스레드).
Claude 아티팩트 FAQ
Claude 아티팩트에서 연결된 MCP 커넥터를 호출할 수 있나요?
네. 출처: Google 자동완성 검색어 "claude code artifacts can now call mcp connectors". 게시된 아티팩트는 누군가 열 때마다 열람자의 claude.ai 커넥터를 통해 MCP 도구를 호출할 수 있습니다. Pro, Max, Ultra, Team 또는 Enterprise 요금제가 필요합니다. Claude Code에서 게시하려면 v2.1.209 이상이 필요합니다. claude.ai 커넥터만 해당되며, 게시된 페이지는 로컬 .mcp.json의 서버를 호출할 수 없습니다(Artifacts).
Claude 아티팩트의 MCP 호출에 한도가 있나요?
출처: Google 자동완성 검색어 "claude artifacts mcp limits". 2026-11-05 기준으로 Claude 공개 문서에는 아티팩트 커넥터 호출의 한도가 나와 있지 않습니다. 사용량이 각 사용자의 한도에 포함된다는 내용만 있습니다. 문서에 적힌 한도는 claude.ai와 데스크톱에서 결과당 약 150,000자, 호출당 240초입니다(Build an MCP server for Claude). 커넥터 서버 자체의 요청 속도 제한도 적용됩니다. EveryInfra는 기본적으로 계정당 분당 60회 호출을 허용합니다.
Claude 계정이 없는 사람도 실시간 데이터를 볼 수 있나요?
아니요. 출처: Claude 라이선스가 없는 관리자에게 데이터베이스 대시보드를 보여 주는 방법을 묻는 r/ClaudeCode 스레드. 외부 사용자와 로그인하지 않은 공개 링크 열람자에게는 커넥터 부분이 실행되지 않습니다. Help Center에도 앱에 연결된 아티팩트는 "Anyone with the link"를 사용할 수 없다고 나와 있습니다(Share artifacts). 외부 독자에게는 정적 스냅샷을 내보내거나, 자체 로그인을 갖춘 작은 내부 웹 페이지를 만드세요.
공유한 대시보드가 팀원에게 비어 보이는 이유는 무엇인가요?
출처: 대시보드가 팀 전원에게 비어 보였던 r/ClaudeAI 스레드. 커넥터는 계정별로 귀속됩니다. 각 열람자는 페이지가 쓰는 모든 커넥터를 연결하고 첫 호출을 승인해야 합니다. Team과 Enterprise에서는 "Enable artifact connectors"가 켜져 있는지 확인하세요. 또한 커넥터 권한에서 해당 도구가 "Needs approval"로 설정되어 있지 않은지도 확인하세요. 커넥터가 노출하지 않는 도구 이름을 페이지가 호출하면 모두에게 빈 페이지가 표시됩니다(Artifacts troubleshooting).
다시 게시한 뒤 "not in this artifact's allowlist"가 뜨는 것은 무슨 뜻인가요?
출처: r/ClaudeAI 스레드와 claude-ai-mcp의 GitHub 이슈 787. 페이지가 호출할 수 있는 도구는 페이지 코드가 아니라 게시 시점의 선언이 결정합니다. 클라우드 세션에서 업데이트하면 이 선언이 지워질 수 있습니다. 스레드에서 효과가 있었던 유일한 해결책은 로컬 세션에서 전체 커넥터 이름과 도구 이름을 넣어 다시 게시하는 것이었습니다.
공유 캐시에 사용자가 봐서는 안 되는 데이터가 표시되거나 누군가 캐시를 변경할 수 있나요?
출처: r/halopsa 서비스 데스크 대시보드 게시물의 댓글. 네, 두 위험 모두 실제로 존재합니다. 캐시된 데이터는 처음 조회한 사람의 접근 권한으로 가져온 것입니다. 기본 규칙에서는 Contributor가 캐시 문서에 쓸 수 있습니다.
경쟁사의 공개 소셜 데이터에는 접근 권한에 따른 차이가 없습니다. 수정을 막으려면 캐시 경로의 쓰기 권한을 Editor로 제한하세요. 그러면 일반 멤버는 만료된 페이지를 열 때마다 조회하게 됩니다.
Claude 아티팩트는 추가 비용이 드나요?
출처: Google 자동완성 검색어 "do claude artifacts cost money". 아티팩트는 유료 요금제에 포함되어 별도 가격이 없으며, 사용량은 각 사용자의 한도에 포함됩니다. 데이터 API 호출 비용은 별도입니다. 이 글의 예시에서 1회 열람 비용은 $0.005004입니다. 10명이 하루 3번 열 경우 캐시가 없으면 월 $4.50, 6시간 공유 캐시를 쓰면 월 $0.60이 듭니다.
시작하기
- EveryInfra에 회원가입하고 잔액을 충전하세요. 빠른 시작을 따라 키를 발급받거나 OAuth 로그인을 준비하세요. 원격 MCP 가이드는 MCP 서버와 원격 MCP 설정에 있습니다.
- 위 구성 예시와 같이 Claude에 커넥터를 추가하세요. 이름은 EveryInfra로 지정하고
everyinfra_call_api를 Always allow로 설정하세요. - Claude 채팅에서 브랜드마다 커넥터를 한 번씩 호출하세요. 사용자 이름, 채널 주소, 반환된 필드를 확인하세요.
- 이 글의 뼈대 코드로 페이지를 만들어 달라고 Claude에 요청하세요.
mcp와db기능을 선언하고 게시한 뒤, 조직 내부에만 공유하세요. - 각 동료가 커넥터를 연결하고 첫 호출을 승인합니다. 페이지에 캐시 경과 시간을 표시하고, 만료 후 조회 비용을 누가 내는지 명시하세요.
관련 글
- Claude Code 서브에이전트: Haiku 서브에이전트로 TikTok 브랜드 계정을 병렬 수집하기: 같은 TikTok 데이터를 Claude Code의 서브에이전트가 병렬로 가져옵니다.
- MCP 2026 사양과 프로덕션 준비 상태: 프로덕션 환경의 도구 선언, 권한 부여, 원격 MCP.
EveryInfra 블로그에는 경쟁사를 다룬 글이 두 편 더 있습니다. AI 도구 4개용 SKILL.md 하나: 경쟁사 리뷰 분석은 리뷰 분석을 에이전트 스킬에 담습니다. Claude Code나 Codex 같은 도구에서 한 번 실행하면 정적 보고서를 얻습니다. ChatGPT Spaces 경쟁사 소셜 트래커는 ChatGPT Space의 공유 페이지를 사용합니다. 이 페이지는 스스로 업데이트되지 않습니다. 매주 실행되는 예약 작업이 새 수치를 기록하므로, 열람자는 항상 가장 최근 작업이 기록한 데이터를 보게 됩니다.
이 글은 두 가지 면에서 다릅니다. 데이터를 언제 가져오는지, 그리고 비용을 누가 내는지입니다. Claude 아티팩트는 각 사용자가 페이지를 여는 순간 그 사람의 커넥터를 통해 데이터를 가져옵니다. 따라서 새로 고침 빈도는 예약 작업이 정하지 않습니다. 열람자 수와 페이지를 여는 빈도가 정합니다. 비용을 내는 사람도 작업을 설정한 사람이 아닙니다.
OAuth를 쓰면 각 열람자가 비용을 냅니다. 공유 키를 쓰면 키를 입력한 조직이 비용을 냅니다. 이 두 가지 사실이 캐시 설계를 결정하며, 아래의 모든 테스트도 이에 관한 것입니다. 주간 정적 보고서만 필요하다면 다른 두 글의 방식이 더 간단합니다.
참고 자료
- Claude Help Center, “What are artifacts and how do I use them?”, 2026-11-05 확인: https://support.claude.com/en/articles/17153992-what-are-artifacts-and-how-do-i-use-them
- Claude Help Center, “Share artifacts”, 2026-11-05 확인: https://support.claude.com/en/articles/9547008-share-artifacts
- Claude Help Center, “Artifacts admin guide for Team and Enterprise plans”, 2026-11-05 확인: https://support.claude.com/en/articles/16994751-artifacts-admin-guide-for-team-and-enterprise-plans
- Claude Help Center, “Get started with custom connectors using remote MCP”, 2026-11-05 확인: https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp
- Claude Help Center, “Use connectors to extend Claude's capabilities”, 2026-11-05 확인: https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities
- Claude Help Center, “Get started with Claude dashboards”, 2026-11-05 확인: https://support.claude.com/en/articles/17454700-get-started-with-claude-dashboards
- Claude Help Center, “Release notes”, 2026-11-05 확인: https://support.claude.com/en/articles/12138966-release-notes
- Claude Code 문서, “Artifacts”, 2026-11-05 확인: https://code.claude.com/docs/en/artifacts
- Claude Code, “Week 29 digest”(2026년 7월 13~17일), 2026-11-05 확인: https://code.claude.com/docs/en/whats-new/2026-w29
- Claude Code, “What's new” 목록, 2026-11-05 확인: https://code.claude.com/docs/en/whats-new
- Claude Code 문서, “Connect Claude Code to tools via MCP”, 2026-11-05 확인: https://code.claude.com/docs/en/mcp
- GitHub의 Claude Code 변경 내역, 2026-11-05 확인: https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
- Claude Code 문서의 변경 내역, 2026-11-05 확인: https://code.claude.com/docs/en/changelog
- claude.com 개발자 문서, “Build an MCP server for Claude”, 2026-11-05 확인: https://claude.com/docs/connectors/building
- claude.com 개발자 문서, “Authentication for connectors”, 2026-11-05 확인: https://claude.com/docs/connectors/building/authentication
- Claude API 문서, “MCP connector”, 2026-11-05 확인: https://docs.claude.com/en/docs/agents-and-tools/mcp-connector
- Claude 요금 페이지, 2026-11-05 확인: https://claude.com/pricing
- Claude 블로그, “Build live dashboards and animate explainers with Claude”(2026-10-08), 2026-11-05 확인: https://claude.com/blog/dashboards-and-motion
- Claude, “Introducing artifacts for legal work with Claude”(2026-10-28), 2026-11-05 확인: https://claude.com/resources/articles/introducing-artifacts-for-legal-work
- Claude, “Turn ideas into interactive AI-powered apps”(2025-10-21 업데이트 안내 포함), 2026-11-05 확인: https://claude.com/resources/articles/build-artifacts
- GitHub anthropics/claude-ai-mcp 이슈 787(2026-08-06 등록), 2026-11-05 확인: https://github.com/anthropics/claude-ai-mcp/issues/787
- MCP 사양 2025-06-18, “Tools”, 2026-11-05 확인: https://modelcontextprotocol.io/specification/2025-06-18/server/tools
- MCP 사양 2025-06-18, “Authorization”, 2026-11-05 확인: https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
- MCP 사양 2025-11-25, “Authorization”, 2026-11-05 확인: https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization
- MCP 사양 2026-07-28, “Schema Reference”, 2026-11-05 확인: https://modelcontextprotocol.io/specification/2026-07-28/schema
- IETF RFC 9728, “OAuth 2.0 Protected Resource Metadata”, 2026-11-05 확인: https://datatracker.ietf.org/doc/html/rfc9728
- IETF RFC 6750, “OAuth 2.0 Bearer Token Usage”, 2026-11-05 확인: https://datatracker.ietf.org/doc/html/rfc6750
- MDN, “429 Too Many Requests”, 2026-11-05 확인: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429
- Google for Developers, “YouTube Data API quota costs”(2026-11-03 업데이트), 2026-11-05 확인: https://developers.google.com/youtube/v3/determine_quota_cost
- Meta for Developers, “IG User Business Discovery”, 2026-11-05 확인: https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/reference/ig-user/business_discovery
- Meta for Developers, “Graph API rate limits”, 2026-11-05 확인: https://developers.facebook.com/docs/graph-api/overview/rate-limiting
- TikTok for Developers, “List Videos”, 2026-11-05 확인: https://developers.tiktok.com/doc/tiktok-api-v2-video-list
- TikTok for Developers, “Understanding TikTok API Rate Limits”, 2026-11-05 확인: https://developers.tiktok.com/doc/tiktok-api-v2-rate-limit
- EveryInfra 원격 MCP(tools/list 및 tools/call), 2026-11-05: https://api.everyinfra.com/mcp
- /mcp/all에 대한 EveryInfra 보호된 리소스 메타데이터, 2026-11-05 싱가포르 시간 00:12 확인: https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all
- EveryInfra 데이터 기능 카탈로그, 2026-11-05 싱가포르 시간 00:15 확인: https://api.everyinfra.com/api/v1/social/catalog
- EveryInfra OpenAPI 문서, 2026-11-05 확인: https://api.everyinfra.com/openapi.json
- Reddit r/ClaudeCode, “Share an artifact with a database to users without a Claude License”, 2026-11-05 확인: https://www.reddit.com/r/ClaudeCode/comments/1xhwscj/help_needed_share_an_artifact_with_a_database_to/
- Reddit r/ClaudeAI, “Has anyone gotten a Claude artifact with connectors to work for their whole team?”, 2026-11-05 확인: https://www.reddit.com/r/ClaudeAI/comments/1wb1ep7/has_anyone_gotten_a_claude_artifact_with/
- Reddit r/ClaudeAI, “Problem with Artifact MCP permissions”, 2026-11-05 확인: https://www.reddit.com/r/ClaudeAI/comments/1vr1k8q/problem_with_artifact_mcp_permissions_how_can_i/
- Reddit r/halopsa, “The mother of all HaloPSA dashboards, built in Claude artifacts”, 2026-11-05 확인: https://www.reddit.com/r/halopsa/comments/1wfttq0/the_mother_of_all_halopsa_dashboards_built_in/
- Reddit r/ClaudeAI, “Artifacts cannot invoke custom MCP connectors”, 2026-11-05 확인: https://www.reddit.com/r/ClaudeAI/comments/1q8gp3l/artifacts_cannot_invoke_custom_mcp_connectors/
- The New Stack, “Claude can now build your dashboards”(2026-10-08), 2026-11-05 확인: https://thenewstack.io/claude-dashboards-data-motion/
- Harvey, “Harvey Brings Intake to Claude for Legal Artifacts Launch”(2026-10-28), 2026-11-05 확인: https://www.harvey.ai/blog/harvey-intake-claude-for-legal-artifact
참고 BL-87