Skip to content

Commit 0e48729

Browse files
YangSen-qnYangSen-qn
andauthored
Change Doc (#7)
* Change README.md * add logo * README.md add tools --------- Co-authored-by: YangSen-qn <yangsen@qiniu.com>
1 parent 8fa63a0 commit 0e48729

File tree

6 files changed

+148
-24
lines changed

6 files changed

+148
-24
lines changed

README.md

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
# Qiniu MCP Server
22

3+
## 概述
4+
35
基于七牛云产品构建的 Model Context Protocol (MCP) Server,支持用户在 AI 大模型客户端的上下文中通过该 MCP
46
Server 来访问七牛云存储、智能多媒体服务等。
57

68
关于访问七牛云存储详细情况请参考 [基于 MCP 使用大模型访问七牛云存储](https://developer.qiniu.com/kodo/12914/mcp-aimodel-kodo)
79

8-
## 前置要求
10+
## 安装
11+
12+
**前置要求**
913

1014
- Python 3.12 或更高版本
1115
- uv 包管理器
@@ -16,8 +20,6 @@ Server 来访问七牛云存储、智能多媒体服务等。
1620
curl -LsSf https://astral.sh/uv/install.sh | sh
1721
```
1822

19-
## 安装
20-
2123
1. 克隆仓库:
2224

2325
```bash
@@ -82,9 +84,9 @@ uv --directory . run qiniu-mcp-server --transport sse --port 8000
8284

8385
## 开发
8486

85-
扩展功能,首先在 core 目录下新增一个业务目录(eg: 存储 -> storage),在此业务目录下完成功能拓展
87+
扩展功能,首先在 core 目录下新增一个业务包目录(eg: 存储 -> storage),在此业务包目录下完成功能拓展
8688
在业务包目录下的 `__init__.py` 文件中定义 load 函数用于注册业务工具或者资源,最后在 `core` 目录下的 `__init__.py`
87-
中调用此 load 函数完成工具和资源的注册
89+
中调用此 load 函数完成工具或资源的注册
8890

8991
```shell
9092
core
@@ -111,11 +113,11 @@ npx @modelcontextprotocol/inspector uv --directory . run qiniu-mcp-server
111113

112114
步骤:
113115

114-
1. 在 vscode 下载 cline 插件(下载后 cline 插件后在侧边栏会增加 cline 的图标)
116+
1. 在 vscode 下载 Cline 插件(下载后 Cline 插件后在侧边栏会增加 Cline 的图标)
115117
2. 配置大模型
116-
3. 配置 qiniu mcp
117-
1. 点击 cline 图标进入 cline 插件,选择 mcp server 模块
118-
2. 选择 installed,点击 Advanced MCP Settings 配置 mcp server,参考下面配置信息
118+
3. 配置 qiniu MCP
119+
1. 点击 Cline 图标进入 Cline 插件,选择 MCP Server 模块
120+
2. 选择 installed,点击 Advanced MCP Settings 配置 MCP Server,参考下面配置信息
119121
```
120122
{
121123
"mcpServers": {
@@ -139,14 +141,14 @@ npx @modelcontextprotocol/inspector uv --directory . run qiniu-mcp-server
139141
}
140142
}
141143
```
142-
3. 点击 qiniu mcp server 的链接开关进行连接
143-
4.cline 中创建一个 chat 窗口,此时我们可以和 AI 进行交互来使用 qiniu-mcp-server ,下面给出几个示例:
144+
3. 点击 qiniu MCP Server 的链接开关进行连接
145+
4.Cline 中创建一个聊天窗口,此时我们可以和 AI 进行交互来使用 qiniu-mcp-server ,下面给出几个示例:
144146
- 列举 qiniu 的资源信息
145-
- 列举 qiniu 中所有的 bucket
146-
- 列举 qiniu 中 xxx bucket 的文件
147-
- 读取 qiniu xxx bucket 中 yyy 的文件内容
148-
- 对 qiniu xxx bucket 中 yyy 的图片切个宽200像素的圆角
149-
- 刷新下 qiniu 的这个 cdn 链接:https://developer.qiniu.com/test.txt
147+
- 列举 qiniu 中所有的 Bucket
148+
- 列举 qiniu 中 xxx Bucket 的文件
149+
- 读取 qiniu xxx Bucket 中 yyy 的文件内容
150+
- 对 qiniu xxx Bucket 中 yyy 的图片切个宽200像素的圆角
151+
- 刷新下 qiniu 的这个 CDN 链接:https://developer.qiniu.com/test.txt
150152

151153

152154

mcp_server/README.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# 七牛云 MCP 服务器
2+
3+
基于七牛云产品构建的 Model Context Protocol (MCP) 服务器,支持在 AI 大模型的上下文中直接访问和操作七牛云的服务。
4+
5+
## Keywords
6+
七牛, Dora, Kodo, CDN
7+
8+
## Tools
9+
10+
### 存储工具
11+
12+
1. `ListBuckets`
13+
- 查询当前用户配置的 Bucket
14+
- Inputs:
15+
- `prefix` (string, optional): Bucket 名称前缀,用于筛选特定前缀的 Bucket
16+
- Returns:
17+
- 满足条件的 Bucket 列表及其详细信息
18+
19+
2. `ListObjects`
20+
- 列举指定 Bucket 中的文件列表
21+
- Inputs:
22+
- `bucket` (string): Bucket 名称
23+
- `max_keys` (integer, optional): 单次返回的最大文件数量,默认为20,最大值为100
24+
- `prefix` (string, optional): 文件 Key 前缀,用于筛选特定前缀的文件
25+
- `start_after` (string, optional): 起始标记,指定列表的开始位置,可以是上一次列举的结果中最后一个文件的 Key
26+
- Returns:
27+
- 满足条件的文件列表及其详细信息
28+
29+
3. `GetObject`
30+
- 获取 Bucket 中文件的内容
31+
- Inputs:
32+
- `bucket` (string): Bucket 名称
33+
- `key` (string): 文件的 Key
34+
- Returns:
35+
- 文件内容
36+
37+
4. `GetObjectURL`
38+
- 生成文件的访问链接,注意文件存储的 Bucket 必须绑定域名,七牛云测试域名不支持 HTTPS,需要用户自己处理为 HTTP。
39+
- Inputs:
40+
- `bucket` (string): Bucket 名称
41+
- `key` (string): 文件的 Key
42+
- `disable_ssl` (boolean, optional): 是否禁用 HTTPS,默认使用 HTTPS
43+
- `expires` (integer, optional): 链接有效期,单位为秒
44+
- Returns:
45+
- 对象的访问链接
46+
47+
### 图片处理工具
48+
49+
1. `ImageScaleByPercent`
50+
- 按照指定百分比缩放图片
51+
- Inputs:
52+
- `object_url` (string): 待处理图片的访问链接,图片必须存储在七牛云空间中
53+
- `percent` (integer): 缩放比例,范围为1%~999%
54+
- Returns:
55+
- `object_url`: 处理后图片的访问链接
56+
57+
2. `ImageScaleBySize`
58+
- 按照指定宽度或高度缩放图片
59+
- Inputs:
60+
- `object_url` (string): 待处理图片的访问链接,图片必须存储在七牛云空间中
61+
- `width` (integer, optional): 目标宽度,单位为像素
62+
- `height` (integer, optional): 目标高度,单位为像素
63+
- 注意:至少需要指定宽度或高度中的一个参数
64+
- Returns:
65+
- `object_url`: 处理后图片的访问链接
66+
67+
3. `ImageRoundCorner`
68+
- 为图片添加圆角效果
69+
- Inputs:
70+
- `object_url` (string): 待处理图片的访问链接,图片必须存储在七牛云空间中
71+
- `radius_x` (string, optional): 水平方向圆角半径,可使用像素值或百分比
72+
- `radius_y` (string, optional): 垂直方向圆角半径,可使用像素值或百分比
73+
- 注意:如果只指定一个参数,另一个参数将自动使用相同的值
74+
- Returns:
75+
- `object_url`: 处理后图片的访问链接
76+
77+
4. `ImageInfo`
78+
- 获取图片的基本信息
79+
- Inputs:
80+
- `object_url` (string): 图片的访问链接,图片必须存储在七牛云空间中
81+
- Returns:
82+
- `size`: 图片大小,单位为字节
83+
- `width`: 图片的宽度,单位为像素
84+
- `height`: 图片的高度,单位为像素
85+
- `format`: 图片的格式,如 png 等
86+
- `color_model`: 图片的颜色模型,如 nrgba
87+
88+
### CDN 工具
89+
90+
1. `CDNPrefetchUrls`
91+
- 预先将指定资源缓存到CDN节点,提高用户访问速度
92+
- Inputs:
93+
- `urls` (Array of string): 待预取资源的URL列表,最多支持60个URL
94+
- Returns:
95+
- 操作状态信息
96+
97+
2. `CDNRefresh`
98+
- 刷新CDN节点上的缓存资源,确保内容更新
99+
- Inputs:
100+
- `urls` (Array of string, optional): 需要刷新的具体URL列表,最多支持60个URL
101+
- `dirs` (Array of string, optional): 需要刷新的目录列表,最多支持10个目录
102+
- 注意:必须提供`urls``dirs`中的至少一项
103+
- Returns:
104+
- 操作状态信息
105+
106+
### 其他工具
107+
108+
1. `Version`
109+
- 获取七牛 MCP Server 的版本信息
110+
- Inputs: 无
111+
- Returns:
112+
- 服务器版本信息
113+
114+
115+
116+

mcp_server/core/media_processing/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from . import client
1+
from . import processing
22
from .tools import register_tools
33
from ...config import config
44

55

66
def load(cfg: config.Config):
7-
cli = client.Client(cfg)
7+
cli = processing.MediaProcessingService(cfg)
88
register_tools(cli)
99

1010

mcp_server/core/media_processing/client.py renamed to mcp_server/core/media_processing/processing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from ...config import config
44

55

6-
class Client:
6+
class MediaProcessingService:
77
def __init__(self, cfg: config.Config):
88
self.cfg = cfg
99
self.auth = qiniu.Auth(cfg.access_key, cfg.secret_key)

mcp_server/core/media_processing/tools.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from mcp import types
33

44
from . import utils
5-
from .client import Client
5+
from .processing import MediaProcessingService
66
from ...consts import consts
77
from ...tools import tools
88

@@ -12,7 +12,7 @@
1212

1313

1414
class _ToolImpl:
15-
def __init__(self, cli: Client):
15+
def __init__(self, cli: MediaProcessingService):
1616
self.client = cli
1717

1818
@tools.tool_meta(
@@ -259,7 +259,7 @@ def get_fop_status(self, **kwargs) -> list[types.TextContent]:
259259
return [types.TextContent(type="text", text=str(status))]
260260

261261

262-
def register_tools(cli: Client):
262+
def register_tools(cli: MediaProcessingService):
263263
tool_impl = _ToolImpl(cli)
264264
tools.auto_register_tools(
265265
[

mcp_server/core/media_processing/utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def url_add_processing_func(url: str, func: str) -> str:
1111

1212
url_info = parse.urlparse(url)
1313
new_query = _query_add_processing_func(url_info.query, func, func_prefix)
14-
new_query = parse.quote(new_query, safe="")
14+
new_query = parse.quote(new_query, safe='&=')
1515
url_info = url_info._replace(query=new_query)
1616
new_url = parse.urlunparse(url_info)
1717
return str(new_url)
@@ -28,13 +28,19 @@ def _query_add_processing_func(query: str, func: str, func_prefix: str) -> str:
2828

2929
# funcs 会放在第一个元素中
3030
first_query = parse.unquote(queries[0])
31-
queries.remove(queries[0])
3231

3332
# funcs 不存在
3433
if len(first_query) == 0:
3534
queries.insert(0, func)
3635
return "&".join(queries)
3736

37+
# first_query 有 = 说明不是 funcs
38+
if first_query.find("=") >= 0:
39+
queries.insert(0, func)
40+
return "&".join(queries)
41+
42+
queries.remove(queries[0])
43+
3844
# 未找到当前类别的 func
3945
if first_query.find(func_prefix) < 0:
4046
func = first_query + "|" + func

0 commit comments

Comments
 (0)