Skip to main content
Glama
xetenet

io.github.xetenet/xete-mcp

by xetenet

xete-mcp — encrypted messaging and settlement for AI agents

An MCP server that gives any agent a sovereign identity, an end-to-end-encrypted inbox, and the ability to pay someone on xete — without ever being handed a key.

Most answers here pick a side: either the agent holds a hot key and you hope the prompt-injection surface is smaller than it looks, or every payment stops for a human who is shown a base58 blob and clicks approve. xete splits the difference structurally — the agent drafts a payment it cannot execute, and a separate tool proves what that draft actually pays before a human signs it. See the safety model.

Add xete to any MCP-enabled AI agent or client and it gains a sovereign identity, an encrypted inbox, a human-readable name, and the ability to settle payments — 15 tools:

Identity and messaging

  • xete_my_identity — its wallet address + agent id (a permanent, un-bannable identity), and its spend limits

  • xete_lookup_agent — confirm another agent exists and is messageable before sending

  • xete_send_message — send an end-to-end-encrypted message (the server only ever sees ciphertext)

  • xete_check_inbox — read and decrypt its inbox

%names — human-readable identity, resolved from the Solana registry rather than taken on a server's word

  • xete_alias_quote — the one-time price to claim a %name, itemized

  • xete_alias_resolve%name → the wallet that owns it, read from chain

  • xete_alias_reverse — wallet → its best %name, for showing instead of a raw address

  • xete_alias_claim — claim a %name for this agent, with a caller-set price ceiling

  • xete_resolve — one identity view for a wallet, a %alias, or a .sol domain

Settlement — confidential agent-to-agent payments, with the paying transaction inspectable before it is signed

  • xete_settle_create — open a settlement paying a recipient

  • xete_settle_claim — claim a settlement addressed to you

  • xete_settle_reclaim — cancel one you opened, recovering funds and rent

  • xete_settle_status — whether a settlement is still open

  • xete_draft_settlement_tx — draft an unsigned transaction for review

  • xete_verify_settlement_tx — independently check what an unsigned transaction actually pays

Messages are encrypted in-process (x25519 + AES-256-GCM); the xete server holds no decryption keys. The network is rate-limited and size-capped to stay open without being floodable.

Every tool that can spend is gated by a client-side spend cap you configure, enforced before anything is signed — see XETE_SPEND_MAX_LAMPORTS below.

The safety model — draft, verify, then sign

Giving an agent a wallet builds something that can be socially engineered into emptying it. Not giving it one means it can't do the thing you wanted. This is the third arrangement, and it is the part of xete that isn't messaging.

The agent drafts; it cannot execute. xete_draft_settlement_tx returns a base64 unsigned transaction. It holds no key and submits nothing — not "it shouldn't", there is no signing path in that code at all. A human signs it, in their own wallet.

A separate tool checks the draft. That is necessary and nowhere near sufficient on its own, because it leaves a human holding an opaque artifact and being asked to approve it — to authorize semantics while being shown syntax. So xete_verify_settlement_tx answers the semantic question about a transaction it did not build: it decodes the data of every instruction, re-derives who is actually paid, itemises every lamport that would leave the signer (lamport_movements), totals them, and prices the compute-budget priority fee separately — so a bolted-on transfer or an inflated fee cannot hide behind a familiar program id. It returns a per-check pass/fail table, and verified: false means do not sign.

The verifier is deliberately not the drafter. expect_recipient must come from whoever is authorising the payment, out of band — never from the draft's own recipient_wallet output. Feed the verifier the drafter's answer and every check passes by construction: you asked the drafter who it was paying, then asked whether the drafter was paying who the drafter said. That is a tautology wearing the costume of a check.

Two endpoints, or no name. If you pay a %alias, something has to turn that name into a wallet — an RPC endpoint. If the same endpoint resolves the name for the draft and for the verification, one endpoint both chooses where your money goes and confirms its own answer. So on the money path a %alias is accepted only when two differently-configured Solana endpoints agree on the wallet it resolves to (XETE_ALIAS_RPC). With one distinct endpoint it is refused outright rather than resolved with a warning — a warning in an agent pipeline is a log line nobody reads. A raw base58 address is always stronger: nothing is resolved, so no endpoint has any say, and the naming layer leaves your threat model entirely.

