Durable Thinking について
Durable Thinkingは、順序立てた思考の履歴を保持したいクライアント向けのセルフホスト型MCPサーバーです。送信された思考を保存し、続行、修正、分岐に対応するほか、MCP Appで表示できます。
主な機能
- 01順次思考履歴の永続化
- 02シーケンスの続行・修正・分岐
- 03履歴のページ取得
- 04保存したシーケンスの削除
- 05MCP Appによる可視化
活用シーン
- 01後から思考シーケンスを再開
- 02分岐や修正の確認
- 03クライアントセッションごとの履歴分離
MCP 対応
順次思考、履歴取得、削除のツールをMCPクライアントに提供します。MCP Apps対応ホストでは思考カードと完了時の全履歴を表示できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://{worker_host}/mcp-compatclaude mcp add --transport http linxule-durable-thinking https://{worker_host}/mcp-compat{"mcpServers":{"linxule-durable-thinking":{"type":"http","url":"https://{worker_host}/mcp-compat"}}}Cursor で開く{"servers":{"linxule-durable-thinking":{"type":"http","url":"https://{worker_host}/mcp-compat"}}}VS Code で開く{"mcpServers":{"linxule-durable-thinking":{"type":"http","url":"https://{worker_host}/mcp-compat"}}}{"mcpServers":{"linxule-durable-thinking":{"serverUrl":"https://{worker_host}/mcp-compat"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Durable Thinking
Cloudflare Workers 上で、MCP クライアント向けに永続化された逐次思考を提供します。
標準の Sequential Thinking サーバーは、思考をプロセスメモリに保持するため、プロセスが終了すると忘れてしまいます。このサーバーでは、思考を永続的に保存できます。調整可能な合計数、継続、修正、分岐という同じ推論モデルを、破棄する代わりに永続化します。各ステップは SQLite ベースの Cloudflare Durable Object に書き込まれ、推測不可能な ID で後から参照できます。また、MCP Apps に対応したクライアントでは、それぞれ独立したカードとして表示されます。
これはシングルユーザー向けのデプロイです。サインインゲートを通過できる GitHub アカウントは 1 つ、ヘッダーに対応したクライアント用のベアラートークンは 1 つ、プライベートストアは 1 つで、独自のインスタンスを立ち上げるためのデプロイボタン付きテンプレートが用意されています。
思考の表示例
通常の sequentialthinking 呼び出しは、どのクライアントでも読みやすい形式で表示されます。
Thought 3/5
A Durable Object keeps the application history persistent while the MCP HTTP
transport remains stateless.
Sequence: seq_... · 3 thoughts stored
構造化された結果は意図的に簡潔にしてあり、思考そのものは繰り返されません。
{
"sequenceId": "seq_...",
"thoughtNumber": 3,
"totalThoughts": 5,
"thoughtHistoryLength": 3
}
MCP Apps 対応ホストには、同じ思考が UI リソース ui://sequential-thinking/process.html に別途送信されます。ホストはツール呼び出しごとに 1 枚のカードを表示するため、このアプリもそれに合わせています。各カードにはそのカード自身の思考だけが表示され、ポーリングはなく、他のカードと状態を共有せず、チャットのトランスクリプト自体がタイムラインになります。シーケンスが終了すると(nextThoughtNeeded: false)、最後のカードは保存済みの履歴全体を読み込み、プロセス全体を一度に表示します。すべての思考が順番に並び、分岐と修正が示され、前のステップは折りたたまれて展開可能になります。
アプリは自己完結型の HTML ドキュメント 1 つで構成され、外部スクリプト、フォント、ネットワーク呼び出しはありません。履歴へのアクセスには、ホストの認証済み MCP 接続のみを使用します。MCP Apps に対応していないクライアントには、プレーンテキストの結果だけが返されます。
各書き込みのたびに思考全体を再送信することもありません。送信されるのは現在の思考だけです。モデルは意図的に get_thought_history を使って前の思考を再読み込みします。
ケイパビリティスコープの履歴
シーケンスを一覧表示するツールはなく、今後も追加されません。最初の呼び出しで返される sequenceId が唯一のアクセス手段です。推測できないほど長く、その履歴を確認するための唯一の認証情報です。この ID を持っていればシーケンスを読めます。持っていなければ、そのシーケンスは存在しないも同然です。
これにより、1 つのデプロイを多数のクライアントやセッションで同時に使っても、それぞれの推論が他者に見られることはありません。認証によって入口を通過し、シーケンス ID によって部屋に入ります。
ツール
sequentialthinking
推論のステップを 1 つ保存します。最初の呼び出しでは sequenceId を省略し、返された ID を以降のすべての継続呼び出しで渡します。
thought
nextThoughtNeeded
thoughtNumber
totalThoughts
sequenceId?
isRevision?
revisesThought?
branchFromThought?
branchId?
branchFromBranchId?
needsMoreThoughts?
branchId と branchFromThought を組み合わせて指定すると、メイン経路から分岐できます。branchFromBranchId を追加すると、別の分岐内から分岐できます。その後のステップでも、同じ branchId を渡し続けます。修正するには、isRevision: true と revisesThought を指定します。
思考番号は、それを書き込む分岐内で管理されます。そのため、2 つの分岐がそれぞれ独自の思考 3 を持つこともあります。参照先は、書き込み先の分岐で解決された後、各分岐点までの祖先をさかのぼって確認され、最も近いスコープが優先されます。
エラーとして扱わず、結果にフラグを付けて受け入れる例外ケースが 2 つあります。nextThoughtNeeded: false と指定された思考の後にシーケンスを継続すると、シーケンスは再開されます。また、同じ分岐で思考番号を再利用すると、後の参照はその番号を持つ最新の思考に解決されます。
get_thought_history
全文履歴を古い順に、ページ分割して返します。続きを取得するには、nextCursor を cursor として渡します(カーソル値は不透明なので、計算しないでください)。ページを 1 つの分岐に限定するには branchId を渡します。sequence.branches には、親と分岐点を含むすべての分岐が一覧表示されます。
delete_thought_sequence
シーケンスと保存済みテキストを完全に削除します。confirm: true が必要です。
アーキテクチャ
MCP client
│
│ POST /mcp or /mcp-compat
│ OAuth access token or static bearer token
▼
Cloudflare Worker
│
│ static token → straight to the MCP handler
│ anything else → workers-oauth-provider validation
│ fresh MCP server for each request
▼
ThoughtStore Durable Object: "personal"
│
▼
SQLite tables for sequences, thoughts, and branches
MCP のトランスポートはステートレスです。データベースキーや継続性の仕組みとして Mcp-Session-Id は使用しません。アプリケーションの状態はすべて Durable Object に保存され、ツール引数で明示的に渡される sequenceId をキーとして管理されます。
保存されるのは、公開されている thought 引数を通じて送信されたテキストのみです。サーバーがモデルの非公開または隠された推論にアクセスすることはありません。
独自にデプロイする
ワンクリック
デプロイには 3 つのシークレットが必要です。MCP_API_TOKEN(静的なベアラートークン。32 バイト以上のランダムな値を生成してください)と、以下の GitHub サインインで説明する OAuth アプリの GITHUB_CLIENT_ID および GITHUB_CLIENT_SECRET です。
openssl rand -hex 32
また、独自の OAuth KV 名前空間も必要です。npx wrangler kv namespace create OAUTH_KV を実行し、その ID を wrangler.jsonc に設定してください(名前空間 ID はシークレットではありません)。
以下の 3 つのエンドポイントが作成されます。
https://<worker>.<account>.workers.dev/mcp
https://<worker>.<account>.workers.dev/mcp-compat
https://<worker>.<account>.workers.dev/healthz
GitHub サインイン
ブラウザベースのクライアントは GitHub にサインインして認証します。アクセスが許可されるのは、許可リストに登録されたアカウントのみです。
- GitHub の開発者設定で OAuth App を作成します。ホームページ URL は
https://<worker-host>、コールバック URL はhttps://<worker-host>/callbackに設定します。 - 認証情報を Worker のシークレットとして保存します。
npx wrangler secret put GITHUB_CLIENT_IDを実行し、続けてGITHUB_CLIENT_SECRETを設定します。 - 許可リストを設定します。
npx wrangler secret put ALLOWED_GITHUB_LOGINを実行します。GitHub のログイン名を 1 つ以上、カンマ区切りで指定します。大文字と小文字は区別されません。値が空、または設定されていない場合は安全側に処理され、誰も認証を完了できません。継続的デプロイで上書きされないよう、wrangler.jsoncの変数ではなくシークレットとして設定します。
サインインフローで読み取るのは GitHub のユーザー ID のみです。許可リストと照合した後、GitHub トークンは破棄されます。認証は変更可能なログイン名ではなく、変更不可能なアカウント ID に紐付けられます。
継続的デプロイ
GitHub Actions は、すべてのプルリクエストと main へのすべてのプッシュで npm run verify を実行します。検証済みの main へのプッシュでは、Wrangler を使って Worker をデプロイします。デプロイが重複して実行されることはなく、フォークの場合のように認証情報がない場合は、デプロイジョブが適切にスキップされます。
以下を Settings → Secrets and variables → Actions に設定します。
CLOUDFLARE_API_TOKEN— Workers Scripts の編集権限。CLOUDFLARE_ACCOUNT_ID— Worker を所有するアカウント。
これらはデプロイを認証するためのもので、上記のランタイムシークレットとは別です。
レジストリへの公開
GitHub Releases は .github/workflows/publish-mcp.yml を通じて、Durable Thinking のメタデータを公式 MCP Registry に公開します。このジョブでは GitHub OIDC を使用するため、id-token: write が必要ですが、長期間有効な Registry 認証情報は不要です。server.json では必須の worker_host 変数と完全な https://{worker_host}/mcp-compat URL を公開し、第三者を 1 つの非公開デプロイ先に誘導するのではなく、プロジェクト独自のデプロイモデルを反映しています。
このリポジトリは意図的に npm へ公開していません。package.json は Cloudflare アプリケーションを記述するもので、bin もローカルの stdio トランスポートもありません。npm パッケージを作成しても、クライアントがインストールできる MCP サーバーにはなりません。将来、サポート対象のローカルランタイムが追加された場合は、実行可能ファイル、パッケージ所有権のメタデータ、来歴情報を用意したうえで、npm Trusted Publishing を導入できます。
Smithery への URL 公開もリリースワークフローとは別です。Smithery では具体的なアップストリーム URL が必要ですが、Durable Thinking の各所有者は、GitHub の許可リストを設定した非公開の Worker をデプロイします。複数ユーザー向けのホスト型アクセスモデルがサービスに加わるか、Smithery が独自デプロイ用 URL テンプレートを直接サポートする場合に限り、Smithery を追加してください。
手動でデプロイする
要件:Node.js 22 以降、Workers と Durable Objects が有効な Cloudflare アカウント、Wrangler の認証。
npm install
npm run verify
npm run secrets # generates a local token
結果を未コミットの .dev.vars にコピーします(GitHub 関連の項目については .dev.vars.example を参照してください)。
MCP_API_TOKEN=<generated token>
npm run dev
デプロイの準備ができたら、次を実行します。
npx wrangler secret put MCP_API_TOKEN
npm run deploy
設定
wrangler.jsonc では、Durable Object と KV のバインディングを宣言します。オプションの Worker 変数は、Cloudflare またはローカルの .dev.vars で設定します。
| 変数 | デフォルト | 用途 |
|---|---|---|
THOUGHT_RETENTION_DAYS | 0 | 0 の場合、明示的に削除するまでシーケンスを保持します。正の値を設定すると、スライド式の有効期限が有効になります。 |
ALLOWED_HOSTNAMES | 自動 | カスタムドメイン用の、任意のカンマ区切りホスト許可リストです。 |
ALLOWED_ORIGIN_HOSTNAMES | 対応する Web クライアントと同一ホスト | 任意のカンマ区切りのブラウザー Origin ホスト名許可リストです。設定すると、デフォルトの Claude と ChatGPT の Web オリジンが置き換えられます。 |
意図的に、パブリックモード、テナントセレクター、設定可能なストレージ ID、思考ログの切り替え、自動的な直近履歴の返却機能は用意していません。ユーザーは 1 人で、ハードコードされた Durable Object 名は personal です。MCP_API_TOKEN や OAuth 認証情報をローテーションしても履歴が失われることはありません。ストレージ ID はどちらとも独立しています。
クライアントを接続する
接続方法は 2 つ。サーバーは 1 つです。
ブラウザーサインイン — カスタムヘッダーを送信できない、Claude や ChatGPT などのホスト型クライアント向けです。完全な互換性 URL を指定して、カスタムコネクターまたは MCP アプリを追加します。
https://<worker-host>/mcp-compat
/mcp-compat のパスはそのままにしてください。これは保護されたリソース識別子の一部であり、置き換え可能なルーティング情報ではありません。互換性エンドポイントは、現在のホスト型クライアントが使用する 2025 年代の Streamable HTTP プロトコルをサポートします。ホストは OAuth エンドポイントを検出し、独自のコールバックを動的に登録して、Durable Thinking の同意ページを開きます。GitHub に進み、ログインユーザーが許可リストに含まれていれば、ホストは独自の Durable Thinking アクセストークンとリフレッシュトークンを受け取ります。
GitHub OAuth App には、デプロイ時に設定した https://<worker-host>/callback を引き続き使用します。これは Worker が GitHub からコールバックを受け取るための URI であり、Claude または ChatGPT が Worker に登録するリダイレクト URI とは別のものです。
ベアラーヘッダー — CLI やヘッダーを送信できるあらゆるクライアント向けです。
Authorization: Bearer <MCP_API_TOKEN>
トークンが完全に一致すると、OAuth の処理を経由せず、MCP ハンドラーに直接ルーティングされます。
/mcp は、MCP 2026-07-28 を明示的にサポートするクライアントにのみ使用してください。現在のホスト型 Web クライアントや、その他の 2025 年代の Streamable HTTP クライアントには /mcp-compat を使用してください。
OAuth のトラブルシューティング
ブラウザーでの同意手順は、サードパーティー Cookie に依存しません。接続に失敗した場合は、次の順にプロトコルの動作を確認してください。
- 認証情報なしで
POST /mcp-compatを送信すると、401と、resource_metadataURL が/oauth-protected-resource/mcp-compatで終わるWWW-Authenticateヘッダーが返される必要があります。 - そのメタデータドキュメントの
resource値は、https://<worker-host>/mcp-compatと完全に一致する必要があります。 /.well-known/oauth-authorization-serverでは、/authorize、/token、/registerと、S256 PKCE のサポートが公開されている必要があります。ALLOWED_ORIGIN_HOSTNAMESが設定されている場合は、ホスト型クライアントのホスト名を含めてください。未設定の場合、サーバー自身のホストと、対応する Claude および ChatGPT の Web オリジンが許可されます。それ以外のオリジンは引き続き拒否されます。- 同意ページの CSP では、
form-action 'self' https://github.comが許可されている必要があります。以前のデプロイでは'self'しか許可されていなかったため、Chrome はフォームの POST を受け入れても、GitHub へのリダイレクトをブロックしていました。
Worker のログには固定のステージフィールドと理由フィールドが使用されます。認可コード、state 値、アクセストークン、クライアントシークレット、思考テキストは記録されません。
保持とプライバシー
思考テキストには、非公開のプロンプトコンテキスト、コピーした認証情報、個人情報、不確かな結論が含まれる場合があります。サーバーはそれに応じて取り扱います。
- すべての MCP リクエストで認証が必要です。発行済みの OAuth トークンまたはベアラーシークレットを使用します。
- 思考テキストがログに記録されることはありません。
- 非公開の Durable Object は 1 つだけで、所有者はあなただけです。
- アプリの CSP は、すべての外部ネットワークアクセスをブロックします。
- シーケンスは明示的に削除でき、デフォルトでは無期限に保持されます。
CORS と MCP App の可視性メタデータは認証制御ではありません。ベアラートークンは秘密にしておいてください。
開発
npm run check:app # validates the self-contained MCP App and protocol surface
npm run check:contract # guards the compact tool and visibility contract
npm run check:registry # guards the official Registry manifest and version sync
npm run typecheck # Worker and test TypeScript projects
npm run test # Durable Object, auth, routes, and App invariants
npm run build # Wrangler dry run
npm run verify # all checks above
src/ui/thought-process.html はアプリの信頼できる情報源です。Wrangler は wrangler.jsonc のルールを通じて、これをテキストモジュールとしてインポートします。
src/index.ts Worker routes, authentication boundary, MCP handler
src/server.ts tools, compact return shapes, MCP App resource
src/thought-store.ts SQLite Durable Object implementation
src/oauth.ts GitHub sign-in and consent flow around the OAuth provider
src/ui/thought-process.html per-thought MCP App card with final process view
src/auth.ts fixed personal bearer authentication
src/model.ts storage commands and records
test/ Worker, storage, auth, and App tests
ライセンス
MIT。LICENSE と NOTICE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。