GitHub Copilot MCP 설정 예시와 실제 API 호출 26건으로 만드는 주간 경쟁사 소셜 리포트
GitHub Copilot MCP 설정 예시와 실제 API 호출 26건: 코딩 에이전트가 경쟁사 리포트 스크립트를 작성하고, Actions가 이 스크립트를 매주 실행하며 비용은 $0.011961입니다.

B2B SaaS 기업의 프로덕트 마케터는 매주 월요일 같은 요청을 받곤 합니다. 요청 내용은 간단합니다. 주요 경쟁사 세 곳이 지난주에 무엇을 게시했는지 알려 달라는 것입니다. 저희는 2026년 11월 6일 00:17~00:38(SGT)에 이 리포트의 데이터 부분을 구축했습니다. Notion, ClickUp, Asana를 대상으로 EveryInfra API를 실제로 26회 호출했습니다.
먼저 밝혀 둘 한계가 있습니다. 저희 테스트 머신에는 Copilot 구독이 없습니다. 이 글의 Copilot 설정, 이슈, 워크플로는 GitHub 문서를 바탕으로 한 구성 예시이며, Copilot에서 직접 실행하지는 않았습니다. 측정한 수치는 모두 실제 EveryInfra API 응답에서 나온 것입니다.
10월 30일부터 11월 5일까지 한 주 동안 ClickUp은 YouTube, TikTok, Instagram에 14개 항목을 게시했습니다. Asana는 3개, Notion은 2개였습니다.
이 글의 방식에서는 GitHub Copilot 코딩 에이전트를 한 번만 사용합니다. 에이전트는 MCP로 실제 응답 몇 개를 읽은 뒤 평범한 Python 스크립트와 예약 워크플로를 작성합니다. 풀 리퀘스트를 병합하면 이후에는 GitHub Actions가 매주 스크립트를 실행하며, 모델은 다시 실행되지 않습니다. 카탈로그 가격 기준으로 브랜드 3곳의 플랫폼 4개를 수집하는 비용은 주당 $0.011961, 월 약 $0.0518입니다.
이 글이 다루는 질문은 범위가 좁습니다. 매주 월요일 아침 저장소에 Markdown 리포트가 쌓이기를 원한다고 가정합니다. 리포트에는 경쟁사별로 4개 플랫폼에 무엇을 게시했는지, 어떤 게시물의 성과가 가장 좋았는지, 게시 빈도가 어떻게 바뀌었는지가 담깁니다. 리포트 코드는 GitHub Copilot이 작성하게 하되, AI 모델이 매주 데이터를 다시 찾게 하지는 않으려는 상황입니다.
이 글의 GitHub 관련 사실은 모두 2026년 11월 6일에 확인한 GitHub Changelog 또는 docs.github.com에서 가져왔습니다. EveryInfra 수치는 모두 저장해 둔 실제 API 응답에서 나왔습니다.
결론: GitHub Copilot MCP 작업은 둘로 나누세요
이 리포트에서 가장 흔한 실수는 두 작업을 섞는 것입니다. 하나는 코드를 작성하는 일이고, 다른 하나는 매주 데이터를 수집하는 일입니다. 2026년 10월 28일, GitHub는 이 두 작업에 각각 대응하는 기능 두 가지를 출시했습니다.
첫 번째 기능은 커넥터와 저장소 MCP 구성으로, Copilot이 작업 중에 외부 도구를 호출할 수 있게 해 줍니다. 두 번째 기능은 Copilot Automations에 새 도구, 트리거, 비용 관리 기능을 추가합니다(자동화 도구, 트리거, 비용 관리에 관한 변경 내역). Automations를 사용하면 Copilot을 일정에 따라 실행할 수 있습니다.
Copilot이 매주 데이터를 수집하고 리포트를 작성하게 하면, 실행할 때마다 클라우드 에이전트 세션이 시작됩니다. 자동화 문서에 따르면 실행마다 AI 크레딧과 Actions 사용 시간이 소모됩니다(Copilot 자동화 문서, 과금 섹션). 형식이 고정된 주간 리포트에는 모델의 판단이 필요하지 않습니다. 그래서 저희는 모델이 코드를 작성할 때 한 번만 일하는 방식을 권장합니다.
워크플로는 간단합니다. 규칙, 핸들, 테스트 예시를 적은 이슈를 열고 Copilot에 할당합니다. 에이전트는 코드를 작성하기 전에 EveryInfra MCP 도구로 카탈로그를 읽고 테스트 호출을 서너 번 합니다.
에이전트는 실제 필드 이름과 실제 날짜 형식을 확인합니다. 그런 다음 weekly_report.py와 .github/workflows/weekly-report.yml을 작성하고 검토용 풀 리퀘스트를 엽니다. 병합 후에는 예약된 Actions 작업이 POST /api/v1/social을 보내고 Markdown 파일을 만든 뒤 커밋합니다.
아래 표는 리포트를 실행하는 두 가지 방법을 비교합니다. 내용은 GitHub 문서를 근거로 하며, 왼쪽 열이 저희가 권장하는 방식입니다.
| 항목 | 예약 실행 Actions 스크립트(권장 방식) | 매주 Copilot Automations 실행 |
|---|---|---|
| 매주 데이터를 수집하는 주체 | 스크립트가 REST API 호출 | 클라우드 에이전트 세션이 MCP 도구 호출 |
| 주간 AI 크레딧 | 0 | 실행마다 크레딧 사용, 실행당 한도는 최소 30 크레딧 |
| 저장소 유형 | 공개 또는 비공개 | 비공개 또는 내부 저장소만 |
| 요금제 | 1회 구축용으로 클라우드 에이전트를 쓸 수 있는 플랜 | Pro, Pro+, Max, Business 또는 Enterprise |
| 출력 형식 | 매주 같은 코드, 같은 형식 | 실행마다 모델이 리포트를 새로 작성 |
| 적합한 용도 | 주별로 비교하는 고정 형식 리포트 | 매주 판단이 필요한 작업 |
30크레딧은 자동화를 만들 때 설정할 수 있는 실행당 최소 한도입니다(자동화 만들기 문서). AI 크레딧 1개는 $0.01입니다(개인용 사용량 기반 과금). 문서에는 일반적인 실행 1회에 크레딧이 얼마나 쓰이는지 나와 있지 않으므로 추측하지 않습니다. 확실히 말할 수 있는 사실은 하나입니다. Actions 스크립트 방식은 매주 AI 크레딧을 전혀 쓰지 않습니다. 두 방식을 섞을 수도 있습니다. 스크립트가 매주 수치를 만들고, 가끔 Copilot에 4주 치 리포트를 읽고 짧은 분석을 쓰게 하는 식입니다.
그래도 매주 Copilot을 실행하고 싶다면 자동화를 사용하세요. 자동화는 저장소 MCP 설정의 도구를 사용할 수 있으므로 이 글의 JSON을 그대로 쓸 수 있습니다. 트리거와 과금 규칙은 Copilot 자동화 문서에 있습니다. 자동화를 켜기 전에 실행당, 주당 AI 크레딧 한도를 설정하세요.
10월 28일 변경 내역에서 달라진 점
많은 사람이 2026년 10월 28일 변경 내역 게시물을 읽고 “github copilot mcp”를 검색합니다. 게시물 제목은 “Connect your tools to Copilot without all the setup”입니다. 이 게시물은 GitHub 인증 MCP 서버, 즉 커넥터를 퍼블릭 프리뷰로 발표합니다. 서비스를 선택하고 로그인한 뒤 접근을 승인하면, 커넥터가 Copilot 앱, Copilot CLI, VS Code, 클라우드의 Copilot, GitHub Mobile에서 작동합니다(변경 내역 게시물). 출시 시점에는 Slack, Figma, Notion, Sentry, Linear, Atlassian Rovo, Cloudflare, Vercel, Work IQ 등 26개 서비스가 제공됩니다.
이 게시물은 플랜도 다룹니다. 모든 Copilot 플랜에 순차 적용되며, Copilot Business와 Enterprise에서는 관리자가 “Editor preview features” 정책을 켜야 합니다. 엔터프라이즈에서 MCP 허용 목록을 사용한다면 관리자가 이 서비스들을 허용 목록에도 추가해야 합니다. 출시 관련 사용자 질문은 커뮤니티 스레드에 모여 있습니다(GitHub Community 토론 211002).
이번 출시는 저희 리포트와 세 가지 면에서 관련이 있습니다. 첫째, EveryInfra는 커넥터 26개에 포함되지 않으며, GitHub가 저희 서버를 인증하지도 않았습니다. 저희 데이터를 쓰려면 저장소 MCP 구성이나 개인 MCP 구성에 직접 추가해야 합니다. 두 방법 모두 직접 작성하는 짧은 JSON 블록을 사용합니다.
둘째, 커넥터 문서에 따르면 커넥터는 로컬 세션과 클라우드 샌드박스 세션에서 작동하지만, GitHub Actions에서 실행되는 세션에서는 아직 작동하지 않습니다(Copilot 커넥터 문서). 이슈를 Copilot에 할당할 때 시작되는 세션이 그 예입니다. 저장소 MCP 페이지 상단에도 같은 안내가 있습니다(저장소 MCP 구성 문서).

