GROWI の MCPサーバーをバイブコーディングしてみた
GROWI の MCPサーバーを作ってみた
今更ながら、MCPのキャッチアップを兼ねて、Cursorで使用できるGROWIのMCPサーバーを作成してみました。
⚠️公式製でもなんでもないので、あくまで個人利用等に限っての利用をお勧めします。
もっとシンプルに実装できそうではあるので今後改善の余地があります。
GROWI:
既存の mcp サーバーと、GROWIのAPIドキュメントを参考に、基本的には Cursor へのプロンプトで作成しました。
ちなみにこの記事もほぼCursorで書いてみました。
背景
- 単純に mcp をキャッチアップしてみたかった
- Growi を活用していて、新たなユースケースを発掘してみたかった
- 周りにも mcp サーバーを作ってる方がいて刺激を受けた
実装のポイント
-
Node.jsベースのMCPサーバー
- TypeScriptで記述
- MCP SDKを使用
-
直接HTTPリクエスト
- GROWIのAPIに直接アクセス
はまりどころ
基本的には Cursor x Claude でのバイブコーディングで作成しました。
内部では mcp の TypeScript SDKを活用しているので、基本的にはお作法にならってサーバーを実装する形になります。
問題1: JSONパースエラー
当初、ログメッセージに絵文字が含まれていたため、Cursorがレスポンスをパースできないという問題がありました。
Client error for command Unexpected token '✅', "✅ Tool exe"... is not valid JSON
解決策: ログから絵文字を削除し、標準出力に何も書き込まないようにしました。
問題2: アクセストークン周りの処理
MCP サーバー自体の実装よりはここで処理でだいぶ時間を溶かしました。
(細かい実装まで自分でいちいち確認しておけばもっと時間短縮できたかも・・・Claudeを信じすぎたのが良くない)
ヘッダーの 'Content-Type':
指定ミスで、永遠にヘッダー経由のアクセストークンが受け付けてもらえず、 一旦は access_token
をクエリパラメータで食わせる形で実装していました。
こちらは解消したので、今はヘッダーで処理しています。
mcp というよりはAPIへの接続の問題でした。
解決策: ヘッダーでの処理を実装。
問題3: 想定より時間かかった
問題2に関連してますが、1-2時間で終わるかと思いつつ、結局5時間ほどかかってしまいました。
mcpサーバー作成の勘所はわかったので、他のtoolや他のサービスについてはもっとスムーズに実装できると思います。
解決策: 1つのtoolに絞り実装
問題4: asdf で node を入れていたことで mcp が起動できない
地味にはまりました。
解決策: command に /your/path/.asdf/installs/nodejs/18.20.8/bin/node
のような指定をすることで解消
使用方法
mcp.json に growi を追加
{
"mcpServers": {
"growi": {
"command": "node",
"args": ["/path/to/your/growi-mcp-server/dist/index.js"],
"env": {
"GROWI_API_URL": "{YOUR URL}",
"GROWI_API_TOKEN": "{YOUR TOKEN}"
}
}
}
}
GROWIのページ一覧を取得するには、Cursorで以下のように呼び出します:
mcp で Growi の / から記事を15件取ってきて
(それ以外の機能も順次追加していこうと思います)
今後の改善点
-
認証方法の改善 (Authorization headerの使用)解消 - ページ内容の取得APIの追加
- 検索機能の実装
まとめ
MCPプロトコルを活用することで、CursorとGROWIを連携させることができました。
もっとtoolsを拡張していけたらと思います。
人生初 npm publish
もできたので、久しぶりにエンジニアっぽいことができてよかったです。
mcp サーバー作者の方がおっしゃっていた気持ちがわかりました。
Discussion