MandoCode 实战指南:用 .NET + Ollama 搭建本地 AI 编程助手
在 Python、TypeScript、Rust 主导的 AI 编程工具生态中,.NET / C# 开发者能找到多少属于自己生态的原生 AI 编码助手?答案可能令人意外——几乎空白。如果你日常使用 .NET 技术栈,同时也希望拥有一个完整的本地 AI 编程助手(代码感知、文件操作、MCP 集成、实时输出),MandoCode 填补了这个生态空白。
MandoCode 是一个基于 Semantic Kernel 和 Ollama 的本地优先 AI 编程助手。它是 RazorConsole 驱动的终端 UI(TUI)应用,通过 NuGet 分发,.NET 8 后即可 dotnet tool install 全局安装,全程不需要任何 API 密钥。支持文件系统感知、Web 搜索、MCP 服务器接入、Diff 审批、任务规划等核心能力。
安装与环境要求
首先安装依赖。完整的技术栈需要:
- .NET 8 SDK — 从 dotnet.microsoft.com/download/dotnet/8.0 获取
- Ollama — 从 ollama.com/download 下载安装(Windows / Linux / macOS)
然后安装 MandoCode 全局工具:
dotnet tool install -g MandoCode mandocode
首次运行会自动触发引导向导。它会检测 Ollama 是否运行、提供本地模型选择(按硬件自动匹配层级)、以及可选的 Ollama Cloud 登录。如果后续需要重新配置,随时键入 /setup。
模型选择策略
MandoCode 的首次运行向导提供了模型选择表格,按硬件能力分为几个层次:
| 模型 | 大小 | 适用硬件 |
|---|---|---|
qwen3.5:0.8b | ~1.0 GB | 纯 CPU / 集成显卡,快速问答 |
qwen3.5:2b | ~2.7 GB | 现代 CPU 或 4 GB+ GPU |
qwen3.5:4b | ~3.4 GB | 中端 GPU(4-6 GB VRAM) |
qwen3.5:9b | ~6.6 GB | 8 GB+ VRAM 独立 GPU |
minimax-m2.7:cloud | 云端 | 无本地 GPU,通过 Ollama Cloud |
选择本地模型后,MandoCode 会自动根据硬件层级设定上下文窗口大小,无需手动调节。如果你在运行时遇到响应被截断(”Response was cut off”),可以手动扩大:
mandocode --config set contextLength 16384
核心功能:文件系统感知
MandoCode 通过 FileSystemPlugin 沙箱化地操作项目文件。AI 只能访问当前工作目录内的内容,路径遍历被严格阻止。可用的文件操作包括:
cd /path/to/your/project mandocode
文件系统插件的 9 个函数覆盖了日常开发的全流程:列出文件、glob 匹配、读取(支持行号区间分页)、写入、删除、创建目录、搜索文本、获取绝对路径。大型文件通过 startLine/endLine 参数按页读取,超长输出会标注从哪一行继续。
Diff 审批:每行改动都经过确认
这是 MandoCode 与云端 AI 编程工具最显著的区别之一。每当 AI 写入或删除文件时,操作会被拦截并显示彩色 Diff:
对于新文件,全局跳过会让整场会话中的写入操作自动放行。对已有文件,跳过是逐文件的——只有同一文件的后续变更会被自动批准。即使开启了自动批准,Diff 依然会渲染显示,让你能跟上变更节奏。
MCP 服务器支持
MandoCode 实现了 Model Context Protocol 客户端,可以连接任何标准 MCP 服务器。配置格式与 Claude Desktop 兼容,这意味着你可以直接复制粘贴任何 MCP 服务器 README 中的安装片段:
{
"enableMcp": true,
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allow"]
},
"github": {
"url": "https://api.githubcopilot.com/mcp/",
"headers": { "Authorization": "Bearer ghp_your_token_here" },
"autoApprove": ["list_issues", "get_pr"]
}
}
}
配置后使用 /mcp-reload 热重载所有 MCP 连接,无需重启 MandoCode。/mcp tools [server] 可列出工具清单。
Web 搜索:无 API 密钥方案
内置 WebSearchPlugin 提供搜索和网页抓取能力——开箱即用,无需任何 API 密钥:
- 搜索通过 DuckDuckGo 的免费 HTML 端点运行
- 抓取页面会用 HtmlAgilityPack 剥离脚本和导航,只保留正文文本
- 如果 DuckDuckGo 因频繁请求限流,可添加免费的 Tavily API 密钥(约 1,000 次 / 月)作为备选:
/config set tavilyKey tvly-你...
任务规划
当请求复杂时(12 个以上单词 + 作用域说明,或 400 字符以上),MandoCode 自动检测并生成步进式规划:
检测到复杂请求:创建 REST API 服务 是否分解为以下步骤? Step 1: 创建项目结构 Step 2: 定义用户实体和数据模型 Step 3: 实现认证中间件 Step 4: 实现 CRUD 端点 Step 5: 添加限流和测试 [执行全部] [跳过规划] [取消]
每步执行时都有进度追踪和错误处理选项。如果模型输出函数调用为纯文本而非标准工具调用,MandoCode 的 fallback 解析器会自动检测并处理。
配置参考
配置文件位于 ~/.mandocode/config.json。几个重要的配置项:
| 配置项 | 默认值 | 作用 |
|---|---|---|
modelName | minimax-m2.7:cloud | 使用的模型 |
temperature | 0.7 | 创造力 0.0-1.0 |
maxTokens | 32768 | 单次回复上限 |
contextLength | 8192 | 本地模型上下文窗口 |
enableDiffApprovals | true | 开启 Diff 审批 |
enableMcp | true | 开启 MCP 集成 |
除了 JSON 编辑,也可以在 MandoCode 会话中直接修改:
mandocode --config set modelName qwen3.5:9b mandocode --config set temperature 0.4 mandocode --config show
环境变量 OLLAMA_ENDPOINT 和 OLLAMA_MODEL 可覆盖 config 中的对应设置。
最佳实践
- 配置上下文窗口:本地模型默认上下文较小(~4K token),使用
/setup或手动设置contextLength到 16K+ 可避免”模型忘记指令”的问题。每 8K token 占用约 0.5-1.5 GB VRAM,根据你的显卡调整。
- Diff 审批不宜全局关闭:全局自动审批虽然方便,但在重构或多文件生成场景中容易忽略细节。建议先用全局模式熟悉工具的生成模式,等对输出质量有信心后再选择性跳过。
- 善用 @ 文件引用:在 prompt 中使用
@列出文件名,AI 会自动读取文件内容作为上下文。在跨文件重构时尤其有用。
- MCP 服务器不宜太多:每个运行时 MCP 服务器都会占用内存和进程资源。按需添加,不用的服务器在配置中设
"disabled": true而非删除。
- 版本兼容注意:如果你的 MandoCode 配置早于 v0.11,
maxTokens可能被设为了过低值。运行mandocode --config show确认其值 >= 32768,过低会导致模型在第一次函数调用前就被截断。
MandoCode 证明了 .NET + Semantic Kernel 完全可以构建出功能完整的本地 AI 编程助手,与 Python 和 TypeScript 生态的工具一较高下。如果你在 .NET 技术栈中工作,而且需要一个不依赖云端 API、所有代码操作都经由审批的本地助手,MandoCode 是个值得尝试的选择。