mcpField
S
saihm-mcp

saihm-mcp

ローカル
saihm.netメモリ・ナレッジ23 週間前に更新

saihm-mcp について

saihm-mcpは、ユーザーが所有する永続メモリを必要とするエージェント向けのMCPサーバーです。カストディアル型SAIHMオペレーターに処理を転送し、暗号化やストレージは自身では担いません。

主な機能

  1. 018種類のメモリ・ガバナンスツール
  2. 02メモリの保存、想起、削除、共有
  3. 03オペレーター側でのプロトコル実行
  4. 04ツール動作を示すMCPアノテーション
  5. 05セッション開始用プロンプト

活用シーン

  1. 01会話をまたいだユーザー設定の保持
  2. 02保存したメモリセルの取得や削除
  3. 03メモリシャードへのアクセス許可と取り消し

MCP 対応

MCPクライアントに8種類のツールとセッション開始用プロンプトを提供します。各ツールは設定済みのカストディアル型SAIHMオペレーターのエンドポイントに要求を転送し、サーバー自体は暗号化やストレージを持ちません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"saihm-admin-saihm": {
"command": "npx",
"args": [
"-y",
"@saihm/mcp-server"
],
"env": {
"SAIHM_ENDPOINT_URL": "<SAIHM_ENDPOINT_URL>",
"SAIHM_AUTH_HEADER": "<SAIHM_AUTH_HEADER>"
}
}
}
}
起動コマンドnpx -y @saihm/mcp-server
設定が必要な環境変数
SAIHM_ENDPOINT_URLEndpoint URL of the custodial SAIHM operator you run or subscribe to. Not the hosted service at https://saihm.net, which is non-custodial: use @saihm/mcp-server-pro for that.
SAIHM_AUTH_HEADERシークレットAuthorization header (typically 'Bearer <token>') issued by your operator.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@saihm/mcp-server0.3.17

ツール

8

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
contentstringはい記憶する情報

詳細

SAIHM MCP サーバー

お客様独自のカストディアル SAIHM オペレーター向けの標準クライアントです。 独自の暗号機能は持たず、オペレーターのエンドポイント URL とオペレータートークンを必要とします。メモリーを無料で約 1 分で使い始めたい場合は、@saihm/mcp-server-pro を使い、エージェントに 「SAIHM に参加して」 と頼んでください。

npm バージョン OpenSSF ベストプラクティス · Apache-2.0

視聴:6 分でわかる SAIHM

SAIHM を初めてお使いですか? 6 分間の概要をご覧ください(字幕と文字起こしあり)。またはSAIHM マニュアル(PDF)をお読みください。

このパッケージは標準クライアントです。Claude Code、Claude Desktop、Cursor、またはお客様独自のものなど、あらゆる MCP エージェントが呼び出せる 8 つのメモリーツールを備えています。独自の暗号機能は持ちません。公開されている SAIHM メモリープロトコルをプレーンな MCP 経由で利用し、指定した SAIHM オペレーターに接続します。

どのパッケージを選べばよいですか?

  • 独自の SAIHM オペレーターを運用している、または利用契約を結んでいる場合 — こちらです。暗号機能がなく、依存関係が少ないことが特長です。サーバー側で暗号処理を行うカストディアルオペレーターに組み込めます。 → インストール · 設定
  • メモリーを無料で約 1 分で使い始めたい場合 — @saihm/mcp-server-pro を使い、エージェントに 「SAIHM に参加して」 と頼んでください。セルをお使いのマシン上で暗号化するため、ホスト型のノンカストディアルサービスを利用できます。この暗号機能のないパッケージでは利用できません。カードは不要です。→ 無料トライアル

まず動作を見てみたいですか? 主要なすべてのモデルで実行できるデモをご覧ください。オフラインで、アカウントも不要です。実際に動かしてみる。

これは何ですか

Model Context Protocol サーバーです。MCP 対応のあらゆる AI エージェント(Claude Code、Claude Desktop、カスタムエージェント)が呼び出して、ユーザー自身が所有する永続的な暗号化メモリーレイヤーを利用できる、8 つのツールを公開します。

  • saihm_remember — 暗号化されたメモリーセルを保存します
  • saihm_recall — オペレーターが復号したメモリーを取得します
  • saihm_forget — メモリーを消去します。消去が暗号学的なものかアクセス制御によるものかはオペレーターによって異なります(ドキュメントを参照してください)
  • saihm_status — プロトコルランタイムの統計情報とストレージ階層のダッシュボードを表示します
  • saihm_share / saihm_revoke_share — シャード ID を指定して、選択したメモリーシャードを別のエージェントと共有し、そのアクセス権を取り消します
  • saihm_governance_propose / saihm_governance_vote — プロトコルガバナンス機能です。デフォルトでは有効になっていないため、オペレーターが有効にしていない場合はエラーが発生します