셋째는 제품 이름입니다. 아직 많은 사람이 “Copilot coding agent”라고 부르지만, docs.github.com에서는 같은 기능의 이름이 이제 “Copilot cloud agent”입니다(클라우드 에이전트 소개). 예전 코딩 에이전트 MCP 링크는 새 페이지로 연결됩니다. 이 글에서 두 이름은 같은 기능을 가리킵니다.
| 연결 방식 | 설정 주체 | EveryInfra 사용 가능 여부 | 세션 유형 | 문서상 참고 사항 |
|---|---|---|---|---|
| GitHub 인증 커넥터 | 사용자가 로그인 | 불가, 26개에 미포함 | 로컬 및 클라우드 샌드박스, Actions는 아직 미지원 | 퍼블릭 프리뷰, 모든 플랜 |
| 저장소 MCP 구성 | 저장소 관리자가 JSON 붙여넣기 | 가능, type: http와 헤더 사용 | 클라우드 에이전트(자동화 포함) 및 코드 리뷰 | 도구만 지원, OAuth 원격 서버 미지원 |
| 개인 MCP 구성 | 각 사용자 | 예 | 클라우드 샌드박스 세션 | Actions 세션에서는 사용 불가 |
| 내 컴퓨터의 Copilot CLI 또는 VS Code | 각 개발자 | 예 | 로컬 세션 | 저장소 설정과 별개 |
Copilot 코딩 에이전트 MCP 설정: 저장소 설정에 넣는 JSON
저장소 MCP 구성은 저장소 페이지의 Settings > Copilot > MCP servers에서 추가합니다. 형식은 mcpServers 객체 하나이며, 각 키가 서버 이름입니다. 모든 서버에는 type 키와 tools 키가 있어야 합니다. 원격 서버에는 url도 필요하고, 인증이 필요한 서버는 headers를 사용합니다. 헤더 값에서는 이름이 COPILOT_MCP_로 시작하는 시크릿을 $COPILOT_MCP_API_KEY 또는 ${COPILOT_MCP_API_KEY} 형식으로 참조할 수 있습니다(저장소 MCP 구성 문서).
문서에서는 tools에 읽기 전용 도구만 구체적으로 나열할 것을 강력히 권장합니다. 에이전트가 사용자에게 묻지 않고 도구를 직접 호출하기 때문입니다. EveryInfra 원격 MCP 엔드포인트는 https://api.everyinfra.com/mcp입니다. OAuth가 아닌 Bearer 키를 사용하므로 문서에서 지원하는 방식에 해당합니다. 다음은 저희의 구성 예시입니다.
{
"mcpServers": {
"everyinfra": {
"type": "http",
"url": "https://api.everyinfra.com/mcp",
"headers": {
"Authorization": "Bearer ${COPILOT_MCP_EVERYINFRA_API_KEY}"
},
"tools": [
"everyinfra_list_capabilities",
"everyinfra_call_api",
"everyinfra_get_job"
]
}
}
}왜 도구를 3개만 지정할까요? 00:16(SGT)에 키 없이 tools/list를 보냈고, 00:26(SGT)에 키를 넣어 다시 보냈습니다. 두 응답 모두 크기가 16,247바이트였고 도구 12개를 나열했습니다.
리포트에 필요한 도구는 그중 3개입니다. 카탈로그를 읽는 도구, 호출을 실행하는 도구, 비동기 작업을 읽는 도구입니다. 나머지 9개는 잔액 조회, 충전 링크 생성, 지원 티켓 생성, CAPTCHA 해결용 도구로, 리포트에는 도움이 되지 않습니다. 허용 목록에 넣으면 에이전트가 잘못 작동할 여지만 늘어납니다.
12개 도구 모두에 MCP annotations가 있습니다. 실제 응답을 보면 문서에는 나오지 않는 세부 사항이 하나 드러납니다. everyinfra_call_api는 비용이 발생할 수 있으므로 readOnlyHint: false, destructiveHint: true로 설정되어 있습니다. GitHub 문서에 따르면 Copilot 코드 리뷰는 tools/list에서 annotations.readOnlyHint가 true로 설정된 도구만 사용합니다. 이 애너테이션이 없는 도구와 값이 false인 도구는 코드 리뷰에서 건너뜁니다. 따라서 같은 저장소 구성에서도 클라우드 에이전트는 EveryInfra 데이터 도구를 호출할 수 있지만 Copilot 코드 리뷰는 호출할 수 없습니다.
이 리포트에서는 바람직한 결과입니다. 코드 리뷰가 데이터에 비용을 써서는 안 되기 때문입니다. 코드 리뷰에서 모든 MCP 도구를 건너뛰게 하려면 문서에 안내된 별도 설정을 사용하면 됩니다. 애너테이션 필드는 MCP 사양의 도구 섹션에 설명되어 있습니다(MCP specification, tools).
| 도구 | readOnlyHint | 비용 발생 | 리포트 허용 목록에 포함 |
|---|---|---|---|
everyinfra_list_capabilities | true | 아니요 | 예: 기능, 파라미터, 가격 조회 |
everyinfra_call_api | false | 카탈로그 가격, 실패 및 빈 결과는 환불 | 예: 테스트 호출 |
everyinfra_get_job | true | 아니요 | 예: 비동기 작업 결과 조회 |
everyinfra_list_requests | true | 아니요 | 선택: 건별 과금 확인 |
everyinfra_get_account | true | 아니요 | 아니요 |
everyinfra_search | false | 예 | 아니요. 리포트는 웹을 검색하지 않음 |
| 그 외 도구 6개(채팅, CAPTCHA, 충전 링크, 티켓) | 도구마다 다름 | 도구마다 다름 | 아니요 |
설정에 영향을 주는 제한이 두 가지 더 있습니다. 클라우드 에이전트와 코드 리뷰는 MCP 도구만 지원하며, 서버의 리소스나 프롬프트는 지원하지 않습니다. 이 리포트는 도구만 사용하므로 여기서는 이 제한이 문제 되지 않습니다.
두 번째 제한은 설정을 확인하는 방법과 관련이 있습니다. 이슈를 Copilot에 할당하고 세션 로그를 연 다음 "Start MCP Servers" 단계를 찾으세요. 이 단계의 끝부분에 시작된 도구 목록이 나옵니다.
한 Reddit 사용자는 코딩 에이전트에 Atlassian MCP 서버를 설정했는데, 연결은 성공했지만 "retrieved 0 tools"라는 메시지가 표시되었습니다(r/GithubCopilot thread). 같은 메시지가 보이면 먼저 tools에 적은 각 이름을 tools/list에서 받은 이름과 비교하세요. 이름이 정확히 일치해야 합니다.
시크릿은 어디에 둘까: 키 두 개, 서랍 두 개
대부분의 설정이 이 단계에서 잘못됩니다. 이제 GitHub에는 클라우드 에이전트 전용 시크릿 유형인 Agents 시크릿이 따로 있으며, Actions, Codespaces, Dependabot 시크릿과 나란히 있습니다. 문서에 따르면 클라우드 에이전트는 Actions, Codespaces, Dependabot의 시크릿과 변수를 읽을 수 없고 Agents 유형만 읽습니다.
이름이 COPILOT_MCP_로 시작하는 Agents 시크릿은 MCP 서버에만 전달되며, 에이전트가 실행하는 명령의 환경 변수가 되지 않습니다(secrets and variables for the cloud agent). 예약 워크플로는 Actions 시크릿을 사용하며 Agents 시크릿을 읽을 수 없습니다. 그래서 이 리포트에는 키가 두 개 필요합니다.

