{"id":50789692,"url":"https://github.com/thecodedaniel/blogcast_mcp","last_synced_at":"2026-06-12T10:02:42.752Z","repository":{"id":347409118,"uuid":"1193979710","full_name":"TheCodeDaniel/blogcast_mcp","owner":"TheCodeDaniel","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-28T00:05:53.000Z","size":261,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T02:51:04.583Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TheCodeDaniel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T19:37:03.000Z","updated_at":"2026-03-28T00:05:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/TheCodeDaniel/blogcast_mcp","commit_stats":null,"previous_names":["thecodedaniel/blogcast_mcp"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/TheCodeDaniel/blogcast_mcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fblogcast_mcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fblogcast_mcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fblogcast_mcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fblogcast_mcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TheCodeDaniel","download_url":"https://codeload.github.com/TheCodeDaniel/blogcast_mcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fblogcast_mcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34238715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-12T10:02:41.711Z","updated_at":"2026-06-12T10:02:42.728Z","avatar_url":"https://github.com/TheCodeDaniel.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BlogCast MCP\n\n\u003e One post. Every platform. Powered by Notion + Claude.\n\nBlogCast MCP is an open-source Model Context Protocol server that turns Notion into a headless CMS and publishing hub. Write once in the dashboard or in Notion, then use Claude (or the dashboard) to publish simultaneously to Dev.to, Hashnode, Medium, and more.\n\n---\n\n## What's Inside\n\n| Package | Description | Port |\n|---|---|---|\n| `mcp/` | MCP server — Claude integration layer | stdio |\n| `server/` | Express.js backend — publishing, images, scheduling, AI | 3001 |\n| `client/` | React dashboard — write posts, publish, manage platforms | 5173 |\n\n---\n\n## Quickstart\n\n### Prerequisites\n\n- Node.js 20+, npm 10+\n- A Notion account with API access\n- Claude Desktop (for MCP tools) — optional if you only use the dashboard\n\n### 1. Clone \u0026 install\n\n```bash\ngit clone https://github.com/thecodedaniel/blogcast-mcp.git\ncd blogcast\nnpm install\n```\n\n### 2. Run everything\n\n```bash\nnpm run dev          # starts server (3001) + client (5173)\n```\n\nOr run individually:\n\n```bash\nnpm run dev:server   # Express backend only\nnpm run dev:client   # React dashboard only\nnpm run dev:mcp      # MCP server only (for testing)\n```\n\n### 3. Open the dashboard\n\nNavigate to `http://localhost:5173` — the Settings page will guide you through:\n\n1. **Notion integration** — API key + database IDs\n2. **Platform credentials** — Dev.to, Hashnode, Medium API keys\n3. **AI features** — Anthropic API key (optional, unlocks smart pre-publish checks)\n4. **Claude Desktop** — one-click auto-configure (no manual JSON editing)\n\n\u003e **First run:** Once you add your Notion credentials, BlogCast automatically sets up all required database columns (idempotent — safe to re-run at any time).\n\n### 4. Set up Notion\n\n1. Go to [notion.so/my-integrations](https://www.notion.so/my-integrations) and create a new integration\n2. Create two databases in Notion: **BlogCast Posts** and **BlogCast Analytics**\n3. Share both databases with your integration (open each DB → ⋯ → Connections → add your integration)\n4. Copy the database IDs from the page URLs (the 32-char string after the last `/`)\n5. Add both IDs in `localhost:5173/settings`\n\nBlogCast will automatically add all required columns to both databases on first run.\n\n### 5. Build the MCP server (for Claude Desktop)\n\n```bash\nnpm run build:mcp\n```\n\nThen in Settings, click **\"Connect Claude Desktop\"** — BlogCast will auto-configure `claude_desktop_config.json` for you.\n\nOr add manually to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"blogcast\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/blogcast/mcp/dist/index.js\"],\n      \"env\": {\n        \"BACKEND_URL\": \"http://localhost:3001\"\n      }\n    }\n  }\n}\n```\n\n---\n\n## Writing Posts\n\n### Option A — In the Dashboard (recommended)\n\n1. Click **Write** in the sidebar\n2. Type your title and write your post using the rich text editor\n   - Full toolbar: bold, italic, headings, inline code, **code blocks with syntax highlighting** (TypeScript, Python, Dart, Go, Rust, and 20+ more languages)\n   - Live **Preview** mode toggle\n3. Add tags, excerpt, and choose target platforms in the right sidebar\n4. Click **Save Draft** (saves to Notion) or **Save \u0026 Publish** (saves + publishes immediately)\n\n### Option B — In Notion directly\n\n1. Open your **BlogCast Posts** database in Notion\n2. Click **+ New** and write your post content inside the page\n3. Fill in the properties: Title, Tags, Publish To, Excerpt\n4. Set Status to *Draft* — it appears in the dashboard automatically\n\n---\n\n## Publishing\n\n### Via the Dashboard\n\n1. **Write → Save \u0026 Publish** — write and publish in one step\n2. **Posts** → click any post → redirects to **Publish** page → choose platforms → click Publish\n\n### Via Claude (MCP)\n\n```\n\"Show me my draft posts\"\n\"Preview my latest Notion draft\"\n\"Publish my post about TypeScript to Dev.to and Hashnode\"\n\"What's the status of my last post?\"\n\"Schedule my React post for tomorrow at 9am UTC on all platforms\"\n\"Add my Hashnode API key\"\n\"Sync analytics for my last 5 posts\"\n```\n\n---\n\n## MCP Tools\n\n| Tool | Description |\n|---|---|\n| `list_drafts` | List posts by status (Draft, Review, Scheduled, all) |\n| `preview_post` | Fetch post content as Markdown without publishing |\n| `publish_post` | Publish to Dev.to + Hashnode + Medium (with image handling) |\n| `get_publish_status` | Check publish status + analytics per platform |\n| `schedule_post` | Set a scheduled publish time on a post |\n| `sync_analytics` | Pull latest views/reactions/comments into Notion |\n| `manage_platforms` | Add/remove/test platform API credentials |\n\n---\n\n## AI Features\n\nWhen an Anthropic API key is configured (`Settings → AI Features`):\n\n| Feature | Where |\n|---|---|\n| **Pre-publish check** | Publish page — AI reviews title, tags, content quality before publishing |\n| **Excerpt \u0026 tag generation** | Write page (Generate button) + Publish page |\n| **Per-platform content adaptation** | Auto-applied on publish — Medium gets optimized HTML, Dev.to/Hashnode get Markdown tweaks |\n\nAI features are fully optional and degrade gracefully — publishing works normally without an Anthropic key.\n\n---\n\n## Architecture\n\n```\nNotion Workspace (CMS + Analytics DB)\n        │ Notion API\n        ▼\nBlogCast MCP Server (stdio, Claude integration)\n        │ HTTP\n        ▼\nExpress Backend (localhost:3001)\n  ├── Publishers: Dev.to, Hashnode, Medium (draft)\n  ├── AI service (Anthropic SDK — pre-publish checks, content adaptation)\n  ├── Image service (download → cache → re-upload)\n  ├── Format service (Markdown ↔ HTML)\n  ├── Auth vault (encrypted local credentials)\n  ├── Setup service (Notion DB auto-migration on startup)\n  └── Scheduler (auto-publish at scheduled time)\n        │\n        ▼\nLocal Storage (./storage/)\n  ├── images/   — cached images with deduplication\n  ├── queue/    — pending publish jobs\n  └── logs/     — winston logs\n\nReact Dashboard (localhost:5173)\n  ├── Write     — TipTap rich text editor with syntax-highlighted code blocks\n  ├── Posts     — list, search, filter all posts from Notion\n  ├── Publish   — select post + platforms + AI pre-publish check\n  ├── Platforms — add/remove/test API keys\n  └── Settings  — Notion config, AI config, Claude Desktop auto-connect\n```\n\n---\n\n## Image Handling\n\nNotion CDN URLs expire after ~1 hour. BlogCast handles this transparently:\n\n1. Images are downloaded from Notion and cached locally in `storage/images/`\n2. Each image is hashed by URL (SHA-256) for deduplication\n3. On publish, images are uploaded to each platform's CDN\n4. Platform CDN URLs are cached so re-publishing doesn't re-upload\n\n---\n\n## Notion Database Schema\n\n### Posts DB (`BlogCast Posts`)\n\n| Property | Type |\n|---|---|\n| Title | Title |\n| Slug | Text |\n| Status | Select: Draft / Review / Scheduled / Published / Failed / Archived |\n| Publish To | Multi-select: devto, hashnode, medium |\n| Scheduled At | Date |\n| Tags | Multi-select |\n| Canonical URL | URL |\n| Cover Image | Files |\n| Excerpt | Text |\n| Published At | Date |\n| Word Count | Number |\n| Last Synced | Date |\n\n### Analytics DB (`BlogCast Analytics`)\n\n| Property | Type |\n|---|---|\n| Name | Title |\n| Post | Relation → Posts DB |\n| Platform | Select |\n| Status | Select: Success / Failed / Pending |\n| Published URL | URL |\n| Error Message | Text |\n| Published At | Date |\n| Reactions | Number |\n| Page Views | Number |\n| Comments | Number |\n\n\u003e All columns are auto-created when you first configure Notion credentials. No manual database setup required.\n\n---\n\n## Environment Variables\n\nAlmost nothing needs to go in `.env`. All credentials and settings are configured through the **Settings page** (`localhost:5173/settings`) and stored encrypted on your local machine.\n\nThe only optional env vars are:\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `PORT` | `3001` | Backend server port |\n| `STORAGE_PATH` | `./storage` | Local storage for images, queue, logs |\n| `LOG_LEVEL` | `info` | Logging verbosity |\n| `BACKEND_URL` | `http://localhost:3001` | MCP server → backend URL |\n| `NOTION_API_KEY` | _(from Settings)_ | CI/Docker override |\n| `NOTION_POSTS_DB_ID` | _(from Settings)_ | CI/Docker override |\n| `NOTION_ANALYTICS_DB_ID` | _(from Settings)_ | CI/Docker override |\n| `ANTHROPIC_API_KEY` | _(from Settings)_ | CI/Docker override |\n\nSee [`.env.example`](.env.example) for the template.\n\n---\n\n## Supported Platforms\n\n| Platform | Status | Notes |\n|---|---|---|\n| Dev.to | ✅ Full support | |\n| Hashnode | ✅ Full support | |\n| Medium | ✅ Draft support | Medium API only allows draft publishing — publish manually from your Medium dashboard |\n| LinkedIn | 🔜 v1.1 | |\n| Ghost | 🔜 v2.0 | |\n| WordPress | 🔜 v2.0 | |\n\n---\n\n## License\n\nMIT — built with ❤️ by [THECODEDANIEL LIMITED](https://thecodedaniel.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthecodedaniel%2Fblogcast_mcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthecodedaniel%2Fblogcast_mcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthecodedaniel%2Fblogcast_mcp/lists"}