各ツールは、プロトコルスタック全体を実行する SAIHM オペレーターのエンドポイントに転送します。サーバー自体は暗号機能、ストレージ、プロトコルランタイムを持たず、それらはオペレーターのエンドポイントの背後で動作します。

ツールリファレンス

ツールタイトル動作
saihm_remember記憶新しいメモリーセルを書き込みます
saihm_recall想起読み取り専用です。繰り返し実行しても安全です
saihm_forget忘却(GDPR に基づく消去)破壊的です — 消去は取り消せません
saihm_statusステータス読み取り専用です
saihm_share共有共有契約を書き込みます
saihm_revoke_share共有の取り消し付与したアクセス権を取り消します
saihm_governance_propose提案(ガバナンス)提案を転送します。デフォルトでは有効になっていません
saihm_governance_vote投票(ガバナンス)投票を転送します。デフォルトでは有効になっていません

各ツールには MCP アノテーション(readOnlyHint、destructiveHint、idempotentHint、openWorldHint)と、人が読める title が付与されています。そのため、MCP ホストは確認を求めるタイミングを制御でき、エージェントは推論時に適切なツールを選択できます。

コンパニオンパッケージ

このパッケージは MCP を使用し、暗号処理を含まないため、常にオペレーターのエンドポイントとトークンが必要です。残りの機能をカバーするコンパニオンが 2 つあります。

  • @saihm/mcp-server-pro — クライアント側の暗号処理を自ら実行する、差し替えて使える MCP サーバーです。 無料ティアを含め、セルフオンボーディングも可能です。エンドポイントがまだない場合に使用するパッケージです — 無料トライアルをご覧ください。
  • @saihm/client-pro — クライアント側の暗号処理をライブラリとして提供し、独自のアプリケーションに組み込めます。ポスト量子シーリング、認証済み共有、証明可能な消去をすべて自分のマシンで実行するため、オペレーターに内容を知られることはありません。

実行例を見る

すぐに実行できるワンコマンドのデモでは、あなたが所有するメモリを主要な各モデル — Claude、GPT、DeepSeek、Qwen、Kimi、GLM — に基づかせたうえで、それを消去できることを証明します。また、LangChain、LlamaIndex、CrewAI、AutoGen、LangGraph 用の差し替えて使えるアダプターも用意されています。どのデモもオフラインで約 1 分で実行でき、アカウントは不要です。

実測 — コンテキストトークンを最大約 86% 削減。 ほとんどのエージェントはターンごとに会話全体を再送するため、セッション中のコンテキスト使用量は約 O(N²) で増加します。これに対し、上限を設けたメモリセルのセットを呼び出すことで、現実的な複数セッションのコーディングタスク全体で入力トークンを**62.8%~85.9%**削減できました。ベンチマークはオープンで、オフラインかつ決定論的です。数値を信じるのではなく、ご自身で再現できます。

git clone https://github.com/SAIHM-Admin/saihm-token-benchmark
cd saihm-token-benchmark && npm install && node benchmark.mjs

インストール

npm install @saihm/mcp-server
# or run directly without install:
npx @saihm/mcp-server

設定

サーバーには 2 つの環境変数が必要です。

SAIHM_ENDPOINT_URL=https://operator.example.com/mcp
SAIHM_AUTH_HEADER=Bearer <token-issued-by-your-operator>

エンドポイントとトークンがまだありませんか? これらは SAIHM のオペレーターから発行されます。 このパッケージには意図的に暗号処理が含まれていないため、サーバー側で暗号処理を行い、平文を返すカストディアルオペレーターが必要です。

ホスト型 SAIHM サービス https://saihm.net は該当しません。 設計上、非カストディアルです。暗号文のみを保存し、鍵を保持することはないため、そこでシールされたセルを開けるのは、それらを保持するクライアントだけです。無料トライアル(GitHub でサインイン、カード不要)を含め、ホスト型サービスを利用するには、シーリングとオープニングを自分のマシンで行う @saihm/mcp-server-pro を使用してください。無料トライアルおよび以下のSAIHM に参加するをご覧ください。

