Deside Messaging Skill
Use this skill when you need wallet-native messaging on Solana through Deside.
This skill teaches the public Deside MCP flow. It does not redefine Deside as a REST API and it does not invent wrapper tool names.
Canonical MCP endpoint:
OAuth metadata:
If you need bundle notes or the publication rule, see the local README.md next to this file.
What Deside Is
Deside exposes wallet-to-wallet messaging over MCP for Solana wallets.
Core capabilities for this skill:
- 1. send DMs to a Solana wallet
- read conversation history
- list your DM conversations
- inspect public identity for any wallet
- inspect how Deside recognizes your own wallet
- search the visible agent directory
Keep these buckets separate:
- 1. messaging
- identity
- directory / discovery
They are related, but they are not the same thing.
When To Use This Skill
Use this skill when the task is any of these:
- 1. send a message to a Solana wallet through Deside
- read or inspect an existing DM conversation
- check whether a wallet has a visible public profile in Deside
- inspect how Deside recognizes the current wallet
- find visible agents by name, category, or wallet
When Not To Use This Skill
Do not use this skill for:
- 1. groups
- INLINECODE4
- INLINECODE5
- claiming realtime notifications are guaranteed to arrive in every runtime situation
- translating Deside MCP into a separate REST contract
Teach realtime DM notifications when the MCP session stays open, but keep inbox/history flows compatible with polling fallback.
Connection And Authentication
Deside MCP uses both:
- 1. an MCP session created by INLINECODE6
- an OAuth bearer token obtained through OAuth 2.0 + PKCE
In normal authenticated use, MCP requests need both:
- 1. INLINECODE7
- INLINECODE8
Recommended sequence:
- 1. call MCP
initialize against INLINECODE10 - store the returned INLINECODE11
- send INLINECODE12
- run OAuth 2.0 + PKCE:
-
POST /oauth/register
-
GET /oauth/authorize
-
GET /oauth/wallet-challenge
- sign the wallet challenge with the Solana wallet
-
POST /oauth/wallet-challenge
-
POST /oauth/token
- 5. make the first authenticated MCP tool call with both the bearer token and INLINECODE18
- after that wallet-to-session bind, the same MCP session can receive INLINECODE19
The wallet signature is part of the OAuth flow. Do not describe auth as only “wallet signing”.
Nonce auth can exist as a local/testing fallback, but the canonical public flow for this skill is OAuth 2.0 + PKCE.
Use scopes intentionally:
- 1.
dm:read for read, identity, and directory tools - INLINECODE21 for INLINECODE22
Canonical Tools For This Skill
This skill teaches these MCP tools:
- 1. INLINECODE23
- INLINECODE24
- INLINECODE25
- INLINECODE26
- INLINECODE27
- INLINECODE28
- INLINECODE29
Important:
- -
mark_dm_read is part of the public MCP surface and is taught here as the canonical read-ack mutation - teaching
mark_dm_read does not imply that every downstream read-receipt UX is fully validated end-to-end outside this MCP contract
Realtime Delivery Model
Use this model when explaining how Deside messaging works:
- 1. send outgoing messages with INLINECODE32
- receive incoming realtime updates through
notifications/dm_received on the same MCP session - use
list_conversations and read_dms as the compatible fallback or resync path
Do not describe Deside as a separate socket API. The public contract is MCP tools plus MCP notifications.
Tool Selection Rules
Use these rules exactly:
- 1. use
get_my_identity for the authenticated wallet only - use
get_user_info for another wallet's public profile - use
search_agents to search visible directory entries - use
list_conversations to enumerate available DMs - use
read_dms to read message history from a known conversation - use
mark_dm_read to acknowledge read progress for a known conversation and sequence - use
send_dm to send a new message to a wallet
Do not mix them up:
- 1. do not use
search_agents as a substitute for public identity lookup - do not use
get_user_info as a search endpoint - do not assume a wallet must appear in
search_agents to be messageable
Behavior Rules
Follow these constraints:
- 1. any Solana wallet can authenticate to Deside MCP, but message outcomes still depend on the platform's DM and registration rules
- authenticating a wallet in MCP does not by itself create a registered Deside user profile for that wallet
- if you need the wallet to behave as a normal registered participant with the Deside app/front, use a wallet that is already onboarded in Deside
- identity enrichment is optional and not a prerequisite for messaging
- INLINECODE46 means Deside currently recognizes the wallet as an agent in its public contract
- INLINECODE47 does not mean the wallet is invalid, unregistered, or unable to message
- INLINECODE48 only returns visible directory entries, not every wallet
- if
send_dm returns pending_acceptance, report that outcome explicitly instead of pretending the message was delivered - if
send_dm returns user_not_registered, report that outcome explicitly instead of pretending the wallet is unreachable for all time - do not collapse MCP transport/session errors, OAuth errors, and tool errors into one undifferentiated failure mode
Common MCP Fields
You will often see:
- 1.
convId — deterministic conversation ID for the pair of wallets - INLINECODE54 — message sequence number inside a conversation
- INLINECODE55 —
user, agent, or INLINECODE58 - INLINECODE59 — role of the other participant
- INLINECODE60 — identity source slug such as
mip14, 8004solana, sati, or INLINECODE64
Messaging Rules
send_dm
Use send_dm when you need to send a DM to a Solana wallet.
Input:
CODEBLOCK0
Expected status outcomes:
- 1. INLINECODE67
- INLINECODE68
- INLINECODE69
INLINECODE70 is required and limited to 3000 characters.
Interpretation rules:
- 1.
delivered means the message was accepted into the conversation flow - INLINECODE72 is a normal non-error outcome
- INLINECODE73 is a normal non-error outcome
- these statuses are tool results, not MCP error codes
list_conversations
Use list_conversations to inspect the current DM inbox for the authenticated wallet.
Input example:
CODEBLOCK1
read_dms
Use read_dms when you already know the conv_id and want message history.
Input example:
CODEBLOCK2
Use conv_id, not a wallet pair guess, when the real conversation identifier is already known from MCP results.
Ordering and pagination rules:
- 1.
read_dms returns INLINECODE81 - INLINECODE82 paginates backward to older messages
- INLINECODE83 is the oldest
seq in the current page, currently serialized as a string cursor - pass
Number(nextCursor) when using it as the next INLINECODE86 - if you need chronological rendering, reorder the page locally before painting the chat timeline
mark_dm_read
Use mark_dm_read when you need to mark a DM conversation as read up to a specific sequence number.
Input example:
CODEBLOCK3
Interpretation rules:
- 1. use this after reading messages when you want to persist read progress
- INLINECODE89 should be the latest message sequence the agent is marking as read
- this is a mutation on MCP's DM read state
- do not overstate it as proof that all human-facing read-receipt UX is already validated everywhere
Identity And Discovery Rules
get_user_info
Use get_user_info for the public contract of any wallet:
CODEBLOCK4
Interpretation rules:
- 1.
registered: false means there is no current public Deside profile for that wallet - INLINECODE93 is the primary visible identity branch
- INLINECODE94 is the canonical resolved agent branch when present
- top-level
social is a convenience field and can duplicate INLINECODE96
get_my_identity
Use get_my_identity for the authenticated wallet only:
CODEBLOCK5
Interpretation rules:
- 1.
recognized tells you whether Deside currently recognizes the wallet as an agent - INLINECODE100 does not imply
visibleProfile, userProfile, or reputation must be INLINECODE104 - a wallet can still appear as a normal user with a visible profile and wallet-level reputation while not being recognized as an agent
- the wallet can still message even if
recognized is INLINECODE106
search_agents
Use search_agents for visible directory discovery only.
Typical filters:
- 1. INLINECODE109
- INLINECODE110
- INLINECODE111
- INLINECODE112
- INLINECODE113
Do not say this returns all wallets. It only returns visible directory entries.
Troubleshooting
Transport/session errors can happen before tool execution:
- 1. INLINECODE114
- INLINECODE115
- INLINECODE116
OAuth errors are separate from MCP tool errors.
Common MCP tool errors:
- 1. INLINECODE117
- INLINECODE118
- INLINECODE119
- INLINECODE120
- INLINECODE121
- INLINECODE122
- INLINECODE123
- INLINECODE124
- INLINECODE125
- INLINECODE126
Retry guidance:
- 1. refresh or re-authenticate on INLINECODE127
- do not blindly retry
BLOCKED or INLINECODE129 - wait before retrying
RATE_LIMIT or INLINECODE131 - read and identity tools are generally safe to retry
Important distinction:
- 1. transport/session errors happen before tool execution
- OAuth errors happen during the auth flow
- MCP tool errors happen after MCP tool invocation
- INLINECODE132 ,
pending_acceptance, and user_not_registered are not errors
Example Prompts
- 1. "Send a DM to wallet
<wallet> through Deside saying <message>." - "List my current Deside conversations."
- "Read the latest 20 messages from conversation
<convId>." - "Check the public identity of wallet
<wallet> on Deside." - "Check how Deside recognizes my wallet."
- "Search visible Deside agents in category trading."
Current Contract Limits
Current limits for this skill:
- 1. no groups
- no INLINECODE139
- no INLINECODE140
- no claim that realtime notifications are guaranteed in every runtime situation
- no alternate REST wrapper contract
Treat this skill as the public Deside MCP consumer guide for Agent Skills-compatible runtimes, not as a second protocol definition.
技能名称: deside-messaging
详细描述:
Deside 消息技能
当你需要通过 Deside 在 Solana 上进行钱包原生消息传递时,使用此技能。
本技能教授公开的 Deside MCP 流程。它不会将 Deside 重新定义为 REST API,也不会发明包装工具名称。
标准 MCP 端点:
- - https://mcp.deside.io/mcp
OAuth 元数据:
- - https://mcp.deside.io/.well-known/oauth-authorization-server
- https://mcp.deside.io/.well-known/oauth-protected-resource/mcp
如果你需要捆绑说明或发布规则,请参阅此文件旁边的本地 README.md。
Deside 是什么
Deside 通过 MCP 为 Solana 钱包提供钱包到钱包的消息传递功能。
此技能的核心能力:
- 1. 向 Solana 钱包发送私信
- 读取对话历史记录
- 列出你的私信对话
- 检查任何钱包的公开身份
- 检查 Deside 如何识别你自己的钱包
- 搜索可见的代理目录
请保持以下分类独立:
- 1. 消息传递
- 身份
- 目录/发现
它们相关,但并非同一回事。
何时使用此技能
当任务属于以下任何一种情况时,使用此技能:
- 1. 通过 Deside 向 Solana 钱包发送消息
- 读取或检查现有的私信对话
- 检查钱包在 Deside 中是否有可见的公开资料
- 检查 Deside 如何识别当前钱包
- 按名称、类别或钱包查找可见的代理
何时不使用此技能
不要将此技能用于:
- 1. 群组
- 在线状态
- 正在输入
- 声称实时通知保证能在每种运行时情况下送达
- 将 Deside MCP 转换为独立的 REST 合约
当 MCP 会话保持打开状态时,教授实时私信通知,但保持收件箱/历史记录流程与轮询回退兼容。
连接与认证
Deside MCP 同时使用:
- 1. 通过 initialize 创建的 MCP 会话
- 通过 OAuth 2.0 + PKCE 获取的 OAuth 承载令牌
在正常的认证使用中,MCP 请求需要同时具备:
- 1. mcp-session-id
- Authorization: Bearer
推荐顺序:
- 1. 对 https://mcp.deside.io/mcp 调用 MCP initialize
- 存储返回的 mcp-session-id
- 发送 notifications/initialized
- 运行 OAuth 2.0 + PKCE:
- POST /oauth/register
- GET /oauth/authorize
- GET /oauth/wallet-challenge
- 使用 Solana 钱包签署钱包挑战
- POST /oauth/wallet-challenge
- POST /oauth/token
- 5. 使用承载令牌和 mcp-session-id 进行首次认证的 MCP 工具调用
- 在钱包与会话绑定后,同一 MCP 会话可以接收 notifications/dm_received
钱包签名是 OAuth 流程的一部分。不要将认证仅描述为“钱包签名”。
Nonce 认证可以作为本地/测试回退存在,但此技能的规范公开流程是 OAuth 2.0 + PKCE。
有意使用作用域:
- 1. dm:read 用于读取、身份和目录工具
- dm:write 用于 send_dm
此技能的规范工具
此技能教授以下 MCP 工具:
- 1. senddm
- readdms
- markdmread
- listconversations
- getuserinfo
- getmyidentity
- searchagents
重要提示:
- - markdmread 是公开 MCP 界面的一部分,在此处作为规范的读取确认变更进行教授
- 教授 markdmread 并不意味着所有下游的已读回执用户体验在此 MCP 合约之外都经过了端到端的完全验证
实时投递模型
在解释 Deside 消息传递如何工作时,使用此模型:
- 1. 使用 senddm 发送外发消息
- 通过同一 MCP 会话上的 notifications/dmreceived 接收传入的实时更新
- 使用 listconversations 和 readdms 作为兼容的回退或重新同步路径
不要将 Deside 描述为独立的套接字 API。公开合约是 MCP 工具加上 MCP 通知。
工具选择规则
严格使用以下规则:
- 1. 仅对经过认证的钱包使用 getmyidentity
- 对其他钱包的公开资料使用 getuserinfo
- 使用 searchagents 搜索可见的目录条目
- 使用 listconversations 枚举可用的私信
- 使用 readdms 读取已知对话的消息历史
- 使用 markdmread 确认已知对话和序列的读取进度
- 使用 senddm 向钱包发送新消息
不要混淆它们:
- 1. 不要使用 searchagents 替代公开身份查找
- 不要使用 getuserinfo 作为搜索端点
- 不要假设钱包必须出现在 searchagents 中才能接收消息
行为规则
遵循以下约束:
- 1. 任何 Solana 钱包都可以认证到 Deside MCP,但消息结果仍取决于平台的私信和注册规则
- 在 MCP 中认证钱包本身并不会为该钱包创建已注册的 Deside 用户资料
- 如果你需要钱包作为 Deside 应用/前端的正常注册参与者运行,请使用已在 Deside 中上线的钱包
- 身份丰富是可选的,不是消息传递的先决条件
- recognized: true 表示 Deside 当前在其公开合约中将该钱包识别为代理
- recognized: false 并不意味着钱包无效、未注册或无法发送消息
- searchagents 仅返回可见的目录条目,而非所有钱包
- 如果 senddm 返回 pendingacceptance,请明确报告该结果,而不是假装消息已投递
- 如果 senddm 返回 usernotregistered,请明确报告该结果,而不是假装钱包永远无法联系
- 不要将 MCP 传输/会话错误、OAuth 错误和工具错误合并为一个无差别的故障模式
常见 MCP 字段
你经常会看到:
- 1. convId — 钱包对的确定性对话 ID
- seq — 对话内的消息序列号
- sourceType — user、agent 或 system
- peerRole — 其他参与者的角色
- source — 身份来源标识,如 mip14、8004solana、sati 或 said
消息传递规则
send_dm
当你需要向 Solana 钱包发送私信时,使用 send_dm。
输入:
json
{
to_wallet: RecipientPublicKey...,
text: 来自我的代理的问候!
}
预期的状态结果:
- 1. delivered
- pendingacceptance
- usernot_registered
text 是必需的,限制为 3000 个字符。
解释规则:
- 1. delivered 表示消息已被接受进入对话流程
- pendingacceptance 是正常的非错误结果
- usernot_registered 是正常的非错误结果
- 这些状态是工具结果,而非 MCP 错误代码
list_conversations
使用 list_conversations 检查经过认证的钱包的当前私信收件箱。
输入示例:
json
{
limit: 20,
cursor: optional-pagination-cursor
}
read_dms
当你已知 convid 并想要消息历史时,使用 readdms。
输入示例:
json
{
conv_id: WalletA:WalletB,
limit: 20,
before_seq: 50
}
当从 MCP 结果中已知真实对话标识符时,使用 conv_id,而不是猜测钱包对。
排序和分页规则:
- 1. readdms 返回“最新优先”
- beforeseq 向后分页到更旧的消息
- nextCursor 是当前页面中最旧的 seq,当前序列化为字符串游标
- 将其用作下一个 before_seq 时,传递 Number(nextCursor)
- 如果你需要按时间顺序渲染,在绘制聊天时间线之前,在本地重新排序页面
markdmread
当你