| 키 | 저장 위치 | 이름 | 읽을 수 있는 대상 | 동작 |
|---|---|---|---|---|
| 첫 번째 키 | Settings, Secrets and variables, Agents | COPILOT_MCP_EVERYINFRA_API_KEY | 이 키를 참조하는 MCP 서버만 | 에이전트가 코드를 작성하는 동안의 테스트 호출 |
| 두 번째 키 | Settings, Secrets and variables, Actions | EVERYINFRA_API_KEY | 예약 워크플로의 단계 | 주간 데이터 호출 |
| 절대 금지 | 코드, 이슈 본문, 자동화 프롬프트 | 없음 | 저장소를 볼 수 있는 모든 사람 | 없음 |
같은 문서에는 규칙이 세 가지 더 있습니다. 시크릿 이름은 GITHUB_로 시작할 수 없습니다. Agents 유형에는 시크릿과 변수가 모두 있지만, 클라우드 샌드박스에서 에이전트는 변수는 받지 못하고 시크릿만 받습니다. COPILOT_MCP_ 접두사가 없는 Agents 시크릿은 에이전트가 실행하는 명령과 도구의 환경 변수가 됩니다.
따라서 에이전트가 네트워크에 접근해 스크립트를 실행하게 할 생각이 아니라면 접두사 없는 EveryInfra 키를 추가하지 마세요. 조직 수준 Agents 시크릿은 여러 저장소에서 함께 쓸 수 있습니다. 여러 저장소에서 경쟁사를 추적하는 팀에 적합한 방식입니다.
두 작업에 이름이 같은 키 하나를 쓰면 되지 않을까요? 그렇게 하지 않는 이유는 세 가지입니다. 첫째, GitHub가 두 서랍을 분리해 두므로 이름을 같게 해도 소용이 없습니다. 둘째, 이름이 명확한 EveryInfra 키 두 개를 쓰면 요청 로그를 읽기 쉽습니다. 키 하나가 유출되거나 비용을 너무 많이 쓰면 어느 키인지 바로 알 수 있습니다.
셋째, GitHub 푸시 보호는 기본적으로 알려진 키 형식만 차단하며, EveryInfra 키는 여기에 포함되지 않습니다(push protection changelog). 에이전트가 테스트 파일에 키를 써 넣어도 푸시가 막히지 않을 수 있습니다. 따라서 키는 환경 변수에서만 가져온다고 이슈에 명시하세요.
방화벽에도 함정이 하나 더 있습니다. 기본적으로 방화벽이 클라우드 에이전트의 네트워크를 제한합니다. 문서에 따르면 방화벽은 에이전트가 Bash 도구로 시작한 프로세스에 적용되며, MCP 서버 프로세스에는 적용되지 않습니다(firewall docs, limitations).
따라서 EveryInfra에 대한 MCP 호출은 정상적으로 동작합니다. 하지만 에이전트가 세션에서 새로 만든 weekly_report.py를 실행하려 할 수 있습니다. 그러면 api.everyinfra.com으로 가는 요청이 방화벽에 막히고, 풀 리퀘스트 본문에 경고가 표시됩니다.
선택지는 두 가지입니다. 첫째, Internet access의 사용자 지정 허용 목록에 api.everyinfra.com을 추가하고, 에이전트 명령용으로 COPILOT_MCP_ 접두사가 없는 세 번째 키를 추가하는 방법이 있습니다. 둘째, 에이전트에게 실제 MCP 응답 하나를 픽스처로 저장하게 하는 방법이 있습니다. 이 경우 테스트는 네트워크를 쓰지 않고 픽스처를 읽습니다.
두 번째 방법을 권장합니다. 첫 번째 방법은 에이전트의 명령 환경에 키를 넣게 됩니다. 문서에는 로그에서 시크릿 값이 마스킹된다고 되어 있지만, 굳이 그 문을 열 필요는 없습니다.
에이전트에게 맡길 이슈는 어떻게 작성할까
GitHub 모범 사례 페이지에 따르면 Copilot에 맡기는 작업에는 문제, 인수 조건, 변경할 파일을 명시해야 하며, 작고 명확한 작업일수록 결과가 좋습니다(best practices for Copilot tasks). 이 리포트에서 가장 중요한 부분은 핸들 목록과 테스트 예시입니다. 에이전트가 핸들을 추측하게 두지 마세요.
테스트에서 추측한 핸들 3개는 빈 목록을 반환했습니다. 오류도 과금도 없었고, 리포트에서 행 하나가 소리 없이 빠졌습니다. 이슈 예시는 다음과 같습니다.
## Task
Write weekly_report.py and .github/workflows/weekly-report.yml.
Every Monday at 09:00 Asia/Singapore, read config/competitors.yml.
For each brand, collect posts from last Monday 00:00 to Sunday 23:59 UTC.
Write reports/<ISO year>-W<week>.md and commit it to main.
## Data (check parameters with everyinfra_list_capabilities, then make one test call each)
- YouTube: youtube/user_posts, param url (channel link), since=last Monday, mode=async
- TikTok: tiktok/user_videos, param username, limit=30
- Instagram: instagram/user_posts, param username, limit=30, mode=async
- LinkedIn: linkedin/company_posts, param company (the part after /company/), limit=20
## Handles (do not change, do not guess; LinkedIn names are not checked yet)
notion: youtube https://www.youtube.com/@Notion | tiktok notionhq | instagram notionhq | linkedin notionhq
clickup: youtube https://www.youtube.com/@ClickUpProductivity | tiktok clickup | instagram clickup | linkedin clickup-app
asana: youtube https://www.youtube.com/channel/UC2BoogM0AqwOJyoSp1S4ClQ | tiktok asana | instagram asana | linkedin asana
## Must handle
1. TikTok: drop is_pinned=true rows, then filter by posted_at. Do not stop at the first old row.
2. YouTube posted_at can be relative text such as "1d ago". Convert it from the fetch time.
3. HTTP 503 or status=failed: wait retry_after, retry once, then write "not collected this week".
4. Zero rows: write "0 this week" and list the handle at the end of the report for a manual check.
5. Read the key only from the EVERYINFRA_API_KEY environment variable. Never write it to a file.
6. Tests read JSON fixtures in tests/fixtures/ (real MCP responses). Tests use no network.
## Test example
With the fixtures, ClickUp TikTok this week = 4 posts (not 0, not 7), total views = 60463.이 이슈에서 가장 중요한 것은 마지막 줄입니다. 기댓값은 SGT 기준 00:19에 ClickUp을 대상으로 받은 실제 tiktok/user_videos 응답에서 가져왔습니다. 10개 행 중 처음 3개는 2024년에 올라온 고정 동영상으로, 조회수가 각각 20.1M, 7.5M, 3.2M회였습니다. 목록은 최신순으로 정렬되지만 고정 동영상은 항상 맨 앞에 옵니다.
이 순서 때문에 세 가지 오답이 나옵니다. 첫 행을 최신 게시물로 간주하는 스크립트는 ClickUp이 TikTok에 마지막으로 게시한 시점을 2024년으로 판단합니다. 최신순으로 읽다가 기간보다 오래된 첫 행에서 멈추는 스크립트는 게시물을 0개로 셉니다. 고정 행은 제외하지만 날짜로 필터링하지 않는 스크립트는 7개로 셉니다.
정답은 4개입니다. 이 숫자가 이슈에 있으면 테스트를 한 번만 실행해도 코드가 맞는지 알 수 있습니다. 코드를 한 줄씩 읽을 필요가 없습니다.
한 번의 실제 요청·응답: Copilot이 보내는 내용과 서버가 반환하는 내용
Copilot을 직접 실행하지는 않았습니다. 하지만 MCP는 개방형 프로토콜입니다. 에이전트가 도구를 호출하면 Streamable HTTP 전송 방식으로 표준 JSON-RPC tools/call 요청 하나를 보냅니다. 각 메시지는 HTTP POST 요청 하나입니다.
클라이언트는 application/json과 text/event-stream을 모두 수락해야 합니다(MCP specification, transports). 따라서 curl로 에이전트와 같은 요청을 보내 서버가 무엇을 반환하는지 확인할 수 있습니다. 2026년 11월 6일 SGT 00:26:28에 다음 요청을 보냈습니다.
curl -s https://api.everyinfra.com/mcp \
-H "Authorization: Bearer $EVERYINFRA_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"everyinfra_call_api",
"arguments":{"platform":"tiktok","action":"user_videos",
"params":{"username":"notionhq","limit":5}}}}'서버는 31.1초 후 HTTP 200을 반환했습니다. result.content[0].text 필드에는 13,272자 길이의 JSON 문자열이 담겨 있었습니다. 여기에는 Notion의 TikTok 동영상 5개가 들어 있었고, 각 동영상에는 posted_at, view_count, like_count, is_pinned 등이 포함되어 있었습니다. 가장 최근 동영상은 2026년 5월 26일에 게시되었고 조회수는 22,800회였습니다.
끝부분의 billing에는 charged: true와 charged_usd: 0.000556이 표시되었습니다. 에이전트는 코드를 작성하기 전에 같은 데이터를 봅니다. 이를 통해 필드 이름과 ISO 날짜 형식을 파악하고, 이 계정이 5개월 넘게 TikTok에 게시하지 않았다는 사실도 알게 됩니다.

