↑ 업로드↑ Upload
AI 에이전트 연동 · MCP

URL 하나로, AI가 바로 게시합니다

DropHTML은 원격 MCP(Model Context Protocol) 서버를 내장합니다. 지금 보고 있는 이 주소(https://drophtml.app/mcp)를 AI 도구에 등록하고 한 번 로그인하면, 에이전트가 만든 HTML·마크다운을 대화 중에 게시하고 공유 링크를 바로 받아옵니다. 설치할 것도, 서버를 띄울 것도 없습니다.

5분 안에 연결하기

처음이라면 이 네 단계면 끝입니다. 아래는 Claude Code 기준이고, 다른 도구는 클라이언트별 연결 방법에 있습니다.

  1. 서버를 등록합니다. 터미널에서 아래 한 줄이면 됩니다. drophtml은 내 컴퓨터에서 부를 이름이라 원하는 대로 바꿔도 됩니다.
    claude mcp add --transport http drophtml https://drophtml.app/mcp
  2. 로그인(연결)합니다. Claude Code 에서 /mcp 명령을 실행해 drophtml을 인증하면 브라우저가 열립니다. 구글로 로그인하고 [허용]을 누르면 끝입니다 — 복사해 둘 키가 없습니다.
  3. 말로 시켜 봅니다. “이 HTML을 DropHTML에 올려줘”라고 하면 에이전트가 게시하고 공유 링크를 돌려줍니다. 더 많은 예시는 이렇게 말해보세요에 있습니다.
  4. 돌아온 관리 토큰을 챙깁니다. 게시 응답에 그 글 전용 관리 토큰한 번만 담깁니다. 계정에 연결돼 있으면 없어도 관리되지만, 계정 밖에서도 고칠 생각이라면 저장해 두세요(관리 토큰).
⚠️ 이 서버는 로그인이 필수입니다. 등록만 하고 인증을 건너뛰면 도구가 하나도 보이지 않습니다 — 그건 고장이 아니라 아직 로그인하지 않았다는 뜻입니다(문제 해결).

용어 풀이

이 페이지에 반복해서 나오는 말들입니다. 여기만 알면 나머지는 술술 읽힙니다.

MCP (Model Context Protocol)
AI 도구가 바깥 서비스의 기능을 불러 쓰기 위한 공통 규약입니다. 서비스마다 플러그인을 따로 만들지 않아도 되도록 “도구를 어떻게 알려주고 어떻게 호출하는가”를 표준으로 정해 둔 것입니다.
MCP 서버
그 규약에 따라 도구를 제공하는 쪽. DropHTML의 MCP 서버는 우리가 이미 띄워 두었고, 여러분은 주소만 등록하면 됩니다(설치·실행할 프로그램이 없습니다).
MCP 클라이언트
그 도구를 불러 쓰는 AI 도구 쪽. Claude Code·Claude 데스크톱·Cursor·VS Code 등이 여기 해당합니다.
Streamable HTTP
MCP 가 원격 서버와 통신하는 방식 중 하나(HTTP 요청 하나로 주고받는 방식). DropHTML 서버가 쓰는 방식이라, 클라이언트도 이 방식을 지원해야 연결됩니다.
도구 (tool)
에이전트가 호출할 수 있는 기능 하나하나입니다. create_share(게시)·search_shares(검색)처럼 이름이 붙어 있고, 연결하면 13가지가 열립니다.
관리 토큰 (deleteToken)
글 하나에만 통하는 편집·삭제 열쇠. 게시 응답에 한 번만 담기고, 웹에서 발급되는 관리 링크와 같은 것입니다.
계정 자격 (OAuth 토큰 · API 키)
사람 하나에 묶이는 자격. 그 계정에 연결된 모든 글에 통합니다. 관리 토큰과는 다른 축입니다.
MCP 표준 OAuth
클라이언트가 스스로 로그인 창을 띄워 자격을 받아 오는 표준 절차. 사용자는 브라우저에서 로그인하고 [허용]만 누르면 됩니다.
동의 화면
[허용]을 누르는 화면입니다. 어떤 클라이언트가 어떤 계정으로 무엇을 하려는지 보여줍니다 — 이 화면이 없으면 아무 사이트나 조용히 계정 권한을 가져갈 수 있어, 자동 승인은 일부러 하지 않습니다.
DCR (동적 클라이언트 등록)
클라이언트가 사람 손을 거치지 않고 스스로 “나는 이런 앱”이라고 등록하는 절차. 여러분이 할 일은 없고, 클라이언트가 알아서 합니다.
액세스 토큰 · 리프레시 토큰
로그인 결과로 클라이언트가 받아 보관하는 값. 액세스 토큰(7일)이 만료되면 리프레시 토큰(180일)으로 클라이언트가 조용히 갱신합니다.
slug · vid
slug는 글 하나를 가리키는 8글자 주소 조각(abcd1234), vid는 그 글의 지난 판 하나를 가리키는 값입니다. 도구가 응답에 실어 주므로 직접 만들 필요는 없습니다.

연결은 이렇게 이뤄집니다

“URL만 넣었는데 왜 로그인 창이 뜨지?”가 이 페이지에서 가장 많이 막히는 지점이라, 순서를 그림으로 둡니다. 2번의 거절이 3번의 로그인 창을 띄우는 신호입니다 — 서버가 익명 요청을 그냥 받아 주면 클라이언트는 로그인이 필요 없는 줄 알고 창을 아예 띄우지 않습니다.

MCP 연결 흐름 6단계 AI 도구에 주소를 등록하면, 클라이언트가 자격 없이 서버를 호출했다가 401 응답을 받고, 브라우저에서 구글 로그인과 허용을 거쳐 액세스 토큰 7일·리프레시 토큰 180일을 발급받은 뒤 도구 13종을 쓸 수 있게 됩니다. 1 AI 도구에 주소 등록 MCP 서버 URL 자리에 이 주소를 넣습니다. 설치할 것은 없습니다. 2 클라이언트가 연결 시도 아직 자격이 없는 첫 요청입니다. 3 서버가 “로그인 필요” 응답 이 응답을 받은 클라이언트가 브라우저를 엽니다. 4 브라우저에서 동의 구글 로그인 → 동의 화면에서 [허용]을 누릅니다. 5 토큰 발급 · 클라이언트가 보관 액세스 7일 · 리프레시 180일. 만료되면 자동으로 갱신됩니다. 6 도구 13종 사용 가능 게시 · 검색 · 편집 · 되돌리기를 대화로 시킬 수 있습니다.
OAuth 로 연결할 때의 순서입니다. API 키를 헤더로 등록해 두면 2~5단계가 통째로 생략되고 첫 호출부터 바로 도구가 열립니다.

클라이언트별 연결 방법

이럴 때 쓰세요 — 쓰는 AI 도구가 Claude Code가 아닐 때. 등록하는 자리와 파일 이름만 다르고, 넣는 값은 어디서나 같은 주소 하나입니다.

등록할 주소는 이것 하나입니다. 다른 값(포트·경로·토큰)은 필요 없습니다.

https://drophtml.app/mcp

Claude Code (CLI)

터미널에서 등록한 뒤, /mcp 명령으로 인증합니다.

claude mcp add --transport http drophtml https://drophtml.app/mcp

API 키를 쓴다면 등록할 때 헤더로 함께 실어 둡니다(그러면 /mcp 인증 단계가 필요 없습니다):

claude mcp add --transport http drophtml https://drophtml.app/mcp \
  --header "Authorization: Bearer dh_발급받은키"

Claude 데스크톱 · claude.ai (웹)

설정에서 커넥터(Connectors) 항목을 찾아 커스텀 커넥터 추가를 고르고, URL 자리에 위 주소를 넣습니다. 추가한 뒤 목록에서 [연결]을 누르면 구글 로그인 → 허용 화면이 뜹니다. 메뉴 이름은 버전에 따라 조금씩 다를 수 있으니, 원격 MCP 서버 URL 을 넣는 자리를 찾으면 됩니다.

Cursor

전역 설정은 ~/.cursor/mcp.json, 프로젝트별 설정은 그 프로젝트의 .cursor/mcp.json입니다.

{
  "mcpServers": {
    "drophtml": { "url": "https://drophtml.app/mcp" }
  }
}

VS Code (GitHub Copilot)

워크스페이스의 .vscode/mcp.json에 넣습니다.

{
  "servers": {
    "drophtml": { "type": "http", "url": "https://drophtml.app/mcp" }
  }
}

mcp.json 계열은 API 키를 headers로 함께 적을 수 있습니다 — 형식은 자격 두 가지에 있습니다.

그 밖의 MCP 클라이언트

이 서버는 Streamable HTTP 방식의 표준 원격 MCP 서버입니다. 쓰는 도구가 원격 MCP 서버를 지원한다면, 서버 URL 을 넣는 자리에 위 주소를 그대로 넣으면 됩니다. 등록 위치와 파일 형식은 도구마다 다르니 그 도구의 문서를 확인하세요(MCP 클라이언트 목록 ↗).

⚠️ 주소는 끝에 슬래시 없이 /mcp여야 합니다. /mcp/처럼 슬래시를 붙이면 다른 경로가 되어 연결되지 않습니다. 그리고 실행할 명령(command)이 아니라 URL을 넣는 자리입니다 — 설치해서 돌리는 로컬 서버가 아닙니다.

자격 두 가지 (OAuth · API 키)

이럴 때 쓰세요 — 로그인 방식을 고를 때. 연결 버튼이 있으면 OAuth, 없으면 API 키라고 생각하면 대체로 맞습니다.

이 서버는 로그인이 필수입니다. 그리고 에이전트가 게시하는 글은 로그인한 내 계정에 자동으로 연결되어, 웹의 마이페이지 “내 계정 글”에서 어느 기기에서든 관리할 수 있습니다. 로그인 방법은 두 가지입니다.

비교MCP 표준 OAuthAPI 키
준비할 것없음 (URL 등록 후 연결 버튼)마이페이지에서 키 발급 후 복사
어디에 넣나넣지 않음 — 클라이언트가 보관서버 등록 시 헤더
만료액세스 7일 · 리프레시 180일 (자동 갱신)없음 (직접 삭제·재발급할 때까지)
끊으려면클라이언트에서 커넥터 삭제마이페이지에서 키 삭제·재발급
쓸 수 있는 곳OAuth 를 지원하는 클라이언트커스텀 헤더를 넣을 수 있는 클라이언트

방법 1 · MCP 표준 OAuth (권장)

클라이언트가 알아서 로그인 창을 띄우는 방식입니다. URL 등록 → [연결] → 구글 로그인 → [허용]이 전부이고, 복사해 둘 키가 없습니다. 만료된 토큰도 클라이언트가 조용히 갱신하므로 평소에 신경 쓸 일이 없습니다(자세한 순서는 연결 흐름).

동의 화면에는 어떤 클라이언트가 어떤 계정으로 권한을 요청하는지가 표시됩니다. 내가 방금 등록한 그 도구가 맞는지 확인하고 누르세요 — 모르는 이름이면 거부하면 됩니다.

방법 2 · API 키 (헤더로 등록)

구글 로그인 후 마이페이지“MCP API 키 · 계정” 탭에서 키(dh_로 시작)를 발급받아, 서버를 등록할 때 헤더로 실어 둡니다. 그러면 이후 모든 호출에 자동으로 붙습니다. 헤더 이름은 Authorization: Bearer <키> 또는 X-Api-Key: <키> 둘 다 됩니다.

{
  "mcpServers": {
    "drophtml": {
      "url": "https://drophtml.app/mcp",
      "headers": { "Authorization": "Bearer dh_발급받은키" }
    }
  }
}
🔑 키는 발급할 때 한 번만 표시됩니다. 마이페이지에서 언제든 재발급·삭제할 수 있고, 재발급하면 이전 키는 즉시 무효가 됩니다 — 그 키를 넣어 둔 클라이언트는 다시 로그인 창을 띄우거나 오류를 냅니다. 헤더도 함께 갱신하세요.

도구 인자에도 api_key가 있지만, 그것은 이미 연결된 상태에서 글을 귀속할 계정을 바꾸는 오버라이드입니다 — 인자만으로는 연결(로그인)이 되지 않습니다. 자격은 언제나 헤더로 실립니다.

관리 토큰 (글 단위 열쇠)

이럴 때 쓰세요 — 계정과 상관없이 그 글 하나만 고치고 지울 수 있게 해 두고 싶을 때. 다른 사람에게 넘겨도 그 글에만 통합니다.

게시하면 그 글 전용 관리 토큰(deleteToken)관리 링크(manageUrl)가 응답에 한 번만 담깁니다. 웹에서 발급되는 관리 링크와 같은 열쇠입니다.

계정 자격과는 축이 다릅니다. 편집·삭제 게이트는 둘 중 하나만 있으면 통과합니다.

관리 토큰계정 자격 (OAuth · API 키)
범위하나그 계정에 연결된 모든 글
받는 때게시 응답에 1회연결(로그인)할 때
잃어버리면재발급 불가다시 로그인·재발급 가능
쓰는 자리도구 인자 manage_token서버 등록 헤더
💡 MCP로 게시한 글은 연결한 계정에 자동으로 연결되므로, 토큰을 잃어도 같은 계정으로 연결돼 있으면 계속 편집·삭제할 수 있습니다(웹에서는 구글 로그인 후 마이페이지 “내 계정 글”). 관리 토큰은 그 계정 밖에서도 관리하고 싶을 때 필요합니다 — 발급 직후 저장해 두세요.

이렇게 말해보세요

외울 명령어는 없습니다. 평소처럼 말하면 에이전트가 알맞은 도구를 고릅니다. 아래는 실제로 도구 호출로 이어지는 말투들입니다.

만들기

  • “이 HTML을 DropHTML에 올리고 링크 줘” → create_share
  • “지금 만든 리포트를 마크다운으로 올려줘” → create_share (content_type이 마크다운으로)
  • “링크 아는 사람만 보게 unlisted로 올려줘” · “비밀번호 걸어서 올려줘”
  • “제목은 ‘2분기 요약’, 태그는 report, chart 로 해줘”

고치기

  • “방금 올린 글 제목만 바꿔줘” → update_share (지정한 것만 바뀌고 나머지는 그대로)
  • “그 페이지 본문을 이 내용으로 갈아줘”
  • “비밀번호 지워줘” → clear_password
  • “그 글 지워줘” → delete_share (되돌릴 수 없습니다)

찾기

  • “css 태그 붙은 공개 글 찾아줘” · “최근에 올라온 것부터 보여줘” → search_shares
  • “요즘 많이 쓰이는 태그 뭐야?” → popular_tags
  • “내 계정으로 올린 글 목록 보여줘” → list_my_shares (링크 공유·비밀번호 글까지 포함)
  • “그 페이지 원본 소스 좀 가져와” → get_share

통계 보기

  • “이 페이지 최근 일주일 조회수 어때?” → get_daily_views
  • “지난 90일치로 다시 보여줘” (1~365일)
  • “내 계정에 글이 몇 개나 있어?” → get_my_info

되돌리기

  • “이 글 수정 이력 보여줘” → list_share_versions
  • “어제 저장한 버전 내용 좀 보여줘” → get_share_version
  • “그 버전으로 되돌려줘” → restore_share_version
💡 되돌리기는 취소가 아니라 새 저장입니다. 되돌리기 직전 내용도 이력에 남으므로, 잘못 되돌렸어도 다시 원래대로 올 수 있습니다. 되돌려도 공개 범위와 비밀번호는 지금 설정 그대로 유지됩니다 — 되돌리기 때문에 링크 공유 글이 갑자기 공개되는 일은 없습니다.

도구 13종

연결하면 아래 13가지가 열립니다(인자 전체와 상세 스키마는 클라이언트가 자동으로 보여 줍니다). 모든 호출은 로그인한 뒤에만 가능하고, 표의 “자격”은 그 위에 추가로 필요한 것입니다.

읽기 전용 9종

도구하는 일 · 돌려주는 것주요 인자자격
search_shares공개 글을 제목·태그로 검색. 목록과 총 개수를 돌려주고 본문은 포함하지 않습니다query, sort(popular·recent), limit(최대 48), offset추가 자격 없음
get_share글 하나의 원본 본문과 메타데이터slug, manage_token공개·링크 공유는 없음 / 비밀번호 글은 작성자
list_share_versions본문 수정 이력 목록(최신순). 각 항목의 vid·저장 시각·크기 등, 본문은 미포함slug, limit(최대 100), offset, manage_token작성자
get_share_version지난 판 1건 — 그 시점의 본문 원본까지slug, vid, manage_token작성자
get_daily_views그 글의 날짜별 방문 수와 누적 조회수slug, days(1~365, 기본 30)추가 자격 없음
popular_tags공개 글에서 많이 쓰인 태그 목록없음추가 자격 없음
site_stats사이트 전체 집계(호스팅 중인 페이지 수·총 조회수)없음추가 자격 없음
get_my_info지금 연결된 계정(이메일·이름·가입 시각·소유 글 수)api_key(다른 계정을 볼 때만)연결 계정
list_my_shares내 계정에 연결된 글 목록(최신순) — 링크 공유·비밀번호 글 포함, 본문은 미포함limit(최대 100), offset연결 계정

쓰기 3종

도구하는 일 · 돌려주는 것주요 인자자격
create_share새 글 게시. 공유 링크(linkslug·관리 토큰·관리 링크를 돌려줍니다(토큰은 이 응답에만)content(최대 2MB), title, tags, content_type(html·markdown), visibility(public·unlisted), password연결 계정 (글이 그 계정에 귀속)
update_share글 편집 — 넘긴 필드만 바뀌고 나머지는 그대로. 본문이 실제로 바뀐 편집은 직전 내용을 이력에 남깁니다slug, content, title, tags, visibility, password, clear_password, manage_token작성자
restore_share_version그 판의 본문으로 되돌리기(앞으로 감기 — 직전 내용도 이력에 남습니다). 공개 범위·비밀번호는 현재값 유지slug, vid, manage_token작성자

파괴적 1종

도구하는 일 · 돌려주는 것주요 인자자격
delete_share글 삭제. 본문·수정 이력·달린 댓글·방문 통계가 함께 사라지고 되돌릴 수 없습니다slug, manage_token, reason, admin_token작성자 (운영자는 admin_token 인자)

운영자 권한은 인자로만 들어옵니다. admin_token은 신고를 받은 운영자가 글을 내리는 통로이고, 서버가 자기 설정값을 알아서 쓰는 일은 없습니다 — 그랬다면 이 공개 엔드포인트에서 누구나 남의 글을 지울 수 있게 됩니다.

🕘 이력 도구는 읽기 2 + 되돌리기 1이고, 삭제가 없습니다. 지난 판 개별 삭제이력 전체 공개 토글은 웹 편집 화면에만 둡니다 — 되돌릴 수 없는 영구 삭제와 “이 글의 모든 과거를 방문자에게 연다”는 정책 전환은 사람이 화면에서 확인하고 누르는 편이 안전하고, 에이전트가 자율적으로 부를 표면을 넓히지 않기 위해서입니다.

문제 해결

실제로 자주 걸리는 것들입니다. 대부분은 고장이 아니라 자격(로그인) 문제입니다.

로그인 창이 자꾸 다시 뜬다

— 이 서버는 자격이 없거나 만료·무효면 “로그인이 필요하다”고 되돌려 주고, 그 응답이 곧 로그인 창입니다. 액세스 토큰은 7일, 리프레시 토큰은 180일이면 만료되고, API 키는 재발급하는 순간 이전 키가 무효가 됩니다.
어떻게 — OAuth 라면 클라이언트에서 그 서버를 다시 연결(재인증)하세요. API 키라면 마이페이지에서 키 상태를 확인하고, 재발급했다면 클라이언트 설정의 헤더 값을 새 키로 바꾸세요.

연결은 됐는데 도구가 하나도 안 보인다

— 세 가지 중 하나입니다. ① 등록만 하고 인증을 끝내지 않았다(가장 흔합니다) ② 주소가 /mcp가 아니거나 끝에 슬래시가 붙었다 ③ 그 클라이언트가 원격 MCP 서버(Streamable HTTP)를 지원하지 않는다.
어떻게 — 먼저 클라이언트의 MCP 서버 목록에서 상태가 “연결됨”인지 확인하고, 아니라면 연결/인증을 다시 실행하세요. 주소는 클라이언트별 연결 방법의 값을 복사 버튼으로 그대로 넣는 것이 가장 안전합니다.

“관리 토큰이 필요하다”는 응답이 온다

— 그 글이 지금 연결된 계정의 글이 아니기 때문입니다. 웹에서 로그인 없이 만든 글, 또는 다른 계정으로 만든 글이 여기 해당합니다. 계정에 연결되지 않은 글은 관리 토큰이 유일한 열쇠입니다.
어떻게 — 게시할 때 받은 관리 토큰을 manage_token으로 넘기세요. 웹에서 만든 내 글이라면 마이페이지에서 “내 계정에 연결”로 계정에 붙여 두면, 그 뒤로는 토큰 없이도 됩니다.

관리 토큰을 잃어버렸다

— 관리 토큰은 게시 응답에 한 번만 담기고, 서버는 그 값을 그대로 보관하지 않아 다시 발급할 수 없습니다.
어떻게 — 그 글이 계정에 연결돼 있다면 애초에 토큰이 필요 없습니다(마이페이지 “내 계정 글”). 계정에 연결되지 않은 글이라면, 그 글을 만든 브라우저의 마이페이지 목록에 남아 있는 편집 버튼이 마지막 경로입니다.

“too many uploads / too many edits”가 뜬다

— 짧은 시간에 너무 많이 만들거나 고쳤을 때 걸리는 속도 제한입니다. 같은 IP 기준으로 게시는 1분에 10회, 편집·되돌리기는 1분에 20회입니다. 웹과 MCP 가 같은 한도를 나눠 쓰므로 도구로 바꿔 우회할 수는 없습니다.
어떻게1분 기다렸다가 다시 시키면 됩니다. 에이전트에게 여러 건을 한꺼번에 시키는 중이었다면 나눠서 요청하세요.

비밀번호를 건 글을 읽지 못한다

— 비밀번호 글의 원본은 작성자만 읽을 수 있습니다. 공개·링크 공유 글은 자격 없이 읽히지만, 비밀번호 글은 get_share에서 막힙니다.
어떻게manage_token을 함께 넘기거나, 그 글이 연결된 계정으로 연결하세요. 참고로 도구에 비밀번호 자체를 넘겨 여는 통로는 없습니다 — 비밀번호는 방문자용 잠금이고, 작성자 자격과는 다른 것입니다.

개발자용

프로토콜. 이 엔드포인트는 MCP Streamable HTTP 표준입니다(stateless, JSON 응답 — 세션 협상도 SSE 스트림도 없습니다). 인증이 필수라 자격증명이 없거나 무효인 요청은 401 + WWW-Authenticate(resource_metadata)로 응답하고, 이 응답이 OAuth 지원 클라이언트의 연결 화면을 띄웁니다. 같은 URL 의 브라우저 GET(Accept 에 text/event-stream 이 없는 GET)은 지금 이 가이드 페이지를 돌려줍니다.

API 키가 있으면 세션 협상 없이 요청 하나로 바로 호출할 수 있습니다:

curl -X POST https://drophtml.app/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'Authorization: Bearer dh_발급받은키' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

OAuth 인가 서버

MCP 인가 스펙(OAuth 2.1 — Authorization Code + PKCE + 동적 클라이언트 등록)을 그대로 따릅니다. 클라이언트는 보호 리소스 메타데이터(/.well-known/oauth-protected-resource/mcp)에서 인가 서버를 찾고, /register로 스스로 등록한 뒤 /authorize → 동의 → /token 순서로 진행합니다.

  • 동의는 자동 승인하지 않습니다. /authorize는 코드를 바로 주지 않고 웹 로그인 + 사람의 [허용]을 요구합니다.
  • 액세스 토큰 7일 · 리프레시 토큰 180일이고, 리프레시는 교환할 때마다 회전합니다(이전 것 즉시 무효).
  • 인가 코드는 5분·1회용, 동의 대기 트랜잭션은 10분입니다.
  • 등록(/register)은 스펙대로 인증이 없어 IP 당 1분에 5회로 제한합니다.

한도·정책

  • 본문은 글 하나당 최대 2MB, 제목은 120자까지, 태그는 앞에서부터 4개까지 저장됩니다.
  • 목록 상한: 검색 48건, 내 글·이력 100건(그 이상을 넘겨도 잘립니다).
  • 속도 제한(IP 기준): 게시 10회/분, 편집·되돌리기 20회/분. 웹 REST 와 같은 한도를 공유합니다.
  • 비밀번호를 걸면 공개 범위는 자동으로 링크 공유가 됩니다.

용량·보관 기간 등 서비스 전반의 제한과 정책은 도움말을 참고하세요.

자주 묻는 질문

AI 에이전트에서 DropHTML에 바로 게시할 수 있나요?
네. DropHTML은 원격 MCP 서버를 내장합니다. Claude Code·Claude 데스크톱·Cursor 같은 MCP 지원 도구에 https://drophtml.app/mcp URL을 등록하고 한 번 로그인하면, 에이전트가 대화 중에 페이지를 게시·검색·편집하고 공유 링크를 바로 돌려줍니다.
MCP 연결에 설치가 필요한가요?
설치할 것은 없습니다. Streamable HTTP 표준을 지원하는 MCP 클라이언트에 URL을 등록하고 한 번 로그인하면 됩니다. 예를 들어 Claude Code는 claude mcp add --transport http drophtml … 로 등록한 뒤 /mcp 명령으로 인증합니다.
OAuth와 API 키 중 무엇을 써야 하나요?
클라이언트가 MCP 표준 OAuth를 지원하면 OAuth가 더 쉽습니다 — URL만 등록하고 연결 버튼을 누르면 브라우저에서 구글 로그인 후 허용하는 것으로 끝이고, 복사해 둘 키가 없으며 만료된 토큰은 클라이언트가 자동으로 갱신합니다. OAuth를 지원하지 않는 클라이언트에서는 마이페이지에서 API 키(dh_로 시작)를 발급받아 서버 등록 시 헤더로 실어 둡니다.
에이전트가 올린 글은 나중에 어떻게 편집·삭제하나요?
MCP로 게시한 글은 연결된 계정에 자동으로 연결되므로, 같은 계정으로 연결돼 있으면 관리 토큰 없이 그대로 편집·삭제할 수 있습니다. 웹에서는 구글 로그인 후 마이페이지의 “내 계정 글”에서 관리합니다. 게시 응답에 한 번만 담기는 관리 토큰으로도 계정과 무관하게 관리할 수 있습니다.
관리 토큰과 계정 자격은 무엇이 다른가요?
축이 다릅니다. 관리 토큰은 글 하나에만 통하는 열쇠로 게시 응답에 한 번만 담기고, 계정 자격(OAuth 토큰 또는 API 키)은 그 계정에 연결된 모든 글에 통하는 사람 단위 자격입니다. 편집·삭제 게이트는 둘 중 하나만 있으면 통과합니다.
에이전트가 지운 글을 되살릴 수 있나요?
글 삭제는 되돌릴 수 없습니다 — 본문·수정 이력·댓글·방문 통계가 함께 사라집니다. 반면 본문을 잘못 고친 것은 되돌릴 수 있습니다. 본문을 바꾸는 편집마다 직전 내용이 이력에 남고, restore_share_version 도구나 웹 편집 화면에서 그 시점으로 되돌릴 수 있습니다.
로그인 창이 계속 다시 뜨거나 도구가 보이지 않습니다.
이 서버는 로그인이 필수라 자격이 없거나 만료되면 “로그인이 필요하다”고 되돌려 주고, 그 응답이 클라이언트의 로그인 창을 띄웁니다. 액세스 토큰은 7일, 리프레시 토큰은 180일 뒤 만료되며 API 키를 재발급하면 이전 키는 즉시 무효가 됩니다. 클라이언트에서 서버를 다시 연결하거나 새 키로 헤더를 갱신하세요. 도구가 아예 보이지 않는다면 인증이 끝나지 않았거나 주소가 틀린 경우가 대부분입니다 — 주소는 끝에 슬래시 없이 /mcp 여야 합니다(문제 해결).
비밀번호를 건 글을 에이전트가 읽지 못합니다.
의도된 동작입니다. 비밀번호 글의 원본은 작성자만 읽을 수 있어, get_share에 관리 토큰을 넘기거나 그 글이 연결된 계정으로 연결돼 있어야 합니다. 공개·링크 공유 글은 자격 없이 읽힙니다.
다른 사람의 글도 볼 수 있나요?
공개 글은 검색으로 찾고 원본까지 읽을 수 있습니다. 링크 공유(unlisted) 글은 목록·검색에 나오지 않지만 주소(slug)를 알면 읽을 수 있고, 비밀번호 글은 작성자만 읽습니다. 편집·삭제는 언제나 작성자 자격이 있어야 합니다.
연결을 끊으려면 어떻게 하나요?
클라이언트에서 그 MCP 서버(커넥터)를 삭제하면 더 이상 호출되지 않습니다. API 키로 연결했다면 마이페이지에서 키를 삭제하세요 — 그 순간 그 키로는 아무것도 할 수 없습니다. OAuth 로 발급된 토큰은 액세스 7일·리프레시 180일이 지나면 만료됩니다.
운영자 토큰(admin_token)은 뭔가요?
신고를 받은 서비스 운영자가 문제되는 글을 내릴 때 쓰는 인자입니다. 일반 사용자에게는 해당하지 않고, 서버가 자기 설정값을 알아서 쓰는 일도 없습니다 — 그랬다면 공개 엔드포인트에서 누구나 남의 글을 지울 수 있게 됩니다.
AI AGENT INTEGRATION · MCP

One URL, and your AI publishes directly

DropHTML has a built-in remote MCP (Model Context Protocol) server. Register this address (https://drophtml.app/mcp) with your AI tool, sign in once, and your agent can publish its HTML or Markdown mid-conversation and hand you the share link. Nothing to install, no server to run.

Connect in five minutes

If this is your first time, these four steps are all you need. The example is Claude Code; other tools are in Connecting your client.

  1. Register the server. One line in your terminal. drophtml is just the local name you will refer to it by — change it if you like.
    claude mcp add --transport http drophtml https://drophtml.app/mcp
  2. Sign in (connect). Run /mcp in Claude Code and authenticate drophtml; a browser opens. Sign in with Google, press Allow, and you are done — there is no key to copy.
  3. Just ask for something. Say “publish this HTML to DropHTML” and the agent publishes it and hands back the share link. More phrasings in Just ask.
  4. Keep the manage token it returns. The publish response carries a per-page manage tokenonly once. You do not need it while connected as the owning account, but save it if you also want to manage the page outside that account (Manage token).
⚠️ This server requires sign-in. If you register but skip authentication, no tools show up at all — that is not a failure, it just means you have not signed in yet (Troubleshooting).

Glossary

The words that keep coming up on this page. Get these and the rest reads easily.

MCP (Model Context Protocol)
A common protocol that lets AI tools call features of outside services. It standardises how a service advertises its tools and how they are invoked, so nobody has to build a per-service plugin.
MCP server
The side that offers the tools. DropHTML's MCP server is already running on our side — you only register its address. There is nothing to install or launch.
MCP client
The AI tool that calls those tools: Claude Code, Claude desktop, Cursor, VS Code, and so on.
Streamable HTTP
One of the ways MCP talks to a remote server (a single HTTP request per exchange). It is what this server speaks, so your client has to support it too.
Tool
One callable capability. They have names like create_share (publish) or search_shares (search); connecting opens 13 of them.
Manage token (deleteToken)
The edit/delete key for one page. It appears in the publish response only once, and it is the same key as the manage link issued on the web.
Account credential (OAuth token · API key)
A credential tied to a person. It works on every page linked to that account — a different axis from the manage token.
MCP standard OAuth
The standard flow in which the client raises the sign-in window itself. All you do is sign in and press Allow.
Consent screen
The screen with that Allow button. It names the client and the account involved — without it any site could quietly take account access, which is why nothing is auto-approved here.
DCR (dynamic client registration)
How a client registers itself (“I am this app”) without a human doing it. There is nothing for you to do; the client handles it.
Access token · refresh token
What the client receives and stores after sign-in. When the access token (7 days) expires, the client silently renews it with the refresh token (180 days).
slug · vid
slug is the 8-character id of a page (abcd1234); vid identifies one saved version of it. Tools hand both back to you — you never have to make them up.

How connecting works

“I only pasted a URL — why is it asking me to sign in?” is where people get stuck most, so here is the order of events. The refusal in step 2 is what triggers the sign-in window in step 3 — if the server quietly accepted anonymous requests, the client would assume no sign-in was needed and never open one.

The six steps of connecting over MCP You register the address in an AI tool; the client calls the server without a credential, receives a 401, opens a browser for Google sign-in and consent, receives an access token good for 7 days and a refresh token good for 180 days, and can then use all 13 tools. 1 Register the address Paste it wherever the tool asks for an MCP server URL. No install. 2 The client calls the server Its first request has no credential. 3 The server says “sign in” Getting that answer is what makes the client open a browser. 4 Approve in the browser Sign in with Google, then press Allow on the consent screen. 5 Tokens issued and stored Access 7 days · refresh 180 days, renewed automatically. 6 All 13 tools available Publish, search, edit and restore, all from the conversation.
This is the OAuth path. With an API key set as a header, steps 2–5 disappear entirely and the tools are available from the very first call.

Connecting your client

Use this when — your AI tool is not Claude Code. Only the place you paste it and the file name differ; the value is the same single address everywhere.

This is the only address to register. No other value (port, path, token) is needed.

https://drophtml.app/mcp

Claude Code (CLI)

Register it in your terminal, then authenticate with the /mcp command.

claude mcp add --transport http drophtml https://drophtml.app/mcp

Using an API key instead? Pass it as a header at registration time and the /mcp authentication step is unnecessary:

claude mcp add --transport http drophtml https://drophtml.app/mcp \
  --header "Authorization: Bearer dh_your_key"

Claude desktop · claude.ai (web)

In settings, find Connectors, choose add a custom connector, and paste the address above into the URL field. Then press Connect in the list to get the Google sign-in and consent screens. Menu wording shifts between versions — look for the field that takes a remote MCP server URL.

Cursor

Global config lives in ~/.cursor/mcp.json; per-project config in that project's .cursor/mcp.json.

{
  "mcpServers": {
    "drophtml": { "url": "https://drophtml.app/mcp" }
  }
}

VS Code (GitHub Copilot)

Put this in your workspace's .vscode/mcp.json.

{
  "servers": {
    "drophtml": { "type": "http", "url": "https://drophtml.app/mcp" }
  }
}

mcp.json-style clients can carry an API key in headers — the shape is in Two credentials.

Any other MCP client

This is a standard remote MCP server over Streamable HTTP. If your tool supports remote MCP servers, paste the address above wherever it asks for the server URL. Where that setting lives differs per tool, so check its documentation (list of MCP clients ↗).

⚠️ The address is /mcp with no trailing slash. /mcp/ is a different path and will not connect. Also note this is a field for a URL, not a command to run — there is no local server to install.

Two credentials (OAuth · API key)

Use this when — deciding how to sign in. Rule of thumb: if there is a Connect button, use OAuth; if there is not, use an API key.

This server requires sign-in. Pages your agent publishes are automatically linked to your account, so you can manage them from any device under “My account pages” in My Pages. There are two ways to sign in.

ComparisonMCP standard OAuthAPI key
What you prepareNothing — register the URL, press ConnectIssue a key in My Pages, copy it
Where it goesNowhere — the client keeps itA header at registration time
ExpiryAccess 7 days · refresh 180 days (auto-renewed)None, until you delete or regenerate it
To disconnectRemove the connector in your clientDelete or regenerate the key in My Pages
Works withClients that support OAuthClients that let you set custom headers

Option 1 · MCP standard OAuth (recommended)

The client raises the sign-in window for you. Register the URL → Connect → sign in with Google → Allow, and that is all; there is no key to copy. Expired tokens are renewed silently, so there is nothing to keep track of day to day (see how connecting works).

The consent screen names which client is asking and which account it would act as. Check that it is the tool you just registered — if the name is unfamiliar, deny it.

Option 2 · API key (as a header)

Sign in with Google, issue a key (it starts with dh_) under the “MCP API key · Account” tab in My Pages, and set it as a header when registering the server. It then applies to every call automatically. Either header name works: Authorization: Bearer <key> or X-Api-Key: <key>.

{
  "mcpServers": {
    "drophtml": {
      "url": "https://drophtml.app/mcp",
      "headers": { "Authorization": "Bearer dh_your_key" }
    }
  }
}
🔑 The key is shown only once, at issue time. You can regenerate or delete it anytime in My Pages, and regenerating invalidates the previous key immediately — any client still holding it will start prompting for sign-in or erroring out. Update the header too.

There is also an api_key tool argument, but it is an override that attributes a call to a different account while already connected — on its own it is not a credential. Credentials always travel in the header.

Manage token (a per-page key)

Use this when — you want one specific page to be editable and deletable regardless of accounts. Hand it to someone else and it still only opens that one page.

Publishing returns a per-page manage token (deleteToken) and manage link (manageUrl)only once. It is the same key as the manage link issued on the web.

It is a different axis from the account credential. The edit/delete gate passes if you have either one.

AxisManage tokenAccount credential (OAuth · API key)
ScopeOne pageEvery page linked to the account
When you get itOnce, in the publish responseWhen you connect (sign in)
If you lose itCannot be reissuedSign in again or regenerate
Where it goesThe manage_token argumentA header at registration time
💡 Pages published over MCP are linked to the connected account automatically, so even if the token is lost you can keep editing and deleting them while connected as that account (on the web: sign in with Google and use “My account pages”). The manage token is what you need when you also want to manage the page outside that account — save it right after publishing.

Just ask

There are no commands to memorise. Talk normally and the agent picks the right tool. These phrasings actually lead to tool calls.

Creating

  • “Publish this HTML to DropHTML and give me the link” → create_share
  • “Put that report up as Markdown” → create_share with content_type markdown
  • “Publish it unlisted so only people with the link can see it” · “Put a password on it”
  • “Title it ‘Q2 summary’ and tag it report, chart”

Editing

  • “Change only the title of the page I just posted” → update_share (unspecified fields keep their values)
  • “Replace that page's body with this”
  • “Remove the password” → clear_password
  • “Delete that page” → delete_share (cannot be undone)

Finding

  • “Find public pages tagged css” · “Show me the newest ones first” → search_shares
  • “What tags are popular right now?” → popular_tags
  • “List the pages on my account” → list_my_shares (unlisted and password-protected included)
  • “Fetch that page's original source” → get_share

Stats

  • “How many views did this page get last week?” → get_daily_views
  • “Show me the last 90 days instead” (1–365 days)
  • “How many pages do I have on my account?” → get_my_info

Undoing

  • “Show me this page's revision history” → list_share_versions
  • “What did the version I saved yesterday say?” → get_share_version
  • “Roll it back to that version” → restore_share_version
💡 Restoring is a new save, not an undo. The body from just before the restore is kept as a version too, so a wrong restore can itself be undone. And restoring keeps visibility and the password exactly as they are now — a rollback never turns an unlisted page public.

The 13 tools

Connecting opens the thirteen tools below (clients show the full argument list and schemas automatically). Every call requires being signed in; the “Credential” column is what is needed on top of that.

Read-only — 9

ToolWhat it does · returnsKey argumentsCredential
search_sharesSearch public pages by title or tag. Returns the list and a total; bodies are not includedquery, sort (popular·recent), limit (max 48), offsetNothing extra
get_shareOne page's original source plus metadataslug, manage_tokenNone for public/unlisted / author for password-protected
list_share_versionsSaved body versions, newest first — each with its vid, timestamp and size; bodies not includedslug, limit (max 100), offset, manage_tokenAuthor
get_share_versionOne saved version, including the body source it held thenslug, vid, manage_tokenAuthor
get_daily_viewsThat page's daily visit counts and total viewsslug, days (1–365, default 30)Nothing extra
popular_tagsTags used most across public pagesNoneNothing extra
site_statsSite-wide totals (pages hosted, total views)NoneNothing extra
get_my_infoThe account you are connected as (email, name, created, pages owned)api_key (only to inspect another account)Connected account
list_my_sharesPages linked to your account, newest first — unlisted and password-protected included, bodies not includedlimit (max 100), offsetConnected account

Writing — 3

ToolWhat it does · returnsKey argumentsCredential
create_sharePublish a new page. Returns the share link, slug, manage token and manage link (the token appears in this response only)content (max 2MB), title, tags, content_type (html·markdown), visibility (public·unlisted), passwordConnected account (the page is linked to it)
update_shareEdit a page — only the fields you pass change. An edit that actually changes the body keeps the previous one as a versionslug, content, title, tags, visibility, password, clear_password, manage_tokenAuthor
restore_share_versionRestore a page to that version's body (a fast-forward — the pre-restore body is kept too). Visibility and password keep their current valuesslug, vid, manage_tokenAuthor

Destructive — 1

ToolWhat it does · returnsKey argumentsCredential
delete_shareDelete a page. The body, its revision history, its comments and its view stats all go with it, irreversiblyslug, manage_token, reason, admin_tokenAuthor (operators pass admin_token)

Operator power only ever arrives as an argument. admin_token is how an operator acts on a report; the server never reaches for its own configured value — if it did, anyone could delete anyone's page through this public endpoint.

🕘 The history tools are two reads plus one restore — there is no delete. Deleting an individual version and making a whole history public are web-only, on the edit screen: a permanent deletion and a policy switch that opens every past version to visitors are safer as things a person confirms on screen, and they are not a surface an agent should be able to reach on its own.

Troubleshooting

The things that actually go wrong. Most of them are not failures — they are credentials.

The sign-in window keeps coming back

Why — with no credential, or an expired or invalid one, the server answers “sign in required”, and that answer is the sign-in window. Access tokens last 7 days, refresh tokens 180 days, and regenerating an API key invalidates the old one immediately.
What to do — on OAuth, reconnect (re-authenticate) the server in your client. On an API key, check its state in My Pages and, if you regenerated it, update the header in your client config.

It says connected, but no tools appear

Why — one of three things: ① you registered it but never finished authenticating (by far the most common) ② the address is not /mcp, or has a trailing slash ③ the client does not support remote MCP servers over Streamable HTTP.
What to do — check that the server shows as connected in your client's MCP list and re-run its connect/authenticate action if not. Safest is to paste the address with the copy button in Connecting your client.

A tool answers “manage token required”

Why — that page is not owned by the account you are connected as: it was made on the web without signing in, or under a different account. For a page not linked to an account, the manage token is the only key.
What to do — pass the manage token you received at publish time as manage_token. If it is your own page made on the web, use “Link to my account” in My Pages and you will not need the token again.

I lost the manage token

Why — it is returned once and the server does not keep the plain value, so it cannot be reissued.
What to do — if the page is linked to your account you never needed it (“My account pages”). If it is not, the remaining route is the Edit button in My Pages in the browser that created it.

“too many uploads” / “too many edits”

Why — a rate limit for creating or editing too fast. Per IP it is 10 publishes per minute and 20 edits or restores per minute. The web and MCP share the same budget, so switching to tools does not get around it.
What to dowait a minute and ask again. If you were having the agent do a batch, split it into smaller runs.

A password-protected page will not open

Why — the source of a password-protected page is author-only. Public and unlisted pages read fine without credentials; password-protected ones are refused by get_share.
What to do — pass manage_token, or connect as the account the page belongs to. Note there is no way to pass the password itself to a tool — the password is a visitor-facing lock, which is a different thing from author credentials.

For developers

Protocol. This endpoint speaks the MCP Streamable HTTP standard (stateless, JSON responses — no session negotiation and no SSE stream). Authentication is required, so requests with missing or invalid credentials get 401 + WWW-Authenticate (resource_metadata), which is what raises the connect screen in capable clients. A browser GET to the same URL (a GET without text/event-stream in Accept) returns this guide page.

With an API key, one request works with no session negotiation:

curl -X POST https://drophtml.app/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'Authorization: Bearer dh_your_key' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

OAuth authorization server

It follows the MCP authorization spec (OAuth 2.1 — authorization code + PKCE + dynamic client registration). Clients discover the authorization server from the protected-resource metadata at /.well-known/oauth-protected-resource/mcp, register themselves at /register, then go through /authorize → consent → /token.

  • Consent is never auto-approved. /authorize does not hand out a code; it requires a web sign-in and a human pressing Allow.
  • Access tokens last 7 days, refresh tokens 180 days, and refresh tokens rotate on every exchange (the previous one dies immediately).
  • Authorization codes are single-use and last 5 minutes; a pending consent transaction lasts 10 minutes.
  • Registration (/register) is unauthenticated per spec, so it is capped at 5 per minute per IP.

Limits and policy

  • Bodies are capped at 2MB per page; titles are stored up to 120 characters and the first 4 tags are kept.
  • List caps: search 48, your own pages and version history 100 (anything larger is clamped).
  • Rate limits (per IP): 10 publishes/min, 20 edits or restores/min. Shared with the web REST API.
  • Setting a password forces visibility to unlisted.

For service-wide limits (size, retention) and policies, see Help.

FAQ

Can my AI agent publish to DropHTML directly?
Yes. DropHTML has a built-in remote MCP server. Register https://drophtml.app/mcp in an MCP-capable tool such as Claude Code, Claude desktop or Cursor, sign in once, and your agent can publish, search and edit pages mid-conversation and hand back the share link.
Do I need to install anything?
No. Register the URL in any MCP client that supports Streamable HTTP and sign in once. Claude Code, for example, registers it with claude mcp add --transport http drophtml … and then authenticates with the /mcp command.
Should I use OAuth or an API key?
If your client supports MCP standard OAuth, that is easier — register the URL, press Connect, sign in with Google and approve; there is no key to copy and expired tokens are renewed automatically. For clients without OAuth, issue an API key (it starts with dh_) in My Pages and set it as a header when registering the server.
How do I edit or delete what the agent published?
Pages published over MCP are linked to the connected account, so while connected as that account you can edit and delete them with no manage token. On the web, sign in with Google and use “My account pages”. The manage token returned once at publish time also works, independently of any account.
What is the difference between a manage token and an account credential?
They are different axes. The manage token is a key to one page and appears once in the publish response; an account credential (OAuth token or API key) is a per-person credential that works on every page linked to that account. The edit/delete gate passes if you have either one.
Can a page the agent deleted be recovered?
No — deleting a page is irreversible, and the body, revision history, comments and view stats go with it. A bad edit, though, is recoverable: every edit that changes the body keeps the previous one as a version, and restore_share_version (or the web edit screen) rolls back to it.
Sign-in keeps reappearing, or I see no tools.
This server requires sign-in, so a missing or expired credential is answered with “sign in required” — and that answer is what raises the client's sign-in window. Access tokens expire after 7 days, refresh tokens after 180, and regenerating an API key invalidates the old one at once. Reconnect the server in your client, or update the header with the new key. If no tools appear at all, authentication usually did not finish or the address is wrong — it must be /mcp with no trailing slash (see Troubleshooting).
My agent cannot read a password-protected page.
That is intended. The source of a password-protected page is author-only, so get_share needs the manage token, or a connection as the account that owns it. Public and unlisted pages read without credentials.
Can I read other people's pages?
Public pages are searchable and readable, including their source. Unlisted pages do not appear in listings or search but can be read if you know the slug; password-protected pages are author-only. Editing and deleting always require author credentials.
How do I disconnect?
Remove the MCP server (connector) in your client and it stops being called. If you connected with an API key, delete the key in My Pages — from that moment the key can do nothing. Tokens issued over OAuth expire on their own: 7 days for access, 180 for refresh.
What is admin_token for?
It is how a service operator takes down a reported page. It does not apply to normal users, and the server never uses its own configured value on its own — if it did, anyone could delete anyone's page through this public endpoint.