🚀 模塊化 MCP 服務器
本項目是一個使用 github.com/metoro-io/mcp-golang
庫實現的 Model Context Protocol (MCP) 服務器的 Go 語言實現,採用模塊化方式進行了重構。它能幫助開發者更高效地構建和管理 MCP 服務器,提升開發效率和代碼可維護性。
🚀 快速開始
構建和運行
cd cmd/mcp-server
go build -o mcp-server
./mcp-server
✨ 主要特性
- 模塊化設計:採用模塊化方式重構,提升代碼的可維護性和可擴展性。
- 安全特性:包含路徑限制功能,可限制文件操作僅限於指定目錄,保障服務器安全。
- 易於擴展:支持添加新工具,開發者可根據需求靈活擴展服務器功能。
📦 安裝指南
構建服務器
cd cmd/mcp-server
go build -o mcp-server
運行服務器
./mcp-server
💻 使用示例
安全特性配置示例
1. 使用命令行標誌
./mcp-server --paths=/home/user/safe:/tmp/workspace
./mcp-server --paths=/home/user --deny-paths=/home/user/.ssh:/home/user/credentials
2. 使用環境變量
export MCP_ALLOWED_PATHS=/home/user/safe:/tmp/workspace
export MCP_DENIED_PATHS=/home/user/.ssh:/home/user/credentials
./mcp-server
3. 程序matic 配置
cfg := config.DefaultConfig()
cfg.AddAllowedPath("/path/to/allow")
cfg.AddDeniedPath("/path/to/deny")
server, err := server.NewServerWithConfig(cfg)
添加新工具示例
package tools
import (
"internal/tools"
)
type NewTool struct{}
func (n *NewTool) Execute(args []string) error {
return nil
}
func init() {
tools.Register("new_tool", &NewTool{})
}
測試示例
go test -v ./...
📚 詳細文檔
項目結構
mcp-server/
├── cmd/
│ └── mcp-server/
│ └── main.go # 入口點
├── internal/
│ ├── config/
│ │ └── config.go # 服務器配置
│ ├── server/
│ │ ├── server.go # MCP 服務器實現
│ │ └── server_test.go # 服務器測試
│ ├── tools/
│ │ ├── tool.go # 工具接口
│ │ ├── execute.go # 執行 shell 命令工具
│ │ ├── showfile.go # 顯示文件工具
│ │ ├── searchfile.go # 在文件中搜索工具
│ │ └── writefile.go # 寫入文件工具
│ └── utils/
│ └── response.go # 響應公用工具
├── go.mod
├── go.sum
└── README.md
安全特性
該服務器現在包含路徑限制功能,以限制文件操作僅限於指定目錄。
配置允許的路徑
你可以通過以下幾種方式配置允許的路徑:
- 使用命令行標誌:通過
--paths
和 --deny-paths
標誌指定允許和拒絕的路徑。
- 使用環境變量:通過
MCP_ALLOWED_PATHS
和 MCP_DENIED_PATHS
環境變量指定允許和拒絕的路徑。
- 程序matic 配置:創建自定義配置,調用
AddAllowedPath
和 AddDeniedPath
方法添加允許和拒絕的路徑。
默認行為
- 如果沒有指定路徑,默認情況下服務器只允許當前工作目錄。
- 常見敏感目錄(如
.git
和 .env
)會自動添加到拒絕列表中。
Shell 命令安全
對於 execute_shell_command
工具:
- 命令受限於一個 whitelist 的常見實用程序。
- 自定義可執行路徑必須經過允許路徑配置的檢查。
- 工作目錄必須在允許的路徑內。
添加新工具
要添加新工具,請按照以下步驟操作:
- 在
internal/tools/
目錄下創建一個新的 Go 文件。
- 實現
Tool
接口(定義在 tool.go
中)。
- 將工具註冊到服務器,通常在
server.go
中進行。
🔧 技術細節
路徑限制功能實現
服務器通過命令行標誌、環境變量或程序matic 配置來指定允許和拒絕的路徑。在進行文件操作時,會檢查操作路徑是否在允許列表中,並且不在拒絕列表中。如果操作路徑不符合要求,將拒絕執行操作。
工具註冊機制
服務器通過 Tool
接口來定義工具的執行方法。開發者可以實現該接口,並將工具註冊到服務器中。服務器在接收到請求時,會根據請求的工具名稱調用相應的工具執行方法。
安全特性
該服務器現在包含路徑限制功能,以限制文件操作僅限於指定目錄。
配置允許的路徑
你可以通過以下幾種方式配置允許的路徑:
1. 使用命令行標誌
./mcp-server --paths=/home/user/safe:/tmp/workspace
./mcp-server --paths=/home/user --deny-paths=/home/user/.ssh:/home/user/credentials
2. 使用環境變量
export MCP_ALLOWED_PATHS=/home/user/safe:/tmp/workspace
export MCP_DENIED_PATHS=/home/user/.ssh:/home/user/credentials
./mcp-server
3. 程序matic 配置
你也可以創建一個自定義配置:
cfg := config.DefaultConfig()
cfg.AddAllowedPath("/path/to/allow")
cfg.AddDeniedPath("/path/to/deny")
server, err := server.NewServerWithConfig(cfg)
默認行為
- 如果沒有指定路徑,默認情況下服務器只允許當前工作目錄。
- 常見敏感目錄(如
.git
和 .env
)會自動添加到拒絕列表中。
Shell 命令安全
對於 execute_shell_command
工具:
- 命令受限於一個 whitelist 的常見實用程序
- 自定義可執行路徑必須經過允許路徑配置的檢查
- 工作目錄必須在允許的路徑內
添加新工具
要添加新工具,請按照以下步驟操作:
- 在
internal/tools/
目錄下創建一個新的 Go 文件。
- 實現
Tool
接口(定義在 tool.go
中)。
- 將工具註冊到服務器,通常在
server.go
中進行。
例如,添加一個新工具:
package tools
import (
"internal/tools"
)
type NewTool struct{}
func (n *NewTool) Execute(args []string) error {
return nil
}
func init() {
tools.Register("new_tool", &NewTool{})
}
測試
要測試服務器,請運行以下命令:
go test -v ./...
確保所有代碼示例和命令都正確無誤地呈現給用戶。