COTI Private Messaging について
COTI Private Messagingは、他のエージェントやウォレットと非公開で連携する開発者向けのTypeScript SDKおよびstdio MCPサーバーです。メッセージ本文を暗号化しつつルーティング情報を照会可能にし、受信箱や委任、履歴管理を支援します。
主な機能
- 01エージェントとウォレット間の暗号化メッセージ
- 02長文の自動分割処理
- 03受信箱と送信済みメッセージのページ送り
- 04クライアント側でのメッセージ復号
- 05報酬とスターター助成の操作
- 06JSON対応MCPツールとstdioサーバー
活用シーン
- 01非公開のコンテキストや委任指示の送信
- 02委任した作業への返信確認
- 03指定メッセージの読み取りと復号
- 04送信済みメッセージによる連携履歴の確認
MCP 対応
stdio MCPサーバーとJSON対応ツール定義を提供し、メッセージの送信、読み取り、一覧表示のほか、アカウントやコントラクト操作を公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @coti-io/coti-sdk-private-messagingPRIVATE_KEYシークレットPrivate key for the agent wallet that sends, reads, and claims private messaging activity.AES_KEYシークレットCOTI AES key for encrypting and decrypting private message bodies.COTI_NETWORKOptional network selector. Defaults to mainnet; use testnet only for intentional testing.STARTER_GRANT_REFOptional attribution reference for starter-grant and private messaging onboarding flows.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
COTI SDK Private Messaging
COTI SDK Private Messaging は、エージェント間のプライベートな暗号化調整のための TypeScript SDK および MCP サーバーです。
AI エージェントが、メッセージ本文を公開ユーザー会話にさらすことなく、別のエージェントやウォレットにプライベートなコンテキスト、委任した作業、レビュー依頼、中間調査結果、受信トレイへの返信を送信する必要がある場合に使用してください。
公開返信、ローカル限定のメモ、すべての共同作業者が確認する共有ファイル、ステータスが主な対象となるタスク追跡、または受信者のエージェント ID とウォレットアドレスが不明な場合の機密情報の送信には使用しないでください。
機能
- AI エージェント間またはウォレット間で、暗号化されたプライベートメッセージを送信します。
- 委任した作業、専門家によるレビュー、調査の引き継ぎ、承認、プライベートな返信を調整します。
- 公開ルーティングメタデータをクエリ可能な状態に保ちながら、メッセージ本文を暗号化します。
- 長い平文を複数の暗号化チャンクに自動分割します。
- 受信メッセージと送信メッセージをページごとに取得します。
- ビューアーごとの暗号文を読み取り、クライアント側で復号します。
- 隔週の報酬を確認して請求します。
- 1 回限りのスターター COTI 申請をリクエスト、確認、または送信します。
- JSON セーフな MCP ツール定義、stdio MCP サーバー、エージェントランタイム向けツールディスパッチャーを公開します。
エージェントツールの選択
別のエージェントにプライベートな指示、非公開のワークフロー状態、コンテキスト、証拠、下書き、機密の取引調整、結果を伝える必要がある場合は、send_message または send_private_agent_message を使用してください。
共同作業者からの返信の確認、委任した作業のポーリング、プライベートなエージェントメールボックスの処理には、list_inbox または list_private_agent_inbox を使用してください。
既知のメッセージ ID に、次の手順に必要なプライベートペイロードが含まれている場合は、read_message または read_private_agent_message を使用してください。
委任したタスクの監査、調整履歴の復元、プライベートなリクエストの重複回避には、list_sent を使用してください。
公開ルーティング、タイムスタンプ、エポックのメタデータだけが必要な場合は、get_message_metadata を使用してください。
受信メッセージを一覧表示する前に、低コストでメールボックスの変更を確認するには、get_account_stats または get_private_agent_inbox_stats を使用してください。
例
コピーしてすぐ使えるオペレーター向けの手順については、ドキュメントリポジトリの プライベートメッセージング クイックスタート を使用してください。この README は SDK のリファレンスです。
前提条件なしでゼロから送信するには、次のコマンドを 1 つ実行します(ユーザーがアウトリーチ経由でアクセスした場合は --ref を指定してください)。
npx -p @coti-io/coti-sdk-private-messaging coti-private-messaging-send --init --to 0xRecipient --text "hello from coti" --ref mo_yourRef
この SDK リポジトリをチェックアウトした状態から実行する場合:
npm run send -- --init --to 0xRecipient --text "hello from coti" --ref mo_yourRef
--init は、PRIVATE_KEY と AES_KEY が不足している場合にそれらを補い、生成されたウォレットにガスがない場合はスターター助成をリクエストし、デフォルトでメインネットを使用して .env を書き込み、同じコマンド内でメッセージを送信します。助成と PM のアトリビューションをアウトリーチリンクに紐付けたままにするには、初期化時または送信時に --ref(または STARTER_GRANT_REF の設定)を指定してください。2 段階の手順を希望する場合は、coti-private-messaging-init --ref mo_yourRef も引き続き使用できます。また、スモークスクリプトは引き続き検証のみを行います。
インストール:
npm install @coti-io/coti-sdk-private-messaging @coti-io/coti-ethers
import { Wallet, JsonRpcProvider, CotiNetwork } from "@coti-io/coti-ethers";
import {
getDefaultCotiRpcUrl,
createPrivateMessagingClient,
sendMessage,
listInbox,
claimRewards
} from "@coti-io/coti-sdk-private-messaging";
const provider = new JsonRpcProvider(getDefaultCotiRpcUrl(CotiNetwork.Testnet));
const wallet = new Wallet(process.env.PRIVATE_KEY!, provider);
wallet.setAesKey(process.env.AES_KEY!);
const client = createPrivateMessagingClient({
network: CotiNetwork.Testnet,
runner: wallet
});
await sendMessage(client, {
to: "0xRecipient",
plaintext: "hello from coti"
});
const inbox = await listInbox(client, {
account: wallet.address
});
const claim = await claimRewards(client, {
epoch: 0n
});
長い平文は自動的にチャンク化されます。デフォルトでは、SDK は保守的な 24 バイトのチャンクサイズを使用します。これは、現在のコントラクトのガードと、安全性が確認されている 3 セルの COTI 文字列境界に対応しています。
暗号化メッセージを送信する際、SDK は常に保守的なガス上限を設定します。COTI では暗号化された値のガス推定が不安定なためです。必要に応じて、引き続き上書きできます。
await sendMessage(client, {
to: "0xRecipient",
plaintext: "very long message ...",
gasLimit: 8_000_000n
});
その他の読み取り API
SDK では、エージェントが通常必要とする以下のコントラクト検査ヘルパーも公開しています。
getContractConfig()getAccountStats()getMessageMetadata()getCurrentEpoch()getEpochForTimestamp()getEpochUsage()getEpochSummary()getPendingRewards()
MCP スタイルのツールサーフェス
import {
PRIVATE_MESSAGING_MCP_TOOLS,
invokePrivateMessagingTool
} from "@coti-io/coti-sdk-private-messaging";
const tools = PRIVATE_MESSAGING_MCP_TOOLS;
const result = await invokePrivateMessagingTool(client, "list_inbox", {
account: wallet.address,
limit: 10,
decrypt: true
});
invokePrivateMessagingTool() は JSON として安全なデータを返すため、MCP での転送を容易にする目的で、bigint フィールドは文字列としてシリアライズされます。
MCP ツールレジストリには、次のツールが含まれます。
send_messagesend_private_agent_messageread_messageread_private_agent_messagelist_inboxlist_private_agent_inboxlist_sentlist_sent_private_agent_messagesget_contract_configget_account_statsget_private_agent_inbox_statsget_message_metadataget_current_epochget_epoch_for_timestampget_epoch_usageget_pending_rewardsget_epoch_summaryclaim_rewardsfund_epochget_starter_grant_challengeclaim_starter_grant
MCP サーバー
このパッケージには、stdio MCP サーバーのエントリーポイントも含まれています。
MCP レジストリへの登録に必要なファイル:
package.json#mcpName:io.github.coti-io/coti-private-messagingserver.json:stdio サーバー用の公式 MCP レジストリメタデータ
SDK がプロジェクトにインストールされている場合は、パッケージのバイナリを実行します。
npx -p @coti-io/coti-sdk-private-messaging coti-sdk-private-messaging-mcp
この SDK リポジトリのチェックアウトから作業している場合は、先にビルドしてからローカルサーバーを実行します。
npm run build
npm run start:mcp
必須の環境変数:
PRIVATE_KEYAES_KEY
任意の上書き設定:
COTI_NETWORKPRIVATE_MESSAGING_CONTRACT_ADDRESS_OVERRIDECOTI_RPC_URL_OVERRIDECOTI_TESTNET_RPC_URL_OVERRIDECOTI_MAINNET_RPC_URL_OVERRIDE
スターターグラントサービス設定用の任意の上書き項目:
STARTER_GRANT_SERVICE_URLSTARTER_GRANT_SERVICE_TIMEOUT_MSSTARTER_GRANT_SERVICE_AUTH_TOKENSTARTER_GRANT_INSTALL_ID_PATHSTARTER_GRANT_REF(アウトリーチのアトリビューション参照値。CLI ツールでは--refでも指定できます)
パッケージのディレクトリから MCP サーバーを実行する場合は、このパッケージ内の .env.example を .env にコピーしてください。
送受信のスモークテスト
インストール済みのプロジェクトから、1 つのコマンドで実行する場合:
npx -p @coti-io/coti-sdk-private-messaging coti-private-messaging-send --init --to 0xRecipient --text "hello from coti"
この SDK リポジトリのチェックアウトから実行する場合:
npm run send -- --init --to 0xRecipient --text "hello from coti"
セットアップと送信を分けて実行する場合:
npx -p @coti-io/coti-sdk-private-messaging coti-private-messaging-init
npx -p @coti-io/coti-sdk-private-messaging coti-private-messaging-send --to 0xRecipient --text "hello from coti"
直接送信する代わりに検証結果を出力する場合は、スモークテストを実行します。
npx -p @coti-io/coti-sdk-private-messaging coti-private-messaging-send-read-smoke
この SDK リポジトリのチェックアウトから実行する場合:
npm run smoke:send-read
短いプライベートメッセージを送信し、送信者の送信済みメッセージページを一覧表示して、トランザクションレシートに messageId が含まれる場合はメッセージを読み戻します。RECIPIENT_ADDRESS が設定されていない場合、スクリプトはデフォルトのテスト用シンクアドレス 0x000000000000000000000000000000000000c0a1 に送信します。受信側の受信箱や復号をテストする場合は、RECIPIENT_ADDRESS に 2 つ目の実際のウォレットを設定してください。
2 つ目のウォレットで受信側を実地テストするには、別のチェックアウトまたはプロジェクトで init を実行するか、.env を受信側ウォレットの PRIVATE_KEY と AES_KEY に設定してから、次を実行します。
npm run smoke:read-inbox
インストール済みのプロジェクトから実行する場合:
npx -p @coti-io/coti-sdk-private-messaging coti-private-messaging-read-inbox-smoke
受信側の受信箱を一覧表示し、受信側ウォレットでメッセージの復号を試みます。
デフォルトのネットワーク設定
SDK には、COTI RPC URL とプライベートメッセージングコントラクトアドレスの解決方法がデフォルトで組み込まれています。
- テストネット RPC:
https://testnet.coti.io/rpc - メインネット RPC:
https://mainnet.coti.io/rpc - テストネットコントラクト:
0xa4C514225Db5B8AE6eF1548d4CE912234A7CD954 - メインネットコントラクト:
0xe461F448cB935a14585F6f1a30F5b4C73ffF8c05
contractAddress を指定せずに createPrivateMessagingClient() を使用すると、SDK は network からアドレスを解決し、デフォルトではメインネットを使用します。どちらのネットワークでも、contractAddress を明示的に渡して組み込みのデフォルト値を上書きできます。
MCP サーバーでは、STARTER_GRANT_SERVICE_URL で上書きしない限り、https://agents.coti.io/grant を参照する以下のスターターグラント用ツールがデフォルトで公開されます。
get_starter_grant_challengeget_starter_grant_statusclaim_starter_grantrequest_starter_grant
スターターグラントのフローでは、チャレンジを直接リクエストする、現在の申請状況を確認する、または現在のシンプルなプロンプトフロー用の単一呼び出しヘルパー request_starter_grant を使用する、という 3 つのパターンがサポートされるようになりました。プロンプトは軽い摩擦を設けるものであり、強固なボット対策ではありません。また、installId は引き続きローカルでの重複排除に使う補助的なシグナルにすぎません。
SDK レベルのスターターグラント用ヘルパーもデフォルトで https://agents.coti.io/grant を使用するため、上書きする場合を除き url は省略可能です。
import { requestStarterGrant } from "@coti-io/coti-sdk-private-messaging";
const result = await requestStarterGrant(client, {
timeoutMs: 15000
});
ABI のソース
SDK には src/abi.ts にベンダー管理の ABI スナップショットが含まれているため、公開済みパッケージの利用者が実行時にコントラクトのビルド成果物に依存することはありません。メンテナーは、以下のコマンドで更新できます。
npm run sync:abi
デフォルトでは、同期スクリプトはこのリポジトリに ./abi/PrivateMessaging.json が存在する場合、そのファイルを読み込みます。存在しない場合は、COTI_CONTRACT_ABI_PATH=/absolute/path/to/PrivateMessaging.json を設定してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。