AI가 우리의 작업을 가속화하면서 따라가기가 점점 더 어려워지고 있습니다. Anthropic에서는 이를 돕기 위해 간단한 에이전트 자동화를 자주 활용합니다. 이러한 자동화는 보통 정해진 일정에 따라 실행되고, 백그라운드에서 맥락을 수집하며, 우리가 알아야 할 내용을 능동적으로 알려줍니다. 하지만 효과적인 에이전트 자동화를 구축하는 것은 어렵습니다. 아무도 눈치채지 못하는 사이에 데이터 소스에 대한 접근 권한을 잃거나, 우리의 선호를 따르지 못할 수 있기 때문입니다.
사용하기 Claude Managed Agents(클로드 매니지드 에이전트) (베타)를 만들면서 사용자 정의 소스(예: Slack 및 GitHub 저장소)를 일정에 따라 읽고, 마지막 실행 이후 무엇이 변경되었는지 추적하고, 알아야 할 내용을 게시하는(예: Slack으로) 참조 구현을 만들었습니다. 이 글에서는 각 단계를 살펴보고, 참조 구현을 공유하며, 에이전트를 자동으로 구성하기 위해 Claude Code에서 실행할 수 있는 명령어를 제공합니다.
코드 받기
참조 구현은 다음과 같습니다 여기아래 명령어를 Claude Code에서 실행하면 대화형 안내를 진행할 수 있습니다. 이 claude-api 이 글의 안내에 따라 에이전트를 설정하는 데 skill이 도움이 될 수 있습니다:
/claude-api managed-agents-onboard https://claude.dev/blog/building-effective-agent-automations/
이 참조 구현을 위해서는 Slack 앱이 필요합니다 ("매니페스트에서 생성합니다.) 및 GitHub 토큰. 아래에 표시된 제공 파일들은 에이전트, 해당 환경, 메모리 저장소, 볼트 및 배포를 포함하여 Claude API 리소스에 대한 구성입니다.
코드 텍스트daily-brief/ ├── agent.md model, tools, instructions ├── deployment.md schedule, time zone, budget, input message ├── environment.yaml network allowlist ├── memory_store_preferences.yaml user preferences ├── memory_store_state.yaml the agent's bookmarks, ledger, notes, and run records ├── vault.yaml the vault that holds the credentials ├── claude-lock.json resource IDs, written by ant apply └── slack/manifest.yaml one bot app
ant apply, 즉 ant CLI의 명령어는 이러한 파일을 읽어 Claude API 워크스페이스(플랫폼이 이를 저장하고 실행하는 곳)에 리소스를 생성하고, 그 ID를 claude-lock.json.
다음 섹션에서 이 명령어를 사용할 것입니다. 한 번 설정되면 자동화는 Anthropic의 인프라에서 일정에 따라 실행되므로 여러분의 머신에서 무언가 계속 실행 중이어야 할 필요가 없습니다.
개요
우리가 만들 에이전트는 여섯 가지 구성 요소로 이루어져 있으며, 다음 순서로 설명합니다:
- 소스(Sources) - 에이전트가 읽을 장소들의 이름이 지정된 목록
- 대상(Destination) - 에이전트가 쓸 수 있는 한 곳
- 에이전트(Agent) - agent.md에 정의된 모델, 도구, 실행 단계
- 스케줄(Schedule) - cron 스케줄
- 메모리(Memory) - 사용자의 기본 설정과 에이전트 자신의 메모리
- 가드레일(Guardrails) - 에이전트가 읽기만 하는 모든 곳에 대한 읽기 전용 접근, 그리고 실행당 지출 상한

소스(SOURCES)
에이전트는 두 개의 기본 소스를 읽습니다: Slack 채널과 GitHub 풀 리퀘스트입니다. 채널과 저장소는 여러분의 preferences 파일에 나열되어 있습니다. 템플릿은 다른 소스를 사용하도록 확장할 수 있습니다.

에이전트에 자체 범위가 지정된 자격 증명을 부여하십시오
함께 관리형 에이전트, 자격 증명은 다음에 저장됩니다 볼트. 에이전트는 이 자격 증명을 참조할 수 있지만 실제 값은 볼트에 보관되며, Claude의 코드가 실행되는 샌드박스 외부에 있습니다 (참조: 여기 및 여기):
-
MCP 서버 (GitHub). 에이전트는 샌드박스 외부에서 실행되는 프록시를 통해 MCP 도구를 호출합니다. 프록시는 URL이 서버의 URL과 일치하는 볼트 자격 증명을 찾습니다.
-
셸 (Slack). 에이전트는 샌드박스 내부에서 bash 도구를 사용해 curl로 Slack API를 호출합니다. 샌드박스에는 불투명한 플레이스홀더만 있으며,
$SLACK_BOT_TOKEN요청이 샌드박스를 떠날 때 플랫폼이 허용된 호스트에 대해 실제 토큰으로 교체합니다.
다음을 사용하여 볼트를 생성합니다: ant CLI와 저장소의 템플릿 파일:
ant apply vault.yaml
이렇게 하면 Claude API 작업 공간에 볼트가 생성되어 플랫폼이 이를 저장하고, 그 ID가 claude-lock.json에 기록됩니다. 그런 다음 TypeScript SDK를 사용하여 각 자격 증명을 볼트에 추가합니다. 다음은 Slack 자격 증명을 추가하는 예제입니다:
const vaultId = process.env.VAULT_ID!; // the vault's ID, from claude-lock.json
await client.beta.vaults.credentials.create(vaultId, {
display_name: "SLACK_BOT_TOKEN",
auth: {
type: "environment_variable",
secret_name: "SLACK_BOT_TOKEN",
secret_value: process.env.SLACK_BOT_TOKEN!,
networking: { type: "limited", allowed_hosts: ["slack.com"] },
injection_location: { header: true },
},
});
볼트를 생성하고 각 자격 증명을 추가한 후에는 볼트를 배포에 연결합니다. 볼트 ID를 claude-lock.json 에서 복사하여 배포 파일의 vault_ids 에 붙여넣습니다. deployment.md.
중단한 곳에서 이어서 읽기
흔히 저지르는 실수 중 하나는 에이전트에게 "최근 24시간." 늦게 실행하면 누락이 생기고 이르게 실행하면 항목이 반복됩니다. 대신 소스별로 북마크를 에이전트에 제공하세요. 각 실행이 끝날 때 에이전트는 각 소스에서 읽은 가장 최신 항목의 타임스탬프를 하나의 파일에 기록합니다, bookmarks.json, 소스마다 하나의 항목이 있습니다: "slack": "2026-09-14T13:02:11Z".
다음 실행은 그 북마크에서 시작하므로, 실행 창은 지난 실행 이후의 모든 내용을 포함하도록 늘어나거나 줄어듭니다. 북마크는 다음에 위치합니다. 메모리 저장소 라고 불리는 state: 플랫폼이 모든 실행의 샌드박스에 다음 경로 아래에 마운트하는 텍스트 파일 폴더 /mnt/memory/ 그리고 실행 사이에 유지됩니다. 에이전트는 일반적인 파일 도구로 이를 읽고 쓰며, 다음에 있는 지침은 agent.md 어떻게 되었는지 말해 줘.
조용한 하루로 착각하지 마세요. 읽기 실패일 수 있습니다
MCP 서버가 다운되었거나 해당 토큰이 만료된 경우에도 실행은 시작되며, 다만 그 서버의 도구 없이 진행됩니다. 세션은 오류를 기록하지만 에이전트는 해당 소스로부터 아무것도 볼 수 없어 "새로운 소식 없음"이라고 보고합니다.
3가지 규칙에서 agent.md 이 문제를 해결해 주세요. 소스 하나가 실패하면 에이전트는 다음과 같이 동작합니다: 해당 소스의 북마크를 제자리에 그대로 두고, 다른 소스들로부터 브리프를 작성한 뒤, 브리프 마지막에 읽지 못한 내용을 밝히는 한 줄을 추가하여("이번 실행에서는 풀 리퀘스트를 확인할 수 없음") 독자가 이를 인지하도록 합니다.
목적지
저희 템플릿은 하나의 Slack 채널에 게시하며, 실행될 때마다 날짜가 표시된 게시물을 올립니다.

에이전트는 샌드박스에서 bash 도구를 사용하여 Slack에 게시하며, 읽기에 사용하는 것과 동일한 봇 토큰을 사용합니다.
아무것도 게시물을 승인할 필요가 없습니다. 에이전트가 bash 명령으로 게시물을 전송하며, 내장된 bash 도구는 기본적으로 승인을 요청하지 않고 실행됩니다. slack.com 또한 에이전트의 환경, 프로그램이 실행되는 샌드박스입니다. 해당 게시물은 요청 한 건입니다:
curl -s https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"channel": "C0123456789", "text": "Daily brief, Tue Sep 15 ..."}'
기록하기 전에 게시물이 등록되었는지 확인하세요
게시물이 확인되면 에이전트는 보고된 항목과 북마크의 장부를 업데이트합니다. 이 기록이 실제 게시된 내용과 일치하지 않으면 두 가지 문제가 발생할 수 있습니다. 에이전트가 실제로 게시되지 않은 게시물을 기록한 경우, 북마크는 다음으로 넘어가고 해당 항목들은 영원히 보고되지 않습니다. 첫 번째 게시물이 게시되었는지 확신하지 못해 다시 게시하는 경우, 독자들은 동일한 브리핑을 두 번 받게 됩니다.
세 가지 규칙에서 agent.md 이를 방지합니다. 첫째, 에이전트는 채널의 최근 메시지에서 오늘자 제목을 찾아보고, 해당 호가 이미 게시되어 있으면 게시하지 않습니다. 둘째, Slack이 응답을 반환했을 때에만 게시물이 발송된 것으로 간주됩니다. "ok": true 그리고 메시지 ts. 세 번째로, 에이전트는 그 확인이 끝난 후에만 원장과 북마크를 업데이트합니다. 결과가 불분명하면 해당 실행을 "maybe posted"로 표시하고 그 외에는 아무것도 변경하지 않아, 어떤 것도 손실되지 않습니다.
에이전트는 자신의 메모리 저장소에 실행 기록을 유지합니다(runs/<date>.md">는 게시 전 "posting", 메시지 ID와 함께 "posted", 또는 "maybe posted"를 표시합니다."
AGENT
Claude Managed Agents에서 에이전트 버전이 관리되는 구성입니다: 모델, 시스템 프롬프트, 도구로 구성됩니다. 각 실행은 해당 실행 단계를 따르며 중단됩니다.

우리의 참조 구현에서 에이전트 구성은 다음과 같습니다. agent.md:
---
name: Daily brief
model: claude-sonnet-5-5
mcp_servers:
- type: url
name: github
url: https://api.githubcopilot.com/mcp/
tools:
- type: agent_toolset_20260401
configs:
- name: web_search
enabled: false
- name: web_fetch
enabled: false
- type: mcp_toolset
mcp_server_name: github
default_config:
permission_policy:
type: always_allow
---
[Eight numbered run steps; the full text is in agent.md in the repo.]
프런트매터는 에이전트 이름, 모델, 도구 및 MCP 서버를 제공합니다. 본문은 에이전트 지침을 제공합니다. MCP 도구는 기본적으로 승인을 요청하지만 승인해 줄 사람이 없으므로, GitHub 도구 세트는 다음과 같이 설정됩니다. always_allow 그리고 GitHub 토큰은 read-only.
브리프를 짧게 유지하세요
agent.md Claude가 간결함을 향하도록 유도합니다:
4. Decide. An item earns a line when the reader would act on it today, or it changes a decision they are about to make. When unsure, leave it out. Most days that is a few items, sometimes none. A count ("12 open reviews") is not an item; link the ones that are blocked. An item already in the ledger and still open is carried as one marked line ("still waiting, day 3"), not re-reported; a closed item is dropped without comment. Do not bring back a topic the preferences file has retired.
게시하기 직전 아직 진행 중인 항목을 다시 확인하십시오
에이전트가 소스를 읽은 시점과 게시하는 시점 사이에 항목이 변경될 수 있습니다. 게시 직전에 agent.md 각 항목의 실시간 상태를 다시 확인하도록 에이전트에 지시합니다:
5. Verify. The world moved while you read. For every item you will report, re-check its live source just before posting: resolved since you read it, drop it; still open but changed, fix the line; cannot confirm, drop it and list it in the run record's cuts. One stale "still waiting on you" costs more trust than ten missing items, so never hedge an item's status: assert it or drop it. Every link is copied from the source's own link field (a pull request's html_url, a Slack permalink), never assembled by hand.
일정
Claude Managed Agents에서 에이전트는 단지 구성 파일일 뿐입니다. a 배포 이를 실행합니다. 배포는 에이전트 이름, 환경, 그리고 각 실행의 첫 번째 메시지를 지정합니다. 또한 일정, 볼트, 메모리 저장소 및 예산을 보유합니다. 일정이 실행될 때마다 플랫폼은 새로운 에이전트를 시작합니다 세션.

