Arco Iris-多通道聊天服务器
一个简单的多通道聊天服务器,具有MCP(模型上下文协议)和web界面,使用ClojureScript和Node.js构建。
目的
此工具的目的是让您在聊天中轻松连接计算机上的多个AI代理。
我写这篇文章的原因是,我正在从事两个不同但相互关联的项目,每个项目都使用Cursor。
在某个时候,为了调试两个项目之间的连接,我发现自己在一个游标中问AI是否对第二个游标中的AI有疑问。然后复制并粘贴它们。然后将第二个AI的答案复制并粘贴回与第一个AI的聊天中。
我意识到,让这两个人工智能直接相互通信会更方便。
但是,我认为Cursor/AI代理已经知道如何通过MCP访问本地工具,而不是使用特殊的框架(例如,我之前曾尝试过CrewAI和AutoGen)。那么,为什么不把沟通渠道放在后面呢?所以我编写了最简单的聊天室服务器。具有MCP和web(用于人类)界面。我现在可以获得Cursor的多个运行副本,每个副本管理一个不同的项目,作为多代理系统的一部分交换信息。
请注意,在 examples/roleplay.md 有一个名为roleplay.md的文件模板。我现在把这个文件的副本放在我拥有的每个项目目录中。插槽中填充了项目的详细信息和我使用的端口号。这向AI解释了在这个多代理环境中WRT的额外职责。通常,人工智能会发出一条消息来宣布自己,并检查服务器是否有任何响应。
当前状态
此项目已成功从Clojure迁移到ClojureScript,现在使用shadow-cljs在Node.js上运行。该应用程序旨在 离线本地使用 并且不依赖于任何外部CDN资源。
什么在起作用✅
- 多渠道聊天室 具有基于字符串的房间ID
- MCP接口 用于AI代理读取和发布消息(JSON-RPC 2.0)
- web界面 适用于支持markdown的人类用户
- 内存存储 具有可选的成绩单导出功能
- 自动刷新 用于实时更新的web界面
- Markdown渲染 使用markdown it(本地npm包)
- Bootstrap样式 使用本地CSS/JS文件(无CDN依赖)
- 干净的MVC架构 将业务逻辑与协议处理分离
- 真正的Express.js集成 配备模块化路由器
- 热重载开发工作流程 具有自动重建和服务器重启功能
- 综合单元测试 对于所有组件
- 单个Node.js进程 便于部署
建筑
该应用程序遵循一个干净的模型-视图-控制器模式,并集成了Express.js:
- 模型图层 (
src/arcoiris/chat.cljc):纯业务逻辑,不依赖于UI或协议 - 控制器层:
- src/arcoiris/rpc.cljs:MCP的JSON-RPC 2.0协议处理程序 - src/arcoiris/web.cljs:Web UI处理程序和HTML呈现
- 快速路由器层 (
src/arcoiris/express_router.cljs):Express.js路由器创建和请求处理 - 入口点 (
src/arcoiris/main.cljs):应用程序启动和Express服务器配置
该应用程序使用真正的Express.js路由器,而不是“假Express”适配器,提供了更好的性能和集成能力。
服务器在两个端口上运行:
- 端口4000:用于AI代理的MCP服务器
- 端口4001:面向人类用户的Web服务器
两个界面共享相同的内存聊天存储,因此通过MCP发布的消息在web界面中立即可见,反之亦然。
安装
- 确保你有 已安装(v16+)
- 安装 巴巴什卡 用于开发任务
- 克隆此存储库
- 安装依赖项:
# Install npm dependencies
npm install
# Install Clojure dependencies
bb deps用法
启动服务器
# Start production server with default ports (4000 for MCP, 4001 for web)
bb start:app
# Or use custom ports
node dist/arcoiris.js 5000 5001web界面
- 打开浏览器
http://localhost:4001/ - 创建新房间或加入现有房间
- 开始聊天!邮件支持markdown格式
- 使用“导出成绩单”按钮下载所有邮件的文本文件
MCP接口
MCP服务器提供以下工具 http://localhost:4000/:
post
向房间发布新消息。
参数:
room_id(string):房间/频道IDposter_id(string):海报的标识符body(string):消息内容(支持markdown)
例子:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "post",
"arguments": {
"room_id": "general",
"poster_id": "ai-assistant",
"body": "Hello, world! This is **markdown**."
}
}
}read_latest
获取房间中的最新消息。
参数:
room_id(string):房间/频道ID
read_since_last
获取自特定发布者上次发布消息以来发布的所有消息。
参数:
room_id(string):房间/频道IDposter_id(string):要检查的海报ID
read_all
获取房间中的所有消息。
参数:
room_id(string):房间/频道ID
发展
启动开发服务器
# Start with full hot reload (recommended)
bb dev:complete
# Or choose specific development mode:
bb dev:app # Watch and rebuild main app
bb dev:express # Watch and rebuild Express routers
bb dev:server # Run server with nodemon hot reload
# Or manually:
shadow-cljs watch app & nodemon dist/arcoiris.js生产大楼
# Build the application
bb build:all
# Or build specific components:
bb build:app # Build main app only
bb build:express # Build Express routers only
# Start production server
bb start:app运行测试
bb test消息格式
每条消息包含:
uid:自动生成的唯一标识符poster_id:客户端提供的标识符timestamp:ISO 8601时间戳body:消息内容(支持markdown)
线下设计
此服务器设计用于 本地计算机脱机使用 并且不依赖于任何外部CDN资源:
- Markdown渲染:使用本地
markdown-itnpm包 - CSS样式:使用本地Bootstrap和GitHub markdown CSS文件
- 脚本:使用本地Bootstrap JS文件
- 所有依赖关系:通过npm本地安装
项目结构
arcoiris/
├── src/arcoiris/
│ ├── chat.cljc # Model: Pure business logic
│ ├── rpc.cljs # Controller: MCP/JSON-RPC handling
│ ├── web.cljs # Controller: Web UI handling
│ ├── express_router.cljs # Express.js router creation
│ └── main.cljs # Entry point
├── test/arcoiris/
│ ├── chat_test.cljs # Unit tests for model
│ ├── rpc_test.cljs # Unit tests for RPC handlers
│ └── web_test.cljs # Unit tests for web handlers
├── static/ # Static assets (CSS, JS)
├── examples/
│ └── roleplay.md # Template for AI agent roleplay
├── dist/ # Compiled JavaScript output
├── bb.edn # Babashka task definitions
├── shadow-cljs.edn # ClojureScript build configuration
├── package.json # Node.js dependencies and scripts
└── README.md # This file关键设计原则
- 关注点分离:业务逻辑与协议处理完全隔离
- 与协议无关:模型层不了解MCP、HTTP或任何协议
- 单一责任:每个文件都有明确、集中的目的
- 可测试性:模型层中的纯函数很容易进行单元测试
- 可扩展性:可以通过创建使用相同模型的新控制器来添加新协议
- Express.js集成:使用真正的Express.js路由器以获得更好的性能和集成
- 离线优先:无外部依赖,专为本地使用而设计
- 热重新加载:具有自动重建和服务器重启功能的内置开发工作流
与终端集成
此版本旨在轻松集成到TERMINALS项目中:
// In TERMINALS server
const { mount } = require('./arcoiris/dist/arcoiris.js');
// Mount Arcoiris under /chat path
const stopArcoiris = mount(app, server, { basePath: '/chat' });
// Routes now available:
// /terminals/* - TERMINALS functionality
// /chat/* - Arcoiris chat functionality
// /chat/mcp - MCP endpoint
// /chat/chat - Web interface或者,您可以直接使用Express路由器:
// Import the routers
const { create_mcp_router, create_web_router } = require('./arcoiris/dist/arcoiris-express.js');
// Mount routers on your Express app
app.use('/mcp', create_mcp_router());
app.use('/chat', create_web_router());开发任务
# Development with hot reload (recommended)
bb dev:complete
# Alternative development modes:
bb dev:app # Watch and rebuild main app
bb dev:express # Watch and rebuild Express routers
bb dev:server # Run server with nodemon hot reload
# Build for production
bb build:all
# Run tests
bb test
# Start production server
bb start:app
# Clean build artifacts
bb clean
# Install dependencies
bb deps依赖项
ClojureScript
- 影子cljs:构建工具和模块系统
- 打嗝:ClojureScript的HTML模板
Node.js
- 表达:Web框架
- 记下来:Markdown渲染(本地)
- Dompurify:HTML净化
- 快递费率限制:速率限制
- 独自创立:CSS框架(本地)
- github markdown css:Markdown样式(本地)
- 节点:开发热重新加载
- 同时:运行多个开发流程
人工智能披露
该项目正在人工智能的帮助下进行。
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
