URL 하나로, AI가 바로 게시합니다
DropHTML은 원격 MCP(Model Context Protocol) 서버를 내장합니다. 지금 보고 있는 이 주소(https://drophtml.app/mcp)를 AI 도구에 등록하고 한 번 로그인하면, 에이전트가 만든 HTML·마크다운을 대화 중에 게시하고 공유 링크를 바로 받아옵니다. 설치할 것도, 서버를 띄울 것도 없습니다.
5분 안에 연결하기
처음이라면 이 네 단계면 끝입니다. 아래는 Claude Code 기준이고, 다른 도구는 클라이언트별 연결 방법에 있습니다.
- 서버를 등록합니다.
터미널에서 아래 한 줄이면 됩니다.
drophtml은 내 컴퓨터에서 부를 이름이라 원하는 대로 바꿔도 됩니다.claude mcp add --transport http drophtml https://drophtml.app/mcp - 로그인(연결)합니다.
Claude Code 에서
/mcp명령을 실행해drophtml을 인증하면 브라우저가 열립니다. 구글로 로그인하고 [허용]을 누르면 끝입니다 — 복사해 둘 키가 없습니다. - 말로 시켜 봅니다. “이 HTML을 DropHTML에 올려줘”라고 하면 에이전트가 게시하고 공유 링크를 돌려줍니다. 더 많은 예시는 이렇게 말해보세요에 있습니다.
- 돌아온 관리 토큰을 챙깁니다. 게시 응답에 그 글 전용 관리 토큰이 한 번만 담깁니다. 계정에 연결돼 있으면 없어도 관리되지만, 계정 밖에서도 고칠 생각이라면 저장해 두세요(관리 토큰).
용어 풀이
이 페이지에 반복해서 나오는 말들입니다. 여기만 알면 나머지는 술술 읽힙니다.
- 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번의 로그인 창을 띄우는 신호입니다 — 서버가 익명 요청을 그냥 받아 주면 클라이언트는 로그인이 필요 없는 줄 알고 창을 아예 띄우지 않습니다.
클라이언트별 연결 방법
등록할 주소는 이것 하나입니다. 다른 값(포트·경로·토큰)은 필요 없습니다.
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 키)
이 서버는 로그인이 필수입니다. 그리고 에이전트가 게시하는 글은 로그인한 내 계정에 자동으로 연결되어, 웹의 마이페이지 “내 계정 글”에서 어느 기기에서든 관리할 수 있습니다. 로그인 방법은 두 가지입니다.
| 비교 | MCP 표준 OAuth | API 키 |
|---|---|---|
| 준비할 것 | 없음 (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 | 서버 등록 헤더 |
이렇게 말해보세요
외울 명령어는 없습니다. 평소처럼 말하면 에이전트가 알맞은 도구를 고릅니다. 아래는 실제로 도구 호출로 이어지는 말투들입니다.
만들기
- “이 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 | 새 글 게시. 공유 링크(link)·slug·관리 토큰·관리 링크를 돌려줍니다(토큰은 이 응답에만) | 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은 신고를 받은 운영자가 글을 내리는 통로이고, 서버가 자기 설정값을 알아서 쓰는 일은 없습니다 — 그랬다면 이 공개 엔드포인트에서 누구나 남의 글을 지울 수 있게 됩니다.
문제 해결
실제로 자주 걸리는 것들입니다. 대부분은 고장이 아니라 자격(로그인) 문제입니다.
로그인 창이 자꾸 다시 뜬다
왜 — 이 서버는 자격이 없거나 만료·무효면 “로그인이 필요하다”고 되돌려 주고, 그 응답이 곧 로그인 창입니다. 액세스 토큰은 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에 바로 게시할 수 있나요?
https://drophtml.app/mcp URL을 등록하고 한 번 로그인하면, 에이전트가 대화 중에 페이지를 게시·검색·편집하고 공유 링크를 바로 돌려줍니다.MCP 연결에 설치가 필요한가요?
claude mcp add --transport http drophtml … 로 등록한 뒤 /mcp 명령으로 인증합니다.OAuth와 API 키 중 무엇을 써야 하나요?
dh_로 시작)를 발급받아 서버 등록 시 헤더로 실어 둡니다.에이전트가 올린 글은 나중에 어떻게 편집·삭제하나요?
관리 토큰과 계정 자격은 무엇이 다른가요?
에이전트가 지운 글을 되살릴 수 있나요?
restore_share_version 도구나 웹 편집 화면에서 그 시점으로 되돌릴 수 있습니다.로그인 창이 계속 다시 뜨거나 도구가 보이지 않습니다.
/mcp 여야 합니다(문제 해결).비밀번호를 건 글을 에이전트가 읽지 못합니다.
get_share에 관리 토큰을 넘기거나 그 글이 연결된 계정으로 연결돼 있어야 합니다. 공개·링크 공유 글은 자격 없이 읽힙니다.다른 사람의 글도 볼 수 있나요?
slug)를 알면 읽을 수 있고, 비밀번호 글은 작성자만 읽습니다. 편집·삭제는 언제나 작성자 자격이 있어야 합니다.연결을 끊으려면 어떻게 하나요?
운영자 토큰(admin_token)은 뭔가요?
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.
- Register the server.
One line in your terminal.
drophtmlis 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 - Sign in (connect).
Run
/mcpin Claude Code and authenticatedrophtml; a browser opens. Sign in with Google, press Allow, and you are done — there is no key to copy. - 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.
- Keep the manage token it returns. The publish response carries a per-page manage token — only 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).
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) orsearch_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
slugis the 8-character id of a page (abcd1234);vididentifies 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.
Connecting your client
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 ↗).
/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)
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.
| Comparison | MCP standard OAuth | API key |
|---|---|---|
| What you prepare | Nothing — register the URL, press Connect | Issue a key in My Pages, copy it |
| Where it goes | Nowhere — the client keeps it | A header at registration time |
| Expiry | Access 7 days · refresh 180 days (auto-renewed) | None, until you delete or regenerate it |
| To disconnect | Remove the connector in your client | Delete or regenerate the key in My Pages |
| Works with | Clients that support OAuth | Clients 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" }
}
}
}
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)
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.
| Axis | Manage token | Account credential (OAuth · API key) |
|---|---|---|
| Scope | One page | Every page linked to the account |
| When you get it | Once, in the publish response | When you connect (sign in) |
| If you lose it | Cannot be reissued | Sign in again or regenerate |
| Where it goes | The manage_token argument | A header at registration time |
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_sharewithcontent_typemarkdown - “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
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
| Tool | What it does · returns | Key arguments | Credential |
|---|---|---|---|
search_shares | Search public pages by title or tag. Returns the list and a total; bodies are not included | query, sort (popular·recent), limit (max 48), offset | Nothing extra |
get_share | One page's original source plus metadata | slug, manage_token | None for public/unlisted / author for password-protected |
list_share_versions | Saved body versions, newest first — each with its vid, timestamp and size; bodies not included | slug, limit (max 100), offset, manage_token | Author |
get_share_version | One saved version, including the body source it held then | slug, vid, manage_token | Author |
get_daily_views | That page's daily visit counts and total views | slug, days (1–365, default 30) | Nothing extra |
popular_tags | Tags used most across public pages | None | Nothing extra |
site_stats | Site-wide totals (pages hosted, total views) | None | Nothing extra |
get_my_info | The account you are connected as (email, name, created, pages owned) | api_key (only to inspect another account) | Connected account |
list_my_shares | Pages linked to your account, newest first — unlisted and password-protected included, bodies not included | limit (max 100), offset | Connected account |
Writing — 3
| Tool | What it does · returns | Key arguments | Credential |
|---|---|---|---|
create_share | Publish 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), password | Connected account (the page is linked to it) |
update_share | Edit a page — only the fields you pass change. An edit that actually changes the body keeps the previous one as a version | slug, content, title, tags, visibility, password, clear_password, manage_token | Author |
restore_share_version | Restore a page to that version's body (a fast-forward — the pre-restore body is kept too). Visibility and password keep their current values | slug, vid, manage_token | Author |
Destructive — 1
| Tool | What it does · returns | Key arguments | Credential |
|---|---|---|---|
delete_share | Delete a page. The body, its revision history, its comments and its view stats all go with it, irreversibly | slug, manage_token, reason, admin_token | Author (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.
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 do — wait 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.
/authorizedoes 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?
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?
claude mcp add --transport http drophtml … and then authenticates with the /mcp command.Should I use OAuth or an API key?
dh_) in My Pages and set it as a header when registering the server.How do I edit or delete what the agent published?
What is the difference between a manage token and an account credential?
Can a page the agent deleted be recovered?
restore_share_version (or the web edit screen) rolls back to it.Sign-in keeps reappearing, or I see no tools.
/mcp with no trailing slash (see Troubleshooting).My agent cannot read a password-protected page.
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?
slug; password-protected pages are author-only. Editing and deleting always require author credentials.