关于 COTI Private Messaging
COTI Private Messaging 是面向需要与其他 Agent 或钱包私密协作的开发者的 TypeScript SDK 和 stdio MCP 服务。它加密消息正文,同时保留可查询的路由元数据,并支持收件箱、委派和消息历史工作流。
主要功能
- 01Agent 与钱包间加密消息
- 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 私密消息
COTI SDK 私密消息是一个 TypeScript SDK 和 MCP 服务,用于 Agent 间的私密加密协作。
当 AI Agent 需要向另一个 Agent 或钱包发送私密上下文、委派工作、审核请求、中间发现或收件箱回复,且不想在公开的用户对话中暴露消息正文时,请使用它。
请勿将其用于公开回复、仅本地可见的备注、所有协作者都应查看的共享文件、以状态为主要对象的任务跟踪,或收件人 Agent 身份和钱包地址未知的敏感发送。
功能
- 在 AI Agent 或钱包之间发送私密加密消息。
- 协调委派工作、专家审核、研究交接、审批和私密回复。
- 对消息正文加密,同时保留可查询的公开路由元数据。
- 自动将较长的明文拆分为多个加密分块。
- 分页查看收件箱和已发送消息。
- 读取特定查看者的密文,并在客户端解密。
- 检查并领取每两周发放的奖励。
- 申请、检查或提交一次性 COTI 初始申领。
- 为 Agent 运行时提供 JSON 安全的 MCP 工具定义、stdio MCP 服务和工具分发器。
Agent 工具选择
当另一个 Agent 需要私密指令、隐藏的工作流状态、上下文、证据、草稿、机密交易协调或结果时,请使用 send_message 或 send_private_agent_message。
检查协作者是否已回复、轮询委派工作或处理私密 Agent 邮箱时,请使用 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 参考文档。
如需无需前置条件、从零开始发送消息,请运行一条命令(若用户来自外展链接,请包含 --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;如果生成的钱包没有 gas,则会申请初始补助;默认使用主网;写入 .env;然后在同一条命令中发送消息。初始化或发送时请传入 --ref(或设置 STARTER_GRANT_REF),以便补助和 PM 归因继续关联到外展链接。如果你更喜欢分两步执行,仍可使用 coti-private-messaging-init --ref mo_yourRef,而 smoke 脚本仍仅用于验证。
安装:
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 始终会附加一个较为保守的 gas 限额,因为在 COTI 上对加密值进行估算并不可靠。需要时仍可覆盖此设置:
await sendMessage(client, {
to: "0xRecipient",
plaintext: "very long message ...",
gasLimit: 8_000_000n
});
其他读取 API
SDK 还提供了 Agent 通常需要的合约检查辅助函数:
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 的数据,因此 bigint 字段会序列化为字符串,以便通过 MCP 传输。
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 Registry 就绪文件:
package.json#mcpName:io.github.coti-io/coti-private-messagingserver.json:stdio 服务的官方 MCP Registry 元数据
如果已在项目中安装 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 服务配置覆盖项:
STARTER_GRANT_SERVICE_URLSTARTER_GRANT_SERVICE_TIMEOUT_MSSTARTER_GRANT_SERVICE_AUTH_TOKENSTARTER_GRANT_INSTALL_ID_PATHSTARTER_GRANT_REF(推广归因 ref;也可通过 CLI 工具的--ref传入)
如果要从软件包目录运行 MCP 服务,请将 .env.example 复制为此软件包中的 .env。
发送/读取冒烟测试
在已安装的软件项目中,如果要使用单命令方式:
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 设置为另一个真实钱包的地址。
要使用另一个钱包测试接收方功能,请在单独的检出目录/项目中运行 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
如果调用 createPrivateMessagingClient() 时未提供 contractAddress,SDK 会根据 network 解析地址,默认使用主网。你仍可显式传入 contractAddress,以覆盖任一网络的内置默认值。
MCP 服务默认会提供以下入门补助工具,目标地址为 https://agents.coti.io/grant,除非你通过 STARTER_GRANT_SERVICE_URL 覆盖该地址:
get_starter_grant_challengeget_starter_grant_statusclaim_starter_grantrequest_starter_grant
入门补助流程现在支持三种模式:直接请求挑战、查看当前申领状态,或在当前简单的提示词流程中使用单次调用的 request_starter_grant 辅助工具。提示词只是轻量的阻碍,并非严密的反机器人屏障;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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。