ClaudeでAppleのメモ機能を自動操作するMCPサーバーを作ってみた
はじめに
どうもClaude使用歴2ヶ月目のwrenchです。
今回は、Claude Desktop Appを活用したMCPサーバーの構築について、その開発過程と得られた知見を共有させていただきます。
きっかけ
日々の開発業務において、Claude Desktop Appを積極的に活用していました。その中で、「後で参照したい」と感じる有用なスクリプトや会話内容に頻繁に遭遇し、それらを都度メモに残す機会が増えていきました。
また、Claude Desktop Appでは会話が一定の長さを超えると、以下のように新規チャットでの会話の継続を促されます。
このような状況では、それまでの会話内容をClaudeに要約してもらい、それをメモとして保存する運用を行っていました。新規チャットを開始する際には、このメモを参照することで会話の文脈を維持することができます。(会話の履歴を保持して欲しい。。。)
ちなみに、Claudeに会話内容を別Chatで引き継げるのか聞いてみました。
しかし、この保存と参照のプロセスを毎回手動で行うのは非効率的でした。
(自動でなんとか登録されるようにしたい。。。)
そんな時、Anthropicが公開した以下のMCPに関する記事に出会い、これが課題解決の突破口になると考え、実装に着手することにしました。
MCPとは?
MCP(Memory and Context Protocol)は、AIアシスタントとの対話におけるコンテキスト管理を効率化し、より自然なコミュニケーションを実現するためのプロトコルです。このプロトコルを導入することで、AIが必要な情報に効率的にアクセスでき、より一貫性のある対話が可能となります。
具体的には、今回の実装ではAppleのメモ機能と連携し、メモの作成・編集・検索をシームレスに行えるようになります。
完成したシステムの紹介
本プロジェクトのソースコードはGitHubにて公開しています。
主要機能
本プロジェクトでは、以下の機能を実装することで、Claudeとのよりスムーズな対話を実現しました。
基本機能として、メモの新規作成・編集に加え、タイトルや本文の全文検索機能を実装しました。これにより、過去のメモ内容への即座のアクセスが可能となります。
また、Claudeとの対話をより直感的にするため、「メモを保存して」といった自然な命令での操作を可能にしました。チャット中に記録したい内容があれば、簡単な指示だけで即座にメモとして保存できます。
実装
ここではレポジトリのコードを一部抜粋して解説したいと思います。
MCPサーバーインスタンス作成
PATH:src/index.ts
今回はAppleの『メモ』機能との連携を行うMCPサーバーインスタンスを以下のように作成しています:
const server = new McpServer({
name: "apple-notes",
version: "1.0.0"
});
tool
メソッドを用いて、Claudeが利用可能な各機能を定義します:
server.tool(
"create-note", // ツール名
{
title: z.string(), // 入力パラメータの定義
content: z.string(),
tags: z.array(z.string()).optional()
},
async ({ title, content, tags = [] }) => { // 実行ハンドラ
const note = notesManager.createNote(title, content, tags);
// ... 処理の実装
}
);
メモの作成・取得
PATH:src/services/appleNotesManager.ts
Appleのメモ機能との連携方法を検討した結果、Node.jsのexecSync
を使用してosascript
コマンドを同期的に実行する方式を採用しました:
import { execSync } from 'child_process';
import type { AppleScriptResult } from '@/types.js';
export function runAppleScript(script: string): AppleScriptResult {
try {
const output = execSync(`osascript -e '${script}'`).toString();
return {
success: true,
output: output.trim()
};
} catch (error) {
console.error('AppleScript execution failed:', error);
return {
success: false,
output: '',
error: error instanceof Error ? error.message : String(error)
};
}
}
claude_desktop_config.jsonの設定
これはClaude Desktop Appで利用するMCPサーバーを設定するための重要なJSONファイルです。
まず、Claude Desktop Appをインストールした状態で、PATH:~/Library/Application Support/Claude/claude_desktop_config.json
の存在を確認します。
ファイルが存在しない場合は、以下のコマンドで作成します:
touch claude_desktop_config.json
作成したJSONファイルに、MCPサーバーを以下のように登録します:
{
"mcpServers": {
"apple-notes": {
"command": "/Users/USER_NAME/.volta/bin/node",
"args": ["/Users/USER_NAME/Documents/private/apple-notes/build/index.js"]
}
}
}
設定後、Claude Desktop Appを再起動すると、右下に「カナヅチ」マークが表示されます。
今回は3つのtoolを実装したため、数字の「3」が表示されています。
「カナヅチ」マークをクリックすると、登録されているtoolsの一覧が表示されます。
実装した3つのtoolsが正しく登録されていることが確認できました。
実際の動作デモについては、容量の制約によりここでは掲載できませんが、GitHubのReadMeを確認してみてください。
開発中に遭遇した課題とその解決策
ここでは実際の開発過程で直面した問題とその解決方法を共有します。
MCPを活用した開発を検討されている方々の参考になれば幸いです。
NodeのPath解決の問題
開発者の方々の参考になればと思い、基本的ではありますが重要な注意点として共有させていただきます。
claude_desktop_config.jsonでMCPサーバーを設定する際は、必ずNodeのPATHを正確に指定する必要があります。
私の環境ではvoltaを使用していたため、PATHの解決に苦心しました。
which node
> /Users/USER_NAME/.volta/bin/node
上記コマンドで得られたパスをclaude_desktop_config.jsonに設定し、アプリケーションを再起動することで問題が解決しました。
テスト・デバッグツール:MCP Inspector
MCPサーバーの入出力をデバッグする際は、MCP Inspectorの活用を強くお勧めします。このツールを使用することで、実装したtoolの動作検証を効率的に行うことができます。
アプリケーションのルートディレクトリで以下のコマンドを実行します:
npx @modelcontextprotocol/inspector node build/index.js args...
実行すると、直感的なデバッグインターフェースが表示されます。
各toolのテストとデバッグが可能で、私自身も文章保存時の改行の問題などをこのツールを使って効率的に解決することができました。
改善していきたい箇所
今後使いながら、以下の箇所を改善していければなと思います
検索機能の拡充
現状:タイトルのみの検索機能
目標:メモ内容の全文検索機能の実装
タグ機能の実装
Appleのメモ機能が持つタグ機能との連携
より効率的な分類・管理の実現
まとめ
開発に取り組んでみて、驚くほどスムーズに進められました。チュートリアルを参考に機能を作っていったのですが、なんと1日で形にすることができました。作るものの複雑さにもよりますが、思っていたよりもずっと簡単に開発できたのが正直な感想です。
開発中は、MCP Inspectorというテストツールに助けられました。作った機能がちゃんと動くかどうかをすぐに確認できて、問題があればその場で直せたので、とても効率よく開発を進めることができました。
このプロジェクトを始めたきっかけは、Claude Desktop Appを使っていて感じた不便さでした。会話の内容を保存して再利用する作業が手間だったことから今回のMCPサーバーを作成しました。MCPを使うことで、AIとの会話がより自然になり、作業の流れもスムーズになりました。最初は自分用のメモツールとして作り始めましたが、開発を進めていくうちに「これ、チームでも使えるかも」と思うようになりました。今後はSlackやNotionと連携できる機能も追加して、チームでも使えるツールに発展させていければと思っています。
Discussion