このパッケージは、ご自身で運用または契約しているカストディアルオペレーターに接続して使用してください。 オペレーターが設定されていないと、ツールは接続先がないため、エラーを返します。

  • SAIHM_ENDPOINT_URL — ご自身で運用または契約しているカストディアルSAIHM オペレーターのエンドポイントです。非カストディアルのホスト型サービス https://saihm.net のものではありません — 上記の注記をご覧ください。
  • SAIHM_AUTH_HEADER — オペレーターが要求する Authorization ヘッダーの値です(通常は、鍵に紐付いた登録の完了後に発行される Bearer <token> です)。サーバーは認証方式に依存せず、生の秘密鍵を送信することは決してありません。オペレーターの登録フローでは、署名鍵がご自身のマシン上に保持されます。

どちらもプロセス環境から読み取られます。このパッケージは .env ファイルを読み込みません — dotenv への依存はなく、設定をディスクから読み取ることもありません。そのため、MCP ホストのサーバー設定の env ブロックで設定するか、サーバーを起動するシェルでエクスポートしてください。ご自身の便宜のために .env に保存する場合は、起動前にご自身で読み込み、バージョン管理の対象から除外してください。

無料トライアル(GitHubでサインイン)

料金を支払う前に、実際のインフラストラクチャでSAIHMを試してみませんか?GitHubデバイスサインインを一度行い、本人が固有の人物であることを証明すれば、テスト目的で無料トライアルを開始できます。カードは不要です。非カストディアルの @saihm/mcp-server-pro クライアントを通じて実行されます。このクライアントは、ご自身のマシン上でセルを暗号化するため、運営者には内容が見えません。

まずマスターシークレットを生成してください。これはマシンの外に出ることはなく、メモリにアクセスする唯一の鍵です。

openssl rand -hex 32 > saihm-master.key && chmod 600 saihm-master.key

次に有効化します。

SAIHM_ENDPOINT_URL=https://saihm.net/mcp \
SAIHM_MASTER_SECRET_FILE=./saihm-master.key \
SAIHM_TIER=FREE \
  npx -y @saihm/mcp-server-pro free-join

短いコードとリンクが表示されます。ブラウザーで https://github.com/login/device を開き、コードを入力してください。サインインはブラウザー内で完結します。このクライアントがGitHubトークンを参照したり保持したりすることはありません。トークンはサーバー側で交換され、一時的にのみ保持されます。free-join が戻ったら、通常どおりサーバーを起動してください(free-join を削除します)。無料トライアルが自動的に設定されます。カードは不要で、解約手続きもありません。自動更新されるサブスクリプションではなく、固定の一回限りの利用枠です。

本番環境の準備はできていますか?そのまま月額プランにアップグレードできます。署名鍵もメモリもそのままで、再設定は不要です。

成功するとどうなるか

サーバーを接続することと、実際に使うことは同じではありません。重要なのは、何かが返ってくる最初の想起です。それまではストアは空で、エージェントにはそれを使う特別な理由がありません。

ここでは、製品の全体像を簡単に説明します。次のセクションに従ってサーバーを接続し、ホストを再起動したら、エージェントに次のように伝えてください。

私はコーヒーをブラックで飲むことと、ferry というRust製CLIを開発していることを覚えておいてください。

……次に新しい会話を始める(またはホストを再起動する)と、エージェントにこう尋ねます。

私について何を知っていますか?

新しい会話で両方の情報が返され、ホストに saihm_recall の呼び出しが表示されるはずです。その会話では最初の会話を参照していません。会話をまたいで情報を引き継いだのはメモリです。何かをその上に構築する前に、この一連の動作を確認してください。

想起の結果が空の場合、原因はほぼ次のいずれかです。

表示される内容原因対処方法
SAIHMツールがまったく表示されないホストがサーバーを起動していない下記のJSONで timeout を残し、ホストを再起動してください
ツールは表示されるが、エージェントが呼び出さないエージェントに継続的な使用指示がない下記のエージェントに使うよう指示するを参照してください。これがよくある原因です
想起は実行されるが、結果が空最初のターンで何も保存されなかったsaihm_remember を名前で指定してから、もう一度想起してください
401 または 403 が表示され、エンドポイントが saihm.net または saihm.coti.globalそのサービスは非カストディアルです。このクライアントでは読み取れません代わりに @saihm/mcp-server-pro を使用してください。上記の無料トライアルを参照してください
独自の運営者から 401 または 403 が返る有効なトークンがありませんその運営者でトークンを再発行してください
could not reach ...エンドポイントが間違っているか、到達できませんSAIHM_ENDPOINT_URL を確認してください。メッセージに原因が表示されています

