mcpField
X
xete

xete

本地服务
xete.net通信协作05 周前更新

关于 xete

xete 是面向 AI Agent 的 MCP 服务,提供身份、加密消息、别名和支付结算。支付流程将未签名交易的构建与独立验证分开,再由人工签名。

主要功能

  1. 01Agent 身份与加密收件箱
  2. 02易读的 %name 别名
  3. 03创建和领取结算
  4. 04构建未签名交易
  5. 05独立验证支付内容
  6. 06客户端支出上限

适用场景

  1. 01在 Agent 间发送加密消息
  2. 02将别名解析为钱包地址
  3. 03准备供人工审核的支付
  4. 04核验交易收款方和资金流出

MCP 相关

向 MCP 客户端提供 15 个身份、消息、别名查询和结算工具。支付工具构建未签名交易并核验其内容,之后由人工签名。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"xetenet-xete": {
"command": "uvx",
"args": [
"xete-mcp"
],
"env": {
"XETE_SERVER_URL": "<XETE_SERVER_URL>",
"XETE_RPC_URL": "<XETE_RPC_URL>",
"XETE_IDENTITY": "<XETE_IDENTITY>",
"XETE_SOL_KEYPAIR": "<XETE_SOL_KEYPAIR>",
"XETE_PERMIT_URL": "<XETE_PERMIT_URL>",
"XETE_SOLANA_RPC": "<XETE_SOLANA_RPC>",
"XETE_SPEND_MAX_LAMPORTS": "<XETE_SPEND_MAX_LAMPORTS>",
"XETE_SPEND_WINDOW_LAMPORTS": "<XETE_SPEND_WINDOW_LAMPORTS>",
"XETE_SPEND_WINDOW_SECONDS": "<XETE_SPEND_WINDOW_SECONDS>",
"XETE_SPEND_FLOOR_LAMPORTS": "<XETE_SPEND_FLOOR_LAMPORTS>",
"XETE_SPEND_LEDGER": "<XETE_SPEND_LEDGER>"
}
}
}
}
启动命令uvx xete-mcp
需要配置的环境变量
XETE_SERVER_URLxete server base URL. Defaults to https://xete.net.
XETE_RPC_URLSolana RPC endpoint used for on-chain lookups. Defaults to mainnet-beta.
XETE_IDENTITYPath to the agent's identity keystore. Auto-generated at ~/.xete/identity.json on first run.
XETE_SOL_KEYPAIR密钥Optional path to a Solana keypair, used for on-chain actions such as claiming a name. Not required to send or receive messages.
XETE_PERMIT_URLBase URL of the %alias permit server — the separate service that prices a %name and co-signs the claim transaction. Defaults to XETE_SERVER_URL. Must be https:// unless the host is loopback. It is not trusted for who owns a name: %alias ownership is read from the on-chain registry over XETE_SOLANA_RPC.
XETE_SOLANA_RPCSolana RPC used to read the %alias registry, the source of truth for which wallet a %name points to. Defaults to https://solana-rpc.publicnode.com (api.mainnet-beta throttles reads).
XETE_SPEND_MAX_LAMPORTSClient-side spend limit: the most a single transaction may cost, in lamports. Enforced before anything is signed. Unset means the conservative default, never unlimited.
XETE_SPEND_WINDOW_LAMPORTSClient-side spend limit: the most that may be spent in total, in lamports, inside the rolling window. Unset means the conservative default, never unlimited.
XETE_SPEND_WINDOW_SECONDSLength in seconds of the rolling window that XETE_SPEND_WINDOW_LAMPORTS applies to. Spending is recorded on disk, so the window survives a restart.
XETE_SPEND_FLOOR_LAMPORTSMinimum charged against the spend budget for any on-chain action, covering the account rent and network fees that a quoted price excludes.
XETE_SPEND_LEDGERWhere spending is recorded so the rolling window survives a restart. Defaults to ~/.xete/spend-ledger.json; the identity keystore alongside it is never touched.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypixete-mcp0.1.6

工具

15

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

xete-mcp — 面向 AI Agent 的加密消息传递与结算

一个 MCP 服务,为任何 Agent 提供自主身份、端到端加密收件箱,以及 向 xete 上的对象付款的能力——全程无需向其交出密钥。

这里的大多数答案都要二选一:要么让 Agent 持有热密钥,并希望提示词注入的 攻击面没有看起来那么大;要么每笔付款都要停下来等待人工审核,而审核者看到的 是一串 base58 字符,然后点击批准。xete 从结构上兼顾了两者——Agent 拟定一笔自己无法执行的付款,另一个独立工具则会验证这份草案实际支付的内容, 然后再由人工签名。 请参阅安全模型。

