深度分析 MCP 和 LSP 如何标准化 agent 与外部系统连接,为何 Rust 成为基础设施首选语言,涉及安全、协议、性能。
最初发布于 tamiz.pro。
AI 辅助开发的格局正在发生结构性转变。我们正从孤立的、基于提示词的交互转向互联的、协议驱动的生态系统。这一转变的核心是两个关键标准:Anthropic 的模型上下文协议(Model Context Protocol,MCP),它标准化了 AI 模型如何连接外部数据;以及长期以来标准化开发者如何与代码智能交互的语言服务器协议(Language Server Protocol,LSP)。
同时,为这些交互提供动力的基础设施层越来越多地由 Rust 主导。为什么?因为当 AI Agent 获得对文件系统、API 和数据库连接的访问权限时,传输层的安全性和性能要求变得不可商量。本文深入探讨这些技术的融合,审视 MCP 和 LSP 如何演进以支持安全、感知上下文的 AI Agent,以及为什么 Rust 正在成为构建使这一切可能的基础设施的事实标准语言。
从历史来看,将 AI 集成到软件工程工作流中是一个脆弱的过程。开发者编写脚本来调用 OpenAI 或 Anthropic API,解析 JSON 响应,然后将其注入到 IDE 或 CI/CD 管道中。这种方法很容易出错,不安全,难以扩展。
LSP 在 2016 年由微软推出,用来解决一个具体问题:如何在不同编辑器和语言服务器中提供智能代码功能(自动补全、转到定义、重构)。通过将编辑器(客户端)和语言分析引擎(服务器)之间的通信抽象为 JSON-RPC 协议,LSP 使我们今天理所当然的丰富 IDE 体验成为可能。
LSP 证明了标准化代码和智能之间的接口比任何单一实现都更有价值。它创建了一个模块化的生态系统,其中 VS Code、Neovim 和 IntelliJ 都可以共享相同的底层语言服务器。
MCP 由 Anthropic 在 2024 年中推出,解决的问题类似,但针对的是 AI 模型。在 MCP 之前,将 LLM 连接到外部数据源(如 PostgreSQL 数据库或 REST API)需要自定义的、临时的集成。每个集成都有自己的身份验证、错误处理和数据格式化逻辑。
MCP 标准化了这种连接。它定义了一个协议,其中:
这个三层架构镜像了 LSP 模型,但专门为 LLM 的随机性、受限的上下文窗口本质设计。它允许模型动态发现和交互工具与资源,无需硬编码的集成。
真正的力量在 LSP 和 MCP 融合时出现。现代 AI Agent 不仅需要生成代码;它们需要理解代码库、导航其结构,并与其运行时环境交互。
AI 辅助开发中最大的挑战之一是上下文管理。LLM 的上下文窗口有限,将整个代码库提供给它们既低效又昂贵。
LSP 提供关于代码库的结构化信息:符号、类型、引用和定义。MCP 可以将这些 LSP 派生的数据作为资源或工具公开给 AI 模型。例如:
file:// URI,指向特定文件,带有关于其大小和语言的元数据。find_references 工具,查询 LSP 服务器以查找符号的所有用法。这种融合允许 AI Agent 以静态分析工具的精度运作,同时保持自然语言交互的灵活性。与其让 LLM"查找所有与身份验证相关的 bug",不如让 Agent 查询 LSP 服务器查找所有用 @auth 修饰符标记的函数,然后让 LLM 分析这些函数内的逻辑。
这种集成引入了新的安全风险。如果 AI Agent 可以通过 LSP 查询代码库,并通过 MCP 执行工具,它实际上对开发环境拥有读/写访问权限。
为了缓解这些风险并处理 AI Agent 的高吞吐量、低延迟要求,基础设施层越来越多地用 Rust 构建。Rust 提供了几个优势,使其成为这个角色的理想选择:
AI Agent 经常处理大量数据(代码库、日志、指标),必须快速处理它们。Rust 的所有权模型在没有垃圾收集器的情况下确保内存安全,导致可预测的性能和降低的延迟。这对 IDE 中的实时 AI 交互至关重要。
Rust 的类型系统防止了缓冲区溢出和数据竞争等常见漏洞。在构建与敏感系统交互的 MCP 服务器或 LSP 客户端时,Rust 提供的基础比 Python 或 JavaScript 更安全,这两种语言更容易出现运行时错误和安全漏洞。
Rust 可以轻松编译为 WebAssembly(Wasm),允许 AI 基础设施在基于浏览器的环境或沙箱容器中安全运行。这对于在不可信环境中运行 MCP 服务器至关重要。
Rust 生态系统已大幅成熟,拥有 tower(用于异步服务)、serde(用于序列化)和 tokio(用于并发)等库。这些库使得构建强大的、高性能的 MCP 和 LSP 服务器变得直接了当。
让我们看一个实际例子,说明如何使用 Rust 构建一个安全的 MCP 服务器。我们将使用 mcp-rs 库(假设的,基于当前趋势)来创建一个服务器,该服务器公开一个从本地代码库读取代码片段的工具。
先决条件:
步骤 1:初始化项目
cargo new mcp-code-server
cd mcp-code-server
步骤 2:添加依赖项
将必要的依赖项添加到你的 Cargo.toml:
[dependencies]
mcp = "0.1.0" # Hypothetical MCP library for Rust
tokio = { version = "1.0", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tracing = "0.1"
步骤 3:实现 MCP 服务器
use mcp::{Server, Tool, Resource};
use serde_json::json;
use std::fs;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize the MCP server
let mut server = Server::new("code-server", "0.1.0");
// Define a secure tool to read code snippets
let read_code_tool = Tool::new(
"read_code",
"Reads a code snippet from a specified file path",
json!({
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "The absolute path to the code file"
}
},
"required": ["path"]
}),
|args| async move {
let path = args["path"].as_str().unwrap();
// Security Check: Ensure the path is within the allowed directory
let allowed_dir = std::env::current_dir()?.canonicalize()?;
let resolved_path = std::path::Path::new(path).canonicalize()?;
if !resolved_path.starts_with(&allowed_dir) {
return Err("Access denied: Path outside allowed directory".into());
}
// Read the file content
let content = fs::read_to_string(&resolved_path)?;
Ok(json!({
"content": content,
"path": path
}))
}
);
// Register the tool
server.register_tool(read_code_tool);
// Start the server
server.run().await?;
Ok(())
}
运行:
cargo run
这个服务器公开了一个 read_code 工具,允许 AI 模型读取代码文件,但带有一个关键的安全限制:它只允许访问当前目录内的文件。这防止了路径遍历攻击,并限制了 AI 访问的范围。
当你将 MCP 和 LSP 集成到开发工作流中时,考虑这些最佳实践:
MCP、LSP 和 Rust 的融合只是开始。我们可以期待看到:
MCP 与现有的 LSP 服务器兼容吗?
是的,MCP 设计为与 LSP 可互操作。MCP 服务器可以查询 LSP 服务器获取代码智能,LSP 客户端可以使用 MCP 工具获取 AI 驱动的功能。这种集成通过标准化的 JSON-RPC 消息便于进行。
为什么相对于 Python,Rust 更受青睐来构建 MCP 服务器?
Rust 提供更好的性能、内存安全和并发处理,这对于高吞吐量、低延迟的 AI 交互至关重要。虽然 Python 在 AI 模型开发中很受欢迎,但 Rust 更适合为这些模型提供动力的基础设施层。
我如何保护我的 MCP 服务器免受恶意提示词的影响?
实现严格的输入验证,沙箱化服务器环境,并限制对 AI 模型公开的工具和资源。定期审计日志中的异常活动,并使用速率限制来防止滥用。
如需更多关于构建安全 AI 基础设施的见解,请查阅 Tamiz 的 Insights,了解开发者工具和 AI 的最新趋势。
如需进一步操作,你可以考虑屏蔽此人和/或举报滥用。