Skip to content

Commit 671576b

Browse files
committed
feat: 🎸 initial commit for mcp esa server
1 parent 135a787 commit 671576b

14 files changed

+2531
-1
lines changed

.cursor/rules/mcp-server.mdc

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
---
2+
description:
3+
globs:
4+
alwaysApply: false
5+
---
6+
# プロジェクト
7+
8+
esa.ioのAPIを使用して、基本的な操作を行えるMCPサーバーを作る
9+
.envで完了変数を管理し、ESA_TOKEN, ESA_TEAM_NAMEでそれぞれAPIトークンとチーム名を管理する。
10+
11+
esa.ioのAPIについては <https://docs.esa.io/posts/102> を参照。
12+
13+
# 使用技術
14+
15+
* python
16+
* uv
17+
18+
# 開発計画
19+
20+
1. **基盤構築フェーズ**
21+
* Pythonプロジェクト初期化 (`uv init`)
22+
* 環境変数設定 (`.env`)
23+
* APIクライアント基礎 (認証、ベースURL)
24+
25+
2. **コア機能実装フェーズ**
26+
* **ユーザー情報取得 (`/user`, テスト)**
27+
* 記事一覧取得 (`/posts`, 検索、テスト)
28+
* 記事詳細取得 (`/posts/:post_number`, テスト)
29+
* エラー処理
30+
31+
3. **追加機能と改善フェーズ**
32+
* 記事作成 (`POST /posts`, テスト)
33+
* 記事更新 (`PATCH /posts/:post_number`, テスト)
34+
* 記事削除 (`DELETE /posts/:post_number`, テスト)
35+
36+
4. **ドキュメント整理**
37+
* ドキュメント作成 (`docs/`)
38+
39+
# 進め方のポイント
40+
41+
* フェーズごとに `git commit`
42+
* TDD (テスト駆動開発)
43+
* **コードを修正したらテスト (`pytest`) とフォーマット/リントチェック (`ruff format`, `ruff check`) を実行する**
44+
* 必要に応じて機能追加 (コメント等)
45+
* サーバーのドキュメント作成
46+
47+
# FastMCPツールでのロギング
48+
49+
* **注意:** MCPツールの `main` 関数内でのロギングに `print` を使用しないでください。
50+
* **推奨:** 常に `logging` パッケージを使用してください。
51+
* `print` はpytestのコードでのみ使用してください。
52+
* 必要に応じて `logger.info()`、`logger.warn()`、`logger.error()`、`logger.debug()` を使用してください。
53+
54+
# FastMCPサーバー開発ノート
55+
56+
* MCPサーバーのコード (`main.py` またはその依存関係) を変更 (ツールの追加/削除、サーバー設定の変更) した後は、CursorでMCPサーバー情報を **再読み込み** する必要があります。
57+
* ツールを追加した直後に「見つからない」と表示される場合は、CursorでMCPサーバー接続を再読み込みしてみてください。
58+
* 変更が完全に認識されるまでに、複数回の再読み込みが必要になる場合があります。
59+
60+
## 環境変数とインポート
61+
62+
* モジュールのインポート時に即座に実行されるコード (例: `src/esa_client.py` のトップレベルでの環境変数チェック) には注意してください。
63+
* サーバーを起動する前に、必要な環境変数 (`ESA_TOKEN`, `ESA_TEAM_NAME`) が正しく設定されていること (例: `.env` と `dotenv` 経由で) を確認してください。
64+
65+
## その他の注意点 (必要に応じて追記)
66+
67+
# リント/フォーマットエラーを優先対応
68+
69+
リンターやフォーマッターのエラーが発生した場合は、直ちに修正してください。これらのエラーが解決されるまで、他のタスクに進ないでください。
70+
71+
# 定期的なフォーマットとリントチェック
72+
73+
コードの品質と一貫性を確保するために、定期的に `ruff format && ruff check` を実行することを忘れないでください。
74+
75+
# 追加タスク (Geminiによる)
76+
77+
## `no-unused-vars` (未使用の変数)
78+
79+
* **対応:** 未使用のインポートや変数は完全に削除してください。
80+
* **禁止:** アンダースコアプレフィックス (例: `_variable`) を使用したり、未使用のコードをコメントアウトしたりしないでください。
81+
82+
## 一般的な未使用コード
83+
84+
* **対応:** 現在使用されていない、または直ちに使用する予定のないコードは削除してください。
85+
* **理由:** コードベースをクリーンで焦点の合った状態に保ちます。

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ESA_TEAM_NAME="YOUR_ESA_TEAM_NAME" # Replace with your esa.io team name (e.g., "myteam")
2+
ESA_TOKEN="YOUR_ESA_API_TOKEN" # Replace with your esa.io API access token

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.13