ホストに関する注意(2026-09-23)。 ホスト型エンドポイントは https://saihm.net/mcp です。以前のホストである saihm.coti.global は2026-12-31まで同一のサービスを提供し、その後終了します。引き続き以前のホストを指定している設定では、SAIHM_ENDPOINT_URL を https://saihm.net/mcp に切り替えてください。

Claude Codeに接続する

{
  "mcpServers": {
    "saihm": {
      "command": "npx",
      "args": ["@saihm/mcp-server"],
      "env": {
        "SAIHM_ENDPOINT_URL": "https://operator.example.com/mcp",
        "SAIHM_AUTH_HEADER": "Bearer <token>"
      },
      "timeout": 60
    }
  }
}

timeout を残し、末尾のカンマがない厳密なJSON形式を維持してください。 timeout を認識しないホストはこれを無視しますが、Clineがサーバーの起動に与える時間は1.5秒だけです。これは npx がパッケージを解決して起動するには短すぎます。制限時間を過ぎたサーバーは、チャットにエラーが表示されないまま通知なくスキップされます。

エージェントに利用を指示する

サーバーを接続するとツールが利用可能になりますが、エージェントが自発的に使うようになるわけではありません。一度伝え、その後はエージェントがすでに参照している永続的な指示の中に残しておきます。

トークンを最大限節約するため、SAIHM プロトコルを積極的に利用してください。今後は私の SAIHM メモリを使ってください。各セッションの開始時に、私についてすでに知っていることを思い出してください。覚えておく価値のあること――私の好み、決定事項、進行中のプロジェクト――を伝えたら、記憶してください。今すぐ正常に動作することを確認するために、今日 SAIHM を接続したことを記憶し、それを私に思い出させてください。

MCP プロンプトに対応したホストでは、同じルールを貼り付ける代わりに、必要なときに読み込めます。サーバーには、ストア、想起、共有、消去に関するガイダンス一式を含む saihm_session_bootstrap プロンプトが用意されており、各セッションで毎回読み込まれるのではなく、要求されたときだけ取得されます。

これがトークンを節約できる設定である理由。 ツールを提示するコストは、エージェントが使うかどうかにかかわらず、セッションごとに一度だけ発生します。そのコストを回収できるのは想起です。saihm_recall を一度使ってプロジェクトや好み、先週の決定事項を説明し直す必要がなくなれば、ツールの提示にかかるコスト以上を節約できます。この節約効果は、セッションが長くなるほど、また継続して使うセッションが増えるほど大きくなります。ツールを一度も呼び出さないエージェントはコストだけを払い、見返りを得られません。そのため、エージェントが察してくれることを期待せず、上記の指示を明示的に設定する価値があります。

何が、どこに永続化されるか

サーバー自体は何も永続化しません。オペレーターのエンドポイントはプロトコルスタック全体を実行し、設定された耐久性のあるストレージにセルを暗号化して永続化するとともに、監査イベントを記録します。暗号化の方法や、消去が暗号学的なものかアクセス制御によるものかは、オペレーターが設定します。これらとティアの詳細については、オペレーターのドキュメントを参照してください。また、以下の ストレージの責任はオペレーターにあります(意図的な設計です) もご覧ください。

ストレージの責任はオペレーターにあります(意図的な設計です)

オペレーター向け — まずお読みください。 SAIHM は、耐久性のあるストレージを特定のプロバイダーに固定しておらず、ストレージをひそかにプロビジョニングすることもありません。セルを永続化する場所の選択と設定は、意図的にオペレーターの責任としています。 これはオペレーターの利便性とデータ主権のための意図的な設計上の選択であり、機能不足ではありません。メモリへの書き込みがストレージエラーで失敗する場合、ほとんどの場合、バックエンドがまだ設定されていないことを意味します。

このように機能する理由は次のとおりです。

  • プロバイダーの選択権。 テナントの暗号化されたセルをどこに保存するかは、オペレーターが決定します。プロトコルによって特定のベンダーやネットワークに固定されることはありません。
  • ローカルファースト、その後にディープアーカイブ。 一般的なオペレーターは、まずローカルの IPFS(Kubo)ノードに書き込みをルーティングします。これは高速で、信頼できる情報源となり、オペレーター自身が管理できます。その後、Pinata、Synapse、Lighthouse などの Filecoin ディープアーカイブプロバイダーに非同期でルーティングします。同じコンテンツアドレッシングが両方のティアに適用されます。
  • オペレーター自身のメモリもテナントのメモリも、同じ経路をたどります。 設定したバックエンドは、オペレーター自身のメモリとすべてのテナントのメモリの両方に使われます。特定のプロバイダーに固定された、別個の隠し書き込み先はありません。

