본문으로 건너뛰기

Cursor에서 Grok Bot 설정

Cursor Grok Bot 가이드

Cursor의 Grok Bot은 AI 기반 자동화 루틴을 개발 워크플로에 직접 가져옵니다. Webhook 루틴, Slack 트리거, 자동화 워크플로를 구성하여 외부 서비스를 연결하고 봇이 반복 작업을 자동으로 처리하게 할 수 있습니다. 이 가이드는 초기 구성부터 고급 문제 해결까지 전체 설정 과정을 다룹니다.

Grok Bot이란?​

Grok Bot은 Webhook 기반 루틴을 사용하여 외부 서비스의 이벤트에 응답하는 Cursor의 자동화 계층입니다. 트리거가 발동되면 봇은 코드 분석 실행, 요약 생성, 알림 전송 등 미리 정의된 루틴을 실행합니다.

Grok Bot 설정의 핵심 구성 요소는 다음과 같습니다:

  • 루틴: 트리거되었을 때 봇이 수행하는 일련의 동작
  • 트리거: 루틴을 시작하는 이벤트 (Slack 메시지 또는 Webhook 호출 등)
  • Webhook URL: 외부 서비스가 데이터를 보내는 엔드포인트 주소
  • 동작: 파일 편집, 터미널 명령, API 호출 등 루틴 내의 개별 단계
팁

Grok Bot을 설정하기 전에 Cursor 설치가 최신인지 확인하세요. Webhook 루틴 기능은 자주 개선되며, 이전 버전에서는 이 가이드에 설명된 모든 트리거 유형을 지원하지 않을 수 있습니다.

초기 구성​

Grok Bot 활성화​

Cursor에서 Grok Bot을 활성화하려면 자동화 설정으로 이동합니다:

  1. Cursor 설정 열기 (Ctrl+, 또는 Cmd+,)
  2. 왼쪽 사이드바의 Automations 섹션으로 이동
  3. Enable Grok Bot을 토글하여 기능 활성화
  4. Generate Webhook Secret을 클릭하여 수신 요청 인증을 위한 비밀 키 생성
// settings.json에 저장된 생성된 구성 예
{
"cursor.grokBot.enabled": true,
"cursor.grokBot.webhookSecret": "whsec_abc123def456ghi789",
"cursor.grokBot.defaultModel": "cursor-agent-pro",
"cursor.grokBot.maxConcurrentRoutines": 3
}
경고

Webhook 비밀 키를 비공개로 유지하세요. 이 비밀 키를 가진 사람은 누구나 귀하의 기기에서 루틴을 트리거할 수 있습니다. 비밀 키가 노출된 경우 설정 패널에서 즉시 새 비밀 키를 생성하세요.

첫 번째 루틴 만들기​

루틴은 트리거되었을 때 봇이 따르는 지침 세트입니다. Automations 패널에서 만듭니다:

  1. Automations 패널 열기 (Ctrl+Shift+A)
  2. New Routine 클릭
  3. 루틴에 설명적인 이름 부여 (예: "Slack Code Review Request")
  4. 트리거 유형 선택 (Webhook, Slack, Manual 또는 Schedule)
  5. 루틴이 수행해야 할 동작 정의
  6. 루틴 저장 및 활성화
# 루틴 구성 예
name: "Slack Code Review Request"
description: "When a Slack message mentions @code-review, analyze the referenced file"
trigger:
type: slack
condition: "message.contains('@code-review')"
actions:
- type: parse_message
extract:
file_path: "regex:review\\s+(.+)"
question: "regex:asking\\s+(.+)"
- type: read_file
path: "{{file_path}}"
- type: analyze
prompt: "Review this code for potential issues, security vulnerabilities, and improvement suggestions."
- type: slack_reply
message: "{{analysis_result}}"

Webhook 루틴​

Webhook 루틴은 외부 서비스가 지정된 URL로 HTTP POST 요청을 보내어 Cursor의 동작을 트리거할 수 있게 합니다.

Webhook URL 이해​

Webhook 트리거 루틴을 만들면 Cursor는 고유한 Webhook URL을 생성합니다. 이 URL은 외부 서비스가 페이로드를 보내는 주소입니다.

# Webhook URL 형식 예
http://localhost:7541/webhooks/routines/rtn_abc123def456
경고

