Skip to content

Commit 3227471

Browse files
committed
feat: Add dynamic toolset enable/disable functionality
- Bump version to 0.1.10 - Add `--enabled-toolsets` and `--disabled-toolsets` command-line options - Add `ENABLED_TOOLSETS` and `DISABLED_TOOLSETS` environment variables - Update documentation to reflect new features
1 parent 03a9447 commit 3227471

File tree

12 files changed

+168
-51
lines changed

12 files changed

+168
-51
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Makefile for cross-platform build
22
BINARY_NAME = mcp-gitee
3-
NPM_VERSION = 0.1.9
3+
NPM_VERSION = 0.1.10
44
GO = go
55
OSES = darwin linux windows
66
ARCHS = amd64 arm64

README.md

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Gitee MCP Server is a Model Context Protocol (MCP) server implementation for Git
88
- Configurable API base URL to support different Gitee instances
99
- Command-line flags for easy configuration
1010
- Supports both personal, organization, and enterprise operations
11+
- Dynamic toolset enable/disable
1112

1213
<details>
1314
<summary><b>Practical scenario: Obtain Issue from the repository, implement and create a Pull Request</b></summary>
@@ -99,18 +100,40 @@ config example: [Click to view more application configuration](./docs/install/)
99100

100101
### Command-line Options
101102

