基于MCP实现朋友间AI共享上下文:轻量部署与实战指南
"朋友之间共享上下文",这可能是目前 MCP 生态里一个非常轻巧但又不失想象力的玩法。这次我们来看一个发布在 Show HN 上的项目:Share context between friends via MCP。它没有做复杂的知识库、没有搞高深的多智能体编排,核心就一件事——让多个朋友、多台电脑、多个 MCP 客户端能共享同一份 AI 会话上下文。如果你平时在 Claude Desktop、Dify、Cherry Studio 或者 Cursor 这类 MCP 客户端里折腾提示词和会话记忆,这个项目值得花十分钟研究一下。
先说它的核心特点:基于 MCP(Model Context Protocol)实现、采用 Server/Client 架构、多个好友可接入同一个共享上下文服务、可以通过 JSON-RPC 方式读写上下文片段、部署形态很轻(本地起一个服务即可)。相比传统"把上下文写在记忆文件里手动复制"的做法,这个项目把上下文变成了一个可订阅、可同步的服务端资源,这在多人协作、小团队共享提示词、或者个人多设备之间同步会话状态时非常实用。
这篇文章我会按 CSDN 技术博客的习惯,拆开讲清楚:这个项目适合谁、怎么理解它的共享上下文机制、本地部署需要准备什么、如何接入不同 MCP 客户端、怎么测试读写效果、以及有哪些值得注意的坑。通篇不搞云里雾里的概念,直接说能不能用、怎么用。
1. MCP 共享上下文项目核心能力速览
在动手之前,先给一个可快速判断的规格表。因为项目本身在持续迭代,且不是重量级平台,这里的参数更多是基于项目定位和常见 MCP 实现方式的推断,具体以官方仓库最新 README 为准。
| 能力项 | 说明 |
|---|---|
| 项目类型 | MCP Server,提供共享上下文读写能力 |
| 核心功能 | 多客户端共享、读取、写入、订阅上下文片段 |
| 通讯协议 | MCP(Model Context Protocol),基于 JSON-RPC 2.0 |
| 部署形态 | 本地服务进程,可暴露给局域网内好友 |
| 推荐运行环境 | 一台常开的电脑、NAS、或云服务器均可 |
| 客户端兼容性 | Claude Desktop、Dify、Cherry Studio、Cursor 等支持自定义 MCP 的客户端 |
| 是否支持 API | 是,MCP 工具调用本质上就是接口调用 |
| 是否支持批量任务 | 取决于上下文服务设计,通常可按标识批量读写 |
| 是否支持多人 | 是,这是项目核心定位 |
| 显存需求 | 无,纯 CPU 服务 |
| 磁盘需求 | 很小,主要是代码和上下文存储文件 |
| 上手难度 | 低,适合有基础 Node.js 或 Python 经验的开发者 |
从项目标题可以看出,这个项目的亮点不是"上下文管理",而是"通过 MCP 在朋友之间共享"。换句话说,它把 MCP 当成了人与人之间交换 AI 上下文的通道。你分享的不只是一个文件,而是一个随时可以变更、订阅、同步的上下文服务。
2. 这个项目解决什么问题:朋友间上下文共享
很多人在实际使用 AI 助手时都会遇到一个尴尬情况:自己攒了一套很好用的系统提示词,或者一整段调试了很久的 few-shot 示例,想发给朋友一起用,结果只能通过聊天窗口复制粘贴,粘过去后还要手动改格式。如果是两个人维护同一个提示词版本,那就更痛苦,改来改去最后根本分不清哪个是新的。
这个项目把"上下文"抽象成了 MCP 服务端的一个资源。你可以往服务端写入一段上下文(比如"我常用的前端代码审查规则"),给一个标识,然后朋友通过 MCP 客户端就能实时读取。你在服务端更新这段上下文,朋友那边再调用时拿到的就是最新版。这种模式对于:
- 小型开发团队共享代码评审规范
- 朋友之间共用一套提示词模板
- 个人在办公室和家里的电脑之间同步 AI 助手状态
- 教学场景中老师给学生分发统一的提问上下文
都有很直接的价值。
需要注意边界。共享上下文不等于"共享一切"。任何涉及密钥、密码、个人隐私、未授权数据的内容,都不应该放进共享上下文。MCP 本身只是协议通道,不会帮你做鉴权和审计,权限控制基本靠部署方自己实现。所以这个项目更适合"熟人小圈子 + 可控网络环境"的场景,而不是直接丢到公网上使用。如果要在公网部署,必须加反向代理、TLS 和身份认证,否则相当于把上下文数据裸奔在互联网上。
3. MCP 共享上下文部署环境准备
部署这个项目,本身不需要 GPU,也不需要单独的显卡环境,核心是有一台能运行 Node.js 或 Python 的机器。下面是通用的环境检查清单,适合大多数 MCP Server 项目。
3.1 操作系统
Windows、macOS、Linux 都可以。考虑到"朋友之间共享"这个场景,更稳妥的做法是部署在一台能长期开机的设备上,比如:
- 家里的 NAS
- 一台云服务器
- 或者一台放在办公室的迷你主机
如果你只是想本地本机测试,那笔记本上直接跑也行。
3.2 运行时环境
具体运行时取决于项目实现。如果仓库是 Node.js 写的,就装 Node.js 16 或更高版本;如果是 Python 写的,就需要 Python 3.9 以上,并配合 uv 或 pip 管理依赖。
建议先确认仓库根目录下的package.json或pyproject.toml,再决定安装哪个运行时。
# 如果项目是基于 Node.js node -v npm -v # 如果项目是基于 Python python --version3.3 MCP 客户端
要体验共享上下文的完整流程,至少准备一个支持自定义 MCP Server 的客户端。常见选择:
- Claude Desktop:在
claude_desktop_config.json中配置 MCP - Dify:在设置里添加自定义 MCP 服务
- Cherry Studio:支持本地 MCP server 添加
- Cursor:可通过 MCP 配置接入
- 其他支持 MCP 的 IDE 或客户端
3.4 网络与端口
本地测试可以直接用127.0.0.1。要和朋友共享,则需要这台机器在局域网内可访问,或者通过内网穿透、云服务器公网地址访问。端口建议选择一个不容易冲突的高位端口,比如 8000 到 9999 之间的常用端口。启动前先检查端口是否被占用。
# Linux/macOS 下查看端口占用 lsof -i :8000 # Windows PowerShell 下查看端口占用 netstat -ano | findstr :80003.5 存储空间
如果只是共享文本型上下文,磁盘需求非常小,几十 MB 的存储空间和代码量就够了。但如果未来要共享大段文档、图片或音视频上下文,需要考虑存储目录的容量规划。
4. 安装部署与启动方式
由于项目形态是一个标准的 MCP Server,部署方式通常遵循"克隆代码 -> 安装依赖 -> 配置环境变量 -> 启动服务 -> 在客户端添加 MCP 配置"这条链路。下面以通用的 Node.js 版本为例演示,具体命令需要按实际仓库调整。
4.1 克隆项目
git clone <项目仓库地址> cd <项目目录>4.2 安装依赖
npm install如果项目使用了pnpm或yarn,对应改为:
pnpm install # 或 yarn install4.3 配置环境变量
多数 MCP Server 支持通过环境变量或配置文件指定监听地址、端口和存储目录。一个通用的配置示例:
# 监听本机所有网卡,方便局域网内好友访问 export HOST=0.0.0.0 export PORT=8900 # 上下文存储目录 export CONTEXT_DIR=./data如果是 Windows PowerShell,则这样设置:
$env:HOST="0.0.0.0" $env:PORT="8900" $env:CONTEXT_DIR="./data"4.4 启动服务
npm start启动后,控制台通常会出现类似MCP server listening on http://0.0.0.0:8900的日志。表示服务已经在运行,下一步就是接入 MCP 客户端。
4.5 在 MCP 客户端中添加服务
以 Claude Desktop 为例,配置文件位置一般在:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
配置文件里增加一个mcpServers条目:
{ "mcpServers": { "friend-context": { "command": "npx", "args": [ "<项目目录>/dist/index.js", "--port", "8900" ], "env": { "HOST": "127.0.0.1", "PORT": "8900" } } } }在 Dify 这类平台型工具中,通常是填一个 MCP endpoint 地址。如果项目支持 HTTP/SSE 传输,那么地址可能是:
http://127.0.0.1:8900 # 或 http://127.0.0.1:8900/sse具体路径要看项目实现。
5. 功能测试与效果验证
服务启动、客户端配置完成后,不要急着写入大量内容。建议先按下面的流程做最小功能验证。
5.1 测试 MCP 客户端能否发现服务
在客户端里查看 MCP 工具列表,如果配置成功,应该能看到这个 Server 提供的工具。常见的工具命名可能包括:
context_list:列出所有共享上下文标识context_get:读取指定标识的上下文内容context_set:写入或更新上下文内容context_delete:删除指定上下文context_subscribe:订阅上下文变更(如果项目支持)
如果在客户端里看不到任何工具,优先检查:
- 服务进程是否存活
- 日志里有没有报错
- 启动时的工作目录是否正确
- 配置里路径是否写错
5.2 写入一段共享上下文
在客户端中调用context_set,输入一个标识和内容。例如:
{ "key": "frontend-review-rules", "content": "请按照 Vite + React + TypeScript 项目的代码规范审查以下代码,重点关注类型定义、组件拆分布局、样式方案一致性。不要输出与代码审查无关的建议。" }预期结果是返回写入成功,并且该标识出现在context_list结果中。
5.3 从另一个客户端读取上下文
让朋友在另一台电脑上用同一个 MCP endpoint 调用context_get,传入相同的 key:
{ "key": "frontend-review-rules" }如果返回和你写入时一致的内容,说明共享链路是通的。这一步是整个项目最核心的验证点,因为它证明了"上下文不是本地文件,而是服务端共享资源"。
5.4 测试覆盖更新
再次调用context_set写入相同 key 但不同的内容,随后重新context_get,确认返回的是最新内容。这个测试可以验证上下文版本是否会被正确覆盖更新,避免出现新旧内容混用的场景。
5.5 测试非法输入和权限
尝试读取一个不存在的 key,观察返回的错误信息是否友好;尝试写入超大内容,观察是否有大小限制和报错。很多 MCP Server 在初期不会对输入做严格限制,但作为使用者,你应该在测试阶段摸清楚边界。
6. 接口调用与多客户端协作
MCP 协议本身就是一种接口规范,所以这个项目天然具备"接口能力"。它的底层通讯是 JSON-RPC 2.0,常用的方法包括initialize、tools/list和tools/call。如果你不想在图形客户端里点来点去,可以直接用 curl 或 Python 脚本调用。
下面给一个通用的 JSON-RPC 调用示例。注意:不同项目的 MCP transport 可能有差异,有的是标准 stdio,有的是 SSE 或 streamable HTTP,你需要根据实际项目调整 endpoint。
# 初始化 MCP 会话 curl -X POST http://127.0.0.1:8900 \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": { "name": "curl-test", "version": "0.1.0" } } }'调用工具:
curl -X POST http://127.0.0.1:8900 \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "context_get", "arguments": { "key": "frontend-review-rules" } } }'用 Python 调用也类似:
import requests url = "http://127.0.0.1:8900" payload = { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "context_set", "arguments": { "key": "daily-standup-template", "content": "今天是 {date},请生成一段 3 人小团队的每日站会摘要模板,包含:已完成事项、今日计划、风险阻塞。" } } } response = requests.post(url, json=payload, timeout=10) print(response.json())当你通过脚本方式调用成功后,就可以把共享上下文服务接到自己的自动化工作流中。比如写一个定时脚本,每天自动更新某个 key 的上下文内容,让群里所有朋友的 AI 助手都能拿到最新的模板。
如果是多人同时写入同一个 key,需要注意并发冲突。比较简单的设计是"最后写入覆盖",但更稳妥的做法是给每个需要协调的上下文加一个单独的唯一 key,或者把写入日志记录到本地,方便回溯。
7. 资源占用与性能观察
这类轻量级 MCP Server 的资源占用非常低,但依然可以从几个角度观察运行状态。
7.1 内存和 CPU
Node.js 或 Python 写的轻量服务,长期运行的内存占用通常在几十 MB 到两三百 MB 之间。如果出现内存持续上涨,优先怀疑是否是上下文存储文件被反复加载进内存,或者存在未关闭的连接。
观察方式:
# Linux/macOS top -p $(pgrep -f "node.*index.js") # 或 ps aux | grep "node.*index.js"7.2 网络连接
如果有很多朋友同时接入,可以观察连接数和服务端日志。MCP 是长连接场景,连接数会随着客户端数量线性增加。如果接入方太多,可以在服务端做连接数限制。
# 查看监听端口的连接状态 lsof -i :89007.3 并发读写性能
对于纯文本上下文的读写,并发能力通常不是瓶颈。但如果存入了一整份很长的文档,每次读取都要把完整内容返回给所有客户端,网络开销会明显增加。建议不要让单个 key 的上下文体积过大。之前有朋友在 MCP 使用中遇到过"上下文过大,已进行多次自动总结但上下文大小仍超出限制"的问题,这种提示在共享上下文项目里同样可能出现,避免办法是:把超长内容拆分成多个 key,按业务场景分开读取。
7.4 降低负载的思路
- 只保留必要的 key,定期清理过期上下文
- 使用 gzip 压缩响应体
- 在服务端做简单的限流,避免单客户端频繁打爆服务
- 对写入内容做大小限制,超大文本直接拒绝
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 客户端配置后看不到 MCP 工具 | 服务未成功启动、路径配置错误、command 参数不对 | 查看服务端控制台日志,用npx直接启动验证 | 确认command和args路径正确,重启客户端 |
| 局域网内好友无法访问 | 服务只监听了127.0.0.1,或防火墙拦截端口 | 检查启动日志中的监听地址,用curl http://本机局域网IP:端口测试 | 将HOST改为0.0.0.0,开放防火墙端口 |
| 读取到的上下文是旧版本 | 多客户端本地缓存了服务列表,未重新拉取 | 检查最近一次context_set的返回状态 | 重新调用context_get或让客户端重新连接 |
| 写入中文内容出现乱码 | 客户端字符编码不一致 | 检查返回 JSON 值的字符编码 | 统一使用 UTF-8,避免在 Windows 终端用 GBK 写文件 |
| 上下文过大导致请求超时 | 单个 key 中存入了过长内容 | 检查存储目录中文件大小 | 拆分 key,控制单条上下文长度 |
| Dify 添加本地 MCP 服务失败 | endpoint 类型不匹配(SSE / streamable HTTP) | 查看 Dify 日志和 server 端请求日志 | 根据项目支持的 transport 类型填对应 endpoint |
| 端口被占用 | 之前启动的服务没有退出 | 使用netstat或lsof查看占用进程 | 结束旧进程或换一个端口启动 |
| 多人同时写入数据丢失 | 并发覆盖且无锁机制 | 查看服务端是否有冲突日志 | 给不同写入方分配独立 key 前缀,或自行实现锁 |
9. 最佳实践与合规使用建议
9.1 上下文命名规范
建议给共享上下文的 key 加前缀,比如friend-a/review-rules、group/dev/commit-rules。这样即使你们是好几个人共用同一个服务端,也不会出现互相覆盖的问题。好的命名规范,是这个项目能否长期用下去的关键。
9.2 私密信息隔离
共享上下文的本质是"别人也能读"。所以绝对不要往里面写:数据库连接串、API Token、密码、身份证号、未公开的商业信息。假如真的需要共享这类数据,也要通过独立的安全通道,并在上下文里填写引用占位符而不是明文。
9.3 控制公开范围
MCP Server 如果部署在公网,必须加一层认证和 TLS 加密。不要图省事直接暴露 MCP 端口。一个比较稳妥的组合是:
- 只监听
127.0.0.1,通过 Nginx/Caddy 反向代理对外暴露 - 反向代理层加 Basic Auth 或其他身份认证
- 开启 HTTPS
9.4 定期备份与清理
上下文内容虽然体积不大,但很多朋友会把精心编写的提示词放在里面。建议把存储目录纳入备份体系,定期复制到本地移动硬盘或对象存储。同时清理那些已经不再使用的 key,避免服务端列表越来越乱。
9.5 合规使用提醒
MCP 共享上下文是一种技术手段,方便了协作,但也可能被用来传播不适宜内容。使用时应确保共享内容合法合规,不涉及侵权材料、不传播垃圾信息、不用于任何违反平台规则的行为。如果上下文里包含他人的作品、提示词、图标、代码片段,请先确认有授权再共享。
10. 总结与下一步
"Show HN: Share context between friends via MCP"这个项目最值得尝试的点,是把 MCP 从"AI 与工具之间的通道"延伸成"人与人之间共享 AI 上下文的通道"。它不需要 GPU、不需要复杂的数据管线,一台小机器、一个 MCP 客户端,就能让几个朋友维护同一套上下文模板。从工程角度看,它更像一个思路示范,而不是一个巨大的平台项目。
建议你上手后先做三件事:第一,用context_set写入一个常用提示词;第二,换一个客户端或设备去context_get读取;第三,多人同时写入不同 key,验证命名隔离是否有效。最容易踩的坑基本集中在端口监听地址不对、客户端缓存、上下文过大导致超时这几个方面。
后续可以继续扩展的方向也不少:给共享上下文加版本历史、增加基于 MCP 的订阅通知、做一个简单的 Web 管理面板、把存储从 JSON 文件换成 SQLite 或 Redis,这些改造都不会太难。对于想深入理解 MCP 协议的开发者来说,这个项目也是一个很适合拿来拆解的轻量样本。
