서버
- 서버 URL
https://app.musael.com/api/mcp?lang=ko- 전송 방식
- Streamable HTTP, 상태 없는 JSON 응답. JSON-RPC 메시지는 POST로 보내세요. GET과 DELETE는 405로 응답해요.
- 서버 이름
musael
인증
모든 요청에 Authorization: Bearer <token> 헤더가 필요해요. 토큰이 없거나 해제·만료·잘못된 토큰이면 서버는 OAuth 메타데이터를 가리키는 WWW-Authenticate 헤더와 함께 401로 응답해요.
OAuth 로그인
ChatGPT, Claude, Cursor, VS Code 등 로그인으로 연결하는 클라이언트용이에요. 클라이언트는 MCP 인증 사양에 따라 401 응답에서 모든 정보를 찾아요:
- 보호된 리소스 메타데이터 (RFC 9728):
https://app.musael.com/.well-known/oauth-protected-resource/api/mcp - 인증 서버 메타데이터 (RFC 8414):
https://app.musael.com/.well-known/oauth-authorization-server - 동적 클라이언트 등록 (RFC 7591): 비밀 키 없는 공개 클라이언트만 가능하고, 리디렉션 주소는 HTTPS, 루프백에 한한 HTTP, 또는 앱 스킴이에요.
- PKCE(S256만)를 사용하는 인증 코드. 작가가 로그인하고 ‘읽기 전용’ 또는 ‘읽기 및 추가’와 프로젝트를 선택한 뒤 허용하거나 취소해요.
- 액세스 토큰은 1시간, 리프레시 토큰은 90일 유효하며 사용할 때마다 교체돼요.
- 스코프: read, suggest (작가에게는 ‘읽기 및 추가’로 표시돼요).
개인 액세스 토큰
Codex, Claude Code, 스크립트처럼 직접 설정하는 클라이언트용이에요. 작가는 Musael의 설정 → 연결된 앱에서 이름, 프로젝트, 권한, 만료일을 정해 토큰을 만들어요.
- 토큰은 sti_로 시작하며 한 번만 표시돼요. Musael은 해시만 보관해요.
- 계정당 활성 토큰은 최대 20개예요. ‘해제’하면 토큰이 즉시 꺼져요.
- Authorization 헤더로 보내세요. URL에 넣지 마세요.
접근과 한도
- 각 호출은 연결한 작가의 권한으로, 그 시점의 접근 범위 안에서, 연결에 선택된 프로젝트에 대해 실행돼요.
- 어떤 도구도 작가의 텍스트를 바꾸거나 삭제하지 않아요. 추가 도구는 새 막, 챕터, 장면, 세계관 항목을 만들고, suggest_edit는 작가가 Musael에서 수락하거나 거절하는 제안을 남겨요.
- 모든 도구는 항상 나열돼요. 요금제나 연결에서 허용하지 않는 도구는 이유를 알려 주고 아무것도 하지 않아요.
- 토큰당 5분에 최대 300회 호출해요. 20만 자를 넘는 응답은 잘리며, 챕터나 장면을 하나씩 읽으라는 안내가 붙어요.
도구
도구 15개. 책 본문 읽기와 수정 제안은 Press 요금제에서 제공해요.
| 도구 | 기능 | 요금제 | 접근 |
|---|---|---|---|
list_projects | 이 연결이 볼 수 있는 프로젝트와 워크스페이스, 작가의 역할, 장면, 마지막 변경이에요. 가장 먼저 사용하세요. 다른 모든 도구에 프로젝트 ID가 필요해요. | 모든 요금제 | 읽기 |
get_profile | 연결된 Musael 계정의 변하지 않는 ID, 이름, 이메일이에요. | 모든 요금제 | 읽기 |
get_outline | 프로젝트의 구조예요. 책, 막, 시놉시스가 있는 챕터, 읽는 순서대로의 장면(상태, 시점, 단어 수 포함), 남은 할 일이 있어요. | 모든 요금제 | 읽기 |
create_project | 아이디어로 새 프로젝트를 만들어요. 막, 챕터, 시놉시스가 있는 빈 장면, 세계관 항목이 포함돼요. | 모든 요금제 | 읽기 및 추가 |
add_to_plan | 기존 프로젝트에 새 막, 챕터, 장면을 추가해요. | 모든 요금제 | 읽기 및 추가 |
add_world_entries | 새 인물, 장소, 사물, 세력을 추가해요. 이미 있는 이름은 그대로 둬요. | 모든 요금제 | 읽기 및 추가 |
read_scene | 장면 하나를 Markdown으로 읽어요. 챕터, 상태, 시점, 장소, 시놉시스가 함께 나와요. | Press | 읽기 |
read_chapter | 챕터의 모든 장면을 순서대로 Markdown으로 읽어요. | Press | 읽기 |
search_project | 장면과 세계관의 단어를 짧은 발췌문과 함께 검색해요. | Press | 읽기 |
list_world | 세계관의 항목을 종류별로 보여 줘요. 다른 이름, 태그, 노트의 앞부분이 함께 나와요. | Press | 읽기 |
get_world_entry | 세계관 항목 하나를 전부 보여 줘요. 노트, 관계, 기록된 사실, 이 항목을 언급한 장면이 포함돼요. | Press | 읽기 |
get_timeline | 세계관의 이벤트를 이야기 순서대로 보여 주고 각각을 보여 주는 장면을 표시해요. 순서와 다르게 서술된 것도 표시해요. | Press | 읽기 |
get_style_report | 고정 규칙으로 만든, AI를 쓰지 않는 앱의 장면 스타일 보고서예요. | Press | 읽기 |
get_reader_stats | 게시된 책의 챕터별 독자를 소유자와 편집자에게 보여 줘요. | Press | 읽기 |
suggest_edit | 구절의 대체안이나 그에 대한 댓글을 제안해요. 작가가 수락해야만 텍스트가 바뀌어요. | Press | 읽기 및 추가 |
표 전체를 보려면 옆으로 스크롤하세요.
예시
MUSAEL_TOKEN을 개인 액세스 토큰으로 설정하세요. initialize 뒤에 notifications/initialized를 보낸 다음 도구를 나열하거나 호출하세요.
초기화
curl https://app.musael.com/api/mcp?lang=ko \
-H "Authorization: Bearer $MUSAEL_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"example","version":"1.0.0"}}}'도구 나열
curl https://app.musael.com/api/mcp?lang=ko \
-H "Authorization: Bearer $MUSAEL_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
curl https://app.musael.com/api/mcp?lang=ko \
-H "Authorization: Bearer $MUSAEL_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'도구 호출
curl https://app.musael.com/api/mcp?lang=ko \
-H "Authorization: Bearer $MUSAEL_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_projects","arguments":{}}}'Codex
# ~/.codex/config.toml
[mcp_servers.musael]
url = "https://app.musael.com/api/mcp?lang=ko"
bearer_token_env_var = "MUSAEL_TOKEN"Claude Code
claude mcp add --transport http --scope user musael https://app.musael.com/api/mcp?lang=ko --header "Authorization: Bearer $MUSAEL_TOKEN"토큰 없이
HTTP/2 401
www-authenticate: Bearer realm="Musael", resource_metadata="https://app.musael.com/.well-known/oauth-protected-resource/api/mcp"
{"error":"TOKEN_INVALID"}
