MCP Server Memo について
MCP Server Memo は、LLM のセッション要約やメモをローカルファイルシステムに保存し、各セッションのタイムスタンプ付きバージョンを保持します。外部データベースを使わずに会話記録を保存、更新、取得、参照したいアプリケーション向けです。
主な機能
- 01セッション要約のバージョン保存
- 02最新の要約を取得
- 03内容を追記して新バージョンを作成
- 04タイトルとタグの更新
- 05一覧の絞り込み・並べ替え・ページ分割
- 06セッションのバージョン履歴を参照
活用シーン
- 01更新ごとの会話要約を保存
- 02セッションの最新メモを取得
- 03タグやタイトルで要約を整理
- 04セッションのバージョン間の変更を確認
MCP 対応
要約の作成、取得、追記、一覧表示、メタデータ更新に加え、セッション履歴を取得する MCP ツールを公開します。データはローカルファイルシステムに保存されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Server Memo
Claude などの LLM 向けに、詳細なセッション要約やメモを管理する軽量な MCP(Model Context Protocol)サーバーです。このサーバーはローカルファイルシステムを使って永続的にデータを保存し、セッション履歴のバージョン追跡に対応しています。また、要約を保存、取得、一覧表示するためのツールを提供します。
概要
MCP Server Memo は、LLM 向けのメモリーアシスタントとして設計されており、MCP ツールインターフェースを通じて詳細なセッション記録を保存、取得できます。このサーバーの特長は次のとおりです。
- 履歴を保持 - セッションの最新バージョンだけでなく、すべての過去のバージョン(同じ sessionId)を保持します
- 時系列で整理 - セッションの複数のバージョンを時系列順に整理し、会話の展開を簡単に追跡できます
- ローカルストレージ - 外部データベースを必要とせず、ローカルファイルシステムを使用します
- MCP に準拠 - ツールインターフェースを提供するため、Model Context Protocol の仕様に準拠しています
- パフォーマンスを最適化 - ファイル I/O と並行処理を最適化しています
- 依存関係を最小限に抑制 - 保守や拡張が容易な、シンプルな設計です
インストール
# Clone the repository
git clone https://github.com/doggybee/mcp-server-memo.git
cd mcp-server-memo
# Install dependencies
npm install
# Build the project
npm run build
設定
サーバーでは、次の設定オプションを使用します。
MCP_SUMMARY_DIR:要約を保存するディレクトリ(デフォルト:./summaries/)
これらのオプションは、環境変数で設定できます。
export MCP_SUMMARY_DIR="/path/to/summaries"
サーバーの実行
# Standard startup
npm start
# Development mode (with auto-reload)
npm run dev
# Start with logging to file
npm run start:log
MCP ツール
サーバーは、次の MCP ツールを提供します。
1. upsertSummary
以前のバージョンを削除せずに、セッション要約の新しいバージョンを作成します。
パラメーター:
sessionId(string、必須):会話セッションの一意な識別子です。この ID を生成するのは、クライアントアプリケーションの責任です。 新しい論理会話セッションの開始時に一度だけ生成してください。一意性を確保するため、プログラミング言語で利用可能な標準の UUID(バージョン 4) ライブラリを使用することを推奨します。 その後、クライアントは、特定のセッションに関するすべての後続のupsertSummary呼び出しで、同じ ID を再利用する必要があります。summary(string、必須):セッションの記録/ログの詳細な内容です。呼び出すたびに、以前のバージョンを上書きするのではなく、セッション履歴に新しいバージョンを作成します。title(string、省略可):セッションを表す短く簡潔なタイトルです。tags(string[]、省略可):セッションを分類するキーワードまたはタグです。
動作:
- 新しいタイムスタンプを使って新しいファイルを作成します
- 以前のすべてのバージョンを保持します
- 新しいバージョンのタイムスタンプを返します
2. getSummaryTool
特定のセッション要約の最新バージョンを取得します。
パラメーター:
sessionId(string、必須):取得するセッション要約の一意な ID です。maxLength(number、省略可):指定した場合、取得した要約テキストをこの最大文字数に切り詰めます。
戻り値:
- 最新のセッション要約オブジェクト(JSON 形式)
3. listSummariesTool
利用可能な要約を一覧表示します(各セッションの最新バージョンのみ)。フィルタリング、ソート、ページネーションに対応しています。
パラメーター:
tag(string、省略可):指定したタグでセッションをフィルタリングします。limit(number、省略可):結果の数を制限します。offset(number、省略可):ページネーションの開始位置です。sortBy(string、省略可):ソートするフィールド('lastUpdated' または 'title')。デフォルト:'lastUpdated'。order(string、省略可):ソート順('asc' または 'desc')。デフォルト:'desc'。
戻り値:
- 要約のメタデータオブジェクトのリスト(JSON 形式)。各セッションの最新バージョンのみを含みます
4. updateMetadata
セッションの最新バージョンのメタデータ(タイトルおよび/またはタグ)のみを更新します。要約の内容やタイムスタンプは変更されません。
パラメーター:
sessionId(string、必須):メタデータを更新するセッションの一意の ID。title(string、任意):新しいタイトル。省略した場合、タイトルは変更されません。tags(string[]、任意):新しいタグの配列。省略した場合、タグは変更されません。
注: title または tags の少なくとも一方を指定する必要があります。
動作:
- ファイル名のタイムスタンプや
lastUpdatedフィールドは更新されません - 指定されたメタデータフィールドのみを変更します
- 要約の内容には影響しません
5. appendSummary
セッションの要約に内容を追加し、以前の内容と新しい内容を含む新しいバージョンを作成します。
パラメーター:
sessionId(string、必須):会話セッションの一意の識別子。content(string、必須):セッションに追加する内容。既存の内容に追加され、新しいバージョンとして保存されます。title(string、任意):セッションの任意のタイトル。tags(string[]、任意):セッションを分類するための任意のタグ。
動作:
- 既存の最新の要約があれば読み込みます
- 内容の間に改行を2つ追加して、新しい内容を追加します
- 新しいタイムスタンプを含むファイルを作成します
- 以前のすべてのバージョンを保持します
6. listAllSummariesTool
利用可能なすべての要約について、基本情報を一覧表示します(各セッションの最新バージョンのみ)。
パラメーター:
- なし
戻り値:
- 利用可能なすべての要約の基本情報の一覧(JSON 形式)
7. getSessionHistory
特定のセッションのすべての過去のバージョンを、新しい順に取得します。
戻り値:
- 全バージョンの完全な内容の一覧(JSON 形式)
クライアントのワークフロー例
クライアントアプリケーションがこのサーバーと連携する方法の例を示します。
import { v4 as uuidv4 } from 'uuid';
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
// Initialize client
const transport = new StdioClientTransport({
command: 'node',
args: ['dist/index.js'],
cwd: process.cwd()
});
const client = new Client({
name: 'example-client',
version: '1.0.0'
});
await client.connect(transport);
// Function to generate new session ID (done once per logical session)
function createNewSession() {
return uuidv4();
}
// Function to append to an existing session
async function appendToSession(sessionId, newContent) {
return client.callTool({
name: "appendSummary",
arguments: {
sessionId,
content: newContent,
title: "Example Session",
tags: ["example", "demo"]
}
});
}
// Function to get session history
async function getSessionHistory(sessionId) {
const response = await client.callTool({
name: "getSessionHistory",
arguments: { sessionId }
});
const result = JSON.parse(response.content[0].text);
if (result.success) {
return result.history;
}
throw new Error(result.error || "Failed to get session history");
}
// Usage example
const sessionId = createNewSession();
// Add initial content
await appendToSession(sessionId, "Initial conversation data");
// Add more content later in the conversation
await appendToSession(sessionId, "Second part of the conversation");
await appendToSession(sessionId, "Final part of the conversation");
// Get the full history
const history = await getSessionHistory(sessionId);
console.log(`Session ${sessionId} has ${history.length} versions`);
プロジェクト構成
mcp-server-memo/
├── dist/ # Compiled JavaScript output
├── src/ # TypeScript source code
│ ├── config.ts # Server configuration
│ ├── index.ts # Main entry point
│ ├── storage.ts # File storage utilities
│ ├── tools.ts # MCP tool implementations
│ └── types.ts # TypeScript type definitions
├── summaries/ # Directory for storing session data
│ └── .gitkeep # Ensures directory is included in git
├── package.json # Project metadata and dependencies
├── tsconfig.json # TypeScript configuration
└── LICENSE # MIT License file
ライセンス
このプロジェクトは MIT License の下でライセンスされています。詳細については、LICENSE ファイルを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。