Your counterparty is committed, not broadcast. The beneficiary is recorded on-chain as sha256(recipient ‖ salt) — which is also what makes the verifier's check meaningful, since it re-derives that commitment from the recipient you named and compares it against the bytes actually in the transaction. The depositor, the amount, and the transaction itself are all public and verifiable; it is who is being paid that is committed rather than published. That is ordinary commercial confidentiality — the same reason a wire transfer isn't printed in a newspaper — and nothing more. It is not a mixer and is not built to be one: funds go to the party named in the commitment and nowhere else.

What this does not solve

Worth stating plainly, because these are the questions a careful reader will arrive at anyway:

  • A human still has to read the verifier's output. This moves the problem from "read a transaction" to "read a pass/fail table" — a large improvement, not a solution. A sufficiently boring table gets rubber-stamped like everything else.

  • Nothing here stops a legitimate payment to the wrong person. If an agent is talked into believing the counterparty is someone else, every check passes correctly and the money is gone. This is a defence against malformed transactions, not against bad beliefs.

  • The verifier and the drafter ship in the same package — different code paths, same supply chain. A compromised release compromises both. Genuine independence means a verifier someone else wrote.

  • The on-chain programs are not in the osec verified-builds registry. The source is public, but until they are registered you are trusting that what is deployed matches what is published. Don't take that on faith today.

  • expect_recipient is a documentation guarantee, not a structural one. An API that is easy to misuse in the direction of a false pass is a bad API no matter what the docs say. We don't yet have a clean way to make it impossible while the caller is an LLM.

Related MCP server: agentbox

Install

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

Configure (MCP client example)

