递归语言模型服务器

RLM-MCP是一个基于递归语言模型模式的服务器,通过将提示视为外部环境对象,使LLM能够处理任意长度的上下文。

  • by adrianwedd
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 adrianwedd/rlm-mcp

使用说明

RLM-MCP:用于Claude代码的递归语言模型服务器

状态: ✅ v0.2.2-为团队环境做好生产准备

实现递归语言模型模式的模型上下文协议(MCP)服务器 张等(2025),通过将提示视为外部环境对象,使LLM能够处理任意长的上下文。

v0.2.x的新增功能:

  • v0.2.2:精确的BM25 doc_ids过滤•突出显示边界夹紧•服务器配置默认值•会话预算豁免。关闭
  • v0.2.1:原子预算执行•chunk_index持久性•截断警告•错误消息改进
  • v0.2.0版本:持久索引•并发会话安全•结构化日志记录•批量文档加载(速度提高2-3倍)

关键洞察

长提示不应直接输入神经网络,而应被视为LLM可以象征性地与之交互的环境的一部分。

特性

核心能力

  • 基于会话的文档管理 --通过批处理加载文件、目录或内联内容
  • 按需分块 --具有智能缓存的固定、基于行或基于分隔符的策略
  • BM25搜索 --延迟构建、持久缓存、服务器重启后仍能存活
  • 文物存储 --存储具有完整跨度来源的导出结果

生产特性(v0.2.0)

  • 持久索引 --通过原子写入和损坏恢复将BM25索引保存到磁盘
  • 并发会话安全 --每会话锁可防止多用户环境中的竞争情况
  • 结构化日志 --带有相关ID的JSON输出,用于生产可观察性
  • 批量文档加载 --使用内存限制信号量进行并发文件加载(速度提高2-3倍)

状态与验证

v0.2.2 生产就绪验证:

  • ✅ 103/103测试通过 (100%功能+生产功能)
  • ✅ 全部13个核心工具 使用规范命名实现
  • ✅ MCP协议集成 与真实客户确认
  • ✅ 已测试大型语料库 --加载并索引了1M+个字符
  • ✅ 性能已验证 --亚秒级搜索,从磁盘加载索引<100ms
  • ✅ 并发测试 --50个并发操作,无竞争条件
  • ✅ 内存安全 --有界信号量可防止大批量OOM
  • ✅ 生产测井 --具有相关性跟踪的JSON结构化日志

测试覆盖率

  • 错误处理:13次测试
  • 并发安全:9项测试
  • 指数持久性:10次测试
  • 集成工作流程:14项测试
  • 大型语料库性能:5次测试
  • 结构化日志记录:13次测试
  • 批量加载:7次测试
  • 来源追踪:8次测试
  • 存储层:11次测试
  • v0.2.2错误修复:13项测试

看 MIGRATION_v0.1_to_v0.2.md 获取升级指南。

安装

pip install rlm-mcp

或者具有开发依赖性:

pip install rlm-mcp[dev]

快速开始

from rlm_mcp import run_server

# Start the MCP server
run_server()

工具

所有工具都使用规范命名: rlm.<category>.<action>

类别 工具
rlm.session create, info, close
rlm.docs load, list, peek
rlm.chunk create
rlm.span get
rlm.search query
rlm.artifact store, list, get

工作流模式

  1. 初始化: rlm.session.create 带配置
  2. 负载: rlm.docs.load 文件
  3. 探测: rlm.docs.peek at结构
  4. 搜索: rlm.search.query 查找相关章节
  5. 块: rlm.chunk.create 有适当的策略
  6. 过程: rlm.span.get +客户端子呼叫
  7. 商店: rlm.artifact.store 结果与来源
  8. 关闭: rlm.session.close

配置

配置文件: ~/.rlm-mcp/config.yaml

# Data storage
data_dir: ~/.rlm-mcp

# Session limits (per-session overridable)
default_max_tool_calls: 500
default_max_chars_per_response: 50000
default_max_chars_per_peek: 10000

# Batch loading (v0.2.0)
max_concurrent_loads: 20   # Max concurrent file loads (memory safety)
max_file_size_mb: 100      # Reject files larger than this