저희 템플릿에서 배포는 다음에 캡처되어 있습니다 deployment.md, 첫 번째 메시지를 본문으로 하여:
---
name: Daily brief
agent: ./agent.md
environment_id: ./environment.yaml
schedule:
type: cron
expression: "32 7 * * 1-5"
timezone: America/New_York
vault_ids: [vlt_...] # the vault you create under Sources
resources:
- path: ./memory_store_preferences.yaml
access: read_only
instructions: The reader's preferences. Re-read them every run. Never write here.
- path: ./memory_store_state.yaml
access: read_write
instructions: Your state. Bookmarks, ledger, notes, proposals, and run records.
---
Write today's brief.
The reader's time zone is America/New_York. Work out every date in that zone.
Follow your run steps in order. Today's edition is titled "Daily brief, <weekday> <month> <day>".
이것은 에이전트, 환경 및 경로로 지정된 이름의 메모리 스토어와 함께 배포를 생성합니다.
CODEShellant apply deployment.md
일정을 기다리지 않고 테스트하려면, 다음을 사용해 수동으로 실행을 시작하고 ant beta:deployments run --deployment-id <id>, 의 ID를 사용하세요 claude-lock.json.
내 시간대 기준으로 날짜 계산
흔한 버그 중 하나는 에이전트가 날짜를 서버의 시간대 기준으로 계산하기 때문에 오늘 아침을 "어제"로 호출하는 것입니다. 그런데 deployment.md, 해당 timezone 실행이 시작될 때 field sets을 설정하고 본문의 두 번째 줄은 에이전트에게 날짜에 사용할 zone을 지정합니다.
메모리
각 실행은 이전 실행의 기억이 없는 새로운 샌드박스에서 시작됩니다. 기억이 없으면 피드백이 축적되지 않습니다. 그러나 오래된 기억은 에이전트를 혼란스럽게 할 수 있습니다. 이미 해결된 항목을 여전히 대기 중이라고 보고하거나, "이미 보고됨" 상태라는 이유로 아직 해결되지 않은 항목을 누락시킬 수 있습니다.

