Skip to content

컴퓨터 사용 도구 (Computer Use Tool)

호환성

  • ZDR: 대상 가능 (Covered Models 제외)
  • 지원 모델: claude-fable-5-1, claude-mythos-5-1, claude-fable-5, claude-mythos-5, claude-opus-5, claude-sonnet-5, claude-opus-4-8
  • 지원 플랫폼: Claude API, Claude Platform on AWS (베타), Amazon Bedrock (베타), Google Cloud, Microsoft Foundry (베타)
  • Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 4.6, Claude Opus 4.5는 이전 computer_20251124 도구 버전으로만 컴퓨터 사용을 지원하며, 이 버전은 베타 헤더가 필요해요. 자세한 내용은 '이전 도구 버전'에서 다뤄요.
  • Claude API와 Google Cloud를 제외한 플랫폼은 현재 이전 베타 도구 버전만 제공해요.

컴퓨터 사용 도구를 쓰면 Claude가 컴퓨터 환경과 상호작용할 수 있어요. 스크린샷을 찍고, 마우스와 키보드를 제어하면서 바탕화면을 자율적으로 다룰 수 있게 되는 거죠.

컴퓨터 사용 도구는 Anthropic이 정의한 클라이언트 도구 모음(client toolset)이에요. tools 배열에 {"type": "computer_toolset_20260801"} 항목 하나만 넣으면 Claude가 screenshot, left_click, type, zoom 같은 멤버 도구 17개를 갖게 되고, 애플리케이션은 각 호출을 직접 통제하는 환경에서 실행해요. 이 도구는 현재 Claude Managed Agents에서는 사용할 수 없어요. Claude의 호출은 name이 멤버 도구를 가리키고 "toolset_name": "computer"를 담은 tool_use 블록 형태로 오는데, 한 턴에 여러 개가 오는 일도 흔해요(배치 액션).

웹페이지 안에서 끝나는 작업이라면 브라우저 사용 도구가 더 가까운 선택이에요. 그 멤버 도구들은 페이지 자체를 읽고 조작하며, 전체 데스크톱 환경이 필요 없거든요.

컴퓨터 사용은 Claude API와 Google Cloud에서 computer_toolset_20260801 도구 모음으로 제공돼요. 지원 모델은 호환성 표를 확인하세요.

기존 computer_20251124 통합은 계속 동작하고, 도구 모음을 지원하지 않는 모델·플랫폼에는 이전 도구 버전들이 베타로 남아 있어요. 업그레이드를 원하면 'computer_20251124에서 마이그레이션'을, 베타 헤더가 필요하면 '이전 도구 버전'을 참고하세요.

보안 고려 사항

컴퓨터 사용은 일반적인 API 기능과는 다른 독특한 위험이 있어요. 인터넷과 상호작용할 때 그 위험이 더 커지죠.

위험을 줄이려면 이런 예방 조치를 고려해 보세요.

  1. 권한이 최소화된 전용 가상 머신이나 컨테이너를 사용해서 직접적인 시스템 공격이나 사고를 막아요.
  2. 계정 로그인 정보 같은 민감한 데이터에 모델이 접근하지 못하게 해 정보 탈취를 막아요.
  3. 인터넷 접근을 도메인 허용 목록으로 제한해 악성 콘텐츠에 노출되는 범위를 줄여요.
  4. 현실에 실질적인 영향을 줄 수 있는 결정이나 동의가 필요한 작업(쿠키 수락, 금전 거래, 서비스 약관 동의 등)은 사람이 확인하도록 해요.

어떤 상황에서는 Claude가 사용자의 지시와 충돌하는데도 콘텐츠 안의 명령을 따르기도 해요. 예를 들어 웹페이지나 이미지에 담긴 지시가 사용자 지시를 덮어쓰거나 Claude가 실수를 하게 만들 수 있죠. 민감한 데이터와 작업에서 Claude를 격리해 프롬프트 인젝션 관련 위험을 피하는 게 좋아요.

Anthropic은 모델이 이런 프롬프트 인젝션에 저항하도록 훈련했고, 추가 방어 계층을 더했어요. 컴퓨터 사용 도구를 쓰면 분류기가 자동으로 프롬프트를 실행해 잠재적 프롬프트 인젝션을 탐지해요. 분류기가 스크린샷에서 잠재적 프롬프트 인젝션을 찾아내면 모델이 다음 작업을 진행하기 전에 사용자 확인을 요청하도록 자동으로 유도해요. 이 추가 보호는 모든 사용 사례에 이상적이진 않아요(예: 사람이 루프에 없는 경우). 원한다면 끌 수 있으니 지원팀에 문의하세요.

분류기 방어 계층이 있어도 이런 예방 조치는 여전히 중요해요.

자체 제품에서 컴퓨터 사용을 활성화하기 전에는 관련 위험을 최종 사용자에게 알리고 동의를 받아야 해요.

빠른 시작

Messages API 요청의 tools 배열에 {"type": "computer_toolset_20260801"}로 컴퓨터 사용 도구 모음을 추가하세요. 요청에는 베타 헤더가 필요 없어요. 아래 예시는 텍스트 편집기 도구bash 도구도 함께 선언하는데, Claude는 컴퓨터 사용과 함께 이들을 자주 쓰거든요.

Claude가 바탕화면에서 작업하면 응답의 stop_reasontool_use가 되고, 각각 멤버 도구를 가리키며 "toolset_name": "computer"를 담은 하나 이상의 멤버 tool_use 블록이 포함돼요. 작업 중간에 Claude가 바탕화면 스크린샷을 본 뒤의 응답은 이렇게 생겼어요.

{
  "id": "msg_01UZ3bXcQH8mTqNhVfL9eK2p",
  "type": "message",
  "role": "assistant",
  "model": "claude-opus-5",
  "content": [
    {
      "type": "text",
      "text": "I'll open the web browser to find a picture of a cat."
    },
    {
      "type": "tool_use",
      "id": "toolu_01WkoTUvSHDzTBu2xnGk8Ep8",
      "name": "left_click",
      "toolset_name": "computer",
      "input": { "coordinate": [512, 742] }
    },
    {
      "type": "tool_use",
      "id": "toolu_017nJn3RgSCkTMwuZDb4uUov",
      "name": "screenshot",
      "toolset_name": "computer",
      "input": {}
    }
  ],
  "stop_reason": "tool_use",
  "stop_sequence": null
}

