About Modular MCP Server
Modular MCP Server is a Go-based MCP server implementation for developers building file and shell-operation tools. It provides configurable path allow and deny rules, with shell commands limited by a utility whitelist.
Key features
- 01Go implementation using mcp-golang
- 02Configurable allowed and denied paths
- 03Defaults to the current directory
- 04Denies common sensitive directories
- 05Restricts shell commands and working directories
Use cases
- 01Limit file operations to selected directories
- 02Run approved shell utilities within allowed paths
MCP support
It implements an MCP server using the `github.com/metoro-io/mcp-golang` library. Its tools are registered in the server entry point.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEModular MCP Server
This is a Go implementation of the Model Context Protocol (MCP) server using the github.com/metoro-io/mcp-golang library, restructured in a modular way.
Project Structure
mcp-server/
├── cmd/
│ └── mcp-server/
│ └── main.go # Entry point
├── internal/
│ ├── config/
│ │ └── config.go # Server configuration
│ ├── server/
│ │ ├── server.go # MCP server implementation
│ │ └── server_test.go # Server tests
│ ├── tools/
│ │ ├── tool.go # Tool interface
│ │ ├── execute.go # Execute shell command tool
│ │ ├── showfile.go # Show file tool
│ │ ├── searchfile.go # Search in file tool
│ │ └── writefile.go # Write file tool
│ └── utils/
│ └── response.go # Common response utilities
├── go.mod
├── go.sum
└── README.md
Building and Running
# Build the server
cd cmd/mcp-server
go build -o mcp-server
# Run the server
./mcp-server
Security Features
The server now includes a path restriction system to limit file operations to specified directories.
Configuring Allowed Paths
You can configure allowed paths in several ways:
1. Using Command-line Flags
# Allow operations only in specific directories
./mcp-server --paths=/home/user/safe:/tmp/workspace
# Explicitly deny specific paths even if within allowed paths
./mcp-server --paths=/home/user --deny-paths=/home/user/.ssh:/home/user/credentials
2. Using Environment Variables
# Set allowed paths
export MCP_ALLOWED_PATHS=/home/user/safe:/tmp/workspace
# Set denied paths
export MCP_DENIED_PATHS=/home/user/.ssh:/home/user/credentials
# Run the server
./mcp-server
3. Programmatically
You can also create a custom configuration programmatically:
cfg := config.DefaultConfig()
cfg.AddAllowedPath("/path/to/allow")
cfg.AddDeniedPath("/path/to/deny")
server, err := server.NewServerWithConfig(cfg)
Default Behavior
- If no paths are specified, the server defaults to allowing only the current working directory.
- Common sensitive directories like
.gitand.envare automatically added to the deny list.
Shell Command Security
For the execute_shell_command tool:
- Commands are restricted to a whitelist of common utilities
- Custom executable paths are checked against the allowed paths configuration
- Working directories must be within allowed paths
Adding New Tools
To add a new tool:
- Create a new file in the
internal/toolsdirectory - Implement the
Toolinterface - Optionally implement the
ConfigAwareinterface if your tool needs access to server configuration - Register the tool in
cmd/mcp-server/main.go
Example:
// internal/tools/newtool.go
package tools
import (
"github.com/metoro-io/mcp-golang"
"mcp-server/internal/config"
"mcp-server/internal/utils"
)
type NewToolArgs struct {
// Tool arguments
}
type NewTool struct{
config *config.ServerConfig
}
func NewNewTool() *NewTool {
return &NewTool{}
}
// Implement ConfigAware interface
func (t *NewTool) SetConfig(cfg *config.ServerConfig) {
t.config = cfg
}
func (t *NewTool) Name() string {
return "new_tool"
}
func (t *NewTool) Description() string {
return "Description of the new tool"
}
func (t *NewTool) Execute(args NewToolArgs) (*mcp.ToolResponse, error) {
// Access configuration if needed
if t.config != nil {
// Use configuration for security checks
}
// Tool implementation
return utils.CreateSuccessResponse(result), nil
}
Testing
go test ./...
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.