| 응답 필드 | 가장 최근 Notion 동영상의 값 | 스크립트가 알게 되는 점 |
|---|---|---|
posted_at | 2026-05-26T22:35:01+00:00 | TikTok 날짜는 UTC 기준 ISO 문자열 |
is_pinned | false | 고정 행이 있으므로 필터 필요 |
view_count | 22800 | 조회수는 일반 정수 |
billing.charged_usd | 0.000556 | 호출마다 과금액 표시 |
실제 호출 26회로 리포트를 먼저 직접 돌려 봤다
에이전트에게 스크립트 작성을 맡기기 전에 정답을 알고 있어야 합니다. 그래서 2026년 11월 6일 SGT 00:17부터 00:38까지 리포트를 먼저 직접 실행했습니다. 기간은 10월 30일부터 11월 5일까지 UTC 기준 7일입니다. 각 기능과 파라미터는 무료 카탈로그인 GET /api/v1/social/catalog에서 확인했습니다. 사용한 기능은 youtube/user_posts(필수 url, 선택 since, sort), tiktok/user_videos(필수 username), instagram/user_posts(필수 username, 카탈로그상 비동기), linkedin/company_posts(필수 company) 4개입니다. 각 기능 페이지는 YouTube 사용자 게시물, TikTok 사용자 동영상, Instagram 사용자 게시물, LinkedIn 회사 게시물입니다.
| 브랜드 | 이번 주 YouTube | 이번 주 TikTok | 이번 주 Instagram | 합계 | 최신 TikTok | |
|---|---|---|---|---|---|---|
| Notion | 1 | 0 | 1 | 503, 수집 안 됨 | 2 | 2026-05-26 |
| ClickUp | 3 | 4 | 7 | 503, 수집 안 됨 | 14 | 2026-11-05 |
| Asana | 0 | 0 | 3 | 503, 수집 안 됨 | 3 | 2026-06-04 |
이 표는 주간 리포트의 핵심이며, 세 가지를 보여 줍니다. 첫째, 세 브랜드의 게시 빈도는 크게 다릅니다. ClickUp은 1주일 동안 3개 플랫폼에 14개 항목을 게시했습니다. Instagram에서는 최근 게시물 10개 중 7개가 이번 주에 올라왔습니다. TikTok에는 4개, YouTube에는 3개를 게시했습니다.
둘째, Notion과 Asana는 TikTok 게시를 거의 중단했습니다. 두 브랜드의 가장 최근 TikTok 동영상은 각각 2026년 5월 26일과 2026년 6월 4일에 올라왔습니다. Asana는 최근 동영상 10개 중 7개가 6월의 그 하루에 올라왔고, 나머지 3개는 2025년과 2023년 게시물입니다. "이번 주 0개"인 행은 유용한 신호입니다. 하지만 핸들이 정확하다는 것을 알 때만 유용합니다. 잘못된 핸들도 0을 반환하기 때문입니다.
셋째, 이번 주 세 브랜드가 모두 게시한 플랫폼은 Instagram뿐입니다. 플랫폼 하나만 지켜볼 수 있다면 이 표를 근거로 Instagram을 선택할 수 있습니다.
이 결과에는 한계가 있습니다. 기간은 1주일이고 표본은 브랜드 3곳입니다. TikTok과 Instagram은 각각 10개 행을 요청했습니다. ClickUp Instagram의 경우 10개 행이 9일 치에 해당했습니다.
SaaS 팀이라면 보통 이 정도로 충분합니다. 소비자 브랜드는 다릅니다. limit 값은 각 계정의 게시 빈도에 맞춰야 하며, limit을 높여도 추가 비용은 들지 않습니다. 이 기능들은 행 단위가 아니라 호출 단위로 과금하기 때문입니다.
이번 주 데이터로 만든 리포트 샘플
개수만으로는 부족합니다. 마케팅팀은 어떤 게시물의 성과가 가장 좋았고 무엇에 관한 내용이었는지도 알고 싶어 합니다. 아래 표는 실제 응답을 바탕으로 직접 만든 리포트 샘플입니다. 에이전트가 만들어야 할 형식으로 이슈에 붙여 넣어도 됩니다.
브랜드와 플랫폼별 상위 게시물을 보여 줍니다. TikTok 행은 고정 동영상을 제외했습니다. Instagram 행은 좋아요 수, YouTube 행은 조회수 기준으로 정렬했습니다. YouTube 날짜는 수집 시점에 "1d ago", "5d ago"를 변환한 값이므로 일 단위까지만 정확합니다.
| 브랜드 | 플랫폼 | 이번 주 상위 게시물 | 날짜(UTC) | 조회 결과 | 좋아요 |
|---|---|---|---|---|---|
| ClickUp | TikTok | 번역 과정에서 사라진 단어를 다룬 사무실 코미디 스킷 | 2026-11-04 | 27,400 | 1,175 |
| ClickUp | 제품팀을 위한 새 굿즈, 피드백 요청 | 2026-10-30 | n/a | 73 | |
| ClickUp | YouTube | ClickUp Brain으로 작업 50개를 한 번에 업데이트 | 2026-11-04경 | 388 | n/a |
| Notion | YouTube | ChatGPT나 Claude를 Notion에 연결하기 | 2026-11-04경 | 3,400 | n/a |
| Notion | 캠퍼스 리더 소개 | 2026-11-04 | n/a | 143 | |
| Asana | 고객 통화 후 후속 조치는 누가 할까 | 2026-10-30 | n/a | 43 |
이 샘플은 개수로는 드러나지 않는 두 가지를 보여 줍니다. 첫째, ClickUp은 TikTok에서 사무실 유머를 활용합니다. 이번 주 게시물 4개(2026-11-05, 2026-11-04, 2026-11-02, 2026-10-30)의 조회수 합계는 60,463회, 좋아요 합계는 3,392개였습니다. 상위 게시물의 조회수는 27,400회였습니다.
기간 시작 하루 전인 10월 29일에 올라온 게시물은 조회수가 145,200회였습니다. 이 계정은 대략 1주일에 한 번 크게 흥행하는 게시물이 나오는 것으로 보입니다. 리포트가 "실행 시점부터 최근 7일" 같은 이동 기간을 사용하면 이런 흥행 게시물이 리포트에 들어갔다 빠졌다 할 수 있습니다.
둘째, 세 브랜드 모두 요즘 AI를 이야기합니다. 이번 주 Notion의 유일한 YouTube 동영상은 ChatGPT나 Claude를 Notion에 연결하는 방법을 보여 줍니다. ClickUp의 YouTube 동영상 3개는 모두 AI에 관한 내용입니다. 10월 30일 Instagram에 올라온 ClickUp 주간 요약에서는 새로 출시한 Salesforce MCP를 언급했습니다. 기간 시작 이틀 전인 10월 28일에는 Asana가 Instagram에서 AI 어시스턴트 Dash를 홍보했습니다. 협업 소프트웨어를 판매한다면 게시물 수보다 "무엇을 이야기했는지" 열이 더 유용할 수 있습니다.
좋아요를 비교하려면 기준도 알아야 합니다. ClickUp Instagram은 게시물 7개에 좋아요 합계 273개였고, 게시물당 1~73개였습니다. Asana는 게시물 3개에 좋아요 82개였습니다. Notion은 게시물 1개에 좋아요 143개로, ClickUp의 어떤 단일 게시물보다도 많았습니다.
게시물 수로 보면 Instagram에서 ClickUp이 앞서지만, 게시물당 좋아요로 보면 Notion이 앞섭니다. 그래서 리포트에 게시물 수, 총 참여도, 게시물당 참여도 중앙값의 세 열을 두고, 상위 게시물을 위한 네 번째 열을 추가할 것을 권장합니다. 스크립트는 응답에 이미 있는 필드만으로 네 열을 모두 계산할 수 있으므로 추가 호출도 추가 비용도 없습니다.
| 브랜드 및 플랫폼 | 이번 주 게시물 | 총 좋아요 | 게시물당 좋아요 중앙값 | 최다 좋아요 게시물의 좋아요 수 |
|---|---|---|---|---|
| ClickUp Instagram | 7 | 273 | 41 | 73 |
| Asana Instagram | 3 | 82 | 22 | 43 |
| Notion Instagram | 1 | 143 | 143 | 143 |
| ClickUp TikTok(고정 게시물 제외) | 4 | 3,392 | 767.5 | 1,776 |
실제 호출에서 드러난 함정 6가지와 스크립트의 대응 방식
실제 호출 26건 중 절반은 과금되지 않았습니다. 이를 유형별로 분류했습니다. 13건은 과금되었습니다. 5건은 빈 결과를 반환해 환불되었습니다. 이 중 4건은 핸들을 잘못 추측한 경우였습니다. 나머지 1건은 올바른 Asana 채널을 사용했지만 그 주에 새 동영상이 없었습니다.
7건은 503을 반환했습니다. LinkedIn 회사 게시물 호출 6건과 타임아웃된 YouTube 동기 호출 1건입니다. 1건은 잘못된 파라미터로 미리 계획한 422 테스트였습니다. 실패한 호출에는 비용이 전혀 청구되지 않았습니다. 총 과금액은 $0.007228로, 정확히 13 × $0.000556입니다.
스크립트에는 실패 유형별 처리 로직이 있습니다. 이슈의 "반드시 처리할 항목" 목록은 이 표에서 나왔습니다:
| 함정 | 근거(SGT) | 스크립트 처리 방식 |
|---|---|---|
| 잘못된 핸들은 빈 목록을 반환 | 00:18 YouTube @ClickUp이 0행을 반환하고 환불됨. 실제 채널은 @ClickUpProductivity이며, 00:28에 3행을 반환 | 확인된 핸들은 설정 파일에 보관하고, 0행 핸들은 수동 확인 목록에 추가 |
| 85초를 넘는 동기 호출은 503 반환 | 00:21 YouTube @asana가 89.8초 대기 후 503 타임아웃, 과금 없음 | YouTube와 Instagram에는 mode: async를 사용하고 job_id로 폴링 |
| 고정된 TikTok 동영상이 먼저 나옴 | 00:19 ClickUp의 처음 3행이 고정된 2024년 동영상 | is_pinned=true를 제외한 뒤 posted_at으로 필터링 |
| YouTube 날짜는 상대 시간 텍스트 | 00:17 최신 Notion 동영상의 posted_at이 "1d ago" | 수집 시각을 기준으로 변환하고 변환 규칙을 리포트에 명시 |
| 기능이 일시적으로 사용 불가 | 00:18~00:38 LinkedIn company_posts가 503을 6회 반환 | 1회 재시도 후 "이번 주 미수집"으로 기록하고 계속 진행 |
| 잘못된 파라미터 이름 | 00:27 url 대신 channel을 사용해 422 반환 | 오류 메시지를 로그로 남기고, 422는 재시도하지 않음 |
두 번째 함정은 좀 더 자세히 살펴볼 필요가 있습니다. 데이터를 반환했거나 타임아웃된 동기 호출 8건에 대해 첫 응답까지 걸린 시간을 측정했습니다. LinkedIn 503 호출 6건은 2.2~2.4초, 422 호출은 0.2초 만에 응답이 돌아와 차트에서 제외했습니다. TikTok 호출 3건은 각각 22.2초, 68.9초, 21.6초, MCP 호출은 31.1초가 걸렸습니다. 올바른 핸들을 사용한 YouTube 호출은 11.5초가 걸렸습니다.
잘못된 핸들을 사용한 YouTube 호출은 빈 목록을 반환하는 데 40.3초가 걸렸고, 다른 호출 하나는 89.8초 후 503을 반환했습니다. 오류 메시지에 따르면 동기 호출은 최대 85초까지 대기합니다. ClickUp TikTok 호출은 68.9초가 걸려 이 한도보다 겨우 16초 짧았습니다.
Actions에서는 대기 시간이 조금 늘어나는 것은 문제가 되지 않습니다. 하지만 타임아웃이 나면 호출을 다시 보내야 합니다. 따라서 카탈로그에서 허용하는 경우 비동기 모드를 사용하세요. 제출 호출은 즉시 job_id를 반환합니다. 이후 스크립트는 몇 초마다 GET /api/v1/jobs/{job_id}를 조회하며, 작업 조회에는 비용이 들지 않습니다.
다섯 번째 함정은 LinkedIn입니다. SGT 기준 00:18부터 00:38까지 linkedin/company_posts는 Notion, ClickUp, Asana, 그리고 오류 메시지에 나온 샘플 회사인 google에 대해 503을 6회 반환했습니다. 오류 코드는 unavailable이었고, 모든 응답의 billing.charged_usd는 0이었습니다. 세 번째 실패 후 next_steps에는 10분 동안 호출 3건이 과금 없이 실패했다는 내용이 담겨 있었습니다. 샘플 요청으로 한 번 호출해 보라는 제안도 있었습니다. 샘플마저 실패하면 문제는 저희 쪽에 있으며, 티켓을 열기 전에 사용자에게 먼저 확인하라고 안내했습니다.
같은 시간에 linkedin/company_profile은 정상 동작했습니다. SGT 00:34에 Notion 회사 페이지를 6.2초 만에 읽었고 $0.000556이 과금되었습니다. 응답에는 팔로워 1,137,647명, 직원 7,211명이 담겨 있었습니다. 게시물 수집이 실패하는 주에도 LinkedIn 열에는 팔로워 변화를 표시할 수 있습니다.
그날 밤에도 카탈로그에는 회사 게시물 기능이 사용 가능으로 표시되어 있었습니다. 따라서 스크립트는 카탈로그만 믿어서는 안 되며 503을 처리해야 합니다. 열 하나를 조용히 빠뜨린 리포트보다 "이번 주 LinkedIn 미수집"이라고 밝히는 리포트가 낫습니다. 실패한 호출의 환불 방식과 확인 방법은 실패 환불 대조 가이드를 참고하세요.
스크립트 구성: 에이전트가 반환해야 할 워크플로
에이전트가 보내는 풀 리퀘스트에는 최소 두 개의 파일이 있어야 합니다. 아래는 워크플로 설정 예시입니다. 핵심 규칙은 GitHub Actions 문서에서 가져왔습니다. schedule은 기본적으로 UTC를 사용하며, 이제 IANA 이름으로 timezone을 지정할 수 있습니다. 최소 간격은 5분입니다. 매시 정각에는 예약 실행이 지연될 수 있습니다.
부하가 높을 때는 대기열에 있던 실행 일부가 누락될 수 있습니다. 그래서 문서에서는 정각이 아닌 시각을 권장합니다. 예약 실행은 기본 브랜치에서만 동작합니다. 공개 저장소에서는 60일 동안 활동이 없으면 예약 워크플로가 비활성화됩니다(events that trigger workflows, schedule). cron의 다섯 필드는 POSIX crontab specification을 따릅니다.
name: weekly-competitor-social-report
on:
schedule:
- cron: "17 9 * * 1" # Monday 09:17, not on the hour
timezone: "Asia/Singapore"
workflow_dispatch: {}
permissions:
contents: write
concurrency: weekly-report
jobs:
report:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Build report
env:
EVERYINFRA_API_KEY: ${{ secrets.EVERYINFRA_API_KEY }}
run: python weekly_report.py --config config/competitors.yml --out reports/
- name: Commit report
run: |
git config user.name "weekly-report-bot"
git config user.email "weekly-report-bot @users.noreply.github.com"
git add reports/
git commit -m "weekly social report" || echo "nothing to commit"
git push스크립트에는 핵심 함수 하나가 필요합니다. 이 함수는 요청을 보냅니다. 상태가 running이면 job_id로 폴링합니다. 503을 받으면 retry_after만큼 기다린 뒤 한 번 더 시도합니다.
그런 다음 행 또는 "미수집" 마커를 반환합니다. 아래는 저희 테스트를 바탕으로 한 뼈대 코드입니다. 필드 이름이 카탈로그의 response_fields와 일치하므로 이슈에 참고 자료로 그대로 붙여 넣을 수 있습니다:
import os, time, json, urllib.request, urllib.error
API = "https://api.everyinfra.com"
KEY = os.environ["EVERYINFRA_API_KEY"] # read only from the environment
def call(platform, action, params, mode="sync"):
body = {"platform": platform, "action": action, "params": params}
if mode == "async":
body["mode"] = "async"
for attempt in (1, 2):
req = urllib.request.Request(API + "/api/v1/social", json.dumps(body).encode(),
{"Authorization": "Bearer " + KEY, "Content-Type": "application/json",
"User-Agent": "weekly-report/1.0"})
try:
data = json.load(urllib.request.urlopen(req, timeout=100))
except urllib.error.HTTPError as e:
err = json.load(e).get("error", {})
if e.code == 503 and attempt == 1:
time.sleep(err.get("retry_after", 60)); continue
return {"unavailable": True, "code": e.code, "reason": err.get("code")}
while data.get("status") in ("submitting", "running", "finalizing"):
time.sleep(8)
job = urllib.request.Request(f"{API}/api/v1/jobs/{data['job_id']}",
headers={"Authorization": "Bearer " + KEY, "User-Agent": "weekly-report/1.0"})
data = json.load(urllib.request.urlopen(job, timeout=60))
if data.get("status", "succeeded") != "succeeded": # job failed: mark it, never report it as 0 rows
return {"unavailable": True, "status": data.get("status"), "reason": data.get("error")}
if "results" not in data: # success without results: raise
raise RuntimeError(f"no results field: {platform}/{action}")
return {"rows": data["results"], "count": len(data["results"])}User-Agent 헤더를 확인하세요. 일부 사이트 보호 규칙은 Python의 기본 사용자 에이전트를 차단합니다. 식별 가능한 사용자 에이전트를 지정하면 Actions 로그에 나타나는 원인 모를 403 오류를 피할 수 있습니다. timeout=100 값은 서버 한도인 85초보다 약간 깁니다. 따라서 타임아웃이 발생하면 클라이언트 연결이 끊기는 대신 retry_after가 담긴 서버의 503을 받게 됩니다.
마지막 두 검사가 가장 중요합니다. 비동기 작업이 succeeded가 아닌 다른 status로 끝나면 함수는 unavailable 마커를 반환하고, 리포트에는 "이번 주 미수집"으로 표시됩니다. 작업이 성공했는데 results 필드가 없으면 함수가 오류를 발생시키고 Actions 단계가 빨간색으로 바뀝니다. 리포트에 "이번 주 게시물 0개"가 표시되는 것은 호출이 실제로 성공해 빈 목록을 받았을 때뿐입니다. 이 두 검사가 없으면 서비스 장애가 "경쟁사가 게시를 중단했다"로 둔갑하는데, 이는 주간 리포트가 저지를 수 있는 최악의 오류입니다.
풀 리퀘스트에서 확인할 5가지
에이전트가 풀 리퀘스트를 보내오면 Python 코드를 한 줄씩 다 읽을 필요는 없습니다. 다섯 가지만 확인하세요. 항목마다 몇 분이면 충분합니다. 첫째, secrets.EVERYINFRA_API_KEY는 데이터 단계의 env에만 나와야 합니다. echo로 출력하거나 파일에 쓰면 안 됩니다. GitHub는 로그에서 시크릿 값을 마스킹하지만, 파일에 커밋된 값은 마스킹하지 않습니다(using secrets in GitHub Actions).
둘째, tests/fixtures/의 샘플 JSON 파일을 열어 보세요. 이 파일들은 에이전트가 MCP 호출에서 저장한 실제 응답이어야 하고, 필드 이름이 이 글의 필드 표와 일치해야 합니다. 에이전트가 샘플을 직접 작성했다면 테스트는 자기 코드를 되풀이할 뿐입니다. 셋째, 테스트 예시가 실제 테스트인지 확인하세요. ClickUp TikTok의 이번 주 게시물은 4개, 조회수는 60463회입니다. 이 숫자는 실제 응답에서 나온 값이며 에이전트가 바꿀 수 없습니다. 코드는 이 값과 일치해야 합니다.
넷째, 실패 경로를 확인하세요. 503이면 한 번 기다린 뒤 재시도합니다. status: failed이면 "미수집"으로 기록합니다. 0행이면 해당 핸들을 "핸들 확인 필요" 목록에 추가합니다. 422는 재시도하지 않습니다.
경로가 하나라도 빠져 있으면 풀 리퀘스트를 반려하세요. 다섯째, 에이전트의 풀 리퀘스트에 대한 워크플로는 쓰기 권한이 있는 사람이 "Approve and run workflows"를 클릭해야만 실행됩니다. workflow_dispatch로 한 번 실행하고, Actions 로그에서 각 호출의 소요 시간과 과금액을 확인한 다음 병합하세요. EveryInfra 콘솔의 요청 로그와 각 과금액을 비교할 수도 있으며, 실패한 호출에는 과금이 표시되지 않습니다.
카탈로그 가격 기준 주간·월간 API 비용
비용은 EveryInfra API 요금과 GitHub 측 비용, 두 가지로 나뉩니다. 저희 요금은 카탈로그의 기능별 price_usd를 따릅니다. 이 기능들은 호출당 과금됩니다. 1행을 반환하는 호출과 30행을 반환하는 호출의 비용은 같습니다. 실패한 호출과 빈 결과에는 과금되지 않습니다. 가격은 EveryInfra 요금 페이지에서도 확인할 수 있습니다.
| 기능 | 카탈로그 호출당 가격 | 브랜드당 주간 호출 수 | 브랜드당 주간 |
|---|---|---|---|
youtube/user_posts | $0.000556 | 1 | $0.000556 |
tiktok/user_videos | $0.000556 | 1 | $0.000556 |
instagram/user_posts | $0.000556 | 1 | $0.000556 |
linkedin/company_posts | $0.002319 | 1 | $0.002319 |
| 합계 | n/a | 4 | $0.003987 |
브랜드 3개의 비용은 주당 $0.011961입니다. 52주를 12개월로 나누어 환산하면 월 약 $0.0518입니다. 목록을 늘려도 비용은 크지 않습니다. 브랜드 10개는 월 약 $0.1728, 30개는 약 $0.5183, 100개는 약 $1.7277입니다. 이번 주 실제 실행 비용은 이보다도 적었습니다.
YouTube는 Asana 호출이 빈 결과로 환불되어 2회 과금되었습니다. TikTok과 Instagram은 각각 3회 과금되었습니다. LinkedIn은 3회 실패했고 과금되지 않았습니다. 과금된 호출은 총 8건, $0.004448입니다.
GitHub 측 비용은 세 가지입니다. 두 가지는 명확하고, 세 번째는 범위만 제시할 수 있습니다. 첫 번째는 Actions 사용 시간(분)입니다. 표준 GitHub 호스팅 러너는 공개 저장소에서 무료입니다. 비공개 저장소에서는 요금제에 매월 포함된 컴퓨팅 사용량을 씁니다. GitHub Free에는 $12 상당, GitHub Pro와 Team에는 $18 상당의 컴퓨팅 사용량이 포함됩니다. 표준 Linux 러너는 분당 $0.006입니다(GitHub Actions billing).
측정한 시간 기준으로 호출 12건을 순차 실행하면 약 5분이 걸리며, 비공개 저장소에서는 주당 약 $0.03입니다. 스크립트가 모든 비동기 작업을 먼저 제출한 뒤 한꺼번에 폴링하면 실행 시간은 1~2분이면 됩니다. 두 번째 비용은 Copilot 요금제입니다. 예를 들어 Copilot Pro는 월 $10에 AI 크레딧 1,500, Pro+는 월 $39에 7,000입니다(Copilot plans).
세 번째 비용은 스크립트를 작성하는 세션 1회에 드는 AI 크레딧입니다. 이 값은 모델과 세션 길이에 따라 달라집니다. 문서에는 일반적인 값이 나와 있지 않고 저희는 Copilot을 실행하지 않았으므로 수치를 제시하지 않습니다. 실제 값은 Copilot 사용량 페이지에서 확인할 수 있습니다.
| 비용 | 금액 | 주기 | 출처 |
|---|---|---|---|
| EveryInfra API 요금, 브랜드 3개 | $0.011961 | 매주 | 카탈로그 price_usd |
| EveryInfra API 요금, 이번 주 실제 실행 | $0.004448 | 1회 | 실제 charged_usd |
| Actions 사용 시간, 비공개 저장소 | 약 $0.03 | 매주 | 분당 $0.006 × 약 5분(추정) |
| Actions 사용 시간, 공개 저장소 | $0 | 매주 | 공개 저장소에서는 표준 러너 무료 |
| 스크립트를 작성하는 Copilot 세션 | 측정하지 않음 | 1회 | 실제 사용된 AI 크레딧 |
| 대신 매주 Automations 실행 | 실행당 AI 크레딧 | 매주 | Automations 과금 문서 |
필드: 플랫폼마다 다른 반환 데이터
리포트는 네 플랫폼을 비교하는데, 가장 어려운 점은 필드가 서로 맞지 않는다는 것입니다. 카탈로그에는 기능별 response_fields가 나와 있습니다. 실제 응답을 하나하나 이와 대조한 결과, 리포트 열에 영향을 주는 차이 세 가지를 찾았습니다. 첫째, 그날 밤 Instagram user_posts는 5개 계정에서 받은 50행 어디에도 view_count가 없었습니다. 카탈로그 field_note에도 일부 Instagram 요청은 view_count, is_comments_disabled, author_follower_count, top_comments를 반환하지 않는다고 나와 있습니다. 이러한 요청은 최대 48개의 게시물을 반환합니다. 따라서 Instagram 열에서는 좋아요와 댓글은 비교할 수 있지만 조회수는 비교할 수 없습니다.
둘째, 카탈로그에는 YouTube user_posts의 필드가 25개로 나와 있습니다. 하지만 테스트에서 반환된 채널 목록에는 필드가 14개뿐이었습니다. view_count, title, duration은 있었습니다. like_count, comment_count, is_paid_partnership은 없었고, posted_at은 상대 시간 텍스트였습니다. 셋째, TikTok user_videos는 필드가 35개였습니다. 정보가 가장 많은 만큼 용량도 가장 많이 차지합니다.
| 리포트 열 | YouTube 필드 | TikTok 필드 | Instagram 필드 | LinkedIn 필드 |
|---|---|---|---|---|
| 게시 시간 | posted_at(상대 시간 텍스트) | posted_at(ISO) | posted_at(ISO) | posted_at |
| 조회수 | view_count | view_count | 일부 요청에서 누락 | 없음(reactions, share_count는 제공) |
| 좋아요 | 채널 목록에서는 반환되지 않음 | like_count | like_count | like_count |
| 댓글 | 채널 목록에서는 반환되지 않음 | comment_count | comment_count | comment_count |
| 고정 게시물 | 없음 | is_pinned | 없음 | 없음 |
| 광고 또는 파트너 게시물 | 카탈로그에는 is_paid_partnership으로 있으나 반환되지 않음 | is_ad, is_sponsored | 없음 | 없음 |
| 링크 | url | url | url | url |
이 표도 이슈에 함께 넣으세요. 어느 플랫폼에 조회수가 있는지 에이전트가 추측하게 두지 마세요. Instagram과 LinkedIn의 조회수 열은 "n/a"로 표시하고, 리포트는 참여도를 좋아요와 댓글의 합으로 비교한다고 알려 주세요. 에이전트는 실제 응답을 읽으면서 차이점 대부분을 찾아냅니다. 표가 이슈에 있으면 에이전트가 추측할 필요가 전혀 없습니다.
Claude Code·ChatGPT 글과 무엇이 다른가
블로그에는 이 글과 주제가 가까운 글이 4편 있습니다. TikTok 브랜드 계정을 위한 Claude Code 서브에이전트, 주간 수요 레이더로 쓰는 ChatGPT 예약 작업, Codex Cloud 앱 리뷰 주간 리포트, ChatGPT Spaces 경쟁사 소셜 트래커입니다. ChatGPT가 매주 직접 리포트를 실행하게 하려면 예약 작업 글을 읽어 보세요.
이 글의 가장 큰 차이는 AI가 코드를 작성할 때 한 번만 동작하고, 그 뒤로는 일반 스크립트가 매주 실행된다는 점입니다. 형식이 일정하고, 매주 드는 모델 비용이 없으며, 실패하면 Actions 로그로 원인을 명확히 확인할 수 있습니다. 대신 풀 리퀘스트를 한 번 리뷰해야 하고, 브랜드나 플랫폼을 추가할 때 설정을 바꿔야 합니다. 영상이 왜 잘됐는지처럼 리포트에 매주 의견이 필요하다면 ChatGPT 방식이 더 잘 맞습니다. 스크립트로 수치를 만든 뒤 한 달 치 리포트를 Copilot에게 읽혀 분석을 작성하게 할 수도 있습니다.
각 플랫폼의 자체 API를 쓰지 않는 이유는?
플랫폼마다 개발자 API가 있는데 왜 EveryInfra가 필요한지 궁금할 수 있습니다. 대부분의 플랫폼 API로는 다른 회사의 공개 콘텐츠를 읽기가 쉽지 않기 때문입니다. 아래 표의 각 행은 해당 플랫폼의 개발자 문서를 근거로 합니다.
| 플랫폼 | 플랫폼 API | 경쟁사 게시물 조회 시 제약 | 출처 |
|---|---|---|---|
| YouTube | YouTube Data API | 공개 채널 조회 가능, 기본 하루 10,000 유닛에 하루 search.list 호출 100회 | YouTube 할당량 계산기 |
| Instagram Graph API의 Business Discovery | 본인의 비즈니스 또는 크리에이터 계정과 instagram_basic 등의 권한이 필요하며, 비즈니스 및 크리에이터 계정만 조회 가능 | Business Discovery 문서 | |
| TikTok | Research API | 연구자 대상, 신청 필요, 보통 4주 이내 회신 | TikTok 연구 도구 페이지 |
| Community Management API | 주로 자사 회사 페이지 관리용, 접근 신청 필요 | Community Management 개요 |
YouTube Data API는 이 리포트의 일부에 잘 맞습니다. YouTube만 추적한다면 직접 사용하세요. 플랫폼이 4개라면 인증 방식, 할당량, 응답 형식을 각각 4가지씩 관리해야 합니다. 에이전트가 작성하는 스크립트에도 분기가 4개 생깁니다. EveryInfra는 4개 플랫폼을 하나의 요청 형식, 하나의 과금 모델, 하나의 오류 코드 체계로 제공합니다.
그래서 스크립트에는 call() 함수 하나만 있으면 됩니다. 플랫폼별로 더 많은 데이터가 필요하면 YouTube 데이터 API와 TikTok 데이터 API를 참고하세요. Instagram 데이터 API와 LinkedIn 데이터 API도 있습니다. LinkedIn 회사 게시물을 가져올 수 없을 때는 LinkedIn 회사 프로필 기능으로 팔로워 열을 채울 수 있습니다.
한계와 주의 사항
첫 번째 위험은 프롬프트 인젝션입니다. 리포트는 경쟁사의 게시물 텍스트를 읽고, 이 텍스트는 MCP를 통해 에이전트 컨텍스트로 들어갑니다. OWASP는 이 위험을 간접 프롬프트 인젝션이라고 부릅니다(OWASP LLM01 프롬프트 인젝션). 웹 페이지나 파일 같은 외부 소스의 콘텐츠가 모델의 동작을 바꾸는 경우입니다. GitHub 위험 안내 페이지에 따르면 GitHub는 이슈와 댓글에 숨겨진 문자를 필터링합니다(클라우드 에이전트의 위험과 완화 방안). 따라서 HTML 주석은 에이전트에 전달되지 않습니다.
다만 이 설명은 MCP 도구 결과에 담긴 게시물 텍스트까지 다루지는 않습니다. 이 글의 방식은 위험을 줄여 줍니다. 에이전트는 코드를 작성할 때 샘플 몇 개만 읽습니다. 주간 리포트는 스크립트가 만들며, 스크립트는 게시물 텍스트를 지시로 해석해 실행하지 않습니다. 도구 3개만 허용하는 허용 목록도 프롬프트 인젝션의 영향을 받은 에이전트가 할 수 있는 일을 제한합니다.
두 번째는 에이전트의 권한입니다. 문서에 따르면 클라우드 에이전트는 자신의 copilot/ 브랜치에만 푸시할 수 있습니다. 에이전트의 풀 리퀘스트는 사람이 리뷰하고 병합해야 합니다. 에이전트는 풀 리퀘스트를 준비 완료로 표시하거나 승인하거나 병합할 수 없습니다. 에이전트의 풀 리퀘스트에 포함된 워크플로는 쓰기 권한이 있는 사람이 "Approve and run workflows"를 클릭한 뒤에야 실행됩니다. 따라서 에이전트가 만든 워크플로가 리뷰 전에 API 예산을 쓸 수는 없습니다.
세 번째는 Actions의 일정이 정확한 알람이 아니라는 점입니다. 문서에 따르면 정각 무렵의 실행은 늦어질 수 있고, 부하가 높을 때는 실행이 누락될 수 있습니다. 따라서 데이터 기간은 "실행 시점부터 7일 전까지"가 아니라 "지난주 월요일부터 지난주 일요일까지"로 잡아야 합니다. 그렇지 않으면 1시간 지연될 때 1시간 분량의 데이터가 빠집니다. 공개 저장소에서는 60일 동안 활동이 없으면 예약된 워크플로가 중지됩니다. 매주 리포트를 커밋하면 활동으로 집계됩니다.
네 번째는 EveryInfra 자체의 범위입니다. EveryInfra는 공개 브랜드 계정의 게시물, 동영상, 참여 수치 같은 공개 콘텐츠만 읽습니다. 비공개 계정, 광고비, 오디언스 데이터는 읽을 수 없습니다. 그날 밤 발생한 LinkedIn 장애가 실제 사례입니다.
스크립트는 이런 공백을 처리해야 하고, 리포트에도 이를 명시해야 합니다. 또한 GitHub와 EveryInfra는 사업상 관계가 없습니다. 이 글은 공개된 GitHub MCP 설정 방식으로 EveryInfra의 공개 API에 연결할 뿐입니다.
최근 변경 사항
- 2026년 10월 28일: GitHub가 GitHub 검증 MCP 서버(커넥터)를 26개 서비스와 함께 공개 프리뷰로 출시했으며, 모든 Copilot 요금제에 순차 적용하고 있습니다(변경 내역). 영향: Slack, Notion 같은 서비스를 이제 한 번에 연결할 수 있습니다. 서드파티 데이터 API에는 여전히 저장소 MCP 설정이 필요하며, 커넥터는 아직 Actions 세션에서 작동하지 않습니다.
- 2026년 10월 28일: Copilot Automations에서 커스텀 MCP 서버의 도구를 사용할 수 있게 되었고, GitHub 이벤트 트리거 24개, GitHub 도구 20개, 실행·일·주·월 단위 AI 크레딧 한도가 추가되었습니다(변경 내역). 저장소 소유자에게 과금되는 공유 자동화도 같은 날 순차 적용이 시작되었고(공유 자동화 변경 내역), 이제 VS Code에서 클라우드 자동화를 관리할 수 있습니다(VS Code 자동화 변경 내역). 영향: 이제 Copilot을 매주 실행할 수 있지만 실행할 때마다 크레딧이 사용되므로 먼저 한도를 설정하세요.
- 2026년 10월 28일: Copilot이 하나로 연결된 클라우드 환경이 되었습니다. 세션은 기본적으로 클라우드 샌드박스에서 실행되며, 포함된 Actions 할당량은 러너와 클라우드 샌드박스가 함께 쓰는 달러 단위 공유 풀로 바뀌었습니다(변경 내역). 영향: 리포트 워크플로의 실행 시간(분)과 에이전트 샌드박스 사용 시간이 하나의 풀에서 차감됩니다. 비공개 저장소라면 총사용량을 확인하세요.
- 2026년 10월 28일: GitHub Agentic Workflows가 정식 출시되었습니다. Markdown으로 작업을 작성하면 Copilot이나 다른 코딩 에이전트를 사용할 수 있는 Actions YAML로 컴파일됩니다(변경 내역, 프로젝트 페이지). 워크플로 락파일도 정식 출시되어
actions/checkout같은 액션을 정확한 커밋에 고정할 수 있습니다(락파일 변경 내역). 영향: 리포트 워크플로의 액션을 고정해 의존성이 예고 없이 바뀌지 않게 할 수 있습니다. - 2026년 10월 27일: GitHub Copilot이 조직의 GitHub App을 위한 서버 간 인증을 공개 프리뷰로 추가했습니다(변경 내역). Copilot SDK로 만든 서비스는 로그인한 사용자 없이 Copilot을 호출할 수 있으며, 비용은 조직이 부담합니다. 영향: 나중에 팀 서비스가 조직 예산으로 Copilot을 사용해 주간 리포트를 읽게 할 수 있습니다.
- 2026년 10월 22일: Copilot 사용량 지표 API에 커스텀 MCP 서버, 스킬, 커스텀 에이전트가 이름별로 표시됩니다(변경 내역). 유형별로 최대 25개까지 표시됩니다. 영향: 조직 관리자가
everyinfraMCP 서버를 사람들이 실제로 사용하는지 확인할 수 있습니다.
FAQ
GitHub Copilot MCP 설정은 어디에 두나요? mcp.json과 같은 건가요?
이 질문은 검색 추천어 "github copilot mcp configuration"과 "github copilot mcp.json"에서 나왔습니다. 둘은 같지 않습니다. 클라우드 에이전트와 코드 리뷰용 설정은 GitHub에서 저장소의 Settings > Copilot > MCP servers에 넣습니다. 설정은 하나의 mcpServers 객체이며, 각 서버에는 type과 tools가 필요합니다.
VS Code는 저장소의 .vscode/mcp.json 또는 사용자 설정을 사용합니다. VS Code 설정을 옮겨 오려면 몇 가지를 바꿔야 합니다(저장소 MCP 설정 문서, VS Code MCP 문서). 예를 들어 tools를 추가하고 inputs를 env로 바꿉니다.
Copilot 코딩 에이전트의 MCP 서버로 원격 HTTP 서버를 쓸 수 있나요?
이 질문은 추천어 "copilot coding agent mcp server"와 "github copilot coding agent mcp configuration"에서 나왔습니다. 쓸 수 있습니다. type에는 local, stdio, http, sse를 지정할 수 있습니다. 원격 서버는 url과 headers를 사용합니다.
제약은 OAuth입니다. 저장소 설정에 등록한 원격 서버에 대해 클라우드 에이전트와 코드 리뷰는 아직 OAuth를 지원하지 않습니다. 헤더에 키를 넣는 방식은 작동합니다. EveryInfra는 Bearer 키를 사용합니다(저장소 MCP 설정 문서).
코딩 에이전트에서 MCP 서버용 토큰은 어디에 넣나요?
이 질문은 코딩 에이전트에서 Atlassian MCP 서버를 쓰는 방법을 다룬 Reddit 스레드에서 나왔습니다(r/GithubCopilot 스레드). 저장소나 조직의 Agents secrets에 COPILOT_MCP_로 시작하는 이름으로 넣으세요. 그런 다음 설정에서 $COPILOT_MCP_NAME 형식으로 참조합니다. 이 유형의 시크릿은 MCP 서버만 받을 수 있습니다(클라우드 에이전트의 시크릿과 변수).
로그에 MCP는 연결됐지만 도구를 0개 가져왔다고 나옵니다. 어떻게 해야 하나요?
이 질문은 같은 오류를 다룬 Reddit 스레드에서 나왔습니다(r/GithubCopilot 스레드). 먼저 tools 허용 목록의 각 이름이 tools/list의 이름과 정확히 일치하는지 확인하세요. 그다음 서버가 리소스나 프롬프트만 제공하는지 확인하세요. 클라우드 에이전트는 도구만 사용하기 때문입니다. EveryInfra는 키 없이 tools/list POST를 한 번 보내면 도구 이름 12개가 모두 표시되며, 00:16 SGT 테스트에서도 그랬습니다(저장소 MCP 설정 문서).
GitHub Copilot MCP 허용 목록이 내가 추가한 서버를 차단할 수 있나요?
이 질문은 추천어 "github copilot mcp allowlist"와 "github copilot mcp registry"에서 나왔습니다. 차단할 수 있습니다. 커넥터 문서에는 MCP에 영향을 주는 정책이 나와 있습니다. 조직이나 엔터프라이즈에서 "MCP servers in Copilot"을 끄면 어떤 MCP 서버도 작동하지 않습니다.
"Restrict MCP access to registry servers"로 레지스트리 서버만 허용하면, 이 정책을 적용하는 클라이언트는 커넥터를 차단합니다. 엔터프라이즈가 allowedMcpServers 목록을 정의했다면 서버 주소가 그 목록에 있어야 합니다. 먼저 관리자에게 이 설정을 확인하세요(Copilot 커넥터 문서).
매주 실행하는 Copilot 자동화가 Actions 스크립트보다 저렴한가요?
이 질문은 자체 테스트와 추천어 "copilot coding agent mcp"에서 나왔습니다. 비용만 보면 Actions 스크립트는 매주 AI 크레딧을 전혀 쓰지 않으며, 브랜드 3개 기준 API 요금은 주당 $0.011961입니다. 자동화는 실행할 때마다 AI 크레딧을 사용합니다. 실행당 최저 한도는 30 크레딧($0.30)이며, 자동화는 비공개 또는 내부 저장소에서만 작동합니다. 매주 분석이 필요하다면 자동화가 더 편합니다(자동화 문서, 자동화 생성 문서). 수치만 필요하다면 스크립트가 더 저렴합니다.
시작하기
- EveryInfra 콘솔에서 "copilot-mcp"와 "weekly-actions"라는 이름으로 키 2개를 만드세요. 빠른 시작을 참고하세요.
- 저장소의 Agents secrets에
COPILOT_MCP_EVERYINFRA_API_KEY를, Actions secrets에EVERYINFRA_API_KEY를 추가하세요. - 이 글의 JSON을 Settings > Copilot > MCP servers에 붙여 넣고 도구 3개를 지정하세요. 다른 MCP 클라이언트는 EveryInfra MCP 서버 페이지를 참고하세요.
- 이 글의 템플릿으로 이슈를 열고 Copilot에게 할당하세요. 병합하기 전에
workflow_dispatch로 워크플로를 한 번 실행해 보세요.
참고 자료
- “Connect your tools to Copilot without all the setup”, GitHub Changelog, 2026년 10월 28일.
- “Copilot connectors”, GitHub Docs, 2026년 11월 6일 확인.
- “Configure MCP servers for your repository”, GitHub Docs, 2026년 11월 6일 확인.
- “Configure secrets and variables for Copilot cloud agent”, GitHub Docs, 2026년 11월 6일 확인.
- “Copilot automations”, GitHub Docs, 2026년 11월 6일 확인.
- “Creating automations with Copilot cloud agent”, GitHub Docs, 2026년 11월 6일 확인.
- “About Copilot cloud agent”, GitHub Docs, 2026년 11월 6일 확인.
- “Risks and mitigations for GitHub Copilot cloud agent”, GitHub Docs, 2026년 11월 6일 확인.
- “Customizing or disabling the firewall for GitHub Copilot”, GitHub Docs, 2026년 11월 6일 확인.
- “Best practices for using GitHub Copilot to work on tasks”, GitHub Docs, 2026년 11월 6일 열람.
- “Plans for GitHub Copilot”, GitHub Docs, 2026년 11월 6일 열람.
- “Usage-based billing for individuals”, GitHub Docs, 2026년 11월 6일 열람.
- “Events that trigger workflows”, GitHub Docs, 2026년 11월 6일 열람.
- “GitHub Actions billing”, GitHub Docs, 2026년 11월 6일 열람.
- “Using secrets in GitHub Actions”, GitHub Docs, 2026년 11월 6일 열람.
- “New tools, triggers, and cost controls for Copilot Automations”, GitHub Changelog, 2026년 10월 28일.
- “Build shared workflows for your team with Copilot Automations”, GitHub Changelog, 2026년 10월 28일.
- “Create and manage Copilot Automations in Visual Studio Code”, GitHub Changelog, 2026년 10월 28일.
- “Work from anywhere with a new, connected Copilot cloud experience”, GitHub Changelog, 2026년 10월 28일.
- “GitHub Agentic Workflows generally available”, GitHub Changelog, 2026년 10월 28일.
- “GitHub Actions workflow lockfiles are generally available”, GitHub Changelog, 2026년 10월 28일.
- “Push protection beyond predefined secret patterns”, GitHub Changelog, 2026년 10월 28일.
- “GitHub Copilot supports server-to-server authentication”, GitHub Changelog, 2026년 10월 27일.
- “Custom skills, agents, and MCP servers in usage metrics API”, GitHub Changelog, 2026년 10월 22일.
- “Secret scanning blocks Anthropic keys by default, adds Salesforce”, GitHub Changelog, 2026년 10월 13일.
- “Connect your tools to Copilot without all the setup, discussion 211002”, GitHub Community, 2026년 10월 28일.
- “GitHub Agentic Workflows”, GitHub Next, 2026년 11월 6일 열람.
- “Tools”, Model Context Protocol specification 2025-11-25, 2026년 11월 6일 열람.
- “Transports”, Model Context Protocol specification 2025-11-25, 2026년 11월 6일 열람.
- “crontab”, The Open Group Base Specifications Issue 7, 2018년.
- “LLM01:2025 Prompt Injection”, OWASP GenAI Security Project, 2026년 11월 6일 열람.
- “Quota Calculator”, YouTube Data API, Google for Developers, 2026년 11월 6일 열람.
- “IG User Business Discovery”, Meta for Developers, 2026년 11월 6일 열람.
- “TikTok Research Tools: Access and Eligibility”, TikTok for Developers, 2026년 11월 6일 열람.
- “Community Management Overview”, LinkedIn on Microsoft Learn, 2026년 11월 6일 열람.
- “Add and manage MCP servers in VS Code”, Visual Studio Code docs, 2026년 11월 6일 열람.
- “GitHub Copilot Code Agent: Retrieved 0 tools from MCP server”, Reddit r/GithubCopilot, 2026년 11월 6일 열람.
- “How to use MCP atlassian on Github coding agent”, Reddit r/GithubCopilot, 2026년 11월 6일 열람.
- “EveryInfra 데이터 기능 카탈로그”, EveryInfra, 2026년 11월 6일 00:16 SGT 열람.
- “Configure the development environment for agents on GitHub Actions”, GitHub Docs, 2026년 11월 6일 열람.
- “Copilot allowlist reference”, GitHub Docs, 2026년 11월 6일 열람.
- “github/github-mcp-server”, GitHub, 2026년 11월 6일 열람.
참고 BL-94