애플리케이션은 각 호출을 자신의 환경에서 순서대로 실행하고, tool_use 블록마다 tool_result 블록 하나씩 돌려주고 다시 API를 호출해요. 그 루프가 어떻게 돌아가는지는 '컴퓨터 사용이 동작하는 방식'에서, 구현 방법은 이 페이지의 나머지 부분에서 설명할게요.


컴퓨터 사용이 동작하는 방식

1단계. Claude에게 컴퓨터 사용 도구와 사용자 프롬프트를 제공해요

  • API 요청의 tools 배열에 컴퓨터 사용 도구 모음(필요하면 다른 도구도 함께)을 추가해요.
  • 데스크톱 상호작용이 필요한 사용자 프롬프트를 포함하세요. 예를 들면 "고양이 사진을 내 바탕화면에 저장해 줘." 같은 거예요.

2단계. Claude가 멤버 도구 호출로 응답해요

  • Claude는 데스크톱에서 작업하는 게 사용자 질문 해결에 도움이 될지 판단해요.
  • 도움이 된다면 Claude는 screenshot, left_click, type 같은 멤버 tool_use 블록을 하나 이상 돌려주는데, 각각 "toolset_name": "computer"를 담아요. 이렇게 블록이 여러 개 온 응답을 배치 액션이라고 불러요.
  • API 응답의 stop_reasontool_use가 되어 도구 사용 요청을 알려줘요.

3단계. 호출을 순서대로 실행하고 결과를 돌려줘요

  • 응답의 모든 tool_use 블록을 순서대로 반복해요. 각각에 대해 멤버 nametoolset_name으로 분기하고, 블록의 input으로 그 작업을 컨테이너나 가상 머신에서 수행해요.
  • tool_use 블록마다 tool_result 블록 하나씩 담은 새 user 메시지로 대화를 이어가요. 블록은 tool_use_id로 짝지어지고 각각 "toolset_name": "computer"를 되울려요. screenshotzoom은 이미지를, 나머지 작업은 OK 같은 짧은 텍스트면 충분해요.
  • 작업이 실패하면 그 블록은 is_error: true로 돌려주고, 나머지 배치는 '배치 액션'에서 설명하는 대로 처리해요.

4단계. 작업이 끝날 때까지 Claude가 이어가요

  • Claude는 도구 결과를 분석해서 더 필요한 작업이 있는지, 작업이 끝났는지 판단해요.
  • 더 필요하면 또 tool_use stop_reason으로 응답하므로 3단계로 돌아가면 돼요.
  • 아니면 사용자에게 텍스트 응답을 돌려줘요.

사용자 입력 없이 3·4단계를 반복하는 것을 에이전트 루프라고 불러요. 즉 Claude가 도구 사용 요청으로 응답하고, 애플리케이션이 그 요청을 평가한 결과를 다시 Claude에게 돌려주는 과정이죠.

배치 액션

Claude는 클릭, 타이핑, 스크린샷 같은 짧은 동작 시퀀스를 계획해서 한 응답에 함께 돌려줄 수 있어요. 이것을 배치 액션이라고 해요. 병렬 도구 사용과 응답 형태는 같은데, 차이 하나는 블록을 동시에가 아니라 순서대로 실행한다는 점이에요.

세 개 작업으로 된 배치 응답은 이렇게 생겼어요.

{
  "role": "assistant",
  "content": [
    {
      "type": "tool_use",
      "id": "toolu_01HqCF3nJ4Vzr8sTkPZ2wxYA",
      "name": "left_click",
      "toolset_name": "computer",
      "input": { "coordinate": [640, 60] }
    },
    {
      "type": "tool_use",
      "id": "toolu_01Ppr3sZ3TnE9m6VUu4RyH2K",
      "name": "type",
      "toolset_name": "computer",
      "input": { "text": "pictures of cats" }
    },
    {
      "type": "tool_use",
      "id": "toolu_01Xf5W1sD8Q9aBcJ7kLmN2pQ",
      "name": "screenshot",
      "toolset_name": "computer",
      "input": {}
    }
  ]
}

tool_use 블록마다 tool_result 블록 하나씩, tool_use_id로 짝지어서 다음 user 메시지에 모두 담아 돌려줘요. 멤버 도구의 모든 결과는 "toolset_name": "computer"를 담아야 해요. 빠뜨리거나 자기 tool_use 블록과 다른 toolset을 가리키면 거부돼요. 이미지가 필요한 건 screenshotzoom뿐이고, 나머지는 OK 같은 짧은 텍스트 확인이면 충분해요(cursor_position은 좌표를 텍스트로 돌려줘요).

{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01HqCF3nJ4Vzr8sTkPZ2wxYA",
      "toolset_name": "computer",
      "content": [{ "type": "text", "text": "OK" }]
    },
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01Ppr3sZ3TnE9m6VUu4RyH2K",
      "toolset_name": "computer",
      "content": [{ "type": "text", "text": "OK" }]
    },
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01Xf5W1sD8Q9aBcJ7kLmN2pQ",
      "toolset_name": "computer",
      "content": [
        {
          "type": "image",
          "source": {
            "type": "base64",
            "media_type": "image/png",
            "data": "iVBORw0KGgo..."
          }
        }
      ]
    }
  ]
}

블록을 순서대로 실행하고 첫 실패에서 멈춰요. 배치의 뒤쪽 작업은 보통 앞쪽 작업에 의존하거든요. 이 예시의 type은 앞의 클릭이 포커스한 곳에 텍스트를 입력해요. content에 나타난 순서대로 블록을 순차 실행하고, 하나가 실패하면 나머지는 실행하지 마세요. 그래도 모든 tool_use 블록은 tool_result가 필요하므로 배치는 이렇게 답하면 돼요.

  • 성공한 각 작업은 정상 결과를 돌려줘요.
  • 실패한 작업은 is_error: true와 함께 무엇이 잘못됐는지 텍스트로 돌려줘요.
  • 배치의 나머지 뒤쪽 작업은 정확히 이 텍스트로 is_error: true를 돌려줘요(브라우저 사용 도구는 자체 중단 텍스트를 써요).
{
  "type": "tool_result",
  "tool_use_id": "toolu_01Xf5W1sD8Q9aBcJ7kLmN2pQ",
  "toolset_name": "computer",
  "is_error": true,
  "content": "Not executed: an earlier computer action in this turn failed."
}