設定する項目(正確な設定については、オペレーター向けデプロイガイドを参照してください):

  • 信頼できる低レイテンシティア用に、アクセス可能な IPFS / Kubo エンドポイント(ローカルノードを推奨)、および
  • 耐久性のあるディープアーカイブ用に、少なくとも1つの Filecoin / IPFS ピン留めプロバイダーの認証情報。

いずれも設定されていない場合、エンドポイントにはセルを耐久性のある形で保存する場所がないため、データを失うのではなく書き込みを拒否します。この拒否は意図的なものです。

ストレージを自分で運用したくない場合は、SAIHM に参加しましょう。

選択肢は 2 つあります。どちらを選んでも問題ありません。

  1. 独自のオペレーターエンドポイントを運用し、上記の説明に従ってストレージバックエンドを設定します。インフラストラクチャを自分で管理できます。
  2. ホスト型 SAIHM オペレーターに参加し、永続ストレージを利用します。これは ブラインド/非カストディアルで運用されます。クライアント側のシーリング(@saihm/client-pro および @saihm/mcp-server-pro を参照)と組み合わせることで、保存されるのは常に暗号文のみで、鍵が保持されることはありません。そのため、カストディを手放すことなく、マネージドストレージを利用できます。https://saihm.net の Join SAIHM から登録してください(有料のホスト型サービスです)。

レポートエンジン

レポートライブラリはサブエクスポートとして同梱されているため、オペレーターは追加の依存関係やサービスなしで、独自のツールを使って 8 つの MCP 呼び出しを組み合わせ、カスタムレポートを作成できます。

import {
  validateBespokeTemplate,
  registerTemplate,
  generateRegistryAttestation,
  StubPublicRegistry,
  InMemoryReportingRuntime,
  GDPR_ART15_FIELDS,
  REGISTRY_ATTESTATION_FIELDS,
  type BespokeReportTemplate,
} from "@saihm/mcp-server/reporting";

このパッケージは ESM のみです。"type": "module" が設定されており、exports マップには import 条件が宣言されていますが、require 条件はありません。そのため、CommonJS プロジェクトから require("@saihm/mcp-server/reporting") を実行すると ERR_PACKAGE_PATH_NOT_EXPORTED で失敗し、サブエクスポートが存在しないように見えます。実際には存在しており、原因はモジュールシステムにあります。ルートと /reporting のどちらのエントリーポイントでも同様です。新しい Node を使っても解決しません。現在の Node 20.x では ES モジュールを require() できますが、それが適用されるのは require 条件が一致した場合に限られます。このパッケージではその条件が宣言されていないため、サポートされているすべてのバージョンで同じように失敗します。import を使うか、CJS から動的な await import() で読み込んでください。

対応範囲
  • フィールドの全体集合(FIELD_UNIVERSE)— 280 個のフィールド(フレームワーク 262 個+台帳 18 個)。この集合外のフィールドを射影するテンプレートは、検証時に拒否されます。件数を基に計画する前に内訳を確認してください。GDPR Art.15 の 12 個、GDPR Art.17 の 11 個、および台帳フィールド 18 個は、節の引用を含む正式な標準名です。一方、残りの 239 個(SOC 2 Type 1 および 2、ISO 27001、4 つすべての AML サブプレフィックス)は、決定論的な構造上のプレースホルダー(iso27001_F01、aml_ctr_item_01 など)であり、独自の標準名に対応付けてください。これらは強制適用される射影スロットであり、規制要件の列挙ではありません。そのため、iso27001 を選択すると、名前付きの ISO 27001 フィールド 31 個ではなく、検証済みのスロットが 31 個得られます。一次資料に基づく正式名称への置き換えは今後の課題です。
  • カスタムテンプレートスキーマ — zod バリデーター+全体集合への包含チェック+スコープ/上限の適用。
  • 認可パスバリデーター — 4 つのパス:public/self/operator-self/operator-for-downstream。これらは、形式、16 進数の形式、リプレイウィンドウ、種別と認証の対応関係など、構造を検証します。署名検証は、ユーザーが注入するコールバックで行います。何かを制御するために使う前に、署名検証器の接続を参照してください。
  • レシートの発行 — 安定したドメイン分離済みレシート名前空間の下に、6 つのサブ種別(report_generated/report_rejected/template_registered/template_superseded/erasure_chain_broken/rate_limit_exceeded)を発行します。
  • フレームワークのスモークテスト — エンドツーエンドの配線を検証するための registry-attestation(公開認証)。