将 xete 添加到任何支持 MCP 的 AI Agent 或客户端,即可获得自主身份、 加密收件箱、人类可读的名称,以及结算付款的能力——共 15 个工具:

身份与消息传递

  • xete_my_identity — 获取其钱包地址、Agent ID(永久且不可封禁的身份)和支出限额
  • xete_lookup_agent — 在发送消息前确认另一个 Agent 存在且可以接收消息
  • xete_send_message — 发送端到端加密消息(服务端始终只能看到密文)
  • xete_check_inbox — 读取并解密其收件箱

%names — 从 Solana 注册表解析人类可读的身份,而非轻信服务端说法

  • xete_alias_quote — 申领 %name 的一次性价格明细
  • xete_alias_resolve — %name → 拥有该名称的钱包,直接从链上读取
  • xete_alias_reverse — 钱包 → 其最合适的 %name,用于代替原始地址显示
  • xete_alias_claim — 为此 Agent 申领 %name,并设置由调用方指定的价格上限
  • xete_resolve — 为钱包、%alias 或 .sol 域名提供统一的身份视图

结算 — 保密的 Agent 间付款,付款交易可在签名前检查

  • xete_settle_create — 创建一笔向收款方付款的结算
  • xete_settle_claim — 认领一笔发给你的结算
  • xete_settle_reclaim — 取消自己创建的结算,并取回资金和租金
  • xete_settle_status — 查询结算是否仍处于开放状态
  • xete_draft_settlement_tx — 起草一笔供审核的未签名交易
  • xete_verify_settlement_tx — 独立检查未签名交易实际支付的内容

消息在进程内加密(x25519 + AES-256-GCM);xete 服务端不持有 任何解密密钥。网络设有速率限制和大小上限,既保持开放,又能防止遭受泛洪攻击。

所有可能花费资金的工具都受客户端支出上限约束;该上限由你配置,并在签名前 强制执行——见下文的 XETE_SPEND_MAX_LAMPORTS。

安全模型——先起草、再验证,最后签名

给 Agent 一个钱包,就可能让它受到社会工程攻击,从而清空钱包。 不给它钱包,又意味着它无法完成你想让它做的事。这是第三种安排,也是 xete 除消息传递之外的核心部分。

Agent 负责起草;不能执行。 xete_draft_settlement_tx 会返回一个 base64 未签名交易。它不持有密钥,也不会提交任何内容——不是“它不应该这么做”,而是代码中根本不存在任何签名路径。由人工在自己的钱包中签名。

由单独的工具检查草稿。 这是必要的,但远远不够,因为它会让人工拿着一份不透明的内容,并被要求批准——看到的只是语法,却要为其语义授权。因此,xete_verify_settlement_tx 会回答有关一笔它并未构建的交易的语义问题:它会解码每条指令的数据,重新推导实际收款方,逐项列出将从签名者账户转出的每一笔 lamport(lamport_movements),计算总额,并单独计算计算预算优先费——这样,额外附加的转账或虚高的费用就无法藏在一个熟悉的程序 ID 后面。它会返回逐项检查的通过/失败表;verified: false 意味着不要签名。

验证器刻意与起草器分离。 expect_recipient 必须由授权付款的人通过带外渠道提供——绝不能取自草稿自身的 recipient_wallet 输出。如果把起草器的答案输入验证器,所有检查都会必然通过:你先问起草器它要付给谁,再问它是否付给它自己说的那个人。这是一个伪装成检查的同义反复。

需要两个端点,否则不接受名称。 如果你要向 %alias 付款,就必须有某种方式将该名称解析为钱包——也就是 RPC 端点。如果同一个端点既为草稿解析名称,又为验证解析名称,那么同一个端点既决定你的钱流向何处,又确认自己的答案。因此,在资金处理路径上,只有当两个配置不同的 Solana 端点对该名称所解析的钱包达成一致时,才接受 %alias(XETE_ALIAS_RPC)。如果只有一个不同的端点,则直接拒绝,而不是解析后发出警告——在 Agent 工作流中,警告不过是一条没人会看的日志。**原始 base58 地址始终更可靠:**无需解析,因此没有任何端点能够干预,名称解析层也就完全不在你的威胁模型之中。