그러면 Claude는 어떤 작업이 성공했고 어떤 게 실패했고 어느 게 건너뛰어졌는지 보고, 다음 턴에 다시 계획해요. 배치의 tool_use 블록 중 하나라도 답하지 않은 요청은 invalid_request_error로 거부되므로, 첫 블록만 읽는 에이전트 루프는 다음 호출에서 실패해요. 애플리케이션이 중대한 작업은 사람에게 확인받는다면, 각 블록이 실행되기 전에 그 확인을 해야 해요. 배치 하나가 한 턴 안에 여러 단계 작업을 끝낼 수 있기 때문이에요.

Claude는 보통 배치를 screenshot으로 마무리해서, 다음 행동을 결정하기 전에 결과를 관찰해요. 배치가 스크린샷으로 끝나지 않으면, 애플리케이션이 배치의 마지막 결과에 스크린샷을 image 블록으로 추가해 Claude가 항상 현재 화면 상태를 보게 할 수 있어요. 그러면 Claude가 요청할 때까지 기다리는 것보다 왕복을 아껴요. 프롬프트로 매 배치를 스크린샷으로 끝내도록 유도할 수도 있어요('프롬프트로 모델 성능 최적화' 참고).

컴퓨팅 환경

컴퓨터 사용은 Claude가 애플리케이션과 웹에 안전하게 상호작용할 수 있는 샌드박스 컴퓨팅 환경이 필요해요. 이 환경은 다음 요소로 이뤄져요.

  1. 가상 디스플레이: Claude가 스크린샷을 통해 보고 마우스·키보드 작업으로 제어할 데스크톱 인터페이스를 렌더링하는 가상 X11 디스플레이 서버(Xvfb 사용).
  2. 데스크톱 환경: Linux에서 동작하는 창 관리자(Mutter)와 패널(Tint2)을 갖춘 가벼운 UI로, Claude가 상호작용할 일관된 그래픽 인터페이스를 제공해요.
  3. 애플리케이션: Firefox, LibreOffice, 텍스트 편집기, 파일 관리자 같은 미리 설치된 Linux 애플리케이션으로, Claude가 작업을 완료할 때 써요.
  4. 도구 구현: "마우스 이동", "스크린샷 촬영" 같은 Claude의 추상적 도구 요청을 가상 환경의 실제 작업으로 변환하는 통합 코드.
  5. 에이전트 루프: Claude와 환경 사이의 통신을 처리하는 프로그램으로, Claude의 작업을 환경으로 보내고 결과(스크린샷, 명령 출력)를 다시 Claude에게 돌려줘요.

컴퓨터 사용을 쓸 때 Claude는 이 환경에 직접 연결되지 않아요. 대신 애플리케이션이 이런 일을 해요.

  1. Claude의 도구 사용 요청을 받아요
  2. 그것을 컴퓨팅 환경의 작업으로 변환해요
  3. 결과(스크린샷, 명령 출력 등)를 캡처해요
  4. 이 결과를 Claude에게 돌려줘요

보안과 격리를 위해 참조 구현은 이 모든 것을 Docker 컨테이너 안에서 실행하며, 환경을 보고 상호작용할 수 있도록 적절한 포트 매핑을 사용해요.


컴퓨터 사용 구현하기

기존 computer_20251124 통합을 업그레이드하는 중인가요? 'computer_20251124에서 마이그레이션'부터 시작하세요. 이 섹션의 나머지는 새 통합과 마이그레이션 통합 모두에 해당해요.

에이전트 루프 이해하기

컴퓨터 사용의 핵심은 에이전트 루프, 즉 Claude가 도구 작업을 요청하고 애플리케이션이 실행해서 결과를 Claude에게 돌려주는 순환 과정이에요. 루프는 빠른 시작에서 만든 클라이언트, 컴퓨터 사용 도구 모음만 선언한 tools 배열, 그리고 '컴퓨터 사용 도구 구현하기'의 도구 호출 처리 헬퍼를 사용해요. bash·텍스트 편집기 도구처럼 다른 도구도 함께 선언한다면 같은 패스에서 그 tool_use 블록도 분기 처리하세요. 헬퍼는 컴퓨터 사용 멤버 호출만 답하고, 루프는 답한 호출이 없는 턴을 작업 완료로 취급해요. 단순화한 예시는 이렇습니다.

def sampling_loop(model: str, messages: list[MessageParam], max_iterations: int = 10):
    """
    Run the computer-use agent loop until Claude stops requesting tools
    or the iteration limit is reached.
    """
    for _ in range(max_iterations):
        response = client.messages.create(
            model=model,
            max_tokens=4096,
            messages=messages,
            tools=TOOLS,
        )

        # Add Claude's response to the conversation history
        messages.append({"role": "assistant", "content": response.content})

        # Run the actions Claude requested, in order, and collect the results
        tool_results = process_tool_calls(response)
        if not tool_results:
            return messages  # No more tool use; task complete

        # Send every result back to Claude in a single user message
        messages.append({"role": "user", "content": tool_results})

    return messages

루프는 Claude가 도구를 요청하지 않고 응답하거나(작업 완료) 최대 반복 횟수에 도달할 때까지 계속돼요. 이 안전장치는 예상치 못한 API 비용을 초래할 수 있는 무한 루프를 막아줘요.

