Medium MCP API Server について
Medium MCP API Serverは、外部アプリからMediumの投稿やアカウントを管理するサービスです。下書き、予約公開、画像アップロードに対応します。
主な機能
- 01Medium OAuthとプロフィール管理
- 02Markdown・HTMLでの投稿
- 03下書き管理と予約公開
- 04タグとpublicationへの対応
- 05画像アップロードと書式処理
活用シーン
- 01アプリからMediumの記事を投稿
- 02下書きを保存して公開予約
- 03記事用の画像をアップロード
- 04Mediumアカウントの管理
MCP 対応
MCPクライアントとMedium APIをつなぎ、AIアシスタントに投稿やアカウント管理機能を提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Medium MCP API サーバー
Medium の API と統合し、外部アプリケーションからシームレスにコンテンツを公開したり、ユーザーアカウントを管理したりできる Model Context Protocol(MCP)サーバーです。Model Context Protocol は、AI モデルが外部サービスや API と連携するための標準化された方法を提供します。このサーバーは、AI アシスタントと Medium の公開プラットフォームをつなぐ橋渡し役として機能します。
🚀 機能
-
認証とユーザー管理
- 安全な Medium OAuth 統合
- JWT ベースの認証
- ユーザープロフィール管理
-
コンテンツの公開
- Markdown および HTML 形式のコンテンツに対応
- 下書きの作成と管理
- 投稿のスケジュール設定
- 公開機能との統合
- タグとカテゴリーに対応
-
メディア管理
- 画像のアップロードと保存
- コンテンツの書式設定ユーティリティ
-
信頼性とパフォーマンス
- Redis ベースのキャッシュ
- 投稿公開のジョブスケジューリング
- 包括的なエラー処理
- レート制限
📋 要件
- Node.js 16+
- MongoDB
- Redis(任意ですが、スケジュール設定には推奨)
- Medium API の認証情報
🛠️ インストール
Docker を使用する(推奨)
-
リポジトリをクローンします:
git clone https://github.com/jignesh88/medium-mcp-api.git cd medium-mcp-api -
サンプルを基に
.envファイルを作成します:cp .env.example .env -
.envファイルに認証情報を設定します:MEDIUM_CLIENT_ID=your_medium_client_id MEDIUM_CLIENT_SECRET=your_medium_client_secret MEDIUM_REDIRECT_URI=http://your-domain.com/api/auth/medium/callback JWT_SECRET=your_strong_secret_key -
Docker Compose を使用してサービスを起動します:
docker-compose up -d
手動インストール
-
リポジトリをクローンします:
git clone https://github.com/jignesh88/medium-mcp-api.git cd medium-mcp-api -
依存関係をインストールします:
npm install -
.envファイルを作成して設定します -
MongoDB サーバーと Redis サーバーを起動します
-
アプリケーションを起動します:
npm start
🔐 Medium API の設定
- https://medium.com/me/applications で Medium の開発者向けアプリケーションを作成します
- コールバック URL を
http://your-domain.com/api/auth/medium/callbackに設定します - Client ID と Client Secret を
.envファイルにコピーします
📚 API ドキュメント
認証エンドポイント
新しいユーザーを登録する
POST /api/auth/register
リクエストボディ:
{
"email": "[email protected]",
"name": "John Doe"
}
レスポンス:
{
"message": "User registered successfully",
"token": "jwt_token_here",
"user": {
"userId": "user_id",
"email": "[email protected]",
"name": "John Doe"
}
}
ログイン
POST /api/auth/login
リクエストボディ:
{
"email": "[email protected]"
}
レスポンス:
{
"message": "Login successful",
"token": "jwt_token_here",
"user": {
"userId": "user_id",
"email": "[email protected]",
"name": "John Doe",
"mediumConnected": true
}
}
Medium アカウントを接続する
GET /api/auth/medium
ヘッダー:
Authorization: Bearer jwt_token_here
レスポンス:
{
"authUrl": "https://medium.com/m/oauth/authorize?client_id=..."
}
コンテンツ管理エンドポイント
投稿を作成する
POST /api/posts
ヘッダー:
Authorization: Bearer jwt_token_here
リクエストボディ:
{
"title": "My New Post",
"content": "# Markdown Content\n\nThis is my post content.",
"contentFormat": "markdown",
"tags": ["programming", "tutorial"],
"publishStatus": "draft",
"publicationId": "optional_publication_id"
}
レスポンス:
{
"_id": "post_id",
"userId": "user_id",
"title": "My New Post",
"content": "# Markdown Content\n\nThis is my post content.",
"contentFormat": "markdown",
"tags": ["programming", "tutorial"],
"publishStatus": "draft",
"createdAt": "2025-03-16T07:00:00.000Z",
"updatedAt": "2025-03-16T07:00:00.000Z"
}
Medium に投稿を公開する
POST /api/posts/:postId/publish
ヘッダー:
Authorization: Bearer jwt_token_here
レスポンス:
{
"message": "Post published successfully",
"post": {
"_id": "post_id",
"mediumPostId": "medium_post_id",
"title": "My New Post",
"published": true,
...
}
}
ユーザーの投稿を取得する
GET /api/posts?status=draft&page=1&limit=10
ヘッダー:
Authorization: Bearer jwt_token_here
レスポンス:
{
"posts": [
{
"_id": "post_id",
"title": "My New Post",
...
}
],
"total": 15,
"page": 1,
"pages": 2
}
メディア管理
画像をアップロードする
POST /api/media/upload
ヘッダー:
Authorization: Bearer jwt_token_here
Content-Type: multipart/form-data
フォームデータ:
image: [file]
レスポンス:
{
"message": "File uploaded successfully",
"filePath": "/uploads/filename.jpg",
"fileName": "filename.jpg",
"originalName": "my-image.jpg",
"mimeType": "image/jpeg",
"size": 12345
}
🔄 MCP サーバーとの統合
例:Node.js で投稿を公開する
const axios = require('axios');
const API_URL = 'http://your-domain.com';
const TOKEN = 'your_jwt_token';
async function publishPost() {
try {
// Create a draft post
const post = await axios.post(`${API_URL}/api/posts`, {
title: 'My Awesome Article',
content: '# Hello Medium\n\nThis is my first post published via the MCP API.',
contentFormat: 'markdown',
tags: ['api', 'medium', 'tutorial'],
publishStatus: 'draft'
}, {
headers: {
'Authorization': `Bearer ${TOKEN}`
}
});
// Publish the post to Medium
const published = await axios.post(`${API_URL}/api/posts/${post.data._id}/publish`, {}, {
headers: {
'Authorization': `Bearer ${TOKEN}`
}
});
console.log('Post published successfully!', published.data);
} catch (error) {
console.error('Error publishing post:', error.response?.data || error.message);
}
}
publishPost();
📅 公開のスケジュール設定
このサーバーでは、将来の公開に向けて投稿をスケジュール設定できます。投稿を作成または更新する際に、ISO 形式のタイムスタンプを指定した scheduledAt フィールドを含めます。
{
"title": "Scheduled Post",
"content": "This will be published automatically.",
"scheduledAt": "2025-03-20T12:00:00.000Z"
}
Redis が設定されている場合、指定した時刻にサーバーが投稿を自動的に公開します。
🛡️ セキュリティに関する考慮事項
- 本番環境では必ず HTTPS を使用してください
- JWT シークレットを定期的にローテーションしてください
- 適切な監視とログ記録を設定してください
- 機密データは環境変数または安全な保管庫に保存してください
- 適切な CORS ポリシーを実装してください
🔧 設定
すべての設定は環境変数を通じて行います。
| 変数 | 説明 | 必須 |
|---|---|---|
| PORT | サーバーのポート(デフォルト:3000) | いいえ |
| MONGODB_URI | MongoDB 接続文字列 | はい |
| REDIS_URL | Redis 接続文字列 | いいえ |
| JWT_SECRET | JWT トークン用のシークレット | はい |
| MEDIUM_CLIENT_ID | Medium API のクライアント ID | はい |
| MEDIUM_CLIENT_SECRET | Medium API のクライアントシークレット | はい |
| MEDIUM_REDIRECT_URI | OAuth コールバック URL | はい |
| FRONTEND_URL | フロントエンドのリダイレクト先 URL | はい |
📜 ライセンス
MIT
🤝 貢献
貢献を歓迎します!お気軽にプルリクエストを送ってください。
- リポジトリをフォークします
- フィーチャーブランチを作成します(
git checkout -b feature/amazing-feature) - 変更をコミットします(
git commit -m 'Add some amazing feature') - ブランチにプッシュします(
git push origin feature/amazing-feature) - プルリクエストを作成します
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。