사용자가 보고하는 일반적인 문제는 Webhook 루틴 구성에 POST URL이 표시되지 않는 것입니다. 이는 일반적으로 루틴이 완전히 저장되지 않았거나 저장 전에 트리거 유형이 "Webhook"으로 설정되지 않았을 때 발생합니다. POST URL이 보이지 않으면 다음 단계를 따르세요:

  1. 루틴 편집기를 다시 엽니다
  2. 트리거 유형이 "Webhook"으로 설정되었는지 확인합니다
  3. Save를 명시적으로 클릭합니다 (패널을 닫기만 하지 마세요)
  4. URL이 이제 표시되는지 확인하기 위해 루틴을 다시 엽니다

URL이 여전히 나타나지 않으면 Cursor를 재시작하고 다시 시도하세요. 이는 보고된 알려진 문제이며 수정이 추적되고 있습니다.

Webhook 루틴 등록​

단계별로 Webhook 트리거 루틴을 만드는 방법은 다음과 같습니다:

  1. Automations 패널 열기
  2. New Routine 클릭
  3. 이름을 "GitHub PR Notification"으로 설정
  4. 트리거 유형을 Webhook으로 설정
  5. Webhook URL을 생성하기 위해 루틴 저장
  6. 표시된 POST URL 복사
  7. 외부 서비스가 해당 URL로 요청을 보내도록 구성
# 예: GitHub Action에서 Webhook 보내기
import json
import urllib.request

webhook_url = "http://localhost:7541/webhooks/routines/rtn_abc123def456"
webhook_secret = "whsec_abc123def456ghi789"

payload = {
"event": "pull_request.opened",
"repository": "my-org/my-repo",
"pr_number": 42,
"pr_title": "Add payment gateway integration",
"author": "jane-dev",
"changed_files": ["src/payment/stripe.ts", "src/api/routes.ts"],
}

req = urllib.request.Request(
webhook_url,
data=json.dumps(payload).encode("utf-8"),
headers={
"Content-Type": "application/json",
"X-Webhook-Secret": webhook_secret,
},
method="POST",
)

try:
with urllib.request.urlopen(req) as response:
print(f"Status: {response.status}")
print(f"Response: {response.read().decode()}")
except urllib.error.URLError as e:
print(f"Webhook delivery failed: {e}")

Webhook 요청 검증​

수신 Webhook 요청이 신뢰할 수 있는 출처에서 온 것인지 항상 검증하세요. 설정 중에 생성한 Webhook 비밀 키는 X-Webhook-Secret 헤더에 포함되어야 합니다.

// 검증 로직 예 (Node.js)
const crypto = require("crypto");

function validateWebhook(req, res, next) {
const secret = req.headers["x-webhook-secret"];
const expectedSecret = process.env.CURSOR_WEBHOOK_SECRET;

if (!secret || secret !== expectedSecret) {
return res.status(401).json({ error: "Invalid webhook secret" });
}

// 선택 사항: 재생 공격을 방지하기 위해 요청 타임스탬프 검증
const timestamp = req.headers["x-webhook-timestamp"];
const now = Date.now();
const maxAge = 5 * 60 * 1000; // 5분

if (timestamp && now - parseInt(timestamp) > maxAge) {
return res.status(401).json({ error: "Webhook timestamp expired" });
}

next();
}
팁

프로덕션 설정의 경우 ngrok나 Cloudflare Tunnel과 같은 도구를 사용하여 로컬 Webhook 엔드포인트를 인터넷에 노출합니다. 이를 통해 GitHub, Slack, Jira와 같은 외부 서비스가 로컬 Cursor 인스턴스에 접근할 수 있습니다.

Slack 통합​

Slack은 Grok Bot 루틴의 가장 일반적인 트리거 소스 중 하나입니다. 특정 이벤트가 발생할 때 Slack이 Cursor로 메시지를 보내도록 구성할 수 있습니다.

Slack 트리거 설정​

  1. Slack API 애플리케이션 페이지로 이동
  2. Create New App 클릭하고 From scratch 선택
  3. 앱 이름을 "Cursor Grok Bot"으로 지정하고 워크스페이스 선택
  4. Event Subscriptions에서 이벤트 활성화
  5. Cursor Webhook URL을 Request URL로 입력
  6. message.channels 및 reaction_added 봇 이벤트 구독
  7. OAuth & Permissions에서 chat:write 및 channels:read 스코프 추가
  8. 워크스페이스에 앱 설치 및 Bot User OAuth Token 복사
// 예: Grok Bot 루틴의 Slack 트리거 핸들러
const slackTrigger = {
type: "slack",
events: ["message.channels"],
conditions: {
// 메시지가 @cursor-bot을 멘션할 때만 트리거
mentions_bot: true,
// 특정 채널에서만 트리거
channels: ["#code-review", "#bug-reports", "#deployments"],
// 봇 자신의 메시지 무시
ignore_bots: true,
},
};

