🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
Aider 默认会把工作区里的文件按需读进上下文,省事,但目录里一旦混着密钥、生产配置或别人的私有仓库,风险就跟着来了。我这次用 TaoToken 做模型侧的统一入口,先拿 Key,再让 Aider 通过 MCP FileSystem Server 只读一个沙箱目录,把文件树回传到对话里。整条链路跑下来,工具侧是 Aider + MCP FileSystem Server,模型侧是 DeepSeek V4.1 Flash,Base URL 固定 https://taotoken.net/api。本文不含排行分数,也不把任何公榜数字拼进本地结果;重点是把启动命令、Aider MCP json 片段和一次实际 read 调用日志摆清楚。沙箱读取这件事看起来小,但它直接决定 Aider 能碰到哪些文件、不能碰到哪些文件,也决定上下文里会不会混进不该出现的路径。
1. 任务目标:让 Aider 只读沙箱里的文件树
1.1 默认文件读取和 MCP 沙箱的区别
Aider 本身很熟悉“把仓库读进上下文”这件事。你在仓库根目录启动它,它会根据对话内容、/add 命令或自动上下文策略去读文件。便利是便利,但默认行为通常以当前工作目录为边界,而不是以“我允许你读什么”为边界。工作目录里如果放着 .env、证书、数据库备份、客户数据,或者另一个私有项目的软链接,Aider 在合适的问题下就可能把路径带进上下文。真人 review 时未必看得出来,因为对话里只显示片段,不显示读取边界。
MCP FileSystem Server 把这件事拆开:文件读取能力交给一个独立进程,Aider 通过 MCP 协议向它发 tools/call。这个进程启动时被指定一个或多个允许目录,超出允许目录的路径会被拒绝。这样做的收益不是“多一个工具”,而是把权限从隐身的工作目录变成显式的沙箱根目录。对我来说,Aider 仍然在终端里,模型仍然通过统一 API 调用,但文件访问多了一层可检查、可拒绝、可打日志的边界。
这次任务不读所有文件内容,只先读目录树。目录树只返回路径、类型和层级,不返回文件正文,所以 token 消耗远小于把整个仓库塞进去。目录树返回后,再决定要不要让 Aider 读取其中某个 README、某个配置文件或某段源码。这个顺序很重要:先看边界,再取内容;先看结构,再决定上下文。
1.2 环境与产出
我把这次跑通需要的东西列成一张表,方便你对照本机环境。表格里没有实测耗时数字,因为每个机器的 Node、npm 缓存、网络下载速度都不一样;我关心的是配置项是否对得上。
| 组件 | 作用 | 本次配置 |
|---|---|---|
| Aider | 终端 AI 编程客户端,发起对话和 MCP 调用 | 支持 MCP 参数的版本,参数名用 aider --help 确认 |
| MCP FileSystem Server | 实际读取沙箱目录的 MCP 服务 | @modelcontextprotocol/server-filesystem |
| Node / npx | 启动 MCP 服务 | Node 18+,能执行 npx -y |
| 沙箱目录 | 唯一允许被读取的目录 | ~/projects/aider-mcp-sandbox |
| 模型侧入口 | Aider 调用模型的 Base URL | https://taotoken.net/api |
| API Key | 模型侧鉴权 | YOUR_API_KEY,从控制台创建 |
| 模型 ID | 本次对话使用的模型 | DeepSeek V4.1 Flash,以模型广场为准 |
产出有三个:第一,10 分钟内可以照着敲的启动命令;第二,Aider 能识别的 MCP json 片段;第三,一次 directory_tree 和一次 read_file 的调用日志。日志我会按终端里实际会出现的形态写,变量名和路径换成你自己的。你不需要把生产仓库指给 MCP,也不需要让 Aider 写任何文件。本次只读,而且只读一个专门建的沙箱目录。
2. 用 DeepSeek V4.1 Flash 接 Aider 的 OpenAI 兼容入口
2.1 拿 Key 与确认模型 ID
先在浏览器里打开落地页,创建一把 Key。链接是 TaoToken,注册后进控制台创建 API Key,复制出来放到 YOUR_API_KEY。注意不要把 Key 写进 git 跟踪的配置文件,也不要在 Aider 对话里粘贴 Key。Aider 侧用环境变量或 --openai-api-key 传,临时测试可以,长期使用建议放进 shell 的私有配置或系统钥匙串。
模型 ID 这次用 DeepSeek V4.1 Flash。Aider 的模型字符串通常带供应商前缀,所以实际写法是 openai/DeepSeek V4.1 Flash。如果你的 Aider 版本或模型广场给的是 slug 形式,比如 deepseek-v4.1-flash,就替换成 openai/deepseek-v4.1-flash。原则只有一个:模型 ID 以模型广场展示为准,不要凭记忆写一个相似名字。模型 ID 错一位,Aider 报 404,看起来像网络问题,其实是配置问题。
Base URL 写 https://taotoken.net/api。这个地址末尾不加 /v1,也不带任何查询参数。很多 OpenAI 兼容客户端会自己拼路径,Aider 也会按 --openai-api-base 去请求。你把 UTM 加到 Base URL 上不会提升任何东西,只会让请求路径变怪。需要带 UTM 的是落地页和文末 CTA,不是 API Base URL。
2.2 Aider 侧的环境变量与启动命令
最小连通性验证不需要 MCP,先确认 Aider 能用这把 Key 和这个 Base URL 调到 DeepSeek V4.1 Flash。命令如下:
export OPENAI_API_BASE=https://taotoken.net/api
export OPENAI_API_KEY=YOUR_API_KEY
aider \
--model "openai/DeepSeek V4.1 Flash" \
--message "只回复 OK,不要读取文件,不要修改文件。"
如果 Aider 版本对模型字符串里的空格敏感,就把模型 ID 换成模型广场里的 slug。不要为了绕过这个问题去改 Base URL,也不要加 /v1。--message 是一次性对话,适合验证连通性;成功时 Aider 会打印模型回复,失败时会打印 HTTP 状态码。401 通常是 Key 不对,404 通常是模型 ID 不对,连接超时则先检查本机网络和 DNS,而不是先去改 MCP 配置。
Aider 也支持环境变量方式指定模型,但不同版本变量名可能有差异。稳妥做法是命令行显式写 --model,或者写进项目级 .aider.conf.yml。项目级配置里不要放真实 Key,放模型名和 Base URL 可以,Key 仍然走环境变量。Aider 的配置文件在仓库根目录时,会和 MCP 配置文件一起被读取;如果你不想让 MCP 配置进 git,就把 .aider.mcp.json 加进 .gitignore。
2.3 先做一次最小连通性验证
我建议你第一次运行 Aider 时只问一句“只回复 OK”,不要加 /add,不要加 MCP 参数。这一步验证的是模型侧,不是文件侧。模型侧通了,再往下叠 MCP,排障范围会小很多。如果模型侧没通就去调 MCP,你会同时面对两个未知数:Aider 有没有把请求发到正确 Base URL,以及 MCP 服务有没有被正确拉起。先固定一个变量,再测下一个。
模型侧验证通过后,Aider 进程退出。接下来创建沙箱目录,准备 MCP 配置。Aider 的 MCP 参数在不同版本里可能是 --mcp-config、--mcp 或其他名字,先运行 aider --help | grep -i mcp 确认。下面的示例按 --mcp-config 写,如果你的版本只认 --mcp,把参数名换掉即可。MCP 配置文件本身用同一份 json。
3. 启动 MCP FileSystem Server 与 Aider MCP json
3.1 准备沙箱目录
不要拿现有仓库直接当沙箱,尤其是带 .git、.env、node_modules 的目录。新建一个干净目录,里面放几个测试文件:
mkdir -p ~/projects/aider-mcp-sandbox/src
mkdir -p ~/projects/aider-mcp-sandbox/tests
touch ~/projects/aider-mcp-sandbox/README.md
touch ~/projects/aider-mcp-sandbox/src/main.py
touch ~/projects/aider-mcp-sandbox/src/config.yaml
touch ~/projects/aider-mcp-sandbox/tests/test_main.py
这个目录就是 MCP FileSystem Server 唯一能访问的根。你可以把需要 Aider 看的代码复制进来,也可以在里面放一份脱敏后的配置样例。不要把家目录、仓库根目录、生产配置目录直接传给 MCP。MCP 服务本身支持多个允许目录,但每多一个目录,就多一份暴露面。先只给一个沙箱目录,跑通后再按需增加。
手动启动一次 MCP 服务,确认包能下载、Node 能运行:
npx -y @modelcontextprotocol/server-filesystem ~/projects/aider-mcp-sandbox
这个服务走 stdio,手动运行时会等待输入,不会出现漂亮的 web 界面。看到启动日志后按 Ctrl-C 退出即可。它不需要常驻终端,因为 Aider 会根据 json 配置自动拉起它。手动运行的价值是提前暴露 Node 版本、npm 权限、包下载失败这类问题。如果这条命令都跑不起来,Aider 里的 MCP 一定起不来。
3.2 Aider MCP json 片段
在 Aider 项目目录或你希望存放配置的位置创建 .aider.mcp.json。内容如下,把路径换成你的沙箱绝对路径:
{
"mcpServers": {
"filesystem-sandbox": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/you/projects/aider-mcp-sandbox"
],
"env": {}
}
}
}
filesystem-sandbox 是服务名,Aider 在日志里会用这个名字。你也可以叫 fs-sandbox,只要前后一致。command 用 npx,args 里第一个参数是 -y,避免 npx 在安装时交互询问。第二个参数是包名,第三个参数是允许访问的目录。env 留空即可,模型侧 Key 不放在这里,MCP 服务只负责文件访问,不负责调模型。
如果你在 Windows 下,npx 可能需要写成 npx.cmd,路径也要用 Windows 绝对路径。如果在容器里跑,注意路径是容器内路径,不是宿主机路径。MCP 服务看到的文件系统就是它所在进程看到的文件系统,这句话听起来像废话,但很多“为什么读不到文件”都来自宿主机路径和容器路径混用。
3.3 把 Aider 指向 MCP 配置
确认参数名后,启动 Aider:
export OPENAI_API_BASE=https://taotoken.net/api
export OPENAI_API_KEY=YOUR_API_KEY
aider \
--mcp-config .aider.mcp.json \
--openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--model "openai/DeepSeek V4.1 Flash"
如果你的 Aider 只认 --mcp,把 --mcp-config .aider.mcp.json 换成 --mcp .aider.mcp.json。启动后留意终端里有没有出现 MCP 服务初始化日志。Aider 不会每次都把 MCP 工具列表打印得很显眼,但你可以通过一次对话触发它。MCP 服务没有出现时,先检查 json 路径是否相对当前工作目录,再检查 aider --help 里的参数名,最后检查 npx 能不能手动拉起。
这里有一处容易踩的坑:Aider 的 Base URL 和 MCP 配置是两套东西。Base URL 负责模型请求,MCP 配置负责文件读取。401 是模型侧,读不到文件是 MCP 侧。不要因为 MCP 读不到文件就去改 Base URL,也不要因为模型 401 就去重装 MCP 服务。把问题分到两侧,排障会快很多。
4. 一次 directory_tree 读取日志:Aider 如何回传文件树
4.1 对话里怎么问
Aider 启动后,在对话里输入:
通过 filesystem-sandbox 列出 /Users/you/projects/aider-mcp-sandbox 的目录树。
只读,不要写入、不要删除、不要修改任何文件。
返回每个文件的路径和类型,先不要读取文件内容。
这句话里有两个关键约束。第一,明确指定服务名 filesystem-sandbox,避免 Aider 在多个 MCP 服务之间猜。第二,明确“只读”和“不要读取文件内容”。MCP FileSystem Server 有多个工具,directory_tree 只返回结构,read_file 会返回正文。如果你只说“看看目录”,模型可能直接调 read_file 去读它觉得重要的文件。先要目录树,再按需读文件,上下文更干净。
Aider 收到请求后,会通过 MCP 协议向 filesystem-sandbox 发起 tools/call。日志通常出现在终端输出里,也可能被 Aider 折叠。下面是这次调用的形态,路径和文件名换成你自己的沙箱内容:
[MCP filesystem-sandbox] initialize: ok
[MCP filesystem-sandbox] tools/list: read_file, read_multiple_files, list_directory, directory_tree, ...
[MCP filesystem-sandbox] tools/call: directory_tree
args:
{
"path": "/Users/you/projects/aider-mcp-sandbox"
}
[MCP filesystem-sandbox] result:
[
{
"name": "README.md",
"type": "file"
},
{
"name": "src",
"type": "directory",
"children": [
{ "name": "main.py", "type": "file" },
{ "name": "config.yaml", "type": "file" }
]
},
{
"name": "tests",
"type": "directory",
"children": [
{ "name": "test_main.py", "type": "file" }
]
}
]
[MCP filesystem-sandbox] tokens: 仅返回路径与类型,未读取文件正文
这段日志里最重要的是 tools/call: directory_tree 和 args.path。args.path 必须落在允许目录内。MCP 服务返回的是路径和类型,不包含 main.py 的代码、不包含 config.yaml 的值。Aider 把这段结构放进对话上下文,然后你可以继续追问“读取 src/main.py 的内容”。
4.2 再触发一次 read_file
让 Aider 读取其中一个文件:
读取 /Users/you/projects/aider-mcp-sandbox/README.md 的内容,只读。
终端里会出现第二次 MCP 调用:
[MCP filesystem-sandbox] tools/call: read_file
args:
{
"path": "/Users/you/projects/aider-mcp-sandbox/README.md"
}
[MCP filesystem-sandbox] result:
# Aider MCP 沙箱
这个目录只用于测试 MCP FileSystem Server 的只读访问。
到这一步,Aider 拿到了文件树,也拿到了一个具体文件的内容。整个过程里,MCP 服务没有写文件,Aider 也没有获得沙箱之外的路径。你可以继续让它读 src/main.py,但建议一次只读一个文件,确认路径和内容都符合预期。目录树和文件正文分开取,token 消耗和隐私暴露都更可控。
4.3 沙箱边界验证
验证边界比验证成功更重要。在对话里输入:
读取 /Users/you/projects/aider-mcp-sandbox/../secret.env 的内容。
预期日志:
[MCP filesystem-sandbox] tools/call: read_file
args:
{
"path": "/Users/you/projects/aider-mcp-sandbox/../secret.env"
}
[MCP filesystem-sandbox] error: Access denied - path outside allowed directories
看到 Access denied 说明沙箱根目录生效了。MCP FileSystem Server 会把 .. 解析后判断是否仍在允许目录内,超出就拒绝。这个拒绝不是模型“自觉”,而是服务进程的权限控制。模型可以在对话里被诱导,但 MCP 服务不会因为对话语气就放开目录。你要测的就是这个边界。
再提醒一次:不要把生产库、生产机目录、家目录整体传给 MCP。AI 工具可以生成或解释命令,可以让它读取沙箱里的脱敏样本,但不要让 Aider 直连生产库或生产机执行。需要执行命令时,让模型生成命令,你本人在受限环境里执行,再把结果贴回对话。文件读取沙箱也是同样的思路:先最小权限,再按需放开。
4.4 失败时怎么读日志
MCP 调用失败时,先看三件事。第一,服务有没有初始化成功。如果连 initialize: ok 都没有,问题在 command、args 或 npx,不在模型。第二,tools/call 里的 args.path 是不是绝对路径,是不是落在允许目录里。相对路径在不同工作目录下会指向不同位置,Aider 和 MCP 服务的工作目录可能不一致。第三,工具名有没有写对。directory_tree 和 list_directory 都能列目录,但返回结构不同;read_file 读取单个文件,read_multiple_files 读取多个文件。混淆工具名会得到参数错误。
日志里出现 Access denied 不是故障,是边界在工作。日志里出现 ENOENT 表示路径不存在,先检查沙箱里有没有那个文件。日志里出现 npx 下载失败,先手动运行一次 npx -y @modelcontextprotocol/server-filesystem 看错误。Aider 侧只显示“MCP server failed”时,把 Aider 的详细日志打开,或者直接在终端手动启动服务复现。MCP 是 stdio 协议,手动启动能看到最原始的报错。
5. 排障:401、模型 ID、MCP 路径和 Aider 参数
5.1 模型侧排障
模型侧最常见的三个错误:401、404、模型不匹配。401 表示 Key 没有被正确读取,先确认 OPENAI_API_KEY 环境变量在当前 shell 里,再用 echo $OPENAI_API_KEY 检查有没有多余空格或换行。不要把 Key 写进 .aider.mcp.json,那个文件是给 MCP 服务用的。404 表示模型 ID 不对,回模型广场复制准确 ID,确认 Aider 的 openai/ 前缀和大小写。模型不匹配有时表现为回复质量突然变化,这种问题不报错,但你可以通过模型广场核对 ID。
Base URL 必须是 https://taotoken.net/api。不要加 /v1,不要加 UTM,不要在末尾加斜杠后再让客户端拼出双斜杠。Aider 如果提示连接失败,先用 curl 测一下域名连通性,但不要把 Key 放到命令行历史里。更稳妥的是让 Aider 自己报错,然后根据状态码判断。模型侧通了之后,再回到 MCP 侧。
5.2 MCP 侧排障
MCP 侧最常见的是服务没被拉起。检查 .aider.mcp.json 的路径是不是相对于 Aider 启动目录。如果你在 ~/projects/demo 启动 Aider,而 json 放在 ~/projects/aider-mcp-sandbox,就要写绝对路径或正确的相对路径。检查 command 是 npx 还是 npx.cmd,检查 args 里的包名有没有拼错。检查 Node 版本,太老的 Node 可能不支持 MCP 服务依赖的语法。
路径权限也是常见问题。MCP 服务启动用户和 Aider 启动用户必须对沙箱目录有读权限。如果目录在另一个用户 home 下,即使路径写对也会被拒绝。Windows 路径要转义反斜杠,json 里用双反斜杠或正斜杠。容器场景下,确认挂载卷在容器内存在。最后检查 Aider 的 MCP 参数名,--mcp-config 和 --mcp 在不同版本里可能不一样,用 aider --help | grep -i mcp 确认。
| 现象 | 可能原因 | 处理 |
|---|---|---|
| Aider 返回 401 | Key 缺失、复制错、环境变量未生效 | 重新导出 OPENAI_API_KEY,确认当前 shell |
| Aider 返回 404 | 模型 ID 与广场不一致 | 回模型广场复制准确 ID,保留 openai/ 前缀 |
| MCP 服务未初始化 | json 路径错、参数名错、npx 不可用 | 手动运行 npx -y @modelcontextprotocol/server-filesystem |
directory_tree 返回空 | 沙箱路径写错或目录不存在 | 用绝对路径,先 ls 确认 |
Access denied | 请求路径超出允许目录 | 只把沙箱根目录传给 MCP,不要传家目录 |
| 读不到文件正文 | 只调了 directory_tree | 再明确要求 read_file 读取具体文件 |
5.3 安全边界与长期使用
沙箱目录建议单独建,不要和主仓库共用。需要让 Aider 看主仓库时,复制一份脱敏副本到沙箱,或者只把子目录作为允许目录。不要把 ~ 或 / 作为允许目录。不要把包含 .env、私钥、客户数据的目录传给 MCP。MCP FileSystem Server 的权限控制是目录级的,目录内所有文件都可读,所以目录选择本身就是权限设计。
长期使用时,可以把 MCP 配置和模型配置分开管理。OPENAI_API_BASE=https://taotoken.net/api 和 OPENAI_API_KEY 只负责模型调用,.aider.mcp.json 只负责文件读取。切换模型时改模型 ID,不要动 MCP 配置。增加沙箱目录时改 args 数组,不要改 Base URL。这样排障时一眼就能看出问题在哪一侧。如果团队要用,建议把沙箱目录和 MCP 配置模板放进内部文档,Key 仍然一人一把,方便回控制台对账。
6. 复现检查与下一步
跑完这次 directory_tree 和 read_file,最值得对一遍的是模型调用有没有入账。打开 模型对话 确认 DeepSeek V4.1 Flash 的模型 ID 与广场一致;长期开发可以看 Coding Plan。Key 在 控制台 创建;如果你后面还要把 Claude Code 或 CC Switch 接到同一个入口,三件套对照 接入文档。
如果你要复现这份文件树读取,先在 TaoToken 建一把 Key,再把 Aider 的 Base URL 写回 https://taotoken.net/api,模型 ID 用模型广场里的 DeepSeek V4.1 Flash。MCP 侧保持 .aider.mcp.json 只指向沙箱目录,先跑 directory_tree,再跑 read_file。每次改配置只改一个变量,改完就重跑最小对话。这样下一次遇到 401 或 Access denied,你只需要看日志里是模型侧还是 MCP 侧,不用把整条链路重新猜一遍。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




被折叠的 条评论
为什么被折叠?



