范围说明。 Cryptohopper MCP 的设计是无状态的——每次工具调用都是独立的,服务器在请求之间不持久化任何内容。内存存在于客户端或您控制的存储中。本指南关注的就是这一层。
前提条件
一个已连接到 Cryptohopper MCP 的 MCP 客户端。请参阅 设置概览。
一个用于存储数据的地方。可以是本地文件、SQLite 数据库、云存储的 JSON Blob,或者像 Notion 这样的工具。开始时无需任何基础设施。
“内存”包含什么
三个层面,各有其用处:
层面 | 示例 | 典型位置 |
会话内存 | 在一次对话中,模型会回忆你之前说过的话 | 模型的上下文窗口(内置) |
跨运行内存 | 今天的代理运行会回忆起上周运行所观察到的内容 | 文件、数据库、Notion 等 |
用户画像 | 代理知道你的观察列表、偏好的交易所、风险偏好 | 与跨运行内存相同;在会话开始时加载 |
会话内存是免费且自动的。跨运行内存和用户画像内存需要您设置存储。
设置 — 用户画像
写一个简短的 markdown 文件,描述你自己作为一个加密用户。保持在一页以内:
关于用户
主要在 Binance 交易。
观察列表:BTC、ETH、SOL、AVAX、ARB、OP、LINK、AAVE、UNI。
持有现货;通过 Cryptohopper 在 SOL 和 AVAX 上运行网格机器人。
比错过上涨更关心回撤风险。
不交易永续合约。
默认设置
交易所: Binance
报价: USDT
技术分析时间周期: 4h (200 根 K 线)
风险承受能力:moderate
提示偏好
偏好具体数字而非形容词。
将投机行为标记为投机。
如果代币模糊不清,请询问而非猜测。在每次代理对话开始时加载它。两种方法:
手动粘贴:在每次会话中,首先粘贴文件。
客户端集成:使用你的客户端的持久化内存功能(Claude 桌面 Projects、Cursor 规则、Zed context)进行自动注入。
保持文件小。任何超过~300 行的内容都会变成模型会忽略的噪音。关键在于约束条件,而不是自传。
版本化。当你更改观察列表或偏好时,将更改提交到 git(或 Notion 历史记录)。你的代理的行为将随着用户画像的变化而变化;你会想知道原因。
设置 — 跨运行内存(简单)
最简单的跨运行内存是一个 markdown 文件,代理在开始时读取并在结束时追加内容:
创建 memory.md 文件,其中包含一个骨架:
代理内存 最近观察(每次运行后在此处追加条目。) 待办事项(代理为未来关注而标记的事项。) 过去的决定(重要的决定及其原因。)
在每次代理运行开始时,注入文件内容:
[代理内存] {memory.md 文件内容} [任务] 今日任务:运行每日摘要。在每次运行结束时,追加新的观察。要求代理显式生成它们:
完成任务后,写 2-4 行总结任何值得记住的事情。使用此格式: [YYYY-MM-DD] {观察} 示例:[2026-05-27] SOL 交易量连续 3 天偏高;在 83-87 左右的范围内波动。[2026-05-27] 观察列表:标记 LINK 为平静,但值得在 7 天后检查。 我将手动将这些追加到 memory.md。定期审阅和修剪。大约每周一次,修剪
memory.md文件——删除过时的条目,合并模式。一个未管理的内存文件会无限增长并变得混乱。
设置 — 跨运行内存(结构化)
对于需要可查询历史的代理,一个小的 SQLite 数据库效果很好。模式建议:
sql
CREATE TABLE observations (
id INTEGER PRIMARY KEY,
run_at TEXT NOT NULL, -- ISO-8601
agent_name TEXT NOT NULL, -- 例如,“daily-digest”
category TEXT, -- 例如,“volume-spike”,“trend-change”
token TEXT, -- 例如,“SOL”
content TEXT NOT NULL, -- 观察文本
metadata JSON -- 任何结构化字段
);
CREATE INDEX idx_run_at ON observations(run_at);
CREATE INDEX idx_agent_token ON observations(agent_name, token);
这允许你提出类似“我们在过去 14 天里对 SOL 做了哪些观察?”这样的查询——并将答案作为今天运行的上下文提供给代理。
代理通过一个小 Python 助手写入此表:
python
def log_observation(agent_name: str, category: str,
token: str, content: str) -> None:
conn.execute(
"INSERT INTO observations (run_at, agent_name, category, token, content) "
"VALUES (?, ?, ?, ?, ?)",
(datetime.utcnow().isoformat(), agent_name, category, token, content),
)
conn.commit()
谨慎使用。只有当你真的会查询结构化内存时,它才值得设置;对于一个简单的摘要,markdown 文件通常足够了。
什么该记住,什么不该记住
好的内存候选:
“SOL 在 83-87 的范围内横盘整理了 5 天”——这是一个单日 K 线无法显示的范围上下文,会在明天的运行中丢失。
“我们昨天标记 LINK 存在交易量异常,今天进行跟进。”
“用户在 2026-05-20 询问了 AVAX 的网格机器人;参数是 X、Y、Z。”
不好的内存候选:
原始市场数据。它会变化——从 MCP 重新获取,而不是依赖过时的缓存。
完整的对话记录。信噪比太低。
每次运行的自动摘要。如果没有经过策划,这些会变得几乎无用。
一个好的测试:“如果我删除这个内存条目,代理下周的表现会变差吗?”如果不会,就删除它。
故障排除
代理引用了与当前数据矛盾的内存。
这是缓存上下文的基本风险。代理“记得”SOL 正在上涨,但现在已经反转。修复:指示代理始终在将内存中的说法作为事实使用之前,先用当前 MCP 数据进行验证。“在依赖内存条目之前,检查当前数据,如果内存已过期则进行标记。”
内存文件变得过大。
你一直在追加而没有修剪。制定一个硬性规则:每周一次,审阅上周的条目并删除/合并。或者每月轮换内存文件(memory-2026-04.md、memory-2026-05.md)。
代理忽略了内存块。
提示不要求代理使用它。要明确:“在回答之前,请审阅上面的内存块。在相关的地方引用具体的条目。如果某项条目与新数据相矛盾,请明确标记。”
内存导致了信心十足但错误的答案。
代理将内存视为权威。将内存视为提示,而非事实:“内存包含过去的观察;将其视为上下文,而非事实。务必与当前数据进行验证。”
你想让代理在没有你的干预下更新内存。
有风险的可能性——未经监控的只追加内存会像好条目一样快速积累坏条目。如果你自动化它,务必同时进行每周审阅步骤。绝不要让内存一个月不被阅读就增长。
多代理内存混淆。
如果多个代理共享一个内存文件,请使用 agent_name 字段为条目添加命名空间。每个代理只读取自己的条目,或者读取整个文件但知道是哪个代理写入了哪一行。
用户画像文件过时。 偏好会改变。如果你注意到代理正在默认使用你不再使用的某个时间周期或交易所,请更新用户画像——不要通过每次提示的覆盖来规避它。
