Recap Raven
공식Discord D&D 노트 작성기: 모든 AI에서 TTRPG 세션 요약, 퀘스트, NPC 및 스크립트를 검색하고 인용할 수 있습니다. Recap Raven API 키가 필요합니다.
Recap Raven MCP(으)로 무엇을 할 수 있나요?
- 캠페인 및 세션 목록 조회 — AI에게 캠페인 목록을 요청하고, 세부 정보를 가져오기 전에 세션 번호를 올바른 요약에 매핑하도록 하세요.
- 트랜스크립트 및 비트 검색 — 트랜스크립트 발언이나 장면 비트에 대해 정확한 키워드 검색을 실행하여 이름, 아이템, 장소가 언급된 위치를 찾으세요.
- 요약 및 트랜스크립트 구간 읽기 — 플레이어 안전 요약 또는 인덱스 범위로 세션에 저장된 발언의 위치 기반 일부를 가져오세요.
- 준비 자료 및 미해결 훅 검토 — 캠페인에 대한 미해결 내러티브 훅, 다음 세션 준비 팩, 이전 줄거리 요약을 가져오세요.
- 엔티티 및 로어 조회 — 엔티티 목록 또는 단일 엔티티 카드와 함께 로어 문서 및 용어집 항목을 가져오세요.
- 참여도 및 퀘스트 확인 — 발언자별 참여 추세, 플레이어에게 표시되는 퀘스트 로그, Ask 크레딧 사용량을 확인하세요.
호스팅형 MCP 서버
npx add-mcp 'https://mcp.recapraven.com/mcp'Claude Code, Codex, Cursor 등에 설치됩니다
문서
맞춤형 AI 워크플로용
호환되는 AI 클라이언트에서 사용하는 캠페인 도구.
MCP를 통해 리캡과 캠페인 데이터를 읽으세요. 기존 API 키 액세스는 호환되는 클라이언트에서 작동합니다. 공개 클라이언트 신원을 지원하는 AI 앱에서 로그인하세요. 연결하기 전에 아래에서 클라이언트 요구 사항을 확인하세요.
MCP란 무엇인가요?
MCP를 사용하면 호환되는 AI 앱이 Recap Raven 도구를 직접 호출할 수 있습니다. 리캡을 다른 AI에 복사하는 대신, AI가 Recap Raven에 세션, 트랜스크립트 구간, 훅, 엔티티, 인용문, 캠페인 답변을 요청할 수 있습니다.
시작하기
Raven의 원격 MCP 엔드포인트는 https://mcp.recapraven.com/mcp 입니다. 설정 안내를 위해 클라이언트를 선택하세요. Premium에는 결정적 읽기가 포함되며, 메모리 검색과 AI 답변에는 Searchable Memory가 필요합니다.
MCP 엔드포인트
https://mcp.recapraven.com/mcp
ChatGPT 설정
- ChatGPT 웹사이트에서 Plugins를 열고 +를 선택한 다음 Add custom MCP server를 선택하세요. "Recap Raven"과 아래의 서버 URL을 입력하세요.
- Raven 로그인이 활성화된 경우, OAuth와 공개 클라이언트 인증을 사용하는 게시된 클라이언트 신원(CIMD) 옵션을 선택하세요. 클라이언트 시크릿이나 Raven API 키는 필요하지 않습니다. 자동 클라이언트 등록은 Raven에서 지원되지 않습니다.
- 플러그인을 생성하고 설치한 다음 Raven에 로그인하여 앱 신원과 요청된 액세스를 검토하세요. 본인이 시작한 연결만 승인하세요.
- 대화에서 @로 Recap Raven을 선택하고 물어보세요: "Use Recap Raven to list my campaigns."
- 읽기 및 쓰기 도구는 권한과 확인에 따라 달라집니다. 설정이 누락된 경우 워크스페이스 제한과 앱에 대한 공식 ChatGPT 설정 가이드를 확인하세요.
ChatGPT 원격 서버 URL
https://mcp.recapraven.com/mcp
동의 및 연결 도움말
Raven 로그인 연결은 캠페인, 트랜스크립트, GM 전용 정보에 액세스할 수 있는 권한을 요청합니다. 도구 결과는 선택한 AI 제공업체로 전송되며, 유료 도구는 기존 Ask 크레딧을 사용합니다.
백그라운드 액세스를 승인하면 앱이 Raven에서 로그아웃된 상태에서도 최대 30일 동안 연결을 갱신할 수 있습니다. 만료되거나 취소된 후에는 다시 연결하고 승인하세요. 계정 설정에서 승인된 AI 연결을 검토하고 하나의 연결을 해제하거나 모든 AI 연결 해제를 사용하세요. API 키는 별도로 관리됩니다.
결과가 비어 있나요? 캠페인을 소유한 Raven 계정으로 로그인했는지 확인하세요. 요금제 변경으로 도구 액세스가 제거될 수 있으며, AI 답변에는 사용 가능한 크레딧도 필요합니다. 동의가 만료되거나 실패하면 클라이언트에서 연결을 다시 시작하세요.
메뉴가 없거나 지원되지 않는 워크스페이스는 Raven 키를 변경해도 해결되지 않습니다. 연결된 공급업체 요구 사항을 확인하거나 앱 이름, 버전, 오류 메시지와 함께 Discord 커뮤니티에 문의하세요. 토큰이나 키를 보내지 마세요.
Premium 및 Searchable Memory에서 사용 가능
Premium에는 API 키와 사용 가능한 리캡, 트랜스크립트, 수동 World 데이터에 대한 액세스가 포함됩니다. 메모리 도구, 캠페인 검색, AI 답변에는 Searchable Memory가 필요합니다. 시맨틱 검색과 AI 답변은 기존 Ask 크레딧을 사용합니다.
요금제별 MCP 가용성
| 무료 티어 | 사용 불가 |
| Premium | API 키, 사용 가능한 리캡, 트랜스크립트, 수동 World 데이터. 메모리 도구는 포함되지 않습니다. |
| 메모리 포함 요금제 | 추가 비용 없이 결정적 도구 사용 가능; search_corpus는 검색당 낮은 채팅 크레딧을 사용하며, 인용 ask 도구는 Ask 크레딧을 사용합니다. |
| API 키 | API Keys에서 개인 API 키를 생성하세요. 언제든지 취소 가능; 계정이 Free로 돌아가면 MCP 액세스가 종료됩니다. |
공정 사용 및 속도 제한
MCP 서버는 공유되고 사용량이 측정되는 표면입니다. 지속 가능하게 유지하고(폭주하는 에이전트 루프가 몇 분 만에 전체 라이선스를 소진하는 것을 방지하기 위해) 모든 API 키는 Ask 허용량과 별도로 속도 제한이 적용됩니다.
MCP 속도 제한
| 서버 공정 사용 | MCP 서버 자체의 API 키당 요청 상한(모든 도구 호출 합산) — 단일 키가 엔드포인트를 범람하는 것을 방지합니다. 한도를 초과한 응답은 Retry-After와 함께 429를 반환합니다. |
| Premium · 모든 요금제 / Memory · 5 세션 | 분당 15회 및 시간당 150회 요청. |
| Memory · 10 세션 | 분당 30회 및 시간당 450회 요청. |
| Memory · 20 세션 | 분당 60회 및 시간당 1200회 요청. |
| 무료 도구 | API 키당 속도 제한. 결정적 읽기와 키워드 검색(search_transcript, search_facts)은 크레딧이 들지 않습니다. 시맨틱 search_corpus는 여기에 포함되지 않으며, 완료된 검색당 낮은 채팅 크레딧을 사용합니다. |
| 채팅 크레딧 도구 | search_corpus(낮은 채팅 크레딧) 및 인용 ask 도구는 Ask 허용량과 키당 속도 제한 _모두_에 의해 제한됩니다. 사용량 게이트는 허용량이 소진되면 지출을 중지하고, 속도 제한은 버스트가 허용량을 즉시 소진하는 것을 막습니다. 별도의 MCP 할당량은 없습니다 — 에이전트는 앱에서 사용하는 것과 동일한 라이선스당 채팅 크레딧을 사용합니다. |
추가 비용 없이 포함
결정적 읽기 도구 — 세션, 엔티티 및 원장, 훅, 메커닉스, 참여도, 트랜스크립트 및 비트 검색, 리캡, 로어, 어휘. AI 추론 없이 저장된 캠페인 데이터를 반환하므로 사용 가능한 도구는 크레딧이 들지 않습니다. 메모리 도구는 여전히 Searchable Memory가 필요합니다. 시맨틱 search_corpus은 이 목록에 포함되지 않으며, 낮은 채팅 크레딧을 사용합니다. 예제 입력, 예제 출력, 필드 참조를 보려면 도구를 펼치세요.
list_campaigns
추가 도구 비용 없음
검색 도구: 다른 도구가 올바른 campaign_id를 사용할 수 있도록 MCP 키에서 사용 가능한 캠페인을 나열합니다.
예제 입력
{}
예제 출력
{
"campaigns": [
{
"campaign_id": "a1b2c3d4-…",
"name": "The White Moose",
"module": "Dolmenwood"
}
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaigns | array | 계정이 소유한 캠페인. |
| campaigns[].campaign_id | string (uuid) | 캠페인 범위 MCP 도구와 함께 이 id를 사용하세요. |
| campaigns[].name | string | 캠페인 이름. |
| campaigns[].module | string | null | 선택적 모듈/시스템 레이블. |
list_sessions
추가 도구 비용 없음
검색 도구: session_number와 제목이 있는 준비된 세션을 나열하여 에이전트가 "session 12"를 올바른 recap_id에 매핑할 수 있게 합니다.
예제 입력
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 생략 | 선택적 캠페인 필터. |
예제 출력
{
"recaps": [
{
"recap_id": "r1e2c3a4-…",
"campaign_id": "a1b2c3d4-…",
"session_number": 12,
"title": "The Choosing",
"status": "ready"
}
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| recaps | array | 계정에 표시되는 준비된 세션. |
| recaps[].recap_id | string (uuid) | get_recap, get_transcript_window, get_mechanics_events와 함께 이 id를 사용하세요. |
| recaps[].campaign_id | string (uuid) | null | 세션을 소유한 캠페인. |
| recaps[].session_number | integer | null | 설정된 경우 GM 자신의 1부터 시작하는 세션 번호(DM 편집 가능). |
| recaps[].title | string | null | 세션 제목. |
| recaps[].status | string | 준비된 세션만 나열됩니다. |
get_engagement
추가 도구 비용 없음
캠페인 참여도 대시보드: 발화자별 참여 추세와 캐시된 세션 간 종합(요약 + 주요 이벤트 타임라인).
예제 입력
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. 계정이 소유해야 합니다. |
예제 출력
{
"sessions": [
{
"recap_id": "…",
"session_ref": "S01AB",
"session_at": "2026-06-20T19:00:00Z"
}
],
"players": [
{
"speaker": "Mira",
"points": [
{
"session_ref": "S01AB",
"participation_pct": 28.4,
"turn_count": 42,
"talk_time_seconds": 612,
"word_count": 1840
}
]
}
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| sessions | array | 캠페인의 준비된 세션당 하나의 항목. |
| sessions[].recap_id | string (uuid) | 리캡/세션 id. |
| sessions[].session_ref | string | 짧은 사람 참조, 예: S01AB. |
| sessions[].session_at | string (ISO 8601) | 세션이 시작된 시각(UTC). |
| players | array | 인식된 발화자당 하나의 항목. |
| players[].speaker | string | 발화자 표시 이름. |
| players[].points | array | 이 발화자의 세션별 지표. |
| players[].points[].participation_pct | number | 대화 점유율, 0–100. |
| players[].points[].turn_count | integer | 발언 턴 수. |
| players[].points[].talk_time_seconds | integer | 총 발언 시간(초). |
| players[].points[].word_count | integer | 총 발언 단어 수. |
get_credit_balance
추가 도구 비용 없음
사용 비율로 표시된 Ask 허용량과 최근 활동 피드. 원시 허용량 수치는 MCP 클라이언트에 노출되지 않습니다.
예제 입력
{}
예제 출력
{
"usage": {
"percent_used": 29
},
"recent_activity": [
{
"type": "recap_ready",
"label": "Session S01AB recap is ready",
"date": "2026-06-21T08:02:00Z",
"recap_id": "…"
},
{
"type": "credit",
"label": "Asked your campaign",
"date": "2026-06-21T08:05:00Z"
}
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| usage.percent_used | integer | 0에서 100까지의 정수 Ask 사용량. |
| recent_activity | array | 최신순 피드(session-recorded, recap-ready, credit-ledger 이벤트). |
| recent_activity[].type | string | 이벤트 종류. 값: recap_ready | session_recorded | credit |
| recent_activity[].label | string | 사람이 읽을 수 있는 요약. |
| recent_activity[].date | string (ISO 8601) | 이벤트가 발생한 시각. |
| recent_activity[].recap_id | string (uuid) | null | 리캡/세션 관련 이벤트에 존재. |
get_memory_overview
추가 도구 비용 없음
가장 풍부한 GM 상황 인식 데이터: 분포, 참여 추세 + 종합 점수, 세션별 참여도, 플레이의 기둥.
예제 입력
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
예제 출력
{
"distribution": [
{
"label": "Roleplay",
"pct": 58
}
],
"engagement": {
"overall": {
"score": 74,
"label": "Playful / tense"
}
},
"pillars": [
"The green-eyed stranger",
"The old inn",
"The white moose hunt"
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| distribution | array | 카테고리별 플레이 점유율. |
| distribution[].label | string | 카테고리 이름. |
| distribution[].pct | number | 점유율, 0–100. |
| engagement.overall.score | number | null | 종합 참여 점수, 0–100. |
| engagement.overall.label | string | null | 정성적 레이블, 예: "Playful / tense". |
| pillars | string[] | null | 반복되는 테마 / 플레이의 기둥. |
get_quest_log
추가 도구 비용 없음
플레이어에게 표시되는 퀘스트 로그. GM 추가 및 편집은 Discord /questlog를 통해 파티와 공유됩니다. GM 비밀은 포함하지 마세요.
예제 입력
{
"campaign_id": "a1b2c3d4-…",
"page": 1
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
| page | integer | 선택 사항, 1부터 시작. 페이지당 퀘스트 10개. |
예제 출력
{
"quests": [
{
"id": "d4e5f6a7-…",
"title": "Find the missing courier",
"objective": "Follow the trail from the bridge.",
"status": "active",
"progress": "The party found a torn satchel."
}
],
"page": 1,
"has_more": false
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| quests | array | 활성/정체 우선, 그다음 완료/포기. 내부 편집 메타데이터와 소스 링크는 제외됩니다. |
| quests[].id | string (uuid) | 퀘스트 식별자. |
| quests[].title | string | 퀘스트 제목. |
| quests[].objective | string | 파티의 목표. |
| quests[].status | string | active, stale, completed 또는 abandoned. |
| quests[].progress | string | 마지막으로 저장된 진행 상황. |
| page | integer | 현재 페이지. |
| has_more | boolean | true이면 다음 페이지를 요청하세요. |
get_open_hooks
추가 도구 비용 없음
미해결 내러티브 훅 — 다음 세션에 준비할 것.
예제 입력
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
예제 출력
{
"hooks": [
{
"text": "Nobody bypasses the Choosing.",
"session_ref": "S01AB",
"session_date": "2026-06-20"
}
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| hooks | array | 현재 열려 있는 내러티브 훅. |
| hooks[].text | string | 훅 설명. |
| hooks[].session_ref | string | 훅이 도입된 세션. |
| hooks[].session_date | string (YYYY-MM-DD) | 해당 세션의 날짜. |
get_previously_on
추가 도구 비용 없음
소유자 범위 메모리로 구축된 캠페인의 이전 줄거리 컨텍스트.
예제 입력
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
예제 출력
{
"sections": [
{
"title": "Last time",
"bullets": [
"The party followed the white moose into the mist."
]
}
]
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| sections | array | 리캡/컨텍스트용 캠페인 메모리 섹션. |
| sections[].title | string | 섹션 제목. |
| sections[].bullets | string[] | 간결한 메모리 불릿. |
get_next_session_prep_pack
추가 도구 비용 없음
GM 전용 다음 세션 준비 조언으로, Recap Raven의 준비 캐시에서 제공됩니다. 한 번 생성된 후 다음 리캡이 수집될 때까지 캐시된 상태로 유지됩니다. 반환값 credit_cost: 0.
입력 예시
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 준비할 캠페인. 귀하의 계정이 소유해야 합니다. |
출력 예시
{
"likely_directions": [
{
"title": "Return to the inn",
"detail": "The unresolved clue points back to the old inn."
}
],
"threads_to_watch": [
"Who opened the moonstone gate?"
],
"prep_suggestions": [
"Review the innkeeper and the gate password."
],
"credit_cost": 0,
"cache_policy": "cached_until_next_recap_ingested"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| likely_directions | array | GM을 위한 예상 다음 전개 방향. |
| threads_to_watch | string[] | GM이 염두에 두면 좋을 스레드. |
| prep_suggestions | string[] | GM을 위한 구체적인 준비 프롬프트. |
| credit_cost | number | 이 MCP 도구에서는 항상 0. |
| cache_policy | string | cached_until_next_recap_ingested. |
get_chronicle
추가 도구 비용 없음
세션당 장면 맵 — 구조화된 캠페인 연대기.
입력 예시
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
출력 예시
{
"sessions": [
{
"recap_id": "…",
"session_ref": "S01AB",
"scenes": [
"The market",
"The hunt",
"The banshee fight"
]
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| sessions | array | 세션당 하나의 항목. |
| sessions[].recap_id | string (uuid) | 리캡/세션 id. |
| sessions[].scenes | string[] | 해당 세션의 순서가 지정된 장면 레이블. |
get_entity
추가 도구 비용 없음
기록된 세션에서 도출된 플레이어에게 공개되는 엔티티 원장으로, 비공개로 업로드된 로어는 제외됩니다. 이름이 없으면 명단을 반환합니다. 이름이나 별칭이 있으면 일치하는 카드, 상호작용 이력, 대화록 턴 링크, 관계 또는 모호한 후보를 반환합니다.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"name": "Captain Vale"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
| name | string | omitted | 단일 카드로 해석할 엔티티 이름/별칭. 명단을 원하면 생략하세요. |
출력 예시
{
"entity": {
"id": "…",
"canonical_name": "Captain Vale",
"kind": "npc",
"aliases": [
"Vale"
],
"search_aliases": [],
"interactions": [
{
"recap_id": "…",
"summary": "Vale warned the party.",
"turn_start": 12,
"turn_end": 16
}
],
"relations": [
{
"subject": "Captain Vale",
"predicate": "located_in",
"object": "Saltmoor Harbour",
"recap_id": "…",
"turn_start": 41,
"turn_end": 44,
"visibility": "player_known",
"session_date": "2026-05-01T00:00:00Z",
"is_current": true,
"predicate_class": "stateful"
}
]
}
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| entities | array (명단 모드) | 이름이 주어지지 않은 경우: 각 엔티티에 대한 {canonical_name, kind, aliases, search_aliases}. |
| entity | object | null (카드 모드) | 이름이 주어진 경우: 해석된 엔티티 카드, 또는 이름이 아무것도 일치하지 않으면 null. |
| candidates | array | 별칭이 모호할 때 가능한 엔티티 카드. 해석이 유일하면 비어 있음. |
| entity.id | string (uuid) | 안정적인 캠페인 엔티티 id. |
| entity.canonical_name | string | 정식 엔티티 이름. |
| entity.kind | string | 엔티티 종류. 값: pc | npc | creature | place | item | faction | deity | other |
| entity.aliases | string[] | 표시 별칭. |
| entity.search_aliases | string[] | 검색 전용 별칭. |
| entity.interactions | array | 리캡 및 대화록 턴 링크가 포함된 근거 기반 이력 항목. |
| entity.interactions[].recap_id | string (uuid) | 상호작용이 포함된 세션. |
| entity.interactions[].turn_start | integer | null | 증거 링크의 첫 번째 대화록 턴. |
| entity.interactions[].turn_end | integer | null | 증거 링크의 마지막 대화록 턴. |
| entity.interactions[].identity_match | string | confirmed 또는 suggested; suggested 링크는 정식 신원 주장이 아닌 가능한 별칭 일치입니다. 값: confirmed | suggested |
| entity.relations | array | 관계 그래프 (오래된 것 → 최신 것). |
| entity.relations[].predicate | string | 예: located_in, ally_of, owns. |
| entity.relations[].recap_id | string (uuid) | 관계를 입증하는 세션. |
| entity.relations[].visibility | string | 엣지의 GM 공개 범위. 레거시 사전 증거 데이터는 dm_only 엣지를 포함할 수 있습니다 — 플레이어에게 노출하지 마세요. 값: player_known | dm_only |
| entity.relations[].is_current | boolean | 상태 기반 술어의 현재 유효한 구간. |
get_mechanics_events
추가 도구 비용 없음
한 세션에 대한 턴 기반 메커니즘 이벤트(공격, 주문, 피해, 휴식, 상태) — 메커니즘 탭과 동일한 데이터입니다.
입력 예시
{
"recap_id": "…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| recap_id | string (uuid) | 읽을 세션. id를 찾으려면 list_sessions를 사용하세요. |
출력 예시
{
"recap_id": "…",
"mechanics": [
{
"action": "attack",
"actor": "Mira",
"target": "Goblin",
"damage_amount": 7,
"damage_type": "slashing",
"evidence_turn_start": 41,
"evidence_turn_end": 41
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| recap_id | string (uuid) | 이 이벤트들이 속한 세션. |
| mechanics | array | 턴 기반 메커니즘 이벤트. |
| mechanics[].action | string | 이벤트 종류. 값: attack | spell_cast | short_rest | long_rest | consumable_used | condition_applied | ability_used | form_changed |
| mechanics[].actor | string | 행동한 주체. |
| mechanics[].evidence_turn_start | integer | 이벤트를 입증하는 첫 번째 턴. |
| mechanics[].evidence_turn_end | integer | 이벤트를 입증하는 마지막 턴. |
get_lore_documents
추가 도구 비용 없음
캠페인의 로어 문서 목록.
입력 예시
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
출력 예시
{
"documents": [
{
"id": "…",
"title": "The Choosing",
"updated_at": "2026-06-20"
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| documents | array | 로어 문서. |
| documents[].id | string (uuid) | 문서 식별자. |
| documents[].title | string | 문서 제목. |
get_lore_document
추가 도구 비용 없음
전체 본문이 포함된 단일 로어 문서.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"doc_id": "…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
| doc_id | string (uuid) | 가져올 로어 문서. |
출력 예시
{
"document": {
"id": "…",
"title": "The Choosing",
"body": "…"
}
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| document.id | string (uuid) | 문서 식별자. |
| document.title | string | 문서 제목. |
| document.body | string | 전체 문서 본문 (markdown). |
get_lexicon
추가 도구 비용 없음
어휘집 항목 (정식 이름, 별칭, 유형, 신뢰도).
입력 예시
{
"campaign_id": "a1b2c3d4-…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 읽을 캠페인. |
출력 예시
{
"entries": [
{
"id": "…",
"canonical": "Sol’Thun",
"type": "npc",
"aliases": [
"the archmage"
],
"confidence": 0.92,
"enabled": true
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| entries | array | 어휘집 항목. |
| entries[].canonical | string | 정식 이름. |
| entries[].type | string | 엔티티 종류. 값: npc | place | item | creature | other |
| entries[].aliases | string[] | 대체 이름 / 별칭. |
| entries[].confidence | number | 추출 신뢰도, 0–1. |
| entries[].enabled | boolean | 이 항목이 활성 상태인지 여부. |
get_transcript_window
추가 도구 비용 없음
세션에 저장된 턴의 위치 기반 일부 (내용 검색 없음 — from/to 턴 인덱스만 사용).
입력 예시
{
"recap_id": "…",
"from": 0,
"to": 20
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| recap_id | string (uuid) | 읽을 리캡/세션. id를 찾으려면 list_sessions를 사용하세요. |
| from | integer | 시작 턴 인덱스 (포함, 기본값 0). |
| to | integer | 종료 턴 인덱스. 생략하면 시작 인덱스부터 50턴 창. |
출력 예시
{
"recap_id": "…",
"total_turns": 184,
"from": 0,
"to": 20,
"turns": [
{
"index": 0,
"t": "~00:01",
"speaker": "GM",
"text": "…"
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| total_turns | integer | 세션의 총 턴 수. |
| from | integer | 반환된 시작 인덱스. |
| to | integer | 반환된 종료 인덱스. |
| turns | array | 요청된 창의 턴. |
| turns[].index | integer | 세션 내 위치 인덱스. |
| turns[].t | string | 상대 타임스탬프, 예: ~00:01. |
| turns[].speaker | string | 화자 표시 이름. |
| turns[].text | string | 발화된 텍스트. |
get_recap
추가 도구 비용 없음
준비된 리캡에 대한 플레이어 안전 리캡 HTML. 아티팩트 유형은 서버 소유이며, 유형 입력은 없습니다.
입력 예시
{
"recap_id": "…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| recap_id | string (uuid) | 플레이어 안전 리캡을 가져올 리캡/세션. |
출력 예시
{
"recap": {
"recap_id": "…",
"content_type": "player_recap_html",
"html": "<!doctype html>…",
"truncated": false
}
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| recap.recap_id | string (uuid) | 리캡/세션 id. |
| recap.content_type | string | 항상 player_recap_html. 값: player_recap_html |
| recap.html | string | 플레이어 안전 리캡 HTML. |
| recap.truncated | boolean | MCP 응답 한도로 HTML이 잘린 경우 true. |
search_transcript
추가 도구 비용 없음
캠페인 대화록 턴에 대한 정확한 키워드(전문) 검색. 정확한 구문을 포함하는 턴을 세션, 화자, 타임스탬프와 함께 반환합니다 — LLM 없음, 임베딩 없음, 크레딧 없음.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"query": "white moose",
"recap_id": "r1e2c3a4-…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 검색할 캠페인. |
| query | string | 일치시킬 정확한 구문 (대화록 텍스트에 대한 전문 검색). |
| recap_id | string (uuid) | omitted | 선택적 세션 범위. 리캡 id를 찾으려면 list_sessions를 사용하세요. |
출력 예시
{
"query": "white moose",
"matches": [
{
"recap_id": "…",
"speaker": "GM",
"t": "~01:04",
"text": "All you know is that it’s a white moose."
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| query | string | 제출된 쿼리의 에코. |
| matches | array | 정확한 구문을 포함하는 대화록 턴, 최적 일치 순. |
| matches[].recap_id | string (uuid) | 일치 항목이 나온 리캡/세션. |
| matches[].speaker | string | 일치한 턴의 화자. |
| matches[].t | string | 상대 타임스탬프, 예: ~01:04. |
| matches[].text | string | 일치한 대화록 텍스트. |
search_facts
추가 도구 비용 없음
캠페인의 장면 비트에 대한 키워드 전문 검색 — 채팅 레인이 추론하는 조밀한 비트별 요약. 정확한 용어(이름, 아이템, 장소)에 가장 적합합니다. 비트 텍스트를 장면/세션 컨텍스트 및 턴 범위와 함께 반환하므로, 에이전트가 해당 순간을 찾아 다음에 정확한 대화록 창을 가져올 수 있습니다. LLM 없음, 임베딩 없음, 크레딧 없음. 자연어, 의미 기반 조회에는 search_corpus를 사용하세요.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"query": "white moose hunt",
"recap_id": "r1e2c3a4-…"
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 검색할 캠페인. |
| query | string | 비트 텍스트와 일치시킬 키워드 (전문 검색). |
| recap_id | string (uuid) | omitted | 선택적 세션 범위. 리캡 id를 찾으려면 list_sessions를 사용하세요. |
출력 예시
{
"matches": [
{
"recap_id": "…",
"session_number": 12,
"session_title": "The Choosing",
"scene_title": "The hunt",
"beat_index": 3,
"turn_start": 120,
"turn_end": 168,
"text": "The party tracked the white moose north of the old inn…",
"truncated": false
}
]
}
필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
| matches | array | 일치하는 비트, 최적 일치 순. |
| matches[].recap_id | string (uuid) | 비트가 나온 세션. |
| matches[].session_number | integer | null | GM의 세션 번호 (설정된 경우). |
| matches[].session_title | string | null | 세션 제목 (설정된 경우). |
| matches[].scene_title | string | null | 비트가 속한 장면의 제목. |
| matches[].beat_index | integer | 장면 내 비트의 위치. |
| matches[].turn_start | integer | 비트 창의 첫 번째 턴 (get_transcript_window에 입력). |
| matches[].turn_end | integer | 비트 창의 마지막 턴. |
| matches[].text | string | 비트 텍스트 (최대 1200자). |
| matches[].truncated | boolean | 비트 텍스트가 잘린 경우 true. |
채팅 크레딧 사용
세 가지 도구가 사용량 기반 채팅 크레딧을 소비합니다. 찾기 vs 답변으로 생각하세요: search_corpus (낮은 채팅 크레딧)은 귀하의 모델이 추론할 수 있도록 가장 강력한 일치 항목을 구조화된 증거로 제공합니다 — 빠른 찾기 도구이며, 완전한 색인이 아닙니다. ask_campaign_cited은 GM 대상 질문에 원문 대화록 인용과 턴 인용을 통해 답변합니다. 그리고 ask_player_campaign_cited는 플레이어 레인을 통해 더 짧은 플레이어 대상 버전을 제공합니다. 모두 잔액과 별도로 API 키당 속도 제한이 있습니다.
search_corpus
낮은 채팅 크레딧 사용
search_corpus는 정확한 문구를 모르더라도 관련성 높은 캠페인 순간을 찾아냅니다. 시맨틱 검색과 재순위화를 사용해 요약, 세션 맥락, 턴 범위를 포함한 가장 강력한 증거 일치 항목을 반환합니다. 이는 파인더이지 완전한 색인이 아닙니다. 최상위 일치 항목만 반환되므로, 결과가 비어 있거나 빈약하다면 "강력한 항목이 드러나지 않았다"는 의미로 받아들여야 하며, 아무것도 존재하지 않는다는 증거로 보아서는 안 됩니다. 일치 항목을 사용해 테이블이 사용한 실제 용어나 이름을 발견한 다음, search_facts / search_transcript로 완전한 무료 키워드 검색을 실행하거나, 턴 범위를 그대로 get_transcript_window에 전달해 축자 구간을 얻으세요. 질문에 대한 확정적이고 검증된 답변(축자 인용과 출처 표시)을 원한다면 대신 ask_campaign_cited를 사용하세요(비용이 더 들고, 구조화된 행이 아닌 서면 답변). 검색 결과에서 GM 전용 콘텐츠를 제외하려면 player_safe: true로 설정하세요. 검색당 낮은 채팅 크레딧을 사용하며, 일치 항목이 없는 경우에도 완료된 모든 검색에 대해 청구됩니다.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"query": "when did the party first distrust the mayor?",
"player_safe": false
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 검색할 캠페인. |
| query | string | 찾고 있는 것에 대한 자연어 설명. |
| player_safe | boolean (기본값 false) | true일 때 검색은 가시성 필터링됩니다 — GM 전용, 추론 및 추측 기억, GM이 입력한 로어는 제외됩니다. 플레이어가 보게 될 모든 항목에 사용하세요. |
출력 예시
{
"matches": [
{
"object_id": "…",
"type": "plot_event",
"visibility": "player_known",
"recap_id": "…",
"session_number": 8,
"session_title": "The Mayor’s Bargain",
"turn_start": 212,
"turn_end": 240,
"text": "The party noticed the mayor’s story about the missing caravan didn’t add up…",
"truncated": false
}
],
"credit_cost": "<chat credits charged for this search>"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| matches | array | 순위가 매겨진 기억 일치 항목, 최적 일치 항목이 먼저. |
| matches[].object_id | string (uuid) | 기억 객체의 id. |
| matches[].type | string | 기억의 종류(예: plot_event, npc_fact). |
| matches[].visibility | string | 누가 이것을 아는지. player_safe 검색에서는 항상 플레이어에게 보이는 항목만 해당됩니다. |
| matches[].recap_id | string (uuid) | null | 기억이 나온 세션. |
| matches[].session_number | integer | null | 설정된 경우 GM의 세션 번호. |
| matches[].session_title | string | null | 설정된 경우 세션의 제목. |
| matches[].turn_start | integer | null | 증거 구간의 첫 번째 턴(get_transcript_window에 전달). |
| matches[].turn_end | integer | null | 증거 구간의 마지막 턴. |
| matches[].text | string | 기억 요약(최대 1200자). |
| matches[].truncated | boolean | 요약이 잘렸을 때 true. |
| credit_cost | number | 이 완료된 검색에 청구된 채팅 크레딧. |
ask_campaign_cited
채팅 크레딧 사용
캠페인에 GM 대상 사실적 질문을 하고 AI 답변을 받으세요 — 앱 내 채팅과 동일한 비트 답변 엔진으로, 축자 트랜스크립트 인용과 턴 출처 표시가 포함됩니다. GM 채팅 크레딧을 사용하며, 앱 내 채팅과 동일한 비용입니다. 잔액과 별도로 API 키당 속도 제한이 있습니다.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"question": "Where did the hunter see the moose?"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 질문할 캠페인. |
| question | string | 질문. |
| clarification | object | 생략 | 선택 사항: 엔진이 물은 명확화 질문에 답변(GM 레인 전용). |
| clarification.question | string | 엔진의 명확화 질문. |
| clarification.answer | string | 해당 질문에 대한 답변. |
| supersedes | string | 생략 | 대체할 이전 답변의 메시지 id(GM 레인 전용). |
출력 예시
{
"answer_markdown": "The hunter reported seeing the white moose near the old inn to the north of town [1].",
"quotes": [
{
"turn": 104,
"speaker": "Skoll",
"text": "All you know is that it’s a white moose.",
"recap_id": "…"
}
],
"confidence_label": "high",
"credit_cost": 1
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| answer_markdown | string | 인라인 [n] 표시가 있는 출처 표시된 답변. |
| citations | array | 각 표시를 뒷받침하는 출처 메타데이터. |
| quotes | array | 증거로 사용된 축자 트랜스크립트 인용. |
| confidence_label | string | 대략적인 신뢰도 구간. 값: high | medium | low |
| credit_cost | number | 이 답변에 청구된 크레딧. |
| quotes[].turn | integer | 인용된 턴 인덱스. |
| quotes[].recap_id | string (uuid) | null | 인용이 나온 세션. |
ask_player_campaign_cited
채팅 크레딧 사용
플레이어 대상 사실적 캠페인 질문을 하고 트랜스크립트 출처가 포함된 짧은 플레이어 안전 답변을 받으세요. GM 전용 콘텐츠는 서버 측 플레이어 레인에서 제외됩니다. 플레이어 채팅 크레딧을 사용합니다.
입력 예시
{
"campaign_id": "a1b2c3d4-…",
"question": "What do we know about the harbour?"
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| campaign_id | string (uuid) | 질문할 캠페인. |
| question | string | 질문. |
출력 예시
{
"answer_markdown": "The party knows the harbourmaster helped them find the missing crate [1].",
"quotes": [
{
"turn": 104,
"speaker": "Skoll",
"text": "The harbourmaster pointed us to the crate.",
"recap_id": "…"
}
],
"confidence_label": "medium",
"credit_cost": 1
}
필드 설명
| 필드 | 유형 | 설명 |
|---|---|---|
| answer_markdown | string | 인라인 [n] 표시가 있는 출처 표시된 답변. |
| citations | array | 각 표시를 뒷받침하는 출처 메타데이터. |
| quotes | array | 증거로 사용된 축자 트랜스크립트 인용. |
| confidence_label | string | 대략적인 신뢰도 구간. 값: high | medium | low |
| credit_cost | number | 이 답변에 청구된 크레딧. |
플레이어 안전 예시
플레이어 대상 봇이나 오버레이를 만들고 있나요? 플레이어 인용 도구를 사용해 답변이 플레이어 레인에서 나오도록 하세요. 이 레인의 가시성 필터링된 원장에는 GM 전용 콘텐츠가 절대 포함되지 않습니다:
{
"tool": "ask_player_campaign_cited",
"arguments": {
"campaign_id": "a1b2c3d4-…",
"question": "What do we know about the harbour?"
}
}
데이터가 가는 곳
MCP 클라이언트를 연결하고 이 도구들을 사용하면, 캠페인 콘텐츠가 선택한 AI 클라이언트(예: ChatGPT, Claude 또는 Gemini)로 전송됩니다. 해당 제공업체의 데이터 사용 및 학습 약관이 귀하가 전송하는 내용에 적용되며, 우리 약관이 아닙니다.
Recap Raven의 무학습 보장은 자체 파이프라인과 우리가 공개한 모델 제공업체에 적용됩니다. 귀하가 연결하는 클라이언트는 보장할 수 없습니다. 클라이언트를 연결함으로써 귀하는 캠페인 데이터에 대한 새로운 처리자를 선택하는 것입니다. 연결하기 전에 해당 클라이언트의 약관을 확인하고, 플레이어가 보게 될 모든 항목에는 ask_player_campaign_cited 또는 플레이어 안전 검색 필터를 사용하세요(로어와 연대기 같은 GM 전용 읽기는 피하세요).
질문이나 피드백이 있나요? Recap Raven 작동 방식 보기 또는 아래 봇을 초대하세요.
다음 세션에서 Recap Raven을 실행하세요
봇을 초대하고, 캠페인을 만들고, 매달 무료 리캡을 받으세요.
카드 불필요 · 테이블의 동의가 있을 때만 녹음 · 언제든지 데이터 삭제 또는 내보내기
질문이나 피드백이 있나요? Discord 커뮤니티 참여하기 →
Discord 음성용으로 제작되었습니다. 세션 전체를 대신 캡처합니다 — 나중에 로그인할 필요도, 보낼 파일도, 누가 말했는지 추측할 필요도 없습니다. 메모리 플랜은 플레이 중에도 편집 가능한 세계 위키를 최신 상태로 유지하여, 무슨 일이 있었는지, 누가 무슨 말을 했는지, 열린 훅, 다음에 준비할 것에 대한 질문에 바로 답할 수 있습니다.