trackmcp
Back to directory
beanspapa

mcp-blogspot-posting

View on GitHub

Blogger Posting

0 stars TypeScriptOthers Updated Jun 16, 2025

Documentation

MCP Blogger Posting Server (MCP λΈ”λ‘œκ·Έ ν¬μŠ€νŒ… μ„œλ²„)

License: MIT

Google Blogger API와 MCP(Model Context Protocol) Tool을 κ²°ν•©ν•œ μ‹€μ „ν˜• λΈ”λ‘œκ·Έ ν¬μŠ€νŒ… μžλ™ν™” μ„œλ²„


πŸ†• μ£Όμš” μ—…λ°μ΄νŠΈ (2025-06-14)

  • server/info μ—”λ“œν¬μΈνŠΈ 지원: MCP Inspector/ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ `server/info` μš”μ²­μœΌλ‘œ μ„œλ²„ 이름/버전 정보λ₯Ό 직접 μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‘œκΉ… μ •μ±… κ°•ν™”: MCP μ„œλ²„μ˜ λͺ¨λ“  λ‘œκ·ΈλŠ” λ°˜λ“œμ‹œ stderr(console.error) λ˜λŠ” MCP ν”„λ‘œν† μ½œ μ „μš© λ‘œκΉ… ν•¨μˆ˜λ§Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, stdout μ˜€μ—Ό μ‹œ ν”„λ‘œν† μ½œ νŒŒμ‹± μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ JSON 솑신 좔적: `[DEBUG][STDIO_SEND] ...` ν˜•νƒœμ˜ stderr 둜그둜 μ‹€μ œ μ†‘μ‹ λ˜λŠ” JSON λ©”μ‹œμ§€λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

✨ μ£Όμš” κΈ°λŠ₯

  • Google Blogger API 연동: MCP Tool둜 λΈ”λ‘œκ·Έ ν¬μŠ€νŒ…/λ°°μΉ˜ν¬μŠ€νŒ… μžλ™ν™”
  • MCP Tool ν‘œμ€€ 지원: LLM/MCP ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ blog-post, blog-batch-post Tool 호좜 κ°€λŠ₯
  • ν™˜κ²½λ³€μˆ˜ 기반 λ³΄μ•ˆ/μ„€μ •: .env, client_secret 파일, 인증 토큰 μ•ˆμ „ 관리
  • ν…ŒμŠ€νŠΈ/운영/ν™•μž₯μ„±: μœ λ‹›/톡합 ν…ŒμŠ€νŠΈ, ν™˜κ²½λ³„ μ„€μ •, λ³΄μ•ˆ κ°€μ΄λ“œ 제곡
  • κ²½λŸ‰ν™”λœ ꡬ쑰: λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€/ν”„λ‘¬ν”„νŠΈ/예제 μ½”λ“œ 제거, Tool μ€‘μ‹¬μ˜ 순수 MCP μ„œλ²„
  • νŒŒλΌλ―Έν„° 기반 config: credentialPath, blogUrl λ“± ν™˜κ²½λ³€μˆ˜/νŒŒλΌλ―Έν„°λ‘œ μœ μ—°ν•˜κ²Œ μ„€μ •
  • μ„œλ²„ 정보 μ—”λ“œν¬μΈνŠΈ(server/info) 제곡: MCP Inspector/ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ `server/info` μš”μ²­μœΌλ‘œ μ„œλ²„ 이름/버전 정보λ₯Ό 직접 쑰회 κ°€λŠ₯

πŸš€ λΉ λ₯Έ μ‹œμž‘

1. ν•„μˆ˜ 파일 μ€€λΉ„

  • `.env` 파일(ν™˜κ²½λ³€μˆ˜)
  • Google OAuth2 client_secret JSON 파일(κ²½λ‘œλŠ” ν™˜κ²½λ³€μˆ˜λ‘œ μ§€μ •)
  • `.gitignore`에 `.env`, `client_secret*.json` λ°˜λ“œμ‹œ 포함

2. ν™˜κ²½λ³€μˆ˜ μ˜ˆμ‹œ(.env)

code
GOOGLE_CLIENT_SECRET_PATH=C:/dev/mcp-servers/mcp-blogspot-posting/client_secret_...json
SESSION_SECRET=your-session-secret
BLOG_ID=your-blog-id (선택)
PORT=3000

3. μ˜μ‘΄μ„± μ„€μΉ˜ 및 λΉŒλ“œ

code
npm install
npm run build

4. μ„œλ²„ μ‹€ν–‰

code
npm run dev

5. MCP Tool μ‚¬μš© μ˜ˆμ‹œ

  • MCP Inspector/ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ blog-post, blog-batch-post Tool 확인 및 호좜
  • μž…λ ₯ μ˜ˆμ‹œ:
json
{
  "title": "ν…ŒμŠ€νŠΈ 포슀트",
  "content": "λ‚΄μš©",
  "labels": ["ν…ŒμŠ€νŠΈ", "μžλ™ν™”"],
  "isDraft": false
}
  • 인증 토큰이 μ—†μœΌλ©΄ μ—λŸ¬, 인증 ν›„ 정상 ν¬μŠ€νŒ…

πŸ“‚ μ£Όμš” ꡬ쑰

code
mcp-blogspot-posting/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ managers/       # Tool ν•Έλ“€λŸ¬
β”‚   β”œβ”€β”€ services/       # BloggerService λ“± λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”œβ”€β”€ types/          # νƒ€μž… μ •μ˜ (bloggerTypes λ“±)
β”‚   β”œβ”€β”€ lib/            # 인증/토큰 관리 λ“±
β”œβ”€β”€ test/               # μœ λ‹›/톡합 ν…ŒμŠ€νŠΈ
β”œβ”€β”€ .env                # ν™˜κ²½λ³€μˆ˜ (gitignore ν•„μˆ˜)
β”œβ”€β”€ client_secret_*.json # Google OAuth2 μ‹œν¬λ¦Ώ (gitignore ν•„μˆ˜)
β”œβ”€β”€ .gitignore
β”œβ”€β”€ package.json
└── README.md

🚦 μ„œλ²„ μ‹œμž‘ 및 λΈ”λ‘œκ·Έ ID 관리 μ •μ±…