프롬프트로 모델 성능 최적화하기

  1. 단순하고 잘 정의된 작업을 지정하고 각 단계에 대한 명확한 지시를 제공하세요.
  2. Claude는 가끔 자기 작업 결과를 명시적으로 확인하지 않고 추정해 버려요. 이를 막으려면 프롬프트에 이렇게 넣어 보세요. After each step, take a screenshot and carefully evaluate if you have achieved the right outcome. Explicitly show your thinking: "I have evaluated step X..." If not correct, try again. Only when you confirm a step was executed correctly should you move on to the next one.
  3. 드롭다운이나 스크롤바 같은 일부 UI 요소는 마우스 이동으로 다루기 까다로울 수 있어요. 그럴 때는 모델에 키보드 단축키를 쓰도록 프롬프트해 보세요.
  4. 반복되는 작업이나 UI 상호작용에는 성공 결과의 예시 스크린샷과 도구 호출을 프롬프트에 포함하세요.
  5. 모델이 로그인해야 한다면 <robot_credentials> 같은 XML 태그 안에 사용자 이름과 비밀번호를 프롬프트로 제공하세요. 로그인이 필요한 애플리케이션 안에서 컴퓨터 사용을 쓰면 프롬프트 인젝션으로 인한 나쁜 결과 위험이 커져요. 모델에 로그인 자격 증명을 주기 전에 탈옥과 프롬프트 인젝션 완화 문서를 검토하세요.
  6. 사용자 턴의 content 배열을 만들 때 지시 텍스트를 스크린샷 이미지 앞에 두세요. 이미지보다 먼저 대상 설명을 처리하면 클릭 정확도가 좋아져요.
  7. Claude는 작은 텍스트나 스크린샷의 기본 해상도에서 읽기 어려운 특정 UI 요소(사이드바 파일 이름, 탭 제목, 상태 표시줄 텍스트, 줄 번호, 버튼 라벨 등)를 물어볼 때 zoom 작업으로 해당 영역을 전체 해상도로 확인해요. 예상한 시점에 Claude가 줌하지 않는다면 화면 전체가 아니라 특정 영역이나 요소에 대해 물어보세요.
  8. 모든 배치 작업을 스크린샷으로 끝내고 싶다면 시스템 프롬프트에 그렇게 말하세요. 예: End each group of actions with a screenshot so you can verify the result before continuing.

시스템 프롬프트

요청에 컴퓨터 사용 도구를 포함하면 API가 컴퓨터 사용 전용 시스템 프롬프트를 생성해요. 일반 도구 사용 시스템 프롬프트와 비슷하지만 이런 문장으로 시작해요.

You have access to a set of functions you can use to answer the user's question. This includes access to a sandboxed computing environment. You do NOT currently have the ability to inspect files or interact with external resources, except by invoking the below functions.

일반 도구 사용과 마찬가지로 사용자가 제공한 system 매개변수도 여전히 존중되며 결합된 시스템 프롬프트를 만드는 데 사용돼요.

사용 가능한 작업

각 작업은 컴퓨터 사용 도구 모음의 멤버 도구예요. Claude는 "toolset_name": "computer"를 담은 tool_use 블록에서 멤버를 이름으로 지정하고, 블록의 input에는 그 멤버의 매개변수만 담으며 action 필드는 없어요. 도구 모음에는 멤버 도구가 17개 있어요.

멤버 입력 설명
screenshot 없음 ({}) 전체 디스플레이를 캡처해 이미지로 돌려줘요.
zoom region: [x0, y0, x1, y1], 확인할 영역의 좌상단·우하단 모서리 디스플레이의 해당 영역만 전체 해상도로 캡처해 이미지로 돌려주고, 종횡비를 유지한 채 보통 스크린샷 크기에 맞게 조정돼요. 축소된 전체 스크린샷에서 읽기 어려운 작은 텍스트나 밀집한 UI를 읽을 수 있게 해줘요.
left_click coordinate(선택): [x, y]; text(선택): 클릭 중 누를 보조 키 (shift, ctrl, alt, super — Command 혹은 Windows 키 — 또는 ctrl+shift처럼 +로 연결한 조합) coordinate에서 왼쪽 마우스 버튼을 클릭해요. coordinate를 생략하면 현재 커서 위치에서 클릭해요.
right_click, middle_click, double_click, triple_click left_click과 동일 다른 마우스 버튼과 여러 번 클릭.
left_click_drag start_coordinate: [x, y]; coordinate: [x, y]; text(선택): 보조 키 start_coordinate에서 누르고 coordinate까지 드래그한 뒤 놓아요.
mouse_move coordinate: [x, y] 클릭 없이 커서를 이동해요. 예를 들어 호버할 때.
left_mouse_down, left_mouse_up 없음 ({}) 현재 커서 위치에서 왼쪽 마우스 버튼을 누르거나 놓아요. left_click_drag로 표현할 수 없는 드래그용. 먼저 mouse_move로 커서를 옮기세요.
cursor_position 없음 ({}) 커서의 현재 [x, y] 위치를 텍스트로 보고해요.
scroll scroll_direction: "up", "down", "left", "right" 중 하나; scroll_amount: 스크롤 휠 클릭 횟수; coordinate(선택): [x, y]; text(선택): 보조 키 coordinate에서, 또는 현재 커서 위치에서 스크롤해요.
type text: 입력할 문자열 현재 키보드 포커스에 리터럴 텍스트를 입력해요.
key text: 키 또는 "Return", "ctrl+s", "alt+Tab"처럼 +로 연결한 조합; repeat(선택): 1~100, 기본값 1 키 또는 키 조합을 repeat 횟수만큼 눌러요.
hold_key text: 키 또는 조합; duration: 초, 최대 300 키를 주어진 시간 동안 누르고 있어요.
wait duration: 초, 최대 300 다음 작업 전에 잠시 멈춰요. 예를 들어 애플리케이션이 로드되는 동안.

멤버를 구현할 때 다음을 명심하세요.

  • 좌표는 스크린샷 픽셀 기준이에요. 모든 coordinate, start_coordinate, region 값과 cursor_position이 보고하는 위치는 돌려주는 전체 디스플레이 스크린샷의 픽셀 공간 기준이며, 원점은 좌상단이에요. 줌 이미지는 이 규칙을 바꾸지 않아요. 줌 이후에도 Claude는 좌표를 축소된 이미지가 아니라 전체 스크린샷 공간으로 표현해요. 스크린샷을 돌려주기 전에 축소했다면, 실제 디스플레이에 적용하기 전에 Claude의 좌표를 다시 확대해야 해요('이미지 한도에 맞게 스크린샷 크기 조정' 참고).
  • zoom을 포함해 모든 멤버가 기본적으로 활성화돼요. 환경이 줌 이미지를 만들 수 없다면, 활성화한 채 두고 오류를 돌려주기보다 configs로 그 멤버를 막는 게 낫습니다('도구 매개변수' 참고). 막았거나 구현하지 않은 멤버를 Claude가 호출하면 그 블록에 is_error: truetool_result를 돌려주세요.
  • (toolset_name, name) 쌍으로 분기하세요. toolset_name이 블록을 컴퓨터 작업으로 표시해요. 같은 요청의 커스텀 도구가 멤버와 같은 이름을 공유할 수 있고, 이후 도구 모음 버전이 멤버를 추가할 수도 있으니까요(클라이언트 도구 모음 참고).