우리 템플릿은 두 개를 유지합니다 메모리 스토어, /mnt/memory/ 아래에 마운트된 폴더들(Sources 참조):
-
환경 설정 (에이전트에게 읽기 전용으로 제공되는 것): 어떤 채널과 저장소를 읽을지, 무엇을 제외할지, 길이 제한, 목적지, 그리고 언제 멈출지입니다.
-
상태 (에이전트 자신의 것, 읽기-쓰기 가능): 북마크, 자신이 보고한 내용의 장부(실행당 기록 1개), 사용자의 기본 설정에 대해 제안하는 변경 사항, 그리고 각 소스가 어떻게 동작하는지에 대한 메모("최신 50개 항목만 반환함").
ant apply deployment.md preferences 스토어를 생성할 뿐, 그 안의 파일은 생성하지 않습니다. 첫 실행 전에 저장소의 preferences.md를 그곳에 작성하십시오. scripts/seed-preferences.sh.
실행을 시작할 때마다 설정을 다시 읽습니다
흔히 발생하는 문제는 환경설정의 복사본이 프롬프트에 박제되어 이미 변경한 규칙이 계속 적용되는 경우입니다. 에이전트가 매 실행마다 파일을 새로 읽도록 하세요. 파일을 읽을 수 없다면 기본값으로 계속 진행하는 대신 중단하고 그렇게 말해야 합니다.
이미 보고한 내용의 장부를 기록해 두고, 변경 사항을 보고하십시오
에이전트는 자신이 보고한 모든 항목의 장부를 유지하여, ledger.md, 브리핑이 같은 내용을 반복하지 않도록 합니다. 각 줄에는 항목이 언제 보고되었는지, 어디에서 왔는지, 변경되지 않는 ID(Slack 메시지 타임스탬프 또는 풀 리퀘스트 번호), 그리고 마지막으로 알려진 상태가 기록됩니다:
2026-09-09 slack:C0123456789 1788963600.000100 refund thread: customer waiting on a decision 2026-09-11 github 481 review blocked, day 2 (still waiting) 2026-09-11 slack:C0234567891 1789117333.000300 enterprise escalation: owner named, in progress
GUARDRAILS
자동화가 일정에 따라 “백그라운드”에서 실행되기 때문에, 에이전트가 할 수 있는 일과 지출할 수 있는 금액에 제한을 설정했습니다.