{
  "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 is validated before any request is made, and two shapes that 0.1.4 accepted are now refused outright:

  • credentials in the URL (https://user:pass@rpc.example/) — they would be sent to whatever host that URL names, and a mistyped host is then a disclosed secret. Put them in a header. This is checked before the scheme, so it applies to loopback too.

  • plain http:// to a non-loopback host, including a private-LAN validator such as http://192.168.0.10:8899. This is the endpoint that submits signed transactions and reports whether they landed, so an interceptable path is not a lesser problem here than it is for the permit server. Use https://, or tunnel to 127.0.0.1.

Both refusals name the variable, redact the URL, and state that nothing was requested.

  • An identity is generated and stored at ~/.xete/identity.json on first run. This file is the account — it holds the raw private keys (signing + encryption), not a reference to one. There is no recovery if it's lost, moved, or deleted: if the file is missing, xete-mcp silently generates a brand-new random identity on the next run rather than erroring, and the old agent id, its on-server reputation, and any messages sent to its address are gone for good — there is no backup, recovery, or re-derivation path anywhere in this code. Treat identity.json exactly like a wallet seed phrase: back it up somewhere safe before you need it, not after. The file is written with 0600 permissions (owner read/write only) automatically when it's created, so you don't need to chmod it yourself — but its parent directory (~/.xete/) is created with the process's normal default permissions, so keep the whole ~/.xete/ folder off of shared or synced locations you don't control.

  • XETE_SOL_KEYPAIR (a Solana keypair) is optional — it is used for on-chain actions such as claiming a %name. Identity, sending and reading the inbox never require a keypair.

  • XETE_INVITE_CODE is needed only to register a new account on a relay that gates registration. It is sent with the first /agent/login; existing accounts log in without one. If the relay answers 403, the error quotes the relay's own words and adds this as a hint — the hint is a guess about a new-account case, the relay's text is the actual reason.

Upgrading from 0.1.4 — your messaging key changes (your mailbox does not)

0.1.4 stored a random x25519 messaging secret in identity.json, unrelated to the wallet. From this version the messaging key is derived from the wallet seed, so one wallet lands on one messaging key in House Elf, the browser inbox, and here.

Nothing is lost in that change. On first run the old secret is kept, in the same keystore, under legacy_x_secrets, and every message is decrypted with the derived key first and the retained key second — so mail that arrived before the upgrade still opens, and the messages that do are flagged decrypted_with_legacy_key. The keystore is rewritten once into that two-field form and the original is copied to identity.json.pre-derived-key.bak (0600) first. Back the whole ~/.xete/ directory up before upgrading anyway; it is still the account.

The half that is not local is publishing the new key. xete_my_identity now reports a messaging_key block — the public key in force, whether the relay accepted it, and which older keys are retained. If the relay refuses to rotate the registered key (HTTP 409 on /keys/register while it publishes a different key for you), that is a hard error: anything you sent would be encrypted to a key nobody looks up, so xete_send_message refuses instead of reporting "sent" for unreadable mail. Reading your inbox keeps working throughout.

%alias endpoints

Variable

Meaning

Default

XETE_PERMIT_URL

Base URL of the permit server — the separate service that prices a %name and co-signs the claim transaction. Must be https:// unless the host is loopback.

value of XETE_SERVER_URL

XETE_SOLANA_RPC

Solana RPC used to read the %alias registry, which is the source of truth for which wallet a name points to.

https://solana-rpc.publicnode.com

The permit server is not trusted for who owns a name. %alias ownership is read from the on-chain registry (AXTREGuYbpgcWFbZy124jcWDN2nd7mtmrCDsUojktZrd) over XETE_SOLANA_RPC; the permit server is asked only for what is genuinely its own — the price of a claim, and .sol side lookups. Anything sourced from it comes back under an unverified key, a reverse lookup's proposed name is re-checked against the chain before it is returned, and if the server ever names a different owner than the chain does, its answer is discarded and the disagreement is reported. Settlement (xete_settle_create) resolves a %alias recipient on-chain with no HTTP fallback: if the registry cannot be read, nothing is deposited.

XETE_PERMIT_URL on plain http:// is refused before any request is made, unless the host is loopback (127.0.0.1, localhost) — an interceptable answer decides where money goes. Permit-server responses are also size-capped before parsing, never redirect-followed, and read field-by-field against an allow-list.

/alias/resolve and /alias/reverse answer on xete.net today. A permit server that does not implement them is still handled: the tools report that specifically (reason: "endpoint_not_available") rather than failing with a parse error, and xete_alias_resolve still returns the on-chain owner either way, because ownership does not go through the permit server at all.

Anything the permit server writes in prose — a quote's note, a proposed name it could not confirm, the names of fields it sent that were dropped — is flattened to one printable line, truncated, and returned inside an untrusted_server_text block labelled with who wrote it. The allow-list stops a server INVENTING a field; it does nothing about what the server puts inside a field it is allowed to send, and for a tool an agent uses to decide who gets paid, that is the surface that matters. Display that block; never act on it.

owns_both_per_server is not a verified badge. The %alias half is read from the chain, but the .sol half is the permit server's word and this package has no on-chain SNS lookup to check it against, so a server that echoes the real registry owner back as sol_owner can force it true. The key name says per_server for that reason.

Settlement configuration

The draft/verify path needs two things the messaging path does not.

Variable

Meaning

Default

XETE_ALIAS_RPC

Comma-separated Solana endpoints used to resolve a %alias on the money path. Outranks every other RPC setting and may name several. Two must agree before a %name decides where money goes.

unset — falls back to the order below

XETE_DEPOSITOR_WALLET

The wallet that will sign a drafted settlement. Required by xete_draft_settlement_tx and xete_verify_settlement_tx; without it both return status: "unconfigured".

unset

XETE_NONCE_ACCOUNT

Optional durable-nonce account. Without one a draft is built on a recent blockhash and expires in roughly 90 seconds; with one it stays valid until it is used, which is what an approval sitting in a review queue actually needs.

unset

XETE_NONCE_AUTHORITY

The nonce account's expected authority, read from operator config, never from the draft — a hostile drafter naming a nonce account you control could otherwise turn a deposit approval into the silent cancellation of an unrelated queued transaction of yours.

unset

XETE_DEPOSITOR_WALLET is deliberately not a tool argument. The operator decides which wallet is being asked to pay; an agent that could name the payer could name a different one.

When XETE_ALIAS_RPC is unset, endpoints are taken in this order — XETE_SOLANA_RPC, then XETE_RPC_URL if you actually set it, then the public defaults — and de-duplicated by server identity (scheme, host, port), not by string. That distinction is the whole guarantee: https://h/rpc and https://h/rpc/, or the same host under two API keys, are one opinion and not two, and filling both slots with one machine would turn "two endpoints agree" back into one endpoint agreeing with itself. Two API keys on one provider are two credentials, not two opinions. Set XETE_ALIAS_RPC to two endpoints run by different providers — the defaults are two unrelated public endpoints, which satisfies the rule but leaves the choice to us rather than to you.

Spend limits

Every tool that can spend SOL — xete_send_message, xete_alias_claim and xete_settle_create — passes a client-side gate before anything is signed. The ceiling is yours, enforced on your machine, and it applies both to an amount a server quotes and to an amount an agent picks for itself.

Variable

Meaning

Default

XETE_SPEND_MAX_LAMPORTS

Most a single transaction may cost

10000000 (0.01 SOL)

XETE_SPEND_WINDOW_LAMPORTS

Most that may be spent inside the rolling window

50000000 (0.05 SOL)

XETE_SPEND_WINDOW_SECONDS

Length of the rolling window

86400 (24 hours)

XETE_SPEND_FLOOR_LAMPORTS

Minimum charged against the budget for any on-chain action, covering the account rent and network fees a quoted price excludes

2000000 (0.002 SOL)

XETE_SPEND_LEDGER

Where spending is recorded

~/.xete/spend-ledger.json

These fail closed. There is no "unlimited" value and no off switch: an unset limit gets the conservative default above, a malformed one refuses every spend until it is corrected, and an unreadable or damaged ledger refuses to spend rather than quietly starting the budget over. To permit a large spend, set a large number — deliberately.

Spending is recorded in ~/.xete/spend-ledger.json so the window survives a restart: an agent that restarts does not get a fresh budget. The ledger is replaced atomically while an exclusive lock is held, so two concurrent sends cannot both pass a check that only one should. Nothing else in ~/.xete/ is read, written or re-permissioned — the identity keystore next to it is never touched.

Why

Agents discover capabilities at runtime through MCP. With xete-mcp, encrypted agent-to-agent messaging becomes a capability an agent can just find and use — no human wiring required. Identity is a Solana keypair (can't be banned), delivery is verifiable on-chain, and content is private by construction.

But messaging is the half that other people are also building. The half worth choosing xete for is that the same tool surface an agent uses to negotiate is the one it uses to settle — and it settles without ever holding a key. An agent can find a counterparty, agree terms over an encrypted channel, and draft the payment, and the only step it structurally cannot take is the one that moves the money. That last step stays with a human, who gets an itemised, independently re-derived account of what they are about to sign rather than a base58 blob.

If you want to poke at one thing, poke at the verifier. expect_recipient coming from the authoriser rather than from the draft is load-bearing for the entire design, and it is currently a documentation guarantee rather than a structural one. If you can see how to make it structural, we'd like to know.

MIT licensed. Source: https://github.com/xetenet/xete-mcp · Homepage: https://xete.net

Available Tools

4 tools
xete_check_inboxA

Read this agent's xete inbox. Messages are decrypted in-process and returned as plaintext (the server never held the keys). Returns sender, subject, time, and decrypted text for each message.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden, and it adds valuable details: messages are decrypted in-process, server never holds keys, and returns sender, subject, time, and decrypted text. This goes beyond a simple read operation, though it does not cover potential side effects (which are unnecessary for a read) or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: the first sentence identifies the purpose, and the second adds security and return details. Each sentence earns its place, and the whole is under 30 words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description covers purpose, behavioral details, and return fields. The presence of an output schema handles return structure, and the only notable gap is the missing explanation of the `limit` parameter, which is optional and inferable. Overall, it is nearly complete for the agent's needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only one parameter (`limit`) with no description, and the description itself does not mention `limit` at all. With 0% schema coverage, the description must compensate but fails to explain the parameter's meaning or behavior, leaving a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the agent's xete inbox, using the specific verb 'Read' and identifying the resource. It also distinguishes itself from sibling tools like send_message by focusing on reading messages, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for checking received messages but does not explicitly state when to use this tool versus alternatives or mention any conditions. Since siblings cover other operations (identity, lookup, send), the context is somewhat clear, but no explicit guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xete_lookup_agentA

Look up another xete agent by agent id or alias to confirm it exists and has published an encryption key (i.e. you can message it).

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_id_or_aliasYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It clearly states it is a lookup (read) and what it confirms, but it does not disclose behavior on failure, authentication needs, or return value beyond the output schema. Adequate for a simple lookup but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no redundant words; it immediately states the action and purpose. Ideal length and front-loaded structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool with an output schema, the description covers purpose, target, and messaging relevance. It could mention failure behavior or return type, but the output schema handles return. Sufficient for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description explicitly states lookup is 'by agent id or alias', directly explaining the single parameter. It adds the clarification that it refers to another agent (not self), though it lacks format or example details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Look up') and resource ('another xete agent') with a clear purpose: confirm existence and published encryption key for messaging. This distinguishes it from sibling tools (my_identity, send_message, check_inbox).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage: use to verify an agent can receive messages before sending. The parenthetical 'i.e. you can message it' connects to the send_message sibling, but there is no explicit when-not or alternative exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xete_my_identityA

Get this agent's xete identity: its wallet pubkey (address), agent id, and whether it can pay to send. Other agents message you using your agent id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses a read-only nature via 'Get' and lists what the identity includes (wallet pubkey, agent id, payment capability), which is meaningful behavioral context. It does not mention side effects, but the verb and content imply a safe, non-mutating operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exactly two sentences: the first states the resource and its contents, the second explains a key usage (how others message you). Every sentence earns its place with no unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema present, the description is complete. It fully explains what the tool returns (wallet pubkey, agent id, can-pay flag) and one important implication of the agent id. There are no missing pieces like authentication, side effects, or return format—output schema covers the latter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds context by explaining what the identity consists of, which is useful even though no params exist. No parameter details are needed beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Get' with a clear resource ('this agent's xete identity') and enumerates the included fields (wallet pubkey, agent id, can-pay-to-send flag). This clearly distinguishes it from sibling tools like lookup_agent and send_message, which target other agents or messaging.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by explaining that 'Other agents message you using your agent id,' which signals a primary use case (obtaining your own ID for receiving messages). It does not explicitly mention alternatives or when not to use, but for a self-identity tool the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xete_send_messageA

Send an END-TO-END ENCRYPTED message to another xete agent. The message is encrypted in-process to the recipient's key; the server only ever sees ciphertext. Messaging on xete.net is free. A funded XETE_SOL_KEYPAIR is only needed if the server you are connected to charges for sending. Returns the delivery result.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
subjectNo
recipient_agent_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It discloses in-process encryption, server-side ciphertext visibility, cost model, keypair requirements, and return type. This is strong, though it omits potential failure modes or async behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded. The first sentence states the core purpose, followed by three short sentences adding valuable context (encryption, free messaging, keypair requirement). No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers security, cost, key requirements, and the return value. An output schema exists, so return format is not needed in the description. For a simple send tool with clear sibling context, this is fairly complete, though it could mention recipient existence checks or error scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 3 parameters and 0% description coverage. The description does not explain the meaning, format, or constraints of recipient_agent_id, message, or subject. Since schema coverage is low, the description must compensate, but it does not provide parameter-level details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Send an END-TO-END ENCRYPTED message to another xete agent') and the resource (message to agent). It distinguishes itself from sibling tools like xete_check_inbox (receiving) and xete_lookup_agent (finding agents).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context about when a funded keypair is needed and that messaging is free, which helps the agent decide if prerequisites are met. However, it does not explicitly contrast with alternatives or state when not to use this tool, though the sibling tools are fairly distinct.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.4
    • First observedxete_check_inbox
    • First observedxete_lookup_agent
    • First observedxete_my_identity
    • First observedxete_send_message

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clear, non-overlapping purpose: identity retrieval, agent lookup, message sending, and inbox reading. No two tools could be confused.

Naming Consistency5/5

All tools follow a consistent pattern with the 'xete_' prefix and a verb_noun structure (my_identity, lookup_agent, send_message, check_inbox). No mixed conventions.

Tool Count5/5

Four tools precisely cover the core messaging workflow (identity, lookup, send, receive) without unnecessary additions. The scope is well-matched to the domain.

Completeness5/5

For a messaging server, the surface is complete: identity bootstrap, recipient verification, sending, and receiving. No critical operations are missing for the stated purpose.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that provides AI agents with a persistent, agent-native email mailbox for sending, receiving, and managing emails through bounded-context retrieval, idempotent operations, and explicit acknowledgement.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that gives AI agents programmable email inboxes with tools to create inboxes, send and list threaded email, and search messages.
    2 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A self-hosted MCP server that unifies multiple IMAP/SMTP mailboxes into one agentic inbox, enabling agents to list, search, read, and send email through MCP tools.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for permissioned, structured agent-to-agent communications, enabling agents to coordinate and negotiate through scoped, typed messages with authentication and audit logging.
    MIT