도구 매개변수

tools 배열의 도구 모음 항목은 네 가지 매개변수를 받아요. 브라우저 사용 도구 모음과 공유하는 규칙은 클라이언트 도구 모음에 정리되어 있어요.

매개변수 필수 설명
type computer_toolset_20260801
configs 아니오 멤버 이름별 설정. 각 멤버는 enabled(17개 모두, zoom 포함, 기본값 true)와 defer_loading(기본값 false, 도구 검색용)을 받으며, 생략된 멤버는 기본값을 유지해요.
cache_control 아니오 도구 모음 정의 지점의 프롬프트 캐싱 중단점. 항목 하나만. 배치의 tool_usetool_result 블록에 있는 중단점은 그 배치가 끝날 때 적용돼요. 프롬프트 캐싱과 도구 사용 참고.
allowed_callers 아니오 ["direct"]만 가능.

예를 들어 이 항목은 zoom을 구현하지 않는 환경을 위해 zoom을 막고, 도구 모음 정의에 캐시 중단점을 설정해요.

{
  "type": "computer_toolset_20260801",
  "configs": {
    "zoom": { "enabled": false }
  },
  "cache_control": { "type": "ephemeral" }
}

에이전트 루프가 왕복당 작업 하나만 실행할 수 있다면 tool_choice에서 disable_parallel_tool_usetrue로 설정하세요. 그러면 Claude가 턴당 멤버 tool_use 블록을 최대 하나만 돌려줘요(병렬 도구 사용 비활성화 참고).

이 도구 모음 항목은 이전 도구 버전의 다음 매개변수를 거부하고, 이 중 하나라도 포함하면 invalid_request_error를 돌려줘요.

  • name: 멤버 이름은 도구 모음 버전이 고정해요.
  • display_width_px, display_height_px, display_number: 좌표는 항상 돌려주는 스크린샷의 픽셀 공간 기준이에요.
  • enable_zoom: 줌은 configs로 제어하는 멤버 도구예요.

이 항목은 같은 요청에서 computer_20251124 항목이나 computer라는 이름의 다른 도구와 함께 선언할 수 없어요. strict, input_examples, defer_loading 위치, tool_choice, 스트리밍, 호출자 제한은 클라이언트 도구 모음을 참고하세요.

thinking과 결합하기

컴퓨터 사용을 thinking과 결합하려면 Thinking 문서를 참고하세요.

컴퓨터 사용을 다른 도구로 확장하기

컴퓨터 사용과 함께 다른 도구를 쓰려면 같은 tools 배열에 포함하면 돼요. 빠른 시작 섹션은 bash 도구텍스트 편집기 도구로 이 패턴을 보여줘요. 커스텀 도구 정의도 같은 방식으로 추가할 수 있어요.

웹페이지 안에서 끝나는 작업이라면 같은 요청에 브라우저 사용 도구를 선언할 수도 있어요. 두 도구 모음은 각자의 좌표 프레임에서 독립적으로 동작하고, screenshot이나 key처럼 이름을 공유하는 멤버 호출은 toolset_name으로 구분돼요.

커스텀 컴퓨터 사용 환경 만들기

참조 구현은 컴퓨터 사용을 시작하는 데 도움이 되도록 만들어졌어요. Claude가 컴퓨터를 쓰는 데 필요한 모든 구성 요소가 포함되어 있죠. 하지만 필요에 맞는 나만의 환경을 만들 수도 있어요. 필요한 것들은 다음과 같아요.

  • Claude와 함께 컴퓨터 사용에 적합한 가상화 또는 컨테이너화 환경
  • 컴퓨터 사용 도구의 작업 구현
  • Claude API와 상호작용하고 도구 구현으로 tool_use 결과를 실행하는 에이전트 루프
  • 사용자 입력으로 에이전트 루프를 시작할 API 또는 UI

컴퓨터 사용 도구 구현하기

컴퓨터 사용 도구는 스키마 없는 도구로 구현돼요. 이 도구를 쓸 때는 다른 도구처럼 입력 스키마를 제공할 필요가 없어요. 스키마는 Claude의 모델에 내장되어 있어 수정할 수 없거든요.

1단계. 컴퓨팅 환경 설정하기

Claude가 상호작용할 가상 디스플레이를 만들거나 기존 디스플레이에 연결하세요. 보통 Xvfb(X Virtual Framebuffer)나 비슷한 기술을 설정하게 돼요.

2단계. 작업 핸들러 구현하기

Claude가 요청할 수 있는 각 작업 유형을 처리하는 함수를 만드세요.

# Placeholder image data; a real executor captures the screen and returns the PNG bytes
PLACEHOLDER_PNG = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="


def capture_screenshot() -> list[ImageBlockParam]:
    # screenshot answers with an image block rather than text: return the result content list
    return [
        {
            "type": "image",
            "source": {"type": "base64", "media_type": "image/png", "data": PLACEHOLDER_PNG},
        }
    ]


def click(coordinate=None):
    if coordinate is None:
        return "clicked at current cursor"
    x, y = coordinate
    return f"clicked at ({x}, {y})"


def type_text(text):
    return f"typed: {text}"


def handle_computer_action(name, tool_input):
    if name == "screenshot":
        return capture_screenshot()
    elif name == "left_click":
        # coordinate is optional; without it, click where the cursor already is
        return click(tool_input.get("coordinate"))
    elif name == "type":
        return type_text(tool_input["text"])
    # Handle other actions as needed
    raise ValueError(f"Unknown or unimplemented member: {name}")

3단계. Claude의 도구 호출 처리하기