에이전트가 할 수 있는 일에 대한 제한
에이전트는 다른 사람들이 작성한 메시지와 이슈를 읽으며, 그 텍스트는 지시문으로 해석될 수 있습니다. 에이전트가 그런 지시문을 따를 경우 할 수 있는 일을 제한하세요. 우리 예제에서는 GitHub 토큰과 preferences 스토어가 읽기 전용이며, 환경은 허용 목록에 있는 호스트에만 접근합니다. 심어진 지시문이라도 브리핑 내용을 바꿀 수 있는데, 이는 에이전트가 실행 사이에 유지하는 노트를 통해서도 가능합니다. 하지만 GitHub에 쓰거나 규칙을 편집할 수는 없습니다.
Slack은 예외입니다: 동일한 토큰으로 게시하기 때문에, 읽거나 게시해야 하는 곳에만 봇을 초대하세요.
실제 실행에서 지출 한도 설정하기
지출 한도는 통제 불가능한 비용으로부터 당신을 보호합니다. 정상 실행 비용의 3~5배에서 시작하고, 실제 수치를 본 후에 조정하세요. 한도에 도달한 실행은 실패하는 대신 일시 중지되므로, 너무 낮게 설정된 한도는 조용해진 브리핑처럼 보입니다. 한도는 budget 의 deployment.md입니다. 모든 실행에는 전체 금액이 주어지며, 한도에 도달한 실행은 budget_reached 중지 사유와 함께 일시 중지됩니다:
budget:
type: limit
max_list_cost:
amount: "500" # a string, in cents: "500" is $5.00
currency: USD
GETTING STARTED
저희 참조 구현은 여섯 가지 규칙으로 요약됩니다:
- 각 소스를 고정된 시간 창이 아닌 북마크부터 읽어 들입니다.
- 실패한 읽기는 조용한 하루가 아니라 읽을 수 없음으로 보고합니다.
- 게시 직전에 모든 항목을 다시 확인합니다.
- Slack이 전송을 확인했을 때에만 게시물을 전송된 것으로 간주하고, 그 후에 북마크와 장부를 갱신합니다.
- 매 실행마다 에이전트가 편집할 수 없는 저장소에서 환경설정을 다시 읽어 들입니다.
- 에이전트가 읽기만 하면 되는 곳에서는 읽기 전용 권한을 부여하고, 각 실행이 지출할 수 있는 한도를 제한합니다.
Claude Code는 이 문서에서 제공하는 안내를 단계별로 안내해 드릴 수 있습니다. 먼저 업데이트하세요:
CODEShellclaude update
그런 다음 claude-api 스킬을 사용하세요:
PROMPT/claude-api managed-agents-onboard https://claude.dev/blog/building-effective-agent-automations/
claude-api 스킬은 이 글을 읽고, 설정을 제안하며, 프로젝트의 agents/ 폴더에 파일을 작성한 후, ant apply로 리소스를 생성합니다. 이를 출발점으로 삼고, 소스, 대상 또는 메모리 선호도에 맞게 에이전트를 사용자 지정하세요.