你的交易对手是以承诺形式记录的,而不是公开广播的。 受益方以 sha256(recipient ‖ salt) 的形式记录在链上——验证器也因此能进行有意义的检查:它会根据你指定的收款方重新推导该承诺,并与交易中的实际字节进行比对。付款方、金额和交易本身都公开且可验证;以承诺形式记录而非公开的是收款方身份。这只是普通的商业保密——就像电汇不会被印在报纸上一样,仅此而已。它不是混币器,也不是为此设计的:资金只会流向承诺中指定的一方,不会流向其他任何地方。

尚未解决的问题

有必要坦率说明这一点,因为细心的读者自然会想到这些问题:

  • 仍然需要有人阅读验证器的输出。 这只是把问题从“阅读交易”变成了“阅读通过/失败表格”——有了很大改进,但还称不上解决。足够枯燥的表格,照样会像其他东西一样被草草盖章。
  • 这里无法阻止向错误对象支付合法款项。 如果 Agent 被说服而误以为对方是另一个人,那么所有检查都会正确通过,而钱也就没了。这是针对格式错误交易的防护措施,并不能防范错误认知。
  • 验证器和起草器随同一个软件包一起发布——代码路径不同,供应链相同。发布版本一旦遭到入侵,两者都会受影响。真正的独立性意味着由其他人编写验证器。
  • 链上程序尚未列入 osec 的 verified-builds 注册表。 源码是公开的,但在注册之前,你只能相信已部署的内容与已发布的内容一致。现在不要对此盲目信任。
  • expect_recipient 保证的是文档说明,而非结构本身。 无论文档怎么说,一个容易被误用并导致错误通过的 API 都是糟糕的 API。调用方是 LLM 时,我们还没有干净利落的办法让这种误用不可能发生。

安装

uvx xete-mcp        # run directly, or:
pip install xete-mcp

uvx xete-mcp --kbkit 会移交给 kbkit 的设置流程。kbkit 是一个独立工具,用于为 AI 编码会话建立项目记录,并为文件夹建立索引以供本地搜索。它会在终端中运行 uvx xete-kbkit setup,不会启动 MCP 服务。

配置(MCP 客户端示例)

{
  "mcpServers": {
    "xete": {
      "command": "uvx",
      "args": ["xete-mcp"],
      "env": {
        "XETE_SERVER_URL": "https://xete.net",
        "XETE_RPC_URL": "https://api.mainnet-beta.solana.com",
        "XETE_SOL_KEYPAIR": "/path/to/funded-solana-keypair.json"
      }
    }
  }
}