Claude의 응답에서 도구 호출을 추출하고 실행해요.

NOT_EXECUTED = "Not executed: an earlier computer action in this turn failed."


def process_tool_calls(response: Message) -> list[ToolResultBlockParam]:
    """
    Run the computer actions in Claude's response in order and answer each
    one. After the first failure the rest are skipped, because Claude planned
    them assuming the earlier actions succeeded.
    """
    tool_results: list[ToolResultBlockParam] = []
    failed = False
    for block in response.content:
        # Only the computer toolset is declared; route other tools here if you add them
        if block.type != "tool_use" or block.toolset_name != "computer":
            continue
        result: ToolResultBlockParam = {
            "type": "tool_result",
            "tool_use_id": block.id,
            "toolset_name": "computer",
        }
        if failed:
            result["content"] = NOT_EXECUTED
            result["is_error"] = True
        else:
            try:
                # A string, or a list of content blocks such as the screenshot image
                result["content"] = handle_computer_action(block.name, block.input)
            except Exception as err:
                result["content"] = f"Error: {err}"
                result["is_error"] = True
                failed = True
        tool_results.append(result)
    return tool_results

4단계. 에이전트 루프 구현하기

앞의 두 단계를 루프로 감싸서 결과를 다시 보내고 Claude가 멤버 도구 호출을 돌려주지 않을 때까지 반복하세요. 각 언어의 루프는 '에이전트 루프 이해하기'에서 확인할 수 있어요.

오류 처리하기

실패한 작업은 is_error: true와 짧은 설명, 그리고 다른 멤버 결과처럼 "toolset_name": "computer"를 담은 tool_result로 Claude에게 보고하세요. 실패한 작업이 배치 액션의 일부였다면, 나머지 블록은 실행하지 말고 배치 섹션에 있는 중단 텍스트로 답하세요.

예를 들어 스크린샷 캡처가 실패하면 이렇게 생겨요.

{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "toolset_name": "computer",
      "content": "Error: Failed to capture screenshot. Display may be locked or unavailable.",
      "is_error": true
    }
  ]
}

디스플레이 경계 밖의 좌표나 실행에 실패한 작업에도 같은 형태를 쓰고, 무엇이 잘못됐는지 알려주는 메시지를 담으세요.

이미지 한도에 맞게 스크린샷 크기 조정하기

컴퓨터 사용 도구 모음에 돌려주는 스크린샷과 줌 이미지는 모델의 이미지 크기 한도에 이미 맞아야 해요. 도구 모음은 디스플레이 크기를 받지 않고 API가 자동으로 축소하지 않으므로, 너무 큰 tool_result 이미지는 검증 오류로 거부돼요. Claude가 좌표를 자신이 보는 이미지의 픽셀 공간으로 돌려주기 때문에, 사용한 스케일 계수를 보관해서 좌표를 자기 화면으로 다시 매핑해야 해요.

화면이 한도보다 크다면 각 스크린샷을 돌려주기 전에 크기를 조정하고, Claude가 돌려준 좌표를 원래 화면 공간으로 다시 확대하세요. 도구 모음이 디스플레이 크기를 받지 않으므로, 애플리케이션 코드의 크기 조정과 좌표 스케일링만으로 충분해요.

import math

screen_width, screen_height = 1512, 982


def get_scale_factor(width, height):
    """Calculate scale factor to meet API constraints."""
    long_edge = max(width, height)
    total_pixels = width * height

    long_edge_scale = 1568 / long_edge
    total_pixels_scale = math.sqrt(1_150_000 / total_pixels)

    return min(1.0, long_edge_scale, total_pixels_scale)


# When capturing screenshot
scale = get_scale_factor(screen_width, screen_height)
scaled_width = int(screen_width * scale)
scaled_height = int(screen_height * scale)

# Resize image to scaled dimensions before sending to Claude
screenshot = capture_and_resize(scaled_width, scaled_height)


# When handling Claude's coordinates, scale them back up
def execute_click(x, y):
    screen_x = x / scale
    screen_y = y / scale
    perform_click(screen_x, screen_y)

디스플레이 해상도를 고르고 스크린샷을 돌려줄 때는 다음을 참고하세요.

  • 일반 데스크톱 작업은 1024x768 또는 1280x720, 웹 애플리케이션은 1280x800 또는 1366x768을 사용하세요.
  • 성능 문제를 피하려면 1920x1080 이상의 해상도를 피하세요.
  • 스크린샷은 base64 PNG나 JPEG로 인코딩하고, 큰 스크린샷은 성능 향상을 위해 압축하는 것도 고려하세요.
  • 타임스탬프나 디스플레이 상태 같은 관련 메타데이터를 포함하세요.
  • 더 높은 해상도를 쓰면 좌표가 정확히 스케일링되는지 확인하세요.

스크린샷 이력 관리하기

긴 에이전트 루프는 스크린샷을 빠르게 쌓아요(각각 대략 1,000~1,800 입력 토큰). API의 요청 한도도 적용돼요. 한 요청에 이미지가 20개를 넘으면 그 요청의 모든 이미지는 변당 더 엄격한 한도에 걸려요. 스크린샷 이력을 유지하는 루프는 수십 턴 안에 그 숫자에 도달하므로, 각 스크린샷을 한 변이 2000px를 넘지 않게 크기 조정하거나, 오래된 스크린샷을 정리해 요청에 20개 이하로 유지하세요.