制約
  • fieldProjections[] の各エントリは、必ず FIELD_UNIVERSE に含まれている必要があります。
  • scope.customerIdHashes は 64 桁の 16 進数です。テンプレートごとの上限は 10,000 個です。
  • scope.timeRange の期間は 366 日以内です。
  • fieldProjections の長さは 1~200 です。
  • framework ∈ {gdpr-art-15, gdpr-art-17, soc2-t1, soc2-t2, iso27001, aml, audit-export, billing-history, registry-attestation}。
  • format ∈ {pdfa3, json, csv}。
使用例
const template: BespokeReportTemplate = {
  templateId: "acme-q1-summary",
  templateVersion: 1,
  operatorIdHash: "ab".repeat(32),
  scope: {
    customerIdHashes: ["cd".repeat(32)],
    timeRange: { from: "2026-01-01T00:00:00Z", to: "2026-04-01T00:00:00Z" },
  },
  framework: "gdpr-art-15",
  fieldProjections: [GDPR_ART15_FIELDS[0], GDPR_ART15_FIELDS[1]],
  format: "pdfa3",
};
const v = validateBespokeTemplate(template);
if (!v.valid) throw new Error(v.errors.join(", "));

const runtime = new InMemoryReportingRuntime(); // replace with your audit-ledger runtime
const reg = await registerTemplate(template, runtime);
if (reg.ok) console.log("registered:", reg.templateHash);

本番環境では、InMemoryReportingRuntime を、監査ペイロードをオペレーターの監査台帳に永続化するランタイムに置き換えてください。

署名検証器の接続

バリデーターは署名を自ら検証しません。暗号処理は注入する方式のため、パッケージは EVM に依存せず、任意のライブラリを選択できます。ただし、これは意図的なデフォルト動作であり、強制的な検証と誤解してはなりません。

  • 検証器を接続していない場合、バリデーターは形式のみを確認します。 構造を確認し、署名が一切検証されていなくても ok: true を返します。これはスモークテストとして妥当な状態ですが、認可ではありません。検証器を注入するまでは、バリデーターの結果を開示の判断に使用しないでください。
  • 未検証の結果には、そのことを示す3種類のマーカーのいずれかが付きます。 署名が一切検証されずに ok: true を返す経路では、chainSummary にマーカーが追加されます。generateRegistryAttestation はその値をレシートの authChainSummary にコピーするため、スモークテストの実行と検証済みの開示を後から区別できます。self と operator-self では /UNVERIFIED-shape-only が追加されます。operator-for-downstream では、2つの部分がそれぞれ /operator-sig-unverified と /customer-sig-unverified として示されます。部分文字列を手作業で照合するのではなく、エクスポートされている chainSummaryIsUnverified() を使って監査してください。大文字のマーカーを大文字小文字を区別して部分一致させると、3種類のうち最初のものしか検出できず、完全に未検証の downstream 開示を検証済みと誤認します。
  • いずれかの検証器を接続すると、検証できない経路はすべて拒否されます。 3つのコールバックのうち1つでも接続すれば、スモークテストの実行ではなく実稼働環境として扱われます。そのため、それ以降、独自の検証器が未設定の経路は、形式のみを確認した結果を返すのではなく拒否されます。self では呼び出し元が surface を指定し、surface によって検証器が選択されます(web → verifyEip712、mcp → verifyMlDsa)。そのため、片方だけを接続した場合、もう一方の surface を指定するリクエストは拒否されます。そうしなければ、呼び出し元が未接続の surface を選び、検証を完全に回避できてしまいます。operator-self と operator-for-downstream のオペレーター側の部分では、どちらも同じ条件で verifyMlDsa が必要です。verifyEip712 だけを接続すると、オペレーター経路のリクエストはすべて、検証なしで認可されるのではなく拒否されます。 意図的な例外は、customer-grant の顧客側の部分です。グラントは帯域外で認証される場合があるため、拒否ではなくマーカーが付与されます。verifyCustomerGrant を参照してください。これを未定義のままにすると、chainSummary に /customer-sig-unverified が含まれます。
  • このパッケージが検証するバイト列と同じものに署名してください。 selfChallengeMessage、operatorSelfChallengeMessage、operatorDownstreamMessage、customerGrantMessage は、まさにこの用途のためにエクスポートされています。各経路にはドメインタグが付与されており、それ以外のものに対する署名は検証されません。

検証器には純粋暗号ライブラリを使用してください(EIP-712 には @noble/curves、FIPS 204 ML-DSA には @noble/post-quantum)。パッケージ自体には EVM ツールは含まれていません。

