viruagent-mcp
MCP server that exposes Tistory blog posting functionality, enabling AI agents to write, upload, and publish posts (public/private) via Playwright and Tistory API.
README
viruagent-mcp
viruagent의 포스팅 기능을 MCP 서버로 노출한 패키지입니다.
CLI 기반 AI Agent가 티스토리 글을 작성·업로드·발행(공개/비공개)까지 한 번에 처리하는 MCP입니다.
OpenAI Function Calling으로 의도를 정하고, MCP/Playwright/Tistory API가 실행을 분리 수행합니다.
- AI Agent: 요청 파라미터 결정
- MCP Tool:
publish/save_draft/list_categories호출 인터페이스 - Playwright: 로그인·2차인증·세션, Tistory API: 발행/임시저장/카테고리/이미지 처리
최근 반영사항
- 2026-02-27:
publish에서 403 발생 시 우선비공개발행(visibility: 0)으로 fallback 합니다. - 동일 일시에서 403이 반복되면 비공개 발행도 실패하고, 해당 에러를 반환해 다시 시도/리커버리 제어할 수 있도록 구성했습니다.
설치
cd /Users/tk/Desktop/project/viruagent-mcp
npm install
실행
npm start
또는
node bin/index.js
제공 tool
- viruagent_auth_status
- viruagent_login
- viruagent_publish
- viruagent_save_draft
- viruagent_list_categories
- viruagent_list_posts
- viruagent_logout
- viruagent_list_providers
기본 사용 예시 (MCP 클라이언트 설정)
{
"mcpServers": {
"viruagent-mcp": {
"command": "node",
"args": ["/Users/tk/Desktop/project/viruagent-mcp/bin/index.js"]
}
}
}
동작 포인트
- session 파일은 사용자 홈(
~/.viruagent-mcp/sessions)에 provider별로 분리 저장됩니다. viruagent_login은 기본적으로 브라우저를 띄워 티스토리 로그인 -> 카카오 로그인 페이지 이동 -> 로그인/2차 인증 흐름을 처리합니다.viruagent_login은 아이디/비밀번호 자동 로그인을 지원합니다.- 카카오톡 푸시 2차 인증이 감지되면, 사용자 승인 대기(
status: "pending_2fa") 상태를 반환하고 승인 완료 후 재시도할 수 있습니다. remember browser(이 브라우저에서 2차 인증 사용 안 함)에 해당하는 체크박스가 보이면 자동 체크를 시도합니다.viruagent_publish는 category가 없으면 카테고리 목록을 돌려주고 사용자가category를 지정해 다시 요청하게 합니다. (카테고리가 하나뿐이면 자동 선택)viruagent_publish는 발행 요청 시 403(발행 제한) 오류가 발생하면visibility: 0(비공개) 발행으로 먼저 fallback를 시도합니다.viruagent_publish는 본문 placeholder(<!-- IMAGE: keyword -->)를 발견하면imageUrls를 받아 원격 URL이면 로컬로 다운로드하고, 로컬 파일 경로면 바로 업로드합니다. 업로드는 Tistory 이미지 업로드 API를 통해 진행됩니다. 성공 시 본문에는 업로드된 이미지 URL이<img src="...">형태로 삽입됩니다. 썸네일은 업로드된 이미지 키(kage@...) 기준으로 자동 후보를 생성합니다.viruagent_save_draft도 동일한 이미지 치환 파이프라인을 사용합니다.- 업로드된 첫 번째 이미지는 썸네일 자동 후보가 됩니다. (
thumbnail직접 지정이 우선) thumbnail은kage@...형식이 가장 안전합니다. (thumbnail이 비어 있으면 업로드된 첫 이미지의kage@키를 자동 사용)relatedImageKeywords는 이미지 수집용 힌트이며, 실제 업로드는imageUrls가 있을 때만 수행됩니다.autoUploadImages와imageUploadLimit은placeholder+URL 처리 동작을 제어합니다.
자동 로그인 사용법
- 환경변수 설정
export TISTORY_USERNAME="your-id"
export TISTORY_PASSWORD="your-password"
- MCP 도구 호출 예시
{
"name": "viruagent_login",
"arguments": {
"provider": "tistory",
"headless": true,
"username": "your-id",
"password": "your-password"
}
}
발행 요청 시 카테고리를 생략하면 아래처럼 status: "need_category" 응답이 올 수 있습니다.
{
"provider": "tistory",
"mode": "publish",
"status": "need_category",
"loggedIn": true,
"title": "자동 테스트 글",
"visibility": 0,
"tags": "테스트",
"message": "category가 없어서 중단했습니다. 카테고리 ID를 지정해 publish를 재요청해 주세요.",
"categories": [
{ "name": "기본", "id": 0 }
]
}
이미지 업로드 단계에서 실패가 발생하면 아래 상태가 반환됩니다.
status: "image_upload_failed": 플레이스홀더가 있지만 업로드된 이미지가 0개status: "image_upload_partial": 일부 업로드 실패
실패 응답에는 uploadErrors에 실패 URL/에러 메시지가 들어오므로, 동일 title/content로 imageUrls만 보완해서 재요청하세요.
발행이 403으로 막혀 비공개로 fallback된 경우:
{
"provider": "tistory",
"mode": "publish",
"status": "publish_fallback_to_private",
"visibility": 0,
"message": "발행 제한(403)으로 인해 비공개로 발행했습니다."
}
발행 403이 비공개 fallback에서도 반복되어 실패한 경우:
{
"provider": "tistory",
"mode": "publish",
"status": "publish_fallback_to_private_failed",
"visibility": 0,
"message": "발행 제한(403)으로 인해 공개/비공개 모두 실패했습니다."
}
2차 인증이 있으면 twoFactorCode를 추가로 전달합니다.
- 카카오톡 푸시 방식에서는
twoFactorCode가 없어도 자동으로 2차 인증 승인 대기 후 실패 시pending_2fa결과가 반환될 수 있습니다.
viruagent_publish 이미지 자동 업로드 예시:
{
"name": "viruagent_publish",
"arguments": {
"provider": "tistory",
"title": "최신 IT 뉴스 요약",
"content": "<blockquote data-ke-style=\"style1\">...</blockquote><!-- IMAGE: galaxy s26 --><p>...</p>",
"visibility": "public",
"category": 1284210,
"tags": "IT,뉴스",
"relatedImageKeywords": ["galaxy s26", "AI phone"],
"imageUrls": ["https://example.com/image1.jpg", "https://example.com/image2.jpg"],
"autoUploadImages": true,
"imageUploadLimit": 3
}
}
pending_2fa 응답 예시:
{
"provider": "tistory",
"status": "pending_2fa",
"loggedIn": false,
"message": "카카오 2차 인증이 필요합니다. 앱에서 인증 후 다시 실행하면 됩니다."
}
- 현재 Naver provider는 스텁이며, 요청 시
ready:false형태로 사용 가능 여부를 반환합니다.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。