컨텍스트에 상한을 두면서 프롬프트 캐싱을 효과적으로 유지하려면 다음과 같이 하세요.

  • 시스템 프롬프트와 도구 정의 뒤에 cache_control 중단점을 하나 두고, 가장 최근 턴들 각각의 마지막 tool_result 블록에 중단점을 최대 세 개 더 두되, 매 턴 그들을 앞으로 이동하세요. 배치 액션 안에서는 여러 블록의 마커가 중단점 한 개처럼 작동하지만 각각이 4개 한도에 포함되므로, 턴마다 하나씩 쓰세요.
  • 오래된 스크린샷은 매 턴이 아니라 배치 단위로 정리하세요. 매 턴 스크린샷을 하나씩 버리면 매 턴 접두어가 바뀌어 캐시가 무효화돼요. 합리적인 기본값은 최근 스크린샷 세 개를 유지하고 25턴마다 정리하는 것이라, 정리 사이에는 접두어가 바이트 단위로 동일하게 유지돼요. 스크린샷이 한 변이라도 2000px를 넘으면 각 요청이 이미지 20개 이하를 유지하도록 간격을 고르세요.
  • Claude Fable 5.1에서는 클라이언트 쪽 정리를 피하세요. 이전 스크린샷을 제거하면 그 턴들을 여전히 담고 있는 모든 요청에서 이후의 모든 thinking 블록이 무효화돼요. 대신 스크린샷을 변당 2000px 이하로 크기 조정하고, 서버 쪽 도구 결과 정리로 오래된 것을 컨텍스트에서 제거하세요. 정리를 해야 한다면 그때부터 prefix_mismatch_behavior: "drop_block"을 유지하세요. 정리 후에도 Claude는 정리된 스크린샷 이후에 생성된 thinking 없이 계속 진행되며, 그 요청과 이후 모든 요청에 그렇게 돼요.

클릭 문제 진단하기

클릭이 대상을 빗나가면 보통 다음 중 하나가 원인이에요.

구현 모범 사례 따르기


computer_20251124에서 마이그레이션

computer_20251124에서 도구 모음으로의 업그레이드는 선택 사항이에요. '이전 도구 버전'에 나열된 모델들은 베타 헤더와 함께 computer_20251124를 계속 받아들이므로, 변경할 때까지 기존 통합은 계속 동작해요. 업그레이드하려면 다음 변경을 함께 수행하세요.

  1. 베타 헤더를 제거하세요. 요청에서 anthropic-beta: computer-use-2025-11-24를 빼세요. SDK에서는 betas 매개변수를 제거하고, 베타 네임스페이스가 아니라 표준 클라이언트로 Messages API를 호출하세요.
  2. tools 항목을 바꾸세요. typecomputer_toolset_20260801로 설정하고 name, display_width_px, display_height_px, display_number, enable_zoom을 삭제하세요. 도구 모음은 이 필드들을 각각 거부해요.
  3. 줌을 활성화로 유지할지 고르세요. 도구 모음에서는 줌이 기본 활성화인데 반해, enable_zoom은 기본값이 false예요. 환경이 줌을 구현하지 않는다면 이전 동작을 유지하도록 "configs": {"zoom": {"enabled": false}}를 추가하고, 그렇지 않으면 구현하세요('사용 가능한 작업' 참고).
  4. 한 턴의 모든 블록을 처리하세요. 에이전트 루프를 첫 블록만 읽는 대신 응답의 모든 tool_use 블록을 반복하고, input.action이 아니라 블록의 nametoolset_name으로 분기하도록 업데이트하세요. 멤버 입력에 더 이상 action 필드가 없으며, 나머지 필드는 그대로예요.
  5. 블록을 순서대로 실행하고 중단 텍스트를 쓰세요. 블록을 순차 실행하고 첫 실패에서 멈춘 뒤, 나머지 블록은 '배치 액션'에서 설명한 대로 Not executed: an earlier computer action in this turn failed.로 답하세요. 아직 배치를 실행할 수 없다면 '도구 매개변수'에서 Claude를 턴당 작업 하나로 제한하는 방법을 설명해요.
  6. 결과에 toolset_name을 되울리세요. 멤버 호출에 답하는 모든 tool_result"toolset_name": "computer"를 추가하세요. 결과에는 textimage 콘텐츠만 포함될 수 있어요.
  7. keyrepeat를 지원하세요. key 멤버는 1~100의 선택적 repeat 횟수를 받아요. 인식하지 못하는 필드를 무시하는 핸들러는 키를 한 번만 누르므로, key 핸들러가 repeat을 존중하게 만드세요.
  8. 스크린샷을 직접 크기 조정하세요. 도구 모음은 모델 이미지 한도를 초과하는 스크린샷이나 줌 이미지를 축소하는 대신 거부해요. 이미지를 돌려주기 전에 크기를 조정하고, '이미지 한도에 맞게 스크린샷 크기 조정'에서 설명한 대로 좌표를 스케일링하세요.
  9. 지원하지 않는 옵션을 제거하세요. defer_loading을 항목에서 configs로 옮기고 모든 활성화된 멤버에 같은 값으로 넣으세요. 도구 모음 항목에서 지원하지 않는 다른 옵션은 클라이언트 도구 모음에 나열되어 있어요.

변경 전의 tools 항목은 이렇습니다. anthropic-beta: computer-use-2025-11-24 헤더와 함께 보냈어요.

{
  "type": "computer_20251124",
  "name": "computer",
  "display_width_px": 1024,
  "display_height_px": 768,
  "display_number": 1
}

변경 후의 tools 항목은 이렇습니다. 베타 헤더 없이 보내요. configs 객체는 enable_zoom을 설정하지 않는 이전 항목과 맞추려고 줌을 꺼 둔 거예요. configs를 통째로 생략하면 기본값을 받아들여 Claude가 줌하도록 두는 것입니다.

{
  "type": "computer_toolset_20260801",
  "configs": {
    "zoom": { "enabled": false }
  }
}

다음 쌍은 변경 전후의 tool_use 블록을 보여줘요. 작업 이름이 input.action에서 name으로 옮겨가고, 블록에 toolset_name이 생겨요.

{
  "type": "tool_use",
  "id": "toolu_01A9r5kQm2LxWc7vT3nZ4bJs",
  "name": "computer",
  "input": { "action": "left_click", "coordinate": [500, 300] }
}
{
  "type": "tool_use",
  "id": "toolu_01A9r5kQm2LxWc7vT3nZ4bJs",
  "name": "left_click",
  "toolset_name": "computer",
  "input": { "coordinate": [500, 300] }
}

이전 도구 버전

컴퓨터 사용 도구의 이전 버전 두 개가 베타로 남아 있어요. 기존 통합, 도구 모음을 지원하지 않는 모델, 그리고 도구 모음을 현재 제공하지 않는 플랫폼을 위한 거예요. 각각은 모든 요청에서 자체 베타 헤더가 필요하고, 매개변수는 베타 Messages API 참조에 문서화되어 있어요. SDK에서는 헤더를 betas 매개변수로 전달하고 베타 네임스페이스를 사용하세요. 베타 헤더가 필요한 건 컴퓨터 사용 도구뿐이고, 같은 요청의 bash·텍스트 편집기 도구에는 필요 없어요.


