csls mcp
csls-mcp (C#语言服务-模型上下文协议)是一个长期运行的协议。NET 8控制台应用程序,为AI代理提供C#语言服务。它利用Roslyn编译器平台在给定的工作空间内提供对C#代码的语义理解,通过模型上下文协议(MCP)与Gemini CLI无缝集成。
此MCP服务器背后的想法是为代理提供更有效的工具来使用,而不是searchText或readFile,或者诱使他们更有效地阅读更多代码,而不是猜测代码的作用或位置,因此将根据代理的使用经验添加或更改功能。
🎯 目标
主要目标 csls-mcp 是使AI代理能够与C#代码库进行语义交互。代理可以使用 csls-mcp 致:
- 解析C#符号: 查找类、接口、方法、名称空间、属性、字段等。
- 查找参考文献: 找到使用符号的位置。
- 列出类型的成员: 枚举给定类或接口的方法、属性和字段。
- 获取准确的源代码: 检索符号声明的精确源文本。
一切:
- 查找声明: 找到符号声明的位置。
这种语义理解对于人工智能代理的智能代码导航、重构、错误修复和功能实现等任务至关重要。
🧱 建筑
- 类型: .NET 8控制台应用程序
- 执行: 长时间运行的进程
- 沟通: 基于标准I/O(STDIO)的模型上下文协议(MCP)
- 工作区管理: 在内存中维护加载的C#解决方案/项目。
- 生命周期: 由Gemini CLI自动启动和停止。
- 罗斯林: 用途
Microsoft.CodeAnalysis和MSBuildWorkspace对于所有语义操作。
🚀 如何编译
- 导航到项目目录:
cd D:\CSLS-MCP\csls-mcp- 还原NuGet包并构建项目:
dotnet build这将编译应用程序并将可执行文件放置在 bin\Debug\net8.0\.
🤝 与Gemini CLI集成
csls-mcp 被设计为与Gemini CLI集成作为MCP服务器。
⚙️ Gemini CLI配置(.gemini/settings.json)
启用Gemini CLI以使用 csls-mcp,将以下配置添加到您的 .gemini/settings.json 项目根目录中的文件:
{
"mcpServers": {
"csharp": {
"command": "D:\\CSLS-MCP\\csls-mcp\\bin\\Debug\\net8.0\\csls-mcp.exe",
"args": ["--workspace", "${workspaceFolder}"],
"trust": true
}
}
}csharp:这是此MCP服务器的唯一标识符(名称)。你可以选择任何你喜欢的名字。command:编译的绝对路径csls-mcp.exe可执行。如果您的生成输出目录不同,请确保更新此路径。args:传递给的命令行参数csls-mcp服务器。
- --workspace ${workspaceFolder}:这将告诉服务器当前工作空间(C#解决方案/项目)的路径。 ${workspaceFolder} 是一个特殊变量,Gemini CLI将其解析为当前项目的根。
trust:必须是true允许服务器执行您的工作区并与之交互。
✨ Gemini CLI的示例用法
配置后,Gemini CLI将自动启动 csls-mcp 在需要时,允许代理使用其暴露的工具。以下是AI代理如何与 csharp MCP服务器:
1. getToolDeclarations (MCP握手)
客户端(Gemini CLI)使用此工具来发现服务器的功能。
请求:
{
"id": "1",
"tool": "getToolDeclarations",
"input": {}
}响应(示例):
{
"output": {
"tools": [
{
"name": "resolveSymbol",
"description": "Resolves a C# symbol (class, interface, method, etc.) and returns its kind, name, namespace, file, and line number.",
"inputSchema": { "type": "object", "properties": { "symbol": { "type": "string" } }, "required": ["symbol"] }
},
{
"name": "getSymbolSource",
"description": "Retrieves the exact source code of a given C# symbol.",
"inputSchema": { "type": "object", "properties": { "symbol": { "type": "string" } }, "required": ["symbol"] }
},
{
"name": "findReferences",
"description": "Finds all references to a given C# symbol within the loaded workspace.",
"inputSchema": { "type": "object", "properties": { "symbol": { "type": "string" } }, "required": ["symbol"] }
},
{
"name": "listMembers",
"description": "Lists methods, properties, and fields of a specified C# type.",
"inputSchema": { "type": "object", "properties": { "symbol": { "type": "string" } }, "required": ["symbol"] }
}
]
},
"id": "1"
}2. resolveSymbol
请求:
{
"id": "2",
"tool": "resolveSymbol",
"input": {
"symbol": "MyTestClass"
}
}响应(例如,假设 MyTestClass 在...里 dummy-project/Program.cs):
{
"output": {
"kind": "Class",
"name": "MyTestClass",
"namespace": "dummy_project",
"file": "D:\\CSLS-MCP\\dummy-project\\Program.cs",
"line": 5
},
"id": "2"
}3. getSymbolSource
请求:
{
"id": "3",
"tool": "getSymbolSource",
"input": {
"symbol": "MyTestMethod"
}
}响应(示例,显示来源 MyTestMethod):
{
"output": {
"file": "D:\\CSLS-MCP\\dummy-project\\Program.cs",
"source": " public void MyTestMethod(string param)\n {\n Console.WriteLine($\"Parameter: {param}, Property: {MyProperty}, Field: {_myField}\");\n }"
},
"id": "3"
}4. findReferences
请求:
{
"id": "4",
"tool": "findReferences",
"input": {
"symbol": "MyTestClass"
}
}响应(示例,显示中的引用 Program.cs):
{
"output": [
{
"file": "D:\\CSLS-MCP\\dummy-project\\Program.cs",
"line": 27
}
],
"id": "4"
}5. listMembers
请求:
{
"id": "5",
"tool": "listMembers",
"input": {
"symbol": "MyTestClass"
}
}响应(示例):
{
"output": {
"methods": [
"MyTestMethod(String param)"
],
"properties": [
"String MyProperty"
],
"fields": [
"Int32 _myField"
]
},
"id": "5"
}