README.md

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,119 @@
11
# mcp-esa-server-python
2-
esa.io の mcp server
2+
3+
esa.io API と連携するための Model Context Protocol Server (mcp server)です。Pythonで実装しています。
4+
5+
## できること
6+
7+
現在は以下の機能を提供しています。
8+
9+
- ユーザー情報取得(user_get_info)
10+
- 記事一覧取得(posts_get_list)
11+
- 記事詳細取得(posts_get_detail)
12+
- 記事作成 (posts_create)
13+
- 記事更新 (posts_update)
14+
- 記事削除 (posts_delete)
15+
16+
## セットアップ手順
17+
18+
### 前提条件
19+
- esa.ioのAPIトークンを発行済であること
20+
- uv が使えること
21+
- インターネット接続
22+
23+
- esa.ioのAPIトークンの発行方法
24+
- あなたの esa.io チームのページにアクセスします (例: `https://<your-team-name>.esa.io/`)。
25+
- 左カラムのSETTINGSをクリックし、「ユーザー設定」>「外部アプリ連携」を選択します。
26+
- 「Personal access tokens」セクションで、「Generate new token」をクリックします。
27+
- トークン名 (例: `mcp-server`) を入力し、必要な権限スコープを選択します。この MCP サーバーには少なくとも以下の権限が必要です:
28+
- `read` (記事の読み取り)
29+
- `write` (記事の作成・更新・削除)
30+
- `read_user` (ユーザー情報の取得) (この項目は自動的に有効になるため、表示されない可能性があります)
31+
- 「Save」をクリックします。
32+
- **表示されたトークンを必ずコピーして安全な場所に保管してください。このトークンは一度しか表示されません。**
33+
- コピーしたトークンは、後述の `.env` ファイルの `ESA_TOKEN` の値として貼り付けます。
34+
- [esa.io](https://esa.io/) では、サインアップから2ヶ月間の無料トライアル期間が提供されています。この期間を利用して、テスト用のチーム名とAPIトークンを取得することができます。
35+
- セキュリティのため、トークンは直接公開しないようご注意ください。
36+
37+
38+
### プロジェクトの初期化
39+
40+
```bash
41+
uv sync
42+
```
43+
44+
### 開発(ローカルでの使い方)
45+
46+
開発に参加する場合や、MCPInspectorを利用する場合は、以下の手順で環境を構築します。
47+
48+
1. 環境変数の設定
49+
`.env.example` を参考にして、`.env` をサーバーを実行したいディレクトリ(`.env.example`と同じ場所)を作成します。
50+
```dotenv
51+
ESA_TEAM_NAME="YOUR_ESA_TEAM_NAME" # Replace with your esa.io team name (e.g., "myteam")
52+
ESA_TOKEN="YOUR_ESA_API_TOKEN" # Replace with your esa.io API access token
53+
```
54+
55+
2. 実行方法
56+
下記コマンドを実行後に、指示のあるURLからブラウザを開くことで、MCP Inspectorを使って、各コマンド(記事作成など)を実行することができます。
57+
```bash
58+
uv run mcp run main.py
59+
```
60+
61+
### MCPServerとしてCursorエディタで使う方法
62+
63+
1. **mcp.jsonの作成例**
64+
65+
プロジェクトルートまたは `~/.cursor/mcp.json` に以下のような設定ファイルを用意します。
66+
67+
```json
68+
{
69+
"mcpServers": {
70+
"mcp-esa-server": {
71+
"command": "uv",
72+
"args": [
73+
"--directory",
74+
"<プロジェクトの絶対パス>",
75+
"run",
76+
"main.py"
77+
],
78+
"env": {
79+
"ESA_TEAM_NAME": "<your-team-name>",
80+
"ESA_TOKEN": "<your-esa-token>"
81+
}
82+
}
83+
}
84+
}
85+
```
86+
- `<your-team-name>``<your-esa-token>` は各自のesa.ioチーム名・APIトークンに置き換えてください。
87+
- `env`: 環境変数を **直接** 設定します。**この方法を使用する場合、`.cursor/mcp.json` のコミットは絶対に避けてください。**
88+
89+
90+
2. **CursorエディタでMCPサーバーを起動**
91+
92+
- CursorエディタのコマンドパレットやUIから「MCPサーバーを起動」または「AIツールを有効化」します。
93+
- mcp.jsonの設定に従い、`uv run main.py` でサーバーが起動します。
94+
- `.env` ファイルや環境変数も自動的に読み込まれます。
95+
96+
3. **AIチャットやツールパネルからAPIを呼び出し**
97+
98+
- AIチャット上で `user_get_info``posts_get_list` などのMCPツールを呼び出すことで、esa.io APIと連携した操作が可能です。
99+
- `mcp-esa-server を使って記事の作成をお願いします` などとチャット上で書き込むことで利用できます。
100+
101+
## ライセンス (License)
102+
103+
このプロジェクトは [MIT License](./LICENSE) の下で公開されています。
104+
(注: `LICENSE` ファイルがまだリポジトリにない場合は、別途追加する必要があります。)
105+
106+
## 使用している外部コード / Dependencies
107+
108+
このプロジェクトの一部では、以下のMIT Licenseで公開されているコードを参照しています。
109+
110+
- **[参照元プロジェクト名]**
111+
- GitHubリポジトリ: [https://github.com/masseater/esa-mcp-server]
112+
- ライセンス: MIT License
113+
114+
## その他 (Misc)
115+
116+
### 生成元 (Generated by)
117+
118+
generated by Cursor (gemini-2.5-pro-exp-03-25)
119+

docs/api_client_spec.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# MCPサーバー esa.io APIクライアント仕様
2+
3+
このドキュメントは、esa.io API クライアント(EsaClientクラス)の実装仕様とテスト方針を記述します。
4+
5+
## 1. 目的
6+
7+
esa.io API との通信を行うための基本的なクライアント機能を提供します。認証情報の管理、リクエストの送信、基本的なエンドポイントへのアクセス機能を含みます。
8+
9+
## 2. クライアント仕様
10+
11+
- .envからESA_TOKEN/ESA_TEAM_NAMEを取得
12+
- requests.Sessionによる認証付き通信
13+
- get_user, get_posts, get_postメソッドを提供
14+
- エラー時は例外送出・ログ出力
15+
16+
### 2.1. EsaClient クラス
17+
18+
- 初期化時にdotenv.load_dotenv()で環境変数を取得し、認証情報を検証
19+
- APIベースURL(https://api.esa.io/v1/teams/{team_name})を構築
20+
- 共通ヘッダー(Authorization, Content-Type)を設定
21+
- _requestヘルパーでAPIリクエストを共通化
22+
- get_user: 認証ユーザー情報取得
23+
- get_posts: 記事一覧取得(q, page, per_page対応)
24+
- get_post: 記事詳細取得(post_number指定)
25+
26+
## 3. テスト方針・構成
27+
28+
- pytestによるユニットテスト・インテグレーションテスト
29+
- モックによる外部依存排除
30+
- テストディレクトリ・マーカーの使い分け
31+
32+
### 3.1. テスト構成
33+
- **ユニットテスト:**
34+
- APIクライアントやMCPツールのロジックをモックで高速に検証します。
35+
- テストファイル例: `tests/test_esa_client.py`, `tests/test_main_tools.py`
36+
- **インテグレーションテスト:**
37+
- 実際のesa.io APIと通信し、全体の連携を検証します(.envとネットワークが必要)。
38+
- テストファイル例: `tests/integration/test_esa_client_integration.py`
39+
- テストディレクトリは `tests/` 配下にあり、`integration/` サブディレクトリでインテグレーションテストを分離しています。
40+
- pytestのマーカー(`@pytest.mark.integration`)でインテグレーションテストを区別しています。
41+
42+
### 3.2. ユニットテスト詳細
43+
- 主なテストファイル:
44+
- `tests/test_esa_client.py`: EsaClientクラスの初期化・APIメソッドの正常系/異常系
45+
- `tests/test_main_tools.py`: MCPツールの引数処理・EsaClient呼び出し・エラーハンドリング
46+
- モック・フィクスチャ:
47+
- `monkeypatch` で環境変数をセット
48+
- `unittest.mock.patch` で requests や EsaClient のメソッドをモック
49+
- 主なテストケース例:
50+
- 認証情報がない場合の初期化エラー
51+
- get_user の正常/エラー応答
52+
- get_posts のパラメータ有無・エラー応答
53+
- MCPツールが正しいEsaClientメソッドを呼ぶか
54+
55+
### 3.3. インテグレーションテスト詳細
56+
- 主なテストファイル:
57+
- `tests/integration/test_esa_client_integration.py`
58+
- 内容:
59+
- 実際のesa.io APIと通信し、ユーザー情報・記事一覧・記事詳細の取得を検証
60+
- 存在しない記事番号で404エラーを検証
61+
- 注意点:
62+
- `.env`ファイルに有効なESA_TOKEN/ESA_TEAM_NAMEが必要
63+
- ネットワーク接続が必要
64+
- 実行に時間がかかる場合あり
65+
66+
## 4. テスト実行方法
67+
68+
- **ユニットテストのみ実行:**
69+
```bash
70+
uv run pytest tests/
71+
```
72+
- **インテグレーションテストのみ実行:**
73+
```bash
74+
uv run pytest -m integration tests/integration/
75+
```
76+
- **全テスト実行:**
77+
```bash
78+
uv run pytest
79+
```
80+
81+
---
82+
83+
※サーバー全体の設計・開発まとめは docs/20250504/mcp_esa_development_summary.md を参照。
84+
※利用方法・MCPツールの説明は docs/mcp_esa_server_usage.md を参照。

docs/mcp_esa_development_summary.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# esa.io MCPサーバー開発まとめ
2+
3+
## 概要
4+
5+
本プロジェクトは、esa.ioのAPIをAIアシスタントから操作できるMCPサーバーの開発を目的としています。
6+
7+
## サーバー設計・技術スタック
8+
9+
- **FastAPI**: Webフレームワーク
10+
- **FastMCP**: MCPプロトコル実装
11+
- **aiohttp**: 非同期HTTPクライアント
12+
- **pytest/ruff**: テスト・フォーマット
13+
14+
## 主要機能
15+
16+
- ユーザー情報取得(user_get_info)
17+
- 記事一覧取得(posts_get_list)
18+
- 記事詳細取得(posts_get_detail)
19+
- 記事作成 (posts_create)
20+
- 記事更新 (posts_update)
21+
- 記事削除 (posts_delete)
22+
23+
## 実装ポイント
24+
25+
- MCPツールとしてユーザー情報・記事一覧・記事詳細取得を実装
26+
- 環境変数・エラーハンドリングの徹底
27+
- ユニットテスト・インテグレーションテストの分離
28+
29+
## 技術的課題と解決策
30+
- .envによる安全な認証情報管理
31+
- テストのモック化・テスト対応
32+
33+
## 今後の課題
34+
35+
- 他のAPI操作の実装
36+
- エラーハンドリングの強化
37+
- テスト拡充・パフォーマンス最適化
38+
39+
---
40+
41+
※APIクライアントの詳細仕様・テスト構成は docs/api_client_spec.md を参照。
42+
※利用方法・起動手順・MCPツールの説明は docs/mcp_esa_server_usage.md を参照。

0 commit comments

Comments
 (0)