제한 사항

  1. 지연 시간: 인간-AI 상호작용의 현재 컴퓨터 사용 지연은 일반적인 인간 주도의 컴퓨터 작업보다 느릴 수 있어요. 속도가 중요하지 않은 사용 사례(예: 신뢰할 수 있는 환경에서의 백그라운드 정보 수집, 자동화된 소프트웨어 테스트)에 집중하세요.
  2. 컴퓨터 비전 정확도와 신뢰성: Claude는 작업을 생성하면서 특정 좌표를 출력할 때 실수하거나 환각할 수 있어요. Claude의 요약 thinking 출력이 모델의 추론을 이해하고 잠재적 문제를 찾는 데 도움이 돼요. thinking 구성에 display: "summarized"를 설정하세요. 도구 모음을 지원하는 모델은 기본적으로 thinking 텍스트를 생략하기 때문이에요.
  3. 도구 선택 정확도와 신뢰성: Claude는 작업을 생성하면서 도구를 고를 때 실수하거나 환각할 수 있고, 문제 해결을 위해 예상 밖의 작업을 할 수도 있어요. 낯선 애플리케이션이나 여러 애플리케이션을 동시에 다룰 때 신뢰성이 더 낮을 수 있어요. 복잡한 작업을 요청할 때는 프롬프트를 신중하게 작성하세요.
  4. 스크롤 신뢰성: 스크롤 작업은 방향 제어(위, 아래, 왼쪽, 오른쪽)와 지정된 양을 지원해요. 스크롤이 적용되지 않는 애플리케이션에서는 Page Down 같은 키보드 대안이 도움이 될 수 있어요.
  5. 스프레드시트 상호작용: 개별 셀을 선택하려면 세밀한 마우스 제어 작업(left_mouse_down, left_mouse_up)과 보조 키 조합을 사용하세요. 복잡한 스프레드시트 작업은 여전히 여러 번의 시도가 필요할 수 있어요.
  6. 소셜·커뮤니케이션 플랫폼에서의 계정 생성과 콘텐츠 생성: Claude가 웹사이트를 방문하긴 하지만, 소셜 미디어 웹사이트와 플랫폼 전반에서 계정을 만들거나 콘텐츠를 생성·공유하거나 다른 방식으로 사람 사칭에 관여하는 능력은 제한적이에요.
  7. 취약성: 탈옥과 프롬프트 인젝션은 다른 최첨단 AI 시스템과 마찬가지로 컴퓨터 사용에도 영향을 줄 수 있어요. 웹페이지나 이미지에 내장된 지시를 통해서도요. '보안 고려 사항'의 예방 조치를 적용하세요.
  8. 부적절하거나 불법적인 작업: Anthropic의 서비스 약관에 따라 컴퓨터 사용을 사용해 어떤 법률이나 허용 가능한 사용 정책(Acceptable Use Policy)을 위반해서는 안 돼요.

Claude의 컴퓨터 사용 작업과 로그를 항상 신중히 검토하고 검증하세요. 완벽한 정밀도가 필요한 작업이나 민감한 사용자 정보를 다루는 작업에는 인간의 감독 없이 Claude를 사용하지 마세요.

데이터 보존

컴퓨터 사용은 클라이언트 쪽 도구예요. 세션에 관련된 모든 스크린샷, 마우스 작업, 키보드 입력, 파일은 Anthropic이 아니라 사용자 환경에 캡처되고 저장돼요. Anthropic은 스크린샷 이미지와 작업 요청을 API 호출의 일부로 실시간 처리해요. 그 API 요청의 보존 정책은 API 및 데이터 보존에 따릅니다.

애플리케이션이 컴퓨터 사용 데이터를 저장하는 위치와 방식을 통제하므로, 컴퓨터 사용은 ZDR 대상이에요. 모든 기능의 ZDR 대상 여부는 API 및 데이터 보존을 참고하세요.

가격

컴퓨터 사용은 표준 도구 사용 가격을 따릅니다. 컴퓨터 사용 도구를 쓸 때의 비용을 정리하면 이렇습니다.

도구 모음 정의 오버헤드: 기본 멤버와 함께 computer_toolset_20260801을 선언하면 요청에 입력 토큰 약 4,500개가 추가돼요(Claude Fable 5, Claude Mythos 5, Claude Opus 5, Claude Opus 4.8에서는 약 4,520, Claude Sonnet 5에서는 약 4,590). 여기에는 멤버 도구 정의와 도구 사용 시스템 프롬프트가 포함돼요. configszoom을 비활성화하면 그중 약 410개가 줄어요. 요청의 정확한 개수는 응답 usage에 보고되고, 토큰 계산 엔드포인트로 미리 추정할 수 있어요.

이전 도구 버전: 다음 수치는 computer_20251124computer_20250124 도구 버전에 적용되고, computer_toolset_20260801에는 적용되지 않아요.

  • 시스템 프롬프트 오버헤드: 시스템 프롬프트에 토큰 466~499개 추가
  • 도구 정의: 도구 정의당 입력 토큰 약 735개(computer_20250124로 측정)

추가 토큰 소비:

  • 도구 결과로 돌려주는 스크린샷과 줌 이미지. 이미지 입력으로 청구돼요(비전 가격 참고).
  • Claude에게 돌려주는 도구 실행 결과

다음 단계

Claude를 외부 도구와 API에 연결하세요. 도구가 어디서 실행되는지, Claude가 언제 도구를 호출하는지, 어떤 도구가 작업에 적합한지 알아보세요.

자체 브라우저 환경에서 브라우저 안에 머무는 작업을 위해 Claude가 웹페이지를 탐색하고 읽고 상호작용하게 하세요.

호환성

지원 모델 Fable 5 및 5.1, Mythos 5 및 5.1, Opus 4.8 및 5, Sonnet 5
지원 플랫폼 Claude API, Claude Platform on AWS, Amazon Bedrock, Google Cloud, Microsoft Foundry