102-
- `-token`: Gitee access token
103-
- `-api-base`: Gitee API base URL (default: https://gitee.com/api/v5)
104-
- `-version`: Show version information
105-
- `-transport`: Transport type (stdio or sse, default: stdio)
106-
- `-sse-address`: The host and port to start the SSE server on (default: localhost:8000)
103+
- `--token`: Gitee access token
104+
- `--api-base`: Gitee API base URL (default: https://gitee.com/api/v5)
105+
- `--version`: Show version information
106+
- `--transport`: Transport type (stdio or sse, default: stdio)
107+
- `--sse-address`: The host and port to start the SSE server on (default: localhost:8000)
108+
- `--enabled-toolsets`: Comma-separated list of tools to enable (if specified, only these tools will be enabled)
109+
- `--disabled-toolsets`: Comma-separated list of tools to disable
107110

108111
### Environment Variables
109112

110113
You can also configure the server using environment variables:
111114

112115
- `GITEE_ACCESS_TOKEN`: Gitee access token
113116
- `GITEE_API_BASE`: Gitee API base URL
117+
- `ENABLED_TOOLSETS`: Comma-separated list of tools to enable
118+
- `DISABLED_TOOLSETS`: Comma-separated list of tools to disable
119+
120+
### Toolset Management
121+
122+
Toolset management supports two modes:
123+
124+
1. Enable specified tools (whitelist mode):
125+
- Use `--enabled-toolsets` parameter or `ENABLED_TOOLSETS` environment variable
126+
- Specify after, only listed tools will be enabled, others will be disabled
127+
- Example: `--enabled-toolsets="list_user_repos,get_file_content"`
128+
129+
2. Disable specified tools (blacklist mode):
130+
- Use `--disabled-toolsets` parameter or `DISABLED_TOOLSETS` environment variable
131+
- Specify after, listed tools will be disabled, others will be enabled
132+
- Example: `--disabled-toolsets="list_user_repos,get_file_content"`
133+
134+
Note:
135+
- If both `enabled-toolsets` and `disabled-toolsets` are specified, `enabled-toolsets` takes precedence
136+
- Tool names are case-sensitive
114137

115138
## License
116139

README_CN.md

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Gitee MCP 服务器是一个用于 Gitee 的模型上下文协议(Model Contex
88
- 可配置的 API 基础 URL,支持不同的 Gitee 实例
99
- 命令行标志,便于配置
1010
- 支持个人、组织和企业操作
11+
- 支持动态启用/禁用工具集
1112

1213
<details>
1314
<summary><b>实战场景:从仓库获取 Issue,实现并创建 Pull Request</b></summary>
@@ -100,18 +101,40 @@ mcp-gitee --version
100101

101102
### 命令行选项
102103

103-
- `-token`:Gitee 访问令牌
104-
- `-api-base`:Gitee API 基础 URL(默认:https://gitee.com/api/v5)
105-
- `-version`:显示版本信息
106-
- `-transport`:传输类型(stdio 或 sse,默认:stdio)
107-
- `-sse-address`:启动 SSE 服务器的主机和端口(默认:localhost:8000)
104+
- `--token`:Gitee 访问令牌
105+
- `--api-base`:Gitee API 基础 URL(默认:https://gitee.com/api/v5)
106+
- `--version`:显示版本信息
107+
- `--transport`:传输类型(stdio 或 sse,默认:stdio)
108+
- `--sse-address`:启动 SSE 服务器的主机和端口(默认:localhost:8000)
109+
- `--enabled-toolsets`: 逗号分隔的要启用的工具列表(如果指定,则只启用这些工具)
110+
- `--disabled-toolsets`: 逗号分隔的要禁用的工具列表
108111

109112
### 环境变量
110113

111114
您也可以使用环境变量配置服务器:
112115

113116
- `GITEE_ACCESS_TOKEN`:Gitee 访问令牌
114117
- `GITEE_API_BASE`:Gitee API 基础 URL
118+
- `ENABLED_TOOLSETS`: 逗号分隔的要启用的工具列表
119+
- `DISABLED_TOOLSETS`: 逗号分隔的要禁用的工具列表
120+
121+
### 工具集管理
122+
123+
工具集管理支持两种模式:
124+
125+
1. 启用指定工具(白名单模式):
126+
- 使用 `--enabled-toolsets` 参数或 `ENABLED_TOOLSETS` 环境变量
127+
- 指定后,只有列出的工具会被启用,其他工具都会被禁用
128+
- 例如:`--enabled-toolsets="update_enterprise_issue,list_enterprise_repositories"`
129+
130+
2. 禁用指定工具(黑名单模式):
131+
- 使用 `--disabled-toolsets` 参数或 `DISABLED_TOOLSETS` 环境变量
132+
- 指定后,列出的工具会被禁用,其他工具保持启用
133+
- 例如:`--disabled-toolsets="update_enterprise_issue,list_enterprise_repositories"`
134+
135+
注意:
136+
- 如果同时指定了 `enabled-toolsets``disabled-toolsets`,则 `enabled-toolsets` 优先
137+
- 工具名称区分大小写
115138

116139
## 许可证
117140

main.go

Lines changed: 97 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import (
44
"context"
55
"flag"
66
"fmt"
7+
"github.com/mark3labs/mcp-go/mcp"
78
"log"
89
"os"
10+
"strings"
911

1012
"gitee.com/oschina/mcp-gitee/operations/issues"
1113
"gitee.com/oschina/mcp-gitee/operations/notifications"
@@ -18,7 +20,9 @@ import (
1820
)
1921

2022
var (
21-
Version = utils.Version
23+
Version = utils.Version
24+
disabledToolsetsFlag string
25+
enabledToolsetsFlag string
2226
)
2327

2428
func newMCPServer() *server.MCPServer {
@@ -30,46 +34,111 @@ func newMCPServer() *server.MCPServer {
3034
)
3135
}
3236

37+
func addTool(s *server.MCPServer, tool mcp.Tool, handleFunc server.ToolHandlerFunc) {
38+
enabledToolsets := getEnabledToolsets()
39+
if len(enabledToolsets) == 0 {
40+
s.AddTool(tool, handleFunc)
41+
return
42+
}
43+
44+
for i := range enabledToolsets {
45+
enabledToolsets[i] = strings.TrimSpace(enabledToolsets[i])
46+
}
47+
48+
for _, keepTool := range enabledToolsets {
49+
if tool.Name == keepTool {
50+
s.AddTool(tool, handleFunc)
51+
return
52+
}
53+
}
54+
}
55+
56+
func disableTools(s *server.MCPServer) {
57+
if enabledToolsetsFlag != "" {
58+
enabledToolsetsFlag = os.Getenv("ENABLED_TOOLSETS")
59+
}
60+
61+
if enabledToolsetsFlag != "" {
62+
return
63+
}
64+
65+
if disabledTools := getDisabledToolsets(); len(disabledTools) > 0 {
66+
s.DeleteTools(disabledTools...)
67+
}
68+
}
69+
3370
func addTools(s *server.MCPServer) {
3471
// Repository Tools
35-
s.AddTool(repository.ListUserReposTool, repository.ListUserReposHandler)
36-
s.AddTool(repository.GetFileContentTool, repository.GetFileContentHandler)
37-
s.AddTool(repository.NewCreateRepoTool(repository.CreateUserRepo), repository.CreateRepoHandleFunc(repository.CreateUserRepo))
38-
s.AddTool(repository.NewCreateRepoTool(repository.CreateOrgRepo), repository.CreateRepoHandleFunc(repository.CreateOrgRepo))
39-
s.AddTool(repository.NewCreateRepoTool(repository.CreateEnterRepo), repository.CreateRepoHandleFunc(repository.CreateEnterRepo))
40-
s.AddTool(repository.CreateReleaseTool, repository.CreateReleaseHandleFunc)
41-
s.AddTool(repository.ListReleasesTool, repository.ListReleasesHandleFunc)
42-
s.AddTool(repository.SearchReposTool, repository.SearchOpenSourceReposHandler)
43-
s.AddTool(repository.ForkRepositoryTool, repository.ForkRepositoryHandler)
72+
addTool(s, repository.ListUserReposTool, repository.ListUserReposHandler)
73+
addTool(s, repository.GetFileContentTool, repository.GetFileContentHandler)
74+
addTool(s, repository.NewCreateRepoTool(repository.CreateUserRepo), repository.CreateRepoHandleFunc(repository.CreateUserRepo))
75+
addTool(s, repository.NewCreateRepoTool(repository.CreateOrgRepo), repository.CreateRepoHandleFunc(repository.CreateOrgRepo))
76+
addTool(s, repository.NewCreateRepoTool(repository.CreateEnterRepo), repository.CreateRepoHandleFunc(repository.CreateEnterRepo))
77+
addTool(s, repository.CreateReleaseTool, repository.CreateReleaseHandleFunc)
78+
addTool(s, repository.ListReleasesTool, repository.ListReleasesHandleFunc)
79+
addTool(s, repository.SearchReposTool, repository.SearchOpenSourceReposHandler)
80+
addTool(s, repository.ForkRepositoryTool, repository.ForkRepositoryHandler)
4481

4582
// Pulls Tools
46-
s.AddTool(pulls.NewListPullsTool(pulls.ListRepoPullsToolName), pulls.ListPullsHandleFunc(pulls.ListRepoPullsToolName))
47-
s.AddTool(pulls.CreatePullTool, pulls.CreatePullHandleFunc)
48-
s.AddTool(pulls.UpdatePullTool, pulls.UpdatePullHandleFunc)
49-
s.AddTool(pulls.GetPullDetailTool, pulls.GetPullDetailHandleFunc)
50-
s.AddTool(pulls.CommentPullTool, pulls.CommentPullHandleFunc)
51-
s.AddTool(pulls.MergePullTool, pulls.MergePullHandleFunc)
52-
s.AddTool(pulls.ListPullCommentsTool, pulls.ListPullCommentsHandleFunc)
83+
addTool(s, pulls.NewListPullsTool(pulls.ListRepoPullsToolName), pulls.ListPullsHandleFunc(pulls.ListRepoPullsToolName))
84+
addTool(s, pulls.CreatePullTool, pulls.CreatePullHandleFunc)
85+
addTool(s, pulls.UpdatePullTool, pulls.UpdatePullHandleFunc)
86+
addTool(s, pulls.GetPullDetailTool, pulls.GetPullDetailHandleFunc)
87+
addTool(s, pulls.CommentPullTool, pulls.CommentPullHandleFunc)
88+
addTool(s, pulls.MergePullTool, pulls.MergePullHandleFunc)
89+
addTool(s, pulls.ListPullCommentsTool, pulls.ListPullCommentsHandleFunc)
5390

5491
// Issues Tools
55-
s.AddTool(issues.CreateIssueTool, issues.CreateIssueHandleFunc)
56-
s.AddTool(issues.UpdateIssueTool, issues.UpdateIssueHandleFunc)
57-
s.AddTool(issues.NewGetIssueDetailTool(issues.GetRepoIssueDetailToolName), issues.GetIssueDetailHandleFunc(issues.GetRepoIssueDetailToolName))
58-
s.AddTool(issues.NewListIssuesTool(issues.ListRepoIssuesToolName), issues.ListIssuesHandleFunc(issues.ListRepoIssuesToolName))
59-
s.AddTool(issues.CommentIssueTool, issues.CommentIssueHandleFunc)
60-
s.AddTool(issues.ListIssueCommentsTool, issues.ListIssueCommentsHandleFunc)
92+
addTool(s, issues.CreateIssueTool, issues.CreateIssueHandleFunc)
93+
addTool(s, issues.UpdateIssueTool, issues.UpdateIssueHandleFunc)
94+
addTool(s, issues.NewGetIssueDetailTool(issues.GetRepoIssueDetailToolName), issues.GetIssueDetailHandleFunc(issues.GetRepoIssueDetailToolName))
95+
addTool(s, issues.NewListIssuesTool(issues.ListRepoIssuesToolName), issues.ListIssuesHandleFunc(issues.ListRepoIssuesToolName))
96+
addTool(s, issues.CommentIssueTool, issues.CommentIssueHandleFunc)
97+
addTool(s, issues.ListIssueCommentsTool, issues.ListIssueCommentsHandleFunc)
6198

6299
// Notifications Tools
63-
s.AddTool(notifications.ListUserNotificationsTool, notifications.ListUserNotificationsHandler)
100+
addTool(s, notifications.ListUserNotificationsTool, notifications.ListUserNotificationsHandler)
64101

65102
// Users Tools
66-
s.AddTool(users.GetUserInfoTool, users.GetUserInfoHandleFunc())
67-
s.AddTool(users.SearchUsersTool, users.SearchUsersHandler)
103+
addTool(s, users.GetUserInfoTool, users.GetUserInfoHandleFunc())
104+
addTool(s, users.SearchUsersTool, users.SearchUsersHandler)
105+
}
106+
107+
func getDisabledToolsets() []string {
108+
if disabledToolsetsFlag == "" {
109+
disabledToolsetsFlag = os.Getenv("DISABLED_TOOLSETS")
110+
}
111+
112+
if disabledToolsetsFlag == "" {
113+
return nil
114+
}
115+
116+
tools := strings.Split(disabledToolsetsFlag, ",")
117+
for i := range tools {
118+
tools[i] = strings.TrimSpace(tools[i])
119+
}
120+
121+
return tools
122+
}
123+
124+
func getEnabledToolsets() []string {
125+
if enabledToolsetsFlag == "" {
126+
enabledToolsetsFlag = os.Getenv("ENABLED_TOOLSETS")
127+
}
128+
if enabledToolsetsFlag == "" {
129+
return nil
130+
}
131+
tools := strings.Split(enabledToolsetsFlag, ",")
132+
for i := range tools {
133+
tools[i] = strings.TrimSpace(tools[i])
134+
}
135+
return tools
68136
}
69137

70138
func run(transport, addr string) error {
71139
s := newMCPServer()
72140
addTools(s)
141+
disableTools(s)
73142

74143
switch transport {
75144
case "stdio":
@@ -103,6 +172,8 @@ func main() {
103172
showVersion := flag.Bool("version", false, "Show version information")
104173
transport := flag.String("transport", "stdio", "Transport type (stdio or sse)")
105174
addr := flag.String("sse-address", "localhost:8000", "The host and port to start the sse server on")
175+
flag.StringVar(&disabledToolsetsFlag, "disabled-toolsets", "", "Comma-separated list of tools to disable")
176+
flag.StringVar(&enabledToolsetsFlag, "enabled-toolsets", "", "Comma-separated list of tools to enable (if specified, only these tools will be available)")
106177
flag.Parse()
107178

108179
if *showVersion {

npm/mcp-gitee-darwin-amd64/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitee/mcp-gitee-darwin-amd64",
3-
"version": "0.1.9",
3+
"version": "0.1.10",
44
"description": "Model Context Protocol (MCP) server for Gitee",
55
"os": [
66
"darwin"

npm/mcp-gitee-darwin-arm64/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitee/mcp-gitee-darwin-arm64",
3-
"version": "0.1.9",
3+
"version": "0.1.10",
44
"description": "Model Context Protocol (MCP) server for Gitee",
55
"os": [
66
"darwin"

npm/mcp-gitee-linux-amd64/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitee/mcp-gitee-linux-amd64",
3-
"version": "0.1.9",
3+
"version": "0.1.10",
44
"description": "Model Context Protocol (MCP) server for Gitee",
55
"os": [
66
"linux"

npm/mcp-gitee-linux-arm64/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitee/mcp-gitee-linux-arm64",
3-
"version": "0.1.9",
3+
"version": "0.1.10",
44
"description": "Model Context Protocol (MCP) server for Gitee",
55
"os": [
66
"linux"

npm/mcp-gitee-windows-amd64/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitee/mcp-gitee-windows-amd64",
3-
"version": "0.1.9",
3+
"version": "0.1.10",
44
"description": "Model Context Protocol (MCP) server for Gitee",
55
"os": [
66
"win32"

npm/mcp-gitee-windows-arm64/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitee/mcp-gitee-windows-arm64",
3-
"version": "0.1.9",
3+
"version": "0.1.10",
44
"description": "Model Context Protocol (MCP) server for Gitee",
55
"os": [
66
"win32"

0 commit comments

Comments
 (0)