Claudeに記憶を持たせてみた〜MCPとMemory機能の導入

OpenAI、MicrosoftがMCP（Model Context Protocol）への対応を発表したことで、「ついにMCPがAI界のUSB-C化するぞ！」と盛り上がっていますね。

そんな最中、私はClaude Professional Planに毎月課金しているにもかかわらず、未だにMCP自体を触ったことがありませんでした。

さすがにまずいだろ！ってことで、試しにAnthropic公式が出している`server-memory`を導入してみました。

https://github.com/modelcontextprotocol/servers/tree/main/src/memory

## server-memoryとは

Model Context Protocol公式プロジェクトが出しているパッケージです。これを導入することでAIアシスタントに長期記憶機能を付与できます。

ChatGPTでは過去のチャットからユーザーのコンテキストを保存して将来のチャットに活用しています。また、Gemini 2.0 Flashではユーザーが許可すればGoogleサービスの履歴を回答に活用させたりできます（Gemini with Personalization）。

Claudeの場合にはそういった機能がなく、チャットごとに完全に分断されているため、新規チャットを作る度に説明し直す手間があります。
Project機能を使えば、自分の自己紹介やAIアシスタントの役目・キャラクターをあらかじめ持たせておくことはできますが、チャットの履歴までは引き継げません。

`server-memory`はチャットのやり取りの中で、パーソナル情報を構造化されたデータとして保存してくれます。これにより、パーソナライズされた回答を簡単に引き出せるようになります。

私は普段からClaudeに人生相談をしているので、私についての情報が自動的にアップデートされてくれるならかなりありがたいです。

### そもそもMCPとは
> MCPはAnthropicが2024年11月に公開した「AIのUSB-Cポート」とも称される標準プロトコルで、AIモデルと外部データを効率的に接続します。MCPホスト（AIアプリケーション）、MCPクライアント（橋渡し役）、MCPサーバー（データ提供者）の3層構造で構成され、JSON-RPCベースの通信により様々なツールやリソースへのアクセスを可能にします。これにより、AIの知識を最新に保ちつつ専門領域への対応が強化され、異なるAIモデル間でも同じデータ統合を再利用できる柔軟性が実現します。

だそうです。ClaudeにPlaywrightを接続して調べてもらいました。

詳細はAnthropic公式のIntroductionや、私より詳しい方が書いた記事を参照してください。

https://modelcontextprotocol.io/introduction

https://qiita.com/megmogmog1965/items/79ec6a47d9c223e8cffc


## 導入方法
### 1. Node.jsをインストールする
PCにNode.jsを導入していない人は、先にインストールします。

ターミナルで以下のコマンドを実行して、バージョンではなくエラーが表示された人はNode.jsが未導入です。
![スクリーンショット 2025-03-30 094705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768381/fa675f1a-5a51-4344-9445-4dc29b3b0982.png)

インストール方法は色々ありますが、バージョン管理ツールの`nvm`や`nvm-windows`を使用するのがおすすめです。

MCPを試すだけならパッケージ済みのインストーラーで単一バージョン運用でも問題はありませんが、あとから別バージョンを共存させたいとなったときに結構面倒なことになりますので、最初からバージョン管理ツールを導入しておいたほうが後々楽です。