Slack에 회신 보내기​

루틴이 완료되면 결과를 원래 Slack 채널로 다시 보낼 수 있습니다:

const { WebClient } = require("@slack/web-api");

const slack = new WebClient(process.env.SLACK_BOT_TOKEN);

async function replyToSlack(channel, text) {
await slack.chat.postMessage({
channel: channel,
text: text,
// 선택 사항: Slack Block Kit 메시지로 포맷
blocks: [
{
type: "section",
text: {
type: "mrkdwn",
text: text,
},
},
{
type: "divider",
},
{
type: "context",
elements: [
{
type: "mrkdwn",
text: ":robot_face: Generated by Cursor Grok Bot",
},
],
},
],
});
}
경고

Slack 트리거가 발동되지 않으면 다음 일반적인 원인을 확인하세요:

  1. Slack 앱이 올바른 이벤트 유형에 구독되지 않음
  2. 봇 사용자에게 타겟 채널을 읽을 권한이 없음
  3. Webhook URL이 잘못되었거나 인터넷에서 접근할 수 없음
  4. X-Webhook-Secret 헤더가 예상 값과 일치하지 않음
  5. 루틴의 조건 필터가 수신 메시지와 일치하지 않음

Slack은 기본적으로 실패한 Webhook 전송을 재시도하지 않습니다. 엔드포인트가 200이 아닌 응답을 반환하면 이벤트는 자동으로 삭제됩니다. Slack API 로그에서 전송 오류를 항상 확인하세요.

트리거 구성​

Grok Bot은 Webhook과 Slack 외에도 여러 트리거 유형을 지원합니다. 각 트리거 유형을 이해하면 사용 사례에 맞는 것을 선택할 수 있습니다.

사용 가능한 트리거 유형​

트리거 유형설명사용 사례
Webhook모든 외부 서비스의 HTTP POST 요청GitHub 이벤트, Jira 업데이트, CI/CD 파이프라인
SlackSlack 메시지 또는 반응팀 알림, 코드 리뷰 요청
Schedule시간 기반 트리거 (cron 식)정기 검사, 매일 밤 요약
File Watch디스크의 파일이 변경될 때 트리거저장 시 자동 포맷, 자동 테스트
Manual키보드 단축키 또는 명령으로 트리거주문형 코드 분석

스케줄 트리거 예​

name: "Nightly Dependency Audit"
description: "Check for outdated dependencies every night at 2 AM"
trigger:
type: schedule
cron: "0 2 * * *"
actions:
- type: terminal_command
command: "npm audit --json"
- type: analyze
prompt: "Analyze these npm audit results and summarize the critical vulnerabilities."
- type: slack_reply
channel: "#security-alerts"
message: "{{analysis_result}}"

파일 감시 트리거 예​

name: "Auto-Format on Save"
description: "Run formatter whenever a TypeScript file is saved"
trigger:
type: file_watch
patterns:
- "**/*.ts"
- "**/*.tsx"
events: ["save"]
actions:
- type: terminal_command
command: "npx prettier --write {{file_path}}"
- type: terminal_command
command: "npx eslint --fix {{file_path}}"
팁

파일 감시 트리거는 자주 저장하는 경우 노이즈가 많을 수 있습니다. 트리거 구성에 디바운스 기간을 추가하여 빠른 저장을 단일 실행으로 배치합니다. 이렇게 하면 봇이 같은 파일에 대해 여러 겹치는 루틴을 실행하는 것을 방지합니다.

루틴 편집​

루틴은 YAML 구성 파일로 저장되며 직접 편집하거나 Cursor의 시각적 편집기를 통해 편집할 수 있습니다.

시각적 편집기 사용​

Automations 패널의 시각적 편집기는 루틴을 구축하기 위한 드래그 앤 드롭 인터페이스를 제공합니다:

  1. 왼쪽 팔레트에서 동작 블록 드래그
  2. 원하는 순서로 정렬
  3. 각 블록을 클릭하여 매개변수 구성
  4. Test 버튼을 사용하여 샘플 입력으로 루틴 실행
  5. 루틴을 저장하여 활성화

YAML 직접 편집​

더 많은 제어가 필요한 경우 루틴 YAML 파일을 직접 편집할 수 있습니다. 루틴 파일은 .cursor/automations/ 디렉토리에 저장됩니다:

# 모든 루틴 나열
ls -la .cursor/automations/

