awful_mcp
一个全面的MCP(模型上下文协议)服务器,为AI编码代理提供强大的开发工具。使用Rust构建,使用官方 rmcp SDK,该服务器提供34多种工具,分为8类:Nushell管道、进程执行、文件系统操作、代码搜索、多文件替换、git操作、cargo命令和基于AST的代码分析。
特性
- 努谢尔一体化:使用结构化JSON输出运行Nushell管道
- 代码搜索:使用ripgrep和fd快速搜索
- 多文件替换:安全搜索并替换为ruplacer(默认为干运行)
- AST分析:使用astgrep进行语法感知代码搜索和转换
- Git操作:状态、差异、添加、提交、推送
- 货物整合:构建、测试、fmt、剪贴
- 文件系统工具:读取、写入、追加、列表、glob
- 安全执行:所有命令都有超时和输出限制
依赖项
必需
- 锈 (1.70+)-用于构建服务器
- 努谢尔 (
nu)-用于运行Nushell命令
# macOS
brew install nushell
# Linux
cargo install nu可选(适用于特定工具)
- ripgrep (
rg)-为search.rg工具
brew install ripgrep # macOS
apt install ripgrep # Debian/Ubuntu- 文件描述符 -For
search.fd工具
brew install fd # macOS
apt install fd-find # Debian/Ubuntu- ruplacer -For
replace.ruplacer工具
cargo install ruplacer- ast grep -For
ast.grep工具
cargo install ast-grep
# or
npm install -g @ast-grep/cli- 版本控制系统 -用于git工具(通常预装)
- 货物 -用于货运工具(安装有防锈漆)
安装
# Clone the repository
git clone
cd awful_mcp
# Build release binary
cargo build --release
# Binary will be at: target/release/awful_mcp设置
适用于克劳德桌面
添加到MCP配置文件(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):
{
"mcpServers": {
"awful_mcp": {
"command": "/absolute/path/to/awful_mcp/target/release/awful_mcp"
}
}
}适用于Cursor或其他MCP客户端
添加到客户的MCP配置中:
{
"mcpServers": {
"awful_mcp": {
"command": "/absolute/path/to/awful_mcp/target/release/awful_mcp"
}
}
}环境变量
NU_PATH-通往nu二进制(默认为nu在PATH中)RUST_LOG-设置日志记录级别(例如。,RUST_LOG=info)
用法
配置后,MCP服务器将在您的MCP客户端连接时自动启动。该服务器公开了8个类别的34个工具。
可用工具
Nushell工具(15个工具)
使用结构化数据处理运行Nushell命令和管道。
nu.run
运行任何Nushell命令并获取stdout/stderr。
论据:
command(string,必填)-要执行的Nushell命令cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:60000)env(对象,可选)-环境变量
例子:
{
"command": "ls | where size > 1mb | get name"
}nu.json
运行一个输出JSON的Nushell命令并获取结构化数据。
论据:
command(string,必填)-输出JSON的Nushell命令allow_stderr(布尔值,可选)-允许stderr输出(默认值:false)cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
例子:
{
"command": "sys | to json"
}nu.ls
使用Nushell丰富的元数据列出目录内容。
论据:
path(字符串,可选)-要列出的目录(默认:当前)all(布尔值,可选)-包含隐藏文件cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.open
使用Nushell打开和解析文件(JSON、YAML、TOML、CSV等)。
论据:
path(字符串,必填)-要打开的文件raw(布尔值,可选)-作为原始文本读取cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.save
以各种格式将结构化数据保存到文件中。
论据:
path(字符串,必填)-输出文件路径content(字符串,必填)-要保存的内容cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.str_contains
检查字符串是否包含模式。
论据:
input(string,必填)-输入字符串pattern(字符串,必填)-要搜索的模式insensitive(布尔值,可选)-不区分大小写的搜索
例子:
{
"input": "Hello World",
"pattern": "world",
"insensitive": true
}nu.str_replace
替换字符串中的文本。
论据:
input(string,必填)-输入字符串find(字符串,必填)-要查找的文本replace(字符串,必填)-替换文本all(布尔值,可选)-替换所有出现的内容(默认值:false)
例子:
{
"input": "foo bar foo",
"find": "foo",
"replace": "baz",
"all": true
}nu.ps
使用Nushell运行进程。
论据:
cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.sys
获取系统信息(CPU、内存、主机、磁盘等)。
论据:
subsystem(字符串,可选)-特定子系统:cpu、mem、主机、磁盘、临时、网络、用户cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.find_by_extension
按扩展名查找带有元数据和排序的文件。
论据:
extensions(数组,必填)-要搜索的文件扩展名(例如,\[“rs”,“toml”\])path(字符串,可选)-要搜索的目录(默认:当前)sort_by(字符串,可选)-排序方式:名称、大小、已修改(默认:已修改)limit(数字,可选)-限制结果数量cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
例子:
{
"extensions": ["rs", "toml"],
"sort_by": "size",
"limit": 10
}nu.recent_files
查找时间窗口内最近修改的文件。
论据:
minutes(数字,可选)-回顾时间(默认值:60)path(字符串,可选)-要搜索的目录(默认:当前)limit(数字,可选)-限制结果数量cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.large_files
查找大于大小阈值的文件。
论据:
min_size(数字,可选)-最小字节大小(默认值:1000000=1MB)path(字符串,可选)-要搜索的目录(默认:当前)limit(数字,可选)-限制结果数量(默认值:20)cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.code_stats
按文件类型分析代码存储库统计信息。
论据:
path(字符串,可选)-要分析的目录(默认:当前)extensions(数组,可选)-要包含的文件扩展名(默认:通用代码扩展名)cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
例子:
{
"path": "src",
"extensions": ["rs", "toml"]
}nu.grep_stats
搜索模式并返回聚合统计数据。
论据:
pattern(字符串,必填)-要搜索的模式path(字符串,可选)-要搜索的目录(默认:当前)extensions(数组,可选)-要筛选的文件扩展名insensitive(布尔值,可选)-不区分大小写的搜索cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
nu.dir_tree
使用文件计数和大小生成目录树可视化。
论据:
path(字符串,可选)-要可视化的目录(默认:当前)max_depth(数字,可选)-最大深度(默认值:3)all(布尔值,可选)-显示隐藏文件cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
______________________________________________________________________
工艺工具(1个工具)
process.run
运行任何带参数的二进制文件(无shell)。
论据:
program(string,必填)-要执行的程序args(数组,可选)-命令参数cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:60000)env(对象,可选)-环境变量
例子:
{
"program": "cargo",
"args": ["test", "--", "--nocapture"],
"timeout_ms": 120000
}______________________________________________________________________
文件系统工具(5个工具)
fs.read_text
读取UTF-8文本文件。
论据:
path(字符串,必填)-要读取的文件路径
退货: { path, content, size }
fs.write_text
以原子方式写入(覆盖)文本文件。
论据:
path(字符串,必填)-要写入的文件路径content(字符串,必填)-要写入的内容
fs.append_text
将文本附加到文件中(如果缺少,则创建)。
论据:
path(字符串,必填)-要附加到的文件路径content(string,必填)-要附加的内容
fs.list
列出包含元数据的目录内容。
论据:
path(字符串,可选)-要列出的目录(默认:当前)include_hidden(布尔值,可选)-包含隐藏文件
退货: 一大批 { name, path, kind, size, modified }
fs.glob
展开Unix风格的glob模式。
论据:
pattern(字符串,必填)-全局模式(例如“\*\*/\*.rs”)cwd(字符串,可选)-工作目录
______________________________________________________________________
搜索工具(2个工具)
search.rg
使用ripgrep进行快速代码搜索(返回JSON)。
论据:
pattern(字符串,必填)-搜索模式path(字符串,可选)-要搜索的文件或目录extra(数组,可选)-额外的ripgrep标志cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:60000)
例子:
{
"pattern": "fn main",
"path": "src",
"extra": ["-i", "--type", "rust"]
}search.fd
快速文件/目录查找器(尊重.gitignore)。
论据:
pattern(字符串,可选)-搜索模式path(字符串,可选)-要搜索的目录type_filter(字符串,可选)-类型:f(文件),d(目录),l(符号链接),x(可执行文件)extension(字符串,可选)-文件扩展名(例如“rs”、“ts”)max_depth(数字,可选)-最大搜索深度hidden(布尔值,可选)-包含隐藏文件no_ignore(布尔值,可选)-包括忽略的文件case_sensitive(布尔值,可选)-区分大小写的搜索absolute_path(boolean,可选)-返回绝对路径extra(数组,可选)-额外的fd标志cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
例子:
{
"extension": "rs",
"type_filter": "f",
"max_depth": 3
}______________________________________________________________________
更换工具(1个工具)
replace.ruplacer
安全的多文件搜索和替换(默认情况下为模拟运行)。
论据:
pattern(字符串,必填)-要搜索的模式replacement(string,必填)-替换字符串path(字符串,可选)-要搜索的目录或文件regex(布尔值,可选)-使用正则表达式模式file_type(字符串,可选)-文件类型过滤器(例如“\*.rs”)go(布尔值,可选)-实际执行替换(默认值:false=模拟运行)ignore_case(布尔值,可选)-不区分大小写的搜索hidden(布尔值,可选)-包含隐藏文件no_ignore(布尔值,可选)-包括忽略的文件word(布尔值,可选)-单词边界匹配extra(数组,可选)-额外的ruplacer标志cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:120000)
示例(干运行):
{
"pattern": "old_name",
"replacement": "new_name",
"file_type": "*.rs"
}示例(实际替换):
{
"pattern": "old_name",
"replacement": "new_name",
"file_type": "*.rs",
"go": true
}______________________________________________________________________
Git工具(5个工具)
git.status
跑 git status --porcelain=v2.
论据:
cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:30000)
git.diff
跑 git diff 带有可选参数。
论据:
extra(数组,可选)-额外的git diff标志(例如,\[“--cached”\])paths(数组,可选)-diff的特定路径cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:60000)
git.add
跑 git add 对于给定的路径。
论据:
paths(数组,必填)-要添加的路径(至少一个必填)cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
例子:
{
"paths": ["src/main.rs", "Cargo.toml"]
}git.commit
跑 git commit 与消息。
论据:
message(字符串,必填)-提交消息signoff(布尔值,可选)-添加--签收标志allow_empty(boolean,可选)-允许空提交cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
git.push
跑 git push 远程。
论据:
remote(字符串,必填)-远程名称(例如“origin”)branch(字符串,必填)-分支机构名称(例如“main”)force(boolean,可选)-使用--force with leasecwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:120000)
______________________________________________________________________
货运工具(4个工具)
cargo.build
跑 cargo build.
论据:
extra(数组,可选)-额外的货物标志(例如,\[“--release”\])cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:300000)
cargo.test
跑 cargo test.
论据:
extra(数组,可选)-额外的货物标志(例如,\[“--”,“--nocapture”\])cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:300000)
cargo.fmt
跑 cargo fmt.
论据:
cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
cargo.clippy
跑 cargo clippy.
论据:
cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)
______________________________________________________________________
AST工具(1个工具)
ast.grep
基于AST的代码搜索和操作。
论据:
pattern(字符串,必填)-AST模式(例如,“fn$NAME(){}”)language(字符串,可选)-语言:rust、typescript、python、javascript等。path(字符串,可选)-要搜索的目录或文件regex(布尔值,可选)-使用正则表达式模式rewrite(字符串,可选)-重写转换模式json(布尔值,可选)-JSON输出格式hidden(布尔值,可选)-包含隐藏文件no_ignore(布尔值,可选)-包括忽略的文件file_type(字符串,可选)-文件类型筛选器interactive(布尔值,可选)-交互模式update_all(布尔值,可选)-就地更新文件extra(数组,可选)-额外的ast-grep标志cwd(字符串,可选)-工作目录timeout_ms(数字,可选)-超时(毫秒)(默认值:120000)
示例(搜索):
{
"pattern": "fn $NAME() {}",
"language": "rust",
"json": true
}示例(转换):
{
"pattern": "fn $NAME() {}",
"rewrite": "async fn $NAME() {}",
"language": "rust",
"update_all": true
}______________________________________________________________________
安全功能
- 超时:所有命令都有可配置的超时和合理的默认值
- 输出限制:截断Stout/stderr以防止内存问题
- 二进制验证:
process.run用途which在执行之前验证二进制文件 - 无外壳注射:直接二进制执行绕过shell(使用
nu.run对于有意使用的壳体管道) - 安全默认值:破坏性行动,如
replace.ruplacer默认为干运行模式
发展
# Run tests
cargo test
# Run with logging
RUST_LOG=info cargo run
# Format code
cargo fmt
# Lint
cargo clippy建筑
服务器采用模块化架构,关注点分离:
- 主服务器 (
src/main.rs)-MCP协议处理和路由 - 工具模块 (
src/tools/)-单独的工具实施
- nushell.rs -Nushell管道工具 - process.rs -流程执行 - filesystem.rs -文件操作 - search.rs -ripgrep与fd - replace.rs -ruplacer集成 - git.rs -Git操作 - cargo.rs -货物指令 - ast_grep.rs -基于AST的分析
- 公用事业 (
src/util.rs)-用于流程执行的共享实用程序
每个工具模块都遵循一个可测试性模式:
- 业务逻辑函数返回
anyhow::Result - MCP包装器函数处理协议转换
- 业务逻辑的全面单元测试
许可证
麻省理工学院
贡献
欢迎投稿!请确保:
- 所有测试均通过(
cargo test) - 代码已格式化(
cargo fmt) - Clippy很高兴(
cargo clippy) - 新工具遵循既定模式