# Logging (v0.2.0)
log_level: "INFO"              # DEBUG, INFO, WARNING, ERROR
structured_logging: true       # JSON format (true) vs human-readable (false)
log_file: null                 # Optional: "/var/log/rlm-mcp.log"

# Tool naming: strict by default (fails if SDK doesn't support canonical names)
# Only set to true for experimentation with older MCP SDKs
allow_noncanonical_tool_names: false

工具命名(严格模式与兼容模式)

默认情况下,RLM-MCP需要一个支持显式工具命名的MCP SDK(例如FastMCP)。这确保了工具在以下情况下可被发现 rlm.session.create,不 rlm_session_create.

  • 严格模式(默认):如果SDK不支持,服务器将无法启动 tool(name=...)
  • Compat模式:返回带有警告的函数名。仅用于实验。
# ~/.rlm-mcp/config.yaml
allow_noncanonical_tool_names: true  # Enable compat mode (not recommended)

日志记录(v0.2.0)

RLM-MCP生成结构化JSON日志以实现生产可观察性。每个操作都会获得一个唯一的关联ID,用于跟踪相关事件。

JSON日志格式

{
  "timestamp": "2026-01-15T10:30:45.123456Z",
  "level": "INFO",
  "logger": "rlm_mcp.server",
  "message": "Completed rlm.session.create",
  "correlation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "session_id": "session-123",
  "operation": "rlm.session.create",
  "duration_ms": 42,
  "success": true
}

筛选日志

# Filter by session
cat /var/log/rlm-mcp.log | jq 'select(.session_id == "session-123")'

# Filter by operation
cat /var/log/rlm-mcp.log | jq 'select(.operation == "rlm.search.query")'

# Track operation with correlation ID
cat /var/log/rlm-mcp.log | jq 'select(.correlation_id == "a1b2c3d4...")'

# Only errors
cat /var/log/rlm-mcp.log | jq 'select(.level == "ERROR")'

看 docs/LOGGING.md 查看详细的日志记录指南。

会话配置

{
    "max_tool_calls": 500,           # Budget enforcement
    "max_chars_per_response": 50000, # DOS protection
    "max_chars_per_peek": 10000,     # DOS protection
    "chunk_cache_enabled": True,
    "model_hints": {                 # Advisory for client
        "root_model": "claude-opus-4-5-20251101",
        "subcall_model": "claude-sonnet-4-5-20250929",
        "bulk_model": "claude-haiku-4-5-20251001"
    }
}

建筑

┌─────────────────────────────────────────┐
│  Claude Skills (policy layer)           │
├─────────────────────────────────────────┤
│  MCP Server (RLM Runtime)               │
│  • Session management + concurrency     │
│  • Document/span operations             │
│  • BM25 search (lazy, persisted)        │
│  • Batch loading with semaphores        │
│  • Response size caps                   │
├─────────────────────────────────────────┤
│  Local Persistence (v0.2.0)             │
│  • SQLite: sessions, docs, spans        │
│  • Blob store: content-addressed        │
│  • Index cache: persistent BM25         │
│  • Structured logs: JSON + correlation  │
└─────────────────────────────────────────┘

设计原则

  1. 本地优先 --所有读/写操作都会影响本地存储
  2. 客户端管理的子呼叫 --MCP是“世界”,客户拨打LLM电话
  3. 不可变文档 --内容已解决,从未修改
  4. 按需分块 --查询时阻塞,缓存结果
  5. DoS保护 --响应大小的硬上限

发展

# Clone and install with uv (recommended)
git clone https://github.com/yourorg/rlm-mcp.git
cd rlm-mcp
uv sync --extra dev

# Run tests
uv run pytest

# Or with pip (editable install required for tests)
pip install -e ".[dev]"
pytest

# Type checking
uv run mypy src/

# Linting
uv run ruff check src/

MCP检查员烟雾测试

要从真实客户端验证工具发现和模式:

# Start server
uv run rlm-mcp

# In another terminal, use MCP Inspector
npx @anthropic/mcp-inspector

验证:

  • 工具名称显示为 rlm.session.create,不 rlm_session_create
  • 模式与预期的输入/输出结构匹配
  • truncated 和 index_built 字段出现在响应中

许可证

麻省理工学院

参考文献

  • 张,A.L.,克拉斯卡,T.,&Khattab,O.(2025)。 递归语言模型.arXiv:2512.24601