# 특정 루틴 편집
code .cursor/automations/nightly-audit.yaml
# .cursor/automations/code-review-bot.yaml
name: "Smart Code Review Bot"
description: "Analyzes changed files and posts a review comment"
trigger:
type: webhook
filter:
event: "pull_request.opened"
actions:
- type: parse_payload
extract:
pr_number: "$.pull_request.number"
changed_files: "$.pull_request.changed_files"
repo: "$.repository.full_name"

- type: loop
over: "{{changed_files}}"
actions:
- type: read_file
path: "{{item}}"
- type: analyze
prompt: |
Review this file for:
1. Security vulnerabilities
2. Performance issues
3. Code style violations
4. Missing error handling

- type: format_output
template: |
## Automated Code Review

{{#each results}}
### {{this.file}}
{{this.review}}
{{/each}}

- type: webhook_response
status: 200
body: "{{formatted_output}}"
경고

루틴 YAML 파일을 직접 편집할 때는 저장 전에 항상 구문을 검증하세요. 잘못된 YAML 파일은 루틴을 자동으로 실패하게 합니다. 명령 팔레트에서 cursor.automations.validate를 사용하여 모든 루틴을 확인하세요.

자동화 워크플로​

여러 루틴을 결합하여 전체 개발 파이프라인을 연결하는 강력한 자동화 워크플로를 만들 수 있습니다.

워크플로 예: PR 수명 주기 자동화​

이 워크플로는 전체 Pull Request 수명 주기를 자동화합니다:

# 루틴 1: PR 열림 - 초기 분석
name: "PR Initial Analysis"
trigger:
type: webhook
filter:
event: "pull_request.opened"
actions:
- type: analyze
prompt: "Summarize this PR and identify the main changes."
- type: slack_reply
channel: "#pr-updates"
message: "New PR: {{pr_title}}\nSummary: {{analysis_result}}"

---

# 루틴 2: PR 리뷰 요청 - 심층 분석
name: "PR Deep Analysis"
trigger:
type: slack
conditions:
mentions_bot: true
contains_keyword: "deep-review"
actions:
- type: analyze
prompt: "Perform a comprehensive code review including security, performance, and architecture."
- type: slack_reply
channel: "{{trigger_channel}}"
message: "{{analysis_result}}"

---

# 루틴 3: PR 병합 - 문서 업데이트
name: "PR Merged - Update Docs"
trigger:
type: webhook
filter:
event: "pull_request.closed"
merged: true
actions:
- type: analyze
prompt: "Update the README and CHANGELOG based on the merged changes."
- type: terminal_command
command: "git add README.md CHANGELOG.md && git commit -m 'docs: update for PR #{{pr_number}}'"

워크플로 예: 인시던트 대응​

name: "Incident Response Bot"
description: "When an error alert is posted to Slack, analyze and suggest fixes"
trigger:
type: slack
channels: ["#alerts", "#incidents"]
conditions:
contains_keyword: "ERROR"
actions:
- type: parse_message
extract:
error_text: "regex:ERROR:\\s*(.+)"
stack_trace: "regex:at\\s+(.+)"

- type: search_codebase
query: "{{error_text}}"

- type: analyze
prompt: |
An error has occurred. Here is the error message and the relevant code.
Suggest a fix and explain the root cause.
Error: {{error_text}}
Stack trace: {{stack_trace}}
Relevant file: {{search_result}}

- type: slack_reply
channel: "{{trigger_channel}}"
message: |
:rotating_light: *Automated Analysis*
*Likely cause:* {{analysis_result.cause}}
*Suggested fix:* {{analysis_result.fix}}
*File to check:* {{search_result}}
팁

워크플로를 점진적으로 구축하세요. 간단한 알림 루틴으로 시작하여 철저히 테스트한 다음 더 복잡한 동작을 추가하세요. 이렇게 하면 문제가 발생했을 때 어떤 단계가 실패했는지 식별하기 쉽습니다.

문제 해결​

Webhook URL이 표시되지 않음​

이것은 가장 자주 보고되는 문제입니다. Webhook 트리거 루틴을 만들 때 POST URL 필드가 비어 있을 수 있습니다.

근본 원인: 트리거 유형을 설정하기 전에 루틴이 저장되었거나 루틴이 부분적으로만 저장되었습니다.

해결책:

  1. 루틴을 삭제하고 새로 만듭니다
  2. 다른 세부 정보를 입력하기 전에 트리거 유형을 "Webhook"으로 설정합니다
  3. Save를 클릭하고 URL이 생성될 때까지 기다립니다
  4. URL이 여전히 나타나지 않으면 Cursor 출력 패널에서 오류를 확인합니다 (View > Output > Cursor Automations)
  5. 해결 방법으로 YAML 파일의 루틴 ID를 사용하여 URL을 수동으로 구성할 수 있습니다:
http://localhost:7541/webhooks/routines/{ROUTINE_ID}

Slack 트리거가 발동되지 않음​

Slack 트리거가 메시지에 응답하지 않는 경우:

  1. Slack 앱이 워크스페이스에 설치되어 있는지 확인
  2. 이벤트 구독 URL이 접근 가능한지 확인 (Slack API 검증 기능 사용)
  3. 봇 사용자가 타겟 채널에 초대되었는지 확인 (/invite @cursor-grok-bot)
  4. 루틴 조건이 너무 제한적이지 않은지 확인
  5. 수신 이벤트에 대해 Cursor Automations 로그 확인:
# 자동화 로그 보기
cat .cursor/automations/logs/automation.log | tail -100

# Slack 이벤트 필터
grep "slack" .cursor/automations/logs/automation.log
경고

Slack은 이벤트 구독 URL 검증에 3초 시간 제한이 있습니다. Cursor가 초기 검증 요청에 응답하는 데 3초 이상 걸리면 Slack은 URL을 거부합니다. Slack API 대시보드에서 이벤트 구독을 구성할 때 Cursor가 실행 중이고 응답 가능한지 확인하세요.

루틴 편집 문제​

루틴을 저장하거나 편집할 수 없는 경우:

  1. 명령 팔레트를 사용하여 YAML 파일이 유효한지 확인
  2. 다른 프로세스가 루틴 파일을 잠그지 않았는지 확인
  3. .cursor/automations/ 디렉토리에 쓰기 권한이 있는지 확인
  4. 강제 새로 고침을 위해 .cursor/automations/cache/ 디렉토리 삭제 시도
  5. 시각적 편집기가 응답하지 않으면 Cursor 재시작

루틴 실행 디버깅​

루틴 실행에 대한 자세한 정보를 보려면 디버그 로깅을 활성화합니다:

// settings.json에서
{
"cursor.grokBot.debug": true,
"cursor.grokBot.logLevel": "verbose"
}
# 실시간으로 디버그 로그 보기
tail -f .cursor/automations/logs/automation.log

# 특정 루틴 필터
grep "routine_id: rtn_abc123" .cursor/automations/logs/automation.log

모범 사례​

  • 간단하게 시작: 복잡한 워크플로를 구축하기 전에 기본 알림 루틴으로 시작
  • 샘플 입력으로 테스트: 루틴을 활성화하기 전에 시각적 편집기의 Test 버튼 사용
  • 조건을 현명하게 사용: 모든 메시지나 이벤트에서 루틴이 발동되는 것을 방지하기 위해 조건 필터 추가
  • 실행 시간 모니터링: 장기 실행 루틴은 다른 루틴의 실행을 차단할 수 있습니다. 시간 제한을 설정하세요.
  • 루틴 버전 관리: 팀 협업을 위해 루틴 YAML 파일을 Git 리포지토리에 저장
  • 워크플로 문서화: 각 루틴에 명확한 설명을 추가하여 팀원이 목적을 이해하도록 함
  • Webhook 비밀 키 교체: 보안을 위해 주기적으로 Webhook 비밀 키 재생성
  • 환경 변수 사용: YAML에 하드코딩하는 대신 환경 변수를 통해 민감한 값 참조
팁

팀이 참조할 수 있는 공유 루틴 리포지토리를 만드세요. 각 팀원은 필요한 루틴을 구독할 수 있으며, 리포지토리를 풀할 때 업데이트가 자동으로 수신됩니다. 이는 팀 전체의 일관성을 촉진합니다.

결론​

Cursor의 Grok Bot은 Webhook 루틴과 Slack 트리거를 통해 편집자를 외부 서비스에 연결하는 유연한 자동화 계층을 제공합니다. 이 가이드의 설정 단계를 따르고 일반적인 문제 해결 시나리오를 해결함으로써 시간을 절약하고 수동 작업을 줄이는 견고한 자동화 워크플로를 구축할 수 있습니다.

가장 중요한 점은: 항상 Webhook 요청을 검증하고, 루틴을 저장하기 전에 트리거 유형을 설정하고, 프로덕션에서 루틴을 활성화하기 전에 내장 테스트 도구로 철저히 테스트하는 것입니다. 이러한 관행을 갖추면 Grok Bot은 개발 도구 키트의 신뢰할 수 있는 부분이 됩니다.