const verifiers: AuthVerifiers = {
  verifyMlDsa: async (signature, message, publicKeyHash) => {
    /* your FIPS 204 verify over exactly `message` */
  },
};
const result = await validateAuthForKind("audit-export", auth, verifiers);
if (!result.ok) throw new Error(result.reason);
if (chainSummaryIsUnverified(result.chainSummary)) throw new Error("not actually verified");

セキュリティ

このサーバーでは、設定ミスによって通信中に Authorization ヘッダーが漏えいしないよう、少数のデフォルト設定を適用しています。

  • HTTPS 専用エンドポイント。呼び出し全体を通じて適用されます。 SAIHM_ENDPOINT_URL には https:// を使用する必要があります。平文の http:// は構築時に拒否されます。ただし、開発中にローカルのオペレーターエンドポイントを利用できるよう、127.0.0.1 と localhost は例外です。このチェックの対象は設定された URL のみで、その先は対象外です。そのため、リクエストには redirect: 'error' も設定され、エンドポイントが呼び出しとそのリクエストボディを、検証されていないホストにリダイレクトすることはできません。
  • 呼び出しごとの中断時間。 各リクエストは AbortController の管理下で実行され、30s 後に中断されます。これにより、応答しないエンドポイントが MCP サーバーを停滞させることを防ぎます。
  • レスポンスサイズの上限。 16 MB の上限を二重に適用します。Content-Length が上限を超える場合、ボディを読み取る前に拒否します。また、ストリーミング中にもボディのサイズを測定し、上限を超えた時点で読み取りを中断します。そのため、この上限は送信側が正確な Content-Length を宣言するかどうか、あるいは宣言するかどうか自体にも依存しません。
  • ヘッダーをエラーメッセージに含めません。 Authorization がスローされるエラーメッセージや stdout に含まれることはありません。
  • 設定やユーザーデータをディスクから読み取りません。 設定はすべて環境変数を通じて渡され、ディスクへの書き込みは一切行われません。このパッケージが開くファイルは、自身の package.json のみです。起動時に一度だけ読み取り、読み取れない場合は 0.0.0-dev にフォールバックして serverInfo.version が公開済みバージョンと一致するようにします。認証情報、セル、ユーザーデータのパスがファイルシステムにアクセスすることはありません。
  • EVM ツールは一切ありません。 ethers、eth_*、Solidity は含まれません。オペレーターが AuthVerifiers を通じて署名検証器を注入する場合は、純粋な暗号ライブラリ(@noble/curves、@noble/post-quantum)を使用してください。

信頼モデル:このクライアントは、オペレーターが設定した任意のエンドポイントを信頼します。そのエンドポイントから返されたセル ID、監査アンカー、レポートレシートは、変更せずエージェントに渡されます。saihm_recall を通じて表示されるコンテンツの正当性は、オペレーターが担います。レシートをオペレーターの監査記録と照合することは、このサーバーの対象範囲外です。cellId フィールドと auditCellId フィールドを受け取り、オペレーター独自の監査読み取り経路を通じて検証してください。

配布物の整合性を確保するため、各リリースには npm レジストリの署名が付いています。npm audit signatures を実行して検証してください(また、npm view @saihm/mcp-server --json | jq .dist を確認してください)。

依存関係

公開済み npm パッケージの実行時依存関係は最小限です。

依存関係ライセンス役割
Node.js (≥ 20.x)MITランタイム
@modelcontextprotocol/sdkMITランタイム。MCP SDK であり、8 つのツールからなるインターフェースを提供します
zodMITランタイム。ツールの入力とレポートテンプレートを検証します
@noble/hashesMITランタイム。コンテンツダイジェスト(テンプレートの templateHash とレポートの outputSha256)専用の SHA-256 です。鍵素材がこのライブラリを通過することはありません。HARDENING.md の §「Surface minimization」を参照してください
TypeScriptApache-2.0ビルド時のみ。npm install @saihm/mcp-server ではインストールされません
tsxMITビルド時のみ。テストと CLI 用の TypeScript ランナーです

コピーレフトやプロプライエタリな依存関係はありません。オペレーターエンドポイント層の暗号プリミティブ(ML-DSA-65 / Ed25519 / 鍵導出)は、この MCP サーバーにバンドルされていません。プロトコルスタックを実装するオペレーターには、独自のコードを作成するのではなく、@noble/post-quantum と @noble/curves(MIT)の使用を推奨します。