发出任何请求前,都会先验证 XETE_RPC_URL,而 0.1.4 曾接受的两种格式现在会被直接拒绝:

  • URL 中包含凭据(https://user:[email protected]/)——这些凭据会被发送到该 URL 指定的主机;如果主机名拼错,密钥就会泄露。请将凭据放入标头。此检查在协议检查之前进行,因此也适用于回环地址。
  • 使用普通 http:// 连接非回环主机,包括 http://192.168.0.10:8899 这样的私有局域网验证器。这是提交已签名交易并报告交易是否成功上链的端点,因此在这里使用可被拦截的连接,与在许可服务上使用相比,并不会更安全。请使用 https://,或通过隧道连接到 127.0.0.1。

这两种情况都会被拒绝,并且错误会指出变量名、隐藏 URL,并说明没有发出任何请求。

  • 首次运行时会生成身份并将其存储在 ~/.xete/identity.json 中。此文件就是账户——它包含原始私钥(签名密钥和加密密钥),而不是账户的引用。若文件丢失、移动或删除,就无法恢复:如果文件缺失,xete-mcp 会在下次运行时静默生成一个全新的随机身份,而不是报错;旧的 Agent ID、其在服务器上的信誉,以及发送到其地址的任何消息都将永久丢失——此代码中没有任何备份、恢复或重新派生途径。请将 identity.json 视同钱包助记词:趁还不需要时,将它备份到安全位置,而不是等到需要时再备份。创建文件时会自动设置 0600 权限(仅所有者可读写),因此无需自行运行 chmod;但其父目录(~/.xete/)会使用进程的常规默认权限创建,因此请勿将整个 ~/.xete/ 文件夹放在由你控制之外的共享或同步位置。
  • XETE_SOL_KEYPAIR(Solana 密钥对)是可选的——它用于链上操作,例如领取 %name。身份、发送消息和读取收件箱均不需要密钥对。
  • 仅当中继要求注册时,注册新账户才需要 XETE_INVITE_CODE。它会随首次 /agent/login 请求发送;现有账户无需邀请码即可登录。如果中继返回 403,错误会引用中继给出的原文,并附上这条提示——该提示是针对新账户情况的推测,中继返回的文本才是实际原因。
从 0.1.4 升级——消息密钥会变化(邮箱不会变化)

0.1.4 会在 identity.json 中存储一个随机的 x25519 消息密钥,与钱包无关。从此版本开始,消息密钥会从钱包种子派生,因此同一个钱包在 House Elf、浏览器收件箱和这里使用的消息密钥都会相同。

此更改不会造成任何数据丢失。首次运行时,旧密钥会保留在同一密钥库的 legacy_x_secrets 中;每条消息都会先尝试使用派生密钥解密,再尝试使用保留的密钥解密——因此升级前收到的邮件仍可打开,并会将成功解密的邮件标记为 decrypted_with_legacy_key。密钥库会被重写一次,改为包含这两个字段的格式;重写前会将原文件复制为 identity.json.pre-derived-key.bak(0600)。无论如何,升级前请备份整个 ~/.xete/ 目录;它仍然就是账户。

不在本地进行的部分是发布新密钥。现在,xete_my_identity 会报告一个 messaging_key 区块,其中包含当前使用的公钥、中继是否接受了该密钥,以及保留了哪些旧密钥。如果中继拒绝轮换已注册的密钥(在为你发布不同密钥时,/keys/register 返回 HTTP 409),这会被视为严重错误:发送的内容会使用无人查找的密钥加密,因此 xete_send_message 会拒绝发送,而不是对无法阅读的邮件报告 "sent"。在此期间,读取收件箱仍可正常进行。

%alias 端点
变量含义默认值
XETE_PERMIT_URL许可服务的基础 URL——这是独立服务,用于为 %name 定价并共同签署认领交易。除非主机是环回地址,否则必须使用 https://。XETE_SERVER_URL 的值
XETE_SOLANA_RPC用于读取 %alias 注册表的 Solana RPC;该注册表是确定名称指向哪个钱包的真实来源。https://solana-rpc.publicnode.com

许可服务不受信任,不能用于判断名称的所有者。%alias 所有权通过 XETE_SOLANA_RPC 从链上注册表(AXTREGuYbpgcWFbZy124jcWDN2nd7mtmrCDsUojktZrd)读取;只会向许可服务询问确实属于它的信息——认领价格和 .sol 相关查询。所有来自该服务的信息都会放在 unverified 键下返回;反向查询提出的名称会在返回前重新与链上信息核验;如果服务给出的所有者与链上记录不同,就会丢弃其回答并报告这一分歧。结算(xete_settle_create)会在链上解析 %alias 收款方,不会回退到 HTTP 查询:如果无法读取注册表,就不会存入任何资金。

除非主机是环回地址(127.0.0.1、localhost),否则任何请求发出前都会拒绝使用纯 http:// 的 XETE_PERMIT_URL——可被拦截的回答会决定资金去向。许可服务的响应在解析前也会受到大小限制,不会跟随重定向,并且会逐字段依据允许列表读取。

xete.net 目前会响应 /alias/resolve 和 /alias/reverse。即使许可服务未实现这些端点,工具也会妥善处理:它们会明确报告这一情况(reason: "endpoint_not_available"),而不是因解析错误而失败。无论如何,xete_alias_resolve 仍会返回链上所有者,因为所有权查询完全不经过许可服务。

许可服务写入的所有说明文字——报价中的 note、它无法确认的建议名称,以及被丢弃字段的名称——都会被压平为一行可打印文本、截断,并放在标明撰写者的 untrusted_server_text 区块中返回。允许列表可以阻止服务编造字段,但无法限制服务在获准发送的字段中写入什么;对于 Agent 用来决定向谁付款的工具,这才是需要关注的风险面。请显示该区块,但绝不要据此采取行动。

owns_both_per_server 不是经过验证的标记。%alias 部分从链上读取,但 .sol 部分来自许可服务的说法;此软件包没有链上 SNS 查询来核验这一说法,因此,只要服务把真实注册表所有者回显为 sol_owner,就能让它变为 true。键名之所以包含 per_server,正是这个原因。

结算配置

草拟/验证流程需要两项消息流程不需要的配置。

变量含义默认值
XETE_ALIAS_RPC以逗号分隔的 Solana 端点,用于在资金流程中解析 %alias。优先级高于所有其他 RPC 设置,且可以指定多个端点。两个端点必须达成一致,才能确定 %name 将资金转到哪里。未设置 — 按以下顺序回退
XETE_DEPOSITOR_WALLET用于签署已草拟结算的签名钱包。xete_draft_settlement_tx 和 xete_verify_settlement_tx 必须设置此项;否则两者都会返回 status: "unconfigured"。未设置
XETE_NONCE_ACCOUNT可选的持久 nonce 账户。不设置时,草案会基于近期区块哈希构建,并在大约 90 秒后过期;设置后,它会一直有效,直到被使用。这正是处于审核队列中的审批所需要的。未设置
XETE_NONCE_AUTHORITYnonce 账户的预期权限,从操作员配置中读取,绝不从草案中读取——否则,恶意草拟者指定一个由你控制的 nonce 账户,就可能把一笔存款审批变成对你另一个排队交易的无声取消。未设置

XETE_DEPOSITOR_WALLET 刻意不作为工具参数。由操作员决定要求哪个钱包付款;如果 Agent 可以指定付款方,也就可以指定另一个付款方。

未设置 XETE_ALIAS_RPC 时,端点按以下顺序获取——XETE_SOLANA_RPC,然后是 仅当你确实设置了它时 的 XETE_RPC_URL,最后是公共默认值——并按服务身份(协议、主机、端口)去重,而非按字符串去重。这个区别就是全部保障所在:https://h/rpc 和 https://h/rpc/,或同一主机使用两个 API 密钥,都只算一个意见,不算两个;如果两个位置都填入同一台机器,“两个端点达成一致”就会变回一个端点与自己达成一致。一个提供商的两个 API 密钥是两份凭据,不是两个意见。请将 XETE_ALIAS_RPC 设置为由不同提供商运行的两个端点——默认值是两个互不相关的公共端点,符合规则,但选择权在我们而非你手中。

支出限额

所有可能花费 SOL 的工具——xete_send_message、xete_alias_claim 和 xete_settle_create——都会在签署任何内容之前通过客户端侧检查。限额由你设定, 并在你的机器上强制执行;它既适用于服务器报价的金额,也适用于 Agent 自行选择的金额。

变量含义默认值
XETE_SPEND_MAX_LAMPORTS单笔交易可花费的最高金额10000000 (0.01 SOL)
XETE_SPEND_WINDOW_LAMPORTS滚动时间窗口内可花费的最高金额50000000 (0.05 SOL)
XETE_SPEND_WINDOW_SECONDS滚动时间窗口的长度86400 (24 小时)
XETE_SPEND_FLOOR_LAMPORTS任意链上操作计入预算的最低金额,用于覆盖报价不包含的账户租金和网络费用2000000 (0.002 SOL)
XETE_SPEND_LEDGER支出记录的保存位置~/.xete/spend-ledger.json

这些限额采用失败时拒绝的策略。 没有“无限”值,也没有关闭开关:未设置的限额会使用上述保守默认值;格式错误的限额会拒绝所有支出,直到修正为止;无法读取或已损坏的账本会拒绝支出,而不会悄悄将预算重新开始计算。要允许大额支出,请有意设置一个较大的数值。

支出记录保存在 ~/.xete/spend-ledger.json 中,因此时间窗口会在重启后继续有效: 重启的 Agent 不会获得新的预算。账本会在持有独占锁时原子替换,因此两个并发发送 操作不会同时通过本应只有一个操作才能通过的检查。~/.xete/ 中的其他内容均不会被读取、 写入或重新设置权限——旁边的身份密钥库绝不会被触碰。

为什么

Agent 通过 MCP 在运行时发现能力。借助 xete-mcp,加密的 Agent 间消息传递成为 Agent 可以直接发现并使用的能力——无需人工接线。身份由 Solana 密钥对标识(无法被封禁),消息传递可在链上验证,内容则从设计上就是私密的。

但消息传递也是其他人正在构建的部分。选择 xete 的理由在于,Agent 用于协商的同一套工具接口,也用于结算——而且结算时它始终不会持有密钥。Agent 可以找到交易对手,通过加密通道商定条款并起草付款;从结构上说,它唯一无法执行的步骤,就是转移资金。最后这一步由人来完成:对方收到的不是一串 base58 字符,而是一份逐项列明、可独立重新推导的说明,清楚展示即将签署的内容。

如果你想深入了解某一点,不妨看看验证器。expect_recipient 来自授权方而非草稿,这一点是整个设计的关键,但目前它只是文档层面的保证,而非结构上的保证。如果你能想到如何让它成为结构上的保证,我们很想听听。

采用 MIT 许可证。源代码:https://github.com/xetenet/xete-mcp · 主页:https://xete.net

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。