1. μ„œλ²„ μ‹œμž‘ μ‹œ

    2. API 호좜 μ‹œ

      3. 운영/λ³΄μ•ˆ μ£Όμ˜μ‚¬ν•­


        πŸ§ͺ ν…ŒμŠ€νŠΈ

        • `npm test`둜 μœ λ‹› ν…ŒμŠ€νŠΈ μ‹€ν–‰
        • 톡합 ν…ŒμŠ€νŠΈλŠ” .env/ν™˜κ²½λ³€μˆ˜/μ‹€μ œ blogUrl λ“± 싀데이터 μ£Όμž… ν•„μš”
        • MCP Tool 정상 λ™μž‘, 인증 μ‹€νŒ¨/성곡 μΌ€μ΄μŠ€ μžλ™ 검증

        πŸ“ μΆ”κ°€ μ°Έκ³ 

        • MCP Inspector λ“±μœΌλ‘œ Tool λͺ©λ‘/호좜 ν…ŒμŠ€νŠΈ ꢌμž₯
        • 인증/토큰 λ°œκΈ‰μ€ Google OAuth2 곡식 κ°€μ΄λ“œ μ°Έκ³ 
        • Tool/μ„œλΉ„μŠ€ ν™•μž₯ μ‹œ managers/services ꡬ쑰 ν™œμš©
        • BaseServer ꡬ쑰 κ°œμ„ μœΌλ‘œ λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€/ν”„λ‘¬ν”„νŠΈ/예제 μ½”λ“œ 없이 κ²½λŸ‰ν™” κ°€λŠ₯

        πŸ› οΈ MCP Tool μž…λ ₯/좜λ ₯ 포맷 및 μ˜ˆμ‹œ

        blog-post Tool

        • μ„€λͺ…: Google Blogger에 단일 포슀트λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
        • μž…λ ₯(JSON):
        jsonc
        {
          "title": "포슀트 제λͺ©", // (ν•„μˆ˜)
          "content": "포슀트 λ‚΄μš©(HTML)", // (ν•„μˆ˜)
          "labels": ["라벨1", "라벨2"], // (선택)
          "isDraft": true, // (선택, κΈ°λ³Έκ°’: true)
        }
        • μž…λ ₯ ν•„λ“œ μ„€λͺ…:
        ν•„λ“œλͺ…νƒ€μž…ν•„μˆ˜μ„€λͺ…
        ------------------------------------------------
        titlestringβœ…ν¬μŠ€νŠΈ 제λͺ©
        contentstringβœ…ν¬μŠ€νŠΈ λ‚΄μš©(HTML)
        labelsstring[]—라벨 λͺ©λ‘
        isDraftbooleanβ€”μ΄ˆμ•ˆ μ—¬λΆ€(true/false, κΈ°λ³Έκ°’: true)
        • λΉ„κ³ : λΈ”λ‘œκ·Έ IDλŠ” μ„œλ²„ ν™˜κ²½λ³€μˆ˜(BLOG_ID)둜 κ΄€λ¦¬λ˜λ©°, μ‚¬μš©μžκ°€ μž…λ ₯ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
        • 좜λ ₯(JSON):
        json
        {
          "content": [
            { "type": "text", "text": "포슀트 μž‘μ„± 성곡!\nURL: https://...\n제λͺ©: ..." }
          ],
          "isError": false
        }
        • 좜λ ₯ ν•„λ“œ μ„€λͺ…:
        ν•„λ“œλͺ…νƒ€μž…μ„€λͺ…
        -----------------------------------------------------------
        contentarrayλ©”μ‹œμ§€(성곡/μ‹€νŒ¨/상세정보)
        isErrorbooleanμ‹€νŒ¨ μ—¬λΆ€(true: μ—λŸ¬, false: 성곡)
        • μ—λŸ¬ μ˜ˆμ‹œ:
        json
        {
          "content": [
            { "type": "text", "text": "인증 토큰이 μ—†μŠ΅λ‹ˆλ‹€. λ¨Όμ € 인증을 μ™„λ£Œν•˜μ„Έμš”." }
          ],
          "isError": true
        }

        blog-batch-post Tool

        • μ„€λͺ…: μ—¬λŸ¬ 포슀트λ₯Ό ν•œ λ²ˆμ— μž‘μ„±ν•©λ‹ˆλ‹€.
        • μž…λ ₯(JSON):
        jsonc
        {
          "posts": [
            // (ν•„μˆ˜)
            {
              "title": "제λͺ©1", // (ν•„μˆ˜)
              "content": "λ‚΄μš©1", // (ν•„μˆ˜)
              "labels": ["라벨A"], // (선택)
              "isDraft": true, // (선택, κΈ°λ³Έκ°’: true)
            },
            {
              "title": "제λͺ©2", // (ν•„μˆ˜)
              "content": "λ‚΄μš©2", // (ν•„μˆ˜)
            },
          ],
        }
        • μž…λ ₯ ν•„λ“œ μ„€λͺ…:
        ν•„λ“œλͺ…νƒ€μž…ν•„μˆ˜μ„€λͺ…
        ------------------------------------------------
        postsobject[]βœ…ν¬μŠ€νŠΈ λ°°μ—΄
        β”” titlestringβœ…ν¬μŠ€νŠΈ 제λͺ©
        β”” contentstringβœ…ν¬μŠ€νŠΈ λ‚΄μš©(HTML)
        β”” labelsstring[]—라벨 λͺ©λ‘
        β”” isDraftbooleanβ€”μ΄ˆμ•ˆ μ—¬λΆ€(true/false, κΈ°λ³Έκ°’: true)
        • λΉ„κ³ : λΈ”λ‘œκ·Έ IDλŠ” μ„œλ²„ ν™˜κ²½λ³€μˆ˜(BLOG_ID)둜 κ΄€λ¦¬λ˜λ©°, μ‚¬μš©μžκ°€ μž…λ ₯ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
        • 좜λ ₯(JSON):
        json
        {
          "content": [
            { "type": "text", "text": "배치 ν¬μŠ€νŒ… μ™„λ£Œ! 성곡: 2, μ‹€νŒ¨: 0" },
            { "type": "text", "text": "[ {\"success\":true,\"postId\":\"...\",...} ]" }
          ],
          "isError": false
        }
        • 좜λ ₯ ν•„λ“œ μ„€λͺ…:
        ν•„λ“œλͺ…νƒ€μž…μ„€λͺ…
        -----------------------------------------------------------
        contentarrayλ©”μ‹œμ§€(성곡/μ‹€νŒ¨/상세정보)
        isErrorbooleanμ‹€νŒ¨ μ—¬λΆ€(true: μ—λŸ¬, false: 성곡)
        • μ—λŸ¬ μ˜ˆμ‹œ:
        json
        {
          "content": [
            { "type": "text", "text": "인증 토큰이 μ—†μŠ΅λ‹ˆλ‹€. λ¨Όμ € 인증을 μ™„λ£Œν•˜μ„Έμš”." }
          ],
          "isError": true
        }

        πŸ“„ λΌμ΄μ„ μŠ€

        이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.


        βš™οΈ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ MCP μ„œλ²„ μ„€μ • μ˜ˆμ‹œ

        MCP ν΄λΌμ΄μ–ΈνŠΈ(예: MCP Inspector, 톡합 MCP ν”Œλž«νΌ λ“±)μ—μ„œ blogspot-posting μ„œλ²„λ₯Ό μ‹€ν–‰ν•  λ•ŒλŠ” μ•„λž˜μ™€ 같이 `mcpServers` 섀정을 μ‚¬μš©ν•©λ‹ˆλ‹€.

        jsonc
        {
          "mcpServers": {
            "blogspot-posting": {
              "command": "npx",
              "args": ["-y", "server-blogspot-posting"],
              "env": {
                "GOOGLE_CLIENT_SECRET_PATH": "/path/to/client_secret_xxx.json",
                "BLOG_ID": "your-blog-id",
              },
            },
          },
        }
        • `command`, `args`: MCP μ„œλ²„ μ‹€ν–‰ λͺ…λ Ή 및 인자
        • `env`: μ„œλ²„μ— μ£Όμž…ν•  ν™˜κ²½λ³€μˆ˜(μ‹œν¬λ¦Ώ 경둜)
        • ν•„μš”μ— 따라 μΆ”κ°€ ν™˜κ²½λ³€μˆ˜(.env에 μžˆλŠ” κ°’)λ₯Ό λͺ¨λ‘ env에 λͺ…μ‹œ κ°€λŠ₯

        > NOTE: ν˜„μž¬ λ²„μ „μ—μ„œλŠ” SESSION_SECRET은 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (μ„Έμ…˜ 기반 인증/둜그인 κΈ°λŠ₯이 좔가될 κ²½μš°μ—λ§Œ ν•„μš”)


        ⚠️ blogId μΊμ‹œ 파일(.blog_id_cache.json) 경둜 μ •μ±… 및 μ£Όμ˜μ‚¬ν•­

        • λΈ”λ‘œκ·Έ ID μΊμ‹œ 파일(.blog_id_cache.json)은 항상 ν”„λ‘œμ νŠΈ 루트(μ΅œμƒμœ„ 폴더)μ—λ§Œ μƒμ„±λ©λ‹ˆλ‹€.
        • λΉŒλ“œ(dist) 폴더 λ“± λ‹€λ₯Έ μœ„μΉ˜μ— μΊμ‹œ 파일이 μƒμ„±λ˜λŠ” 문제λ₯Ό 2025-06-12에 μˆ˜μ •ν•˜μ˜€μœΌλ©°, 이제 μ–΄λ–€ ν™˜κ²½μ—μ„œ 싀행해도 λ£¨νŠΈμ—λ§Œ μƒμ„±λ©λ‹ˆλ‹€.
        • dist/.blog_id_cache.json λ“± 잘λͺ»λœ μœ„μΉ˜μ˜ μΊμ‹œ 파일이 μžˆλ‹€λ©΄ μˆ˜λ™μœΌλ‘œ μ‚­μ œν•˜μ„Έμš”.
        • λ°˜λ“œμ‹œ .gitignore에 .blog_id_cache.json을 포함해 git에 μ»€λ°‹λ˜μ§€ μ•Šλ„λ‘ ν•˜μ„Έμš”.
        • μ„œλ²„ μ‹€ν–‰/λΉŒλ“œ μœ„μΉ˜μ™€ λ¬΄κ΄€ν•˜κ²Œ μΊμ‹œ 파일이 λ£¨νŠΈμ—λ§Œ μƒμ„±λ˜λŠ”μ§€ 운영/ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ ν™•μΈν•˜μ„Έμš”.

        πŸ§‘β€πŸ’» 디버깅/운영 κ°€μ΄λ“œ

        • MCP μ„œλ²„μ˜ λͺ¨λ“  λ‘œκ·ΈλŠ” λ°˜λ“œμ‹œ stderr(console.error) λ˜λŠ” MCP ν”„λ‘œν† μ½œ μ „μš© λ‘œκΉ… ν•¨μˆ˜λ§Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, stdout μ˜€μ—Ό μ‹œ ν”„λ‘œν† μ½œ νŒŒμ‹± μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
        • `[DEBUG][STDIO_SEND] ...` stderr 둜그λ₯Ό 톡해 μ‹€μ œ μ†‘μ‹ λ˜λŠ” JSON λ©”μ‹œμ§€λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μΆ”μ ν•˜μ—¬, νŒŒμ‹± μ—λŸ¬ 및 ν”„λ‘œν† μ½œ 문제λ₯Ό μ‹ μ†ν•˜κ²Œ 진단할 수 μžˆμŠ΅λ‹ˆλ‹€.
        • Inspector/ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ `server/info`둜 μ„œλ²„ 정보 쑰회 및 tools/list λ“± 정상 λ™μž‘μ„ ν™•μΈν•˜μ„Έμš”.

        🚦 MCP Tool/μ„œλ²„ μ—”λ“œν¬μΈνŠΈ μ˜ˆμ‹œ

        • μ„œλ²„ 정보 쑰회(server/info):
        json
        { "method": "server/info" }

        β†’ 응닡 μ˜ˆμ‹œ:

        json
        { "name": "blogspot-mcp-server", "version": "1.0.0" }

        Frequently asked questions

        What is mcp-blogspot-posting?

        mcp-blogspot-posting is Blogger Posting

        How do I install mcp-blogspot-posting?

        Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

        Is mcp-blogspot-posting open source?

        Yes β€” it is hosted on GitHub at https://github.com/beanspapa/mcp-blogspot-posting.

        Related MCP tools

        Run your own MCP server? See who uses it and what to fix.

        Measure it with TrackMCP