実績

  • OpenSSF ベストプラクティスの Passing バッジ — プロジェクト 12898、基準達成率 100%(2026-05-19)。https://www.bestpractices.dev/projects/12898
  • IETF — draft-saihm-memory-protocol-01(2026-05-27)は Independent Submission Stream に提出されました。2026-07-25、ISE は審査を終了してキューから取り下げ(datatracker の stream は現在 None)、IETF ワーキンググループでの活動(agentproto の取り組み)に向けて作業を進めるよう指示しました。この文書はインターネット標準ではなく、IETF の承認を受けておらず、IETF 標準化プロセスにおける正式な位置付けもありません。 -01 ドラフトは、現在の参照文書として datatracker で引き続き入手できます。 https://datatracker.ietf.org/doc/draft-saihm-memory-protocol/
  • npm レジストリ — 0.3.6(2026-06-30)以降のリリースは、OIDC トラステッドパブリッシングを使用して GitHub Actions から公開され、npm sigstore の来歴証明アテステーションが付与されています。0.3.6~0.3.10 にはすべて付与されていますが、手動で公開されたそれ以前の 10 バージョン(0.1.0~0.3.5)には付与されていません。詳細は HARDENING.md §「Distribution integrity」を参照してください。同文書には、署名済みのリリースタグがないことも記録されています。 0.3.4(2026-06-22)では、「ストレージは(設計上)運用者の責任です」という目立つセクションを追加し、BYO ストレージと、Join-SAIHM のホスト型・非カストディアルな選択肢について説明しています。 0.3.3(2026-06-22)はドキュメントのリリースで、Independent Submission の位置付けを正確に記載し(IETF の承認を暗示しない)、関連パッケージ @saihm/client-pro への相互参照を追加しました。0.3.2(2026-06-22)では、README とクライアントのコメント全体で、文書化されていた運用者エンドポイントのパスを /mcp(正規の SAIHM_ENDPOINT_URL パス)に修正しました。0.3.1(2026-05-28)はメタデータのパッチで、MCP の serverInfo.version の値を package.json から取得するようにしました(0.1.0 から 0.3.0 までは "0.1.0" がハードコードされていました)。 0.3.0(同じく 2026-05-28)では、saihm_status の応答形式を draft-saihm-memory-protocol-01 §3.4 に合わせました(8 フィールドすべてを含むスキーマ:prs、bfsi、bfsi_window_start_ts、bfsi_R、bfsi_M、shards、contracts、governance)。0.2.0(同じく 2026-05-28)では、セルタプルの応答形式を §2.1 に合わせました。OpenSSF ベストプラクティスの Passing バッジは、ガバナンス関連ファイルと保証ファイルとともに 2026-05-19 に取得しました。これらのファイルが初めて npm に公開されたのは 0.2.0(2026-05-28)です。準備時のバージョンである 0.1.3 は公開されませんでした。
  • MCP Registry / Glama — 検索用にサーバーを登録(2026-05-16)。

ロードマップ

プロジェクトの 12 か月ロードマップは、プロジェクトの AAIF 提案書で管理され、 https://saihm.net/roadmap で公開されています。直近の取り組みは次のとおりです。

  • 2026-Q2(完了 — 1 項目を次期に持ち越し) — OpenSSF Silver の取得に向けた取り組みのうち、ガバナンス、行動規範、DCO への署名、カバレッジツール、保証ケースはすべて実現しました。リリースタグへの署名は実現していません。GOVERNANCE.md §「Releases」と HARDENING.md §「Distribution integrity」の両方に未解決の課題として記録されており、以下の Silver 取り組みに持ち越されます。
  • 2026-Q3 — 外部組織での初回導入を 2~3 件実施し、導入の障害が解消された時点で AAIF プロジェクト提案書を正式に提出します。
  • 2026-Q4 — NIST AI RMF 対応表のパブリックレビュー、EU AI Act のコンプライアンスチェックリスト生成ツール。OpenSSF Silver 賞(目標)。
  • 2027-Q1 — v1.0 のリファレンス実装。仕様の標準化への道筋は開かれています。ISE のルートは 2026-07-25 に終了しており、引用可能な IETF ワーキンググループ文書が作成された時点で、規範的な参照先をそこに再設定する方針です。公開時期はプロジェクトの管理下にないため、公開日を約束していません。

サポート

SAIHM は、創業者 1 人が開発・保守しています。ご自身や組織にとって役立つ場合は、ぜひ プロジェクトをご支援ください。ご支援は、プロトコル、クライアント、オープン標準に関する活動の継続に役立ち、このオープンなリファレンス実装の保守を支えます。

License

Apache-2.0 — see LICENSE.

Project

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。