- Windows+nvm-windowsの場合は[こちら](https://learn.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-windows)を参照（Microsoft Learn）
- macOS+nvmの場合は[こちら](https://qiita.com/ffggss/items/94f1c4c5d311db2ec71a)を参照（藤澤勇樹さんの記事）

### 2. `server-memory`のパッケージをインストールする
ターミナルで以下のコマンドを実行して、グローバル環境にパッケージをインストールします。

```bash
npm install -g @modelcontextprotocol/server-memory
```

### 3.claude_desktop_config.jsonに設定を追記する
Claude Desktopを起動し、アプリの設定画面を開きます。
- Windowsの場合…ウィンドウ左上のハンバーガーメニュー(≡)→ファイル→設定
- macの場合…メニューバーのClaude→設定

設定画面を開いたら「開発者」→「構成を編集」の順にクリックします。
![スクリーンショット 2025-03-30 094006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768381/335c1e7d-5f6b-4e13-bfaf-962f817776f7.png)


自動で開かれたエクスプローラ（Finder）から`claude_desktop_config.json`を探してエディタで開き、以下をコピペします。

```json
{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-memory"
      ],
    }
  }
}
```
<details><summary>（オプション）記憶ファイルの保存場所を変更する</summary>

長期記憶のストレージとなる`memory.json`は所定だと`server-memory`のインストールフォルダに保存されますが、先程のJSONに環境変数を追加すると任意のフォルダに変更できます。

複数のPCで共有するためにクラウドストレージやNASに保存する、のようなことが可能です。
```json
{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-memory"
      ],
      "env": {
        "MEMORY_FILE_PATH": "{任意のフォルダのパス}/memory.json"
      }
    }
  }
}
```

#### バグの解決(v0.6.3)
執筆時点での最新バージョン(v0.6.3)では、環境変数に記したパスが反映されないバグがあります。

解決策はXで共有してくれていた方がいました。

https://x.com/LearningWtm/status/1904481555160187386

##### 1. `server-memory`のインストールディレクトリを探す
ターミナルで以下のコマンドを実行して、グローバル環境にインストール済みのパッケージのリストを出力します。

```bash
npm list -g
```

たとえばmacOS+nvmの環境なら以下のような結果が出力されると思います。

```
/Users/ユーザー名/.nvm/versions/node/v22.14.0/lib
├── @modelcontextprotocol/server-memory@0.6.2
├── corepack@0.31.0
└── npm@10.9.2
```

##### 2. `index.js`をエディタで開く
表示された親ディレクトリに移動し、その配下の`node-modules/@modelcontextprotocol/server-memory/dist/index.js`をエディタで開きます。

##### 3. `index.js`の10行目を以下のように書き換えてください。
```js
const MEMORY_FILE_PATH = process.env.MEMORY_FILE_PATH || path.join(__dirname, 'memory.json');
```

</details>

## Memory機能の使い方
「knowleage graphを読み取って」や「これまでのチャットからパーソナライズ情報に限定して、knowleage graphに記録して」と都度指示してもいいですが、Project機能を活用すると便利です。
### Project機能でプロンプトを登録する
ProjectのCustom Instructionsにプロンプトを登録し、Claudeの判断で知識グラフの読み書きが行われるようにします。

以下はプロジェクトのreadmeにあったサンプルプロンプトを日本語訳して、若干改造したものです。

```
各インタラクションには以下の手順に従ってください：

1. ユーザー識別：
    - あなたはdefault_userと対話していると想定してください
    - もしdefault_userを識別していない場合は、積極的に識別を試みてください
2. 記憶の取得：
    - チャット内での最初の会話開始時に「Remembering...」とだけ言って、知識グラフから関連するすべての情報を取得してください
    - 知識グラフは常に「記憶」と呼んでください
3. 記憶：
    - ユーザーとの会話中、以下のカテゴリに該当する新しい情報に注意を払ってください： 
    - a) 基本的なアイデンティティ（年齢、性別、場所、職業、学歴など） 
    - b) 行動（興味、習慣など） 
    - c) 好み（コミュニケーションスタイル、好みの言語など） 
    - d) 目標（目標、ターゲット、願望など） 
    - e) 人間関係（3次の隔たりまでの個人的および職業的関係）
4. 記憶の更新：
    - インタラクション中に新しい情報が得られた場合は、以下のように記憶を更新してください： 
    - a) 繰り返し登場する組織、人物、重要なイベントについてエンティティを作成する 
    - b) それらを関係を使って現在のエンティティに接続する 
    - c) それらに関する事実を観察として保存する
```

↓Project Instructionsを設定した様子

![スクリーンショット 2025-03-31 13.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768381/5996b2dc-6c1d-456f-884b-bb7d5017300b.png)

## 使用した感想
実際に使用しているところは、残念ながら個人情報の塊なのでお見せできません😅

代わりに、じっさい使ってよかった点と微妙だった点をいくつか挙げておきます。

### よかった点
- 構造化されたデータなので、トークン数の消費を抑えながら自分に関する情報を別のチャットに引き継げる。
- パーソナルデータの保存場所がローカルなので、プライバシーが確保される。
- Anthropic公式が開発しているので、これからも開発が活発に続きそう。

### 微妙な点
- 導入難易度がやや高め
    - Chromeの拡張機能くらい簡単に入れられるようになってほしいところ。
- チャットのはじめにプロンプトを入れるか、都度明確に指示するかしないと、Memoryの読み書きが行われない。
    - ChatGPTのパーソナライズと同程度だと想像していると肩透かしを食らう。
- ユーザーやコンテキストの使い分けが想定されていない。
	- 知識グラフを読み取ったあとに曖昧なプロンプトを投げると、こちらの意図とは関係ない過去の情報から判断しそうで怖い。

## まとめ
これ単体だとAIエージェントにはまだ遠いですが、分野ごとに特化したAIをChatGPやClaudeのようなLLMに接続して拡張していけるMCPは非常に面白い取り組みだなと思いました。

これからどんどんMCPサーバーが開発されてくれれば、いろんなMCPサーバーを組み合わせて自分に必要な能力を持ったAIエージェントを作れそうな未来が想像できてワクワクしますね。

みなさんもぜひMCPを導入して、自分好みなAIエージェントの構築を目指してみてください。

## 参考文献
https://qiita.com/Maki-HamarukiLab/items/3ccf9cd6edd634476d02