sufy-mcp-server 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. sufy_mcp_server-1.0.0/.env.example +6 -0
  2. sufy_mcp_server-1.0.0/.github/workflows/ruff.yml +8 -0
  3. sufy_mcp_server-1.0.0/.gitignore +13 -0
  4. sufy_mcp_server-1.0.0/.idea/.gitignore +8 -0
  5. sufy_mcp_server-1.0.0/.idea/demo.iml +10 -0
  6. sufy_mcp_server-1.0.0/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  7. sufy_mcp_server-1.0.0/.idea/misc.xml +7 -0
  8. sufy_mcp_server-1.0.0/.idea/modules.xml +8 -0
  9. sufy_mcp_server-1.0.0/.idea/vcs.xml +6 -0
  10. sufy_mcp_server-1.0.0/.idea/workspace.xml +208 -0
  11. sufy_mcp_server-1.0.0/.python-version +1 -0
  12. sufy_mcp_server-1.0.0/CHANGELOG.md +3 -0
  13. sufy_mcp_server-1.0.0/LICENSE.txt +21 -0
  14. sufy_mcp_server-1.0.0/PKG-INFO +13 -0
  15. sufy_mcp_server-1.0.0/README.md +139 -0
  16. sufy_mcp_server-1.0.0/README_zh.md +146 -0
  17. sufy_mcp_server-1.0.0/docs/images/logo.png +0 -0
  18. sufy_mcp_server-1.0.0/pyproject.toml +24 -0
  19. sufy_mcp_server-1.0.0/src/mcp_server/__init__.py +11 -0
  20. sufy_mcp_server-1.0.0/src/mcp_server/application.py +53 -0
  21. sufy_mcp_server-1.0.0/src/mcp_server/config/__init__.py +0 -0
  22. sufy_mcp_server-1.0.0/src/mcp_server/config/config.py +52 -0
  23. sufy_mcp_server-1.0.0/src/mcp_server/consts/__init__.py +0 -0
  24. sufy_mcp_server-1.0.0/src/mcp_server/consts/consts.py +1 -0
  25. sufy_mcp_server-1.0.0/src/mcp_server/core/__init__.py +17 -0
  26. sufy_mcp_server-1.0.0/src/mcp_server/core/media_processing/__init__.py +11 -0
  27. sufy_mcp_server-1.0.0/src/mcp_server/core/media_processing/tools.py +179 -0
  28. sufy_mcp_server-1.0.0/src/mcp_server/core/media_processing/utils.py +157 -0
  29. sufy_mcp_server-1.0.0/src/mcp_server/core/storage/__init__.py +13 -0
  30. sufy_mcp_server-1.0.0/src/mcp_server/core/storage/resource.py +158 -0
  31. sufy_mcp_server-1.0.0/src/mcp_server/core/storage/storage.py +203 -0
  32. sufy_mcp_server-1.0.0/src/mcp_server/core/storage/tools.py +154 -0
  33. sufy_mcp_server-1.0.0/src/mcp_server/core/version/__init__.py +9 -0
  34. sufy_mcp_server-1.0.0/src/mcp_server/core/version/tools.py +31 -0
  35. sufy_mcp_server-1.0.0/src/mcp_server/core/version/version.py +2 -0
  36. sufy_mcp_server-1.0.0/src/mcp_server/resource/__init__.py +0 -0
  37. sufy_mcp_server-1.0.0/src/mcp_server/resource/resource.py +61 -0
  38. sufy_mcp_server-1.0.0/src/mcp_server/server.py +72 -0
  39. sufy_mcp_server-1.0.0/src/mcp_server/tools/__init__.py +0 -0
  40. sufy_mcp_server-1.0.0/src/mcp_server/tools/tools.py +138 -0
  41. sufy_mcp_server-1.0.0/uv.lock +887 -0
@@ -0,0 +1,6 @@
1
+ # S3/Sufy 认证信息
2
+ SUFY_ACCESS_KEY=your_access_key
3
+ SUFY_SECRET_KEY=your_secret_key
4
+ SUFY_REGION_NAME=your_region # eg:us-south-1
5
+ SUFY_ENDPOINT_URL=endpoint_url # eg:https://mos.us-south-1.sufybkt.com
6
+ SUFY_BUCKETS=bucket1,bucket2,bucket3
@@ -0,0 +1,8 @@
1
+ name: Ruff
2
+ on: [push, pull_request]
3
+ jobs:
4
+ ruff:
5
+ runs-on: ubuntu-latest
6
+ steps:
7
+ - uses: actions/checkout@v4
8
+ - uses: astral-sh/ruff-action@v3
@@ -0,0 +1,13 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ .env
12
+
13
+ test.py
@@ -0,0 +1,8 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.venv" />
6
+ </content>
7
+ <orderEntry type="jdk" jdkName="Python 3.12 (sufy-mcp-server)" jdkType="Python SDK" />
8
+ <orderEntry type="sourceFolder" forTests="false" />
9
+ </component>
10
+ </module>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.9 (mcp-server)" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (sufy-mcp-server)" project-jdk-type="Python SDK" />
7
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/demo.iml" filepath="$PROJECT_DIR$/.idea/demo.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,208 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="fa567ce3-5664-44c9-99d5-2af592d41018" name="Changes" comment="" />
8
+ <option name="SHOW_DIALOG" value="false" />
9
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
10
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11
+ <option name="LAST_RESOLUTION" value="IGNORE" />
12
+ </component>
13
+ <component name="FileTemplateManagerImpl">
14
+ <option name="RECENT_TEMPLATES">
15
+ <list>
16
+ <option value="Python Script" />
17
+ </list>
18
+ </option>
19
+ </component>
20
+ <component name="Git.Settings">
21
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
22
+ </component>
23
+ <component name="ProjectColorInfo">{
24
+ &quot;associatedIndex&quot;: 4
25
+ }</component>
26
+ <component name="ProjectId" id="2uFyAMrS01i95liKU4P48OfEkJj" />
27
+ <component name="ProjectViewState">
28
+ <option name="hideEmptyMiddlePackages" value="true" />
29
+ <option name="showLibraryContents" value="true" />
30
+ </component>
31
+ <component name="PropertiesComponent"><![CDATA[{
32
+ "keyToString": {
33
+ "Python.client.executor": "Debug",
34
+ "Python.server (1).executor": "Debug",
35
+ "Python.server.executor": "Debug",
36
+ "Python.test.executor": "Debug",
37
+ "RunOnceActivity.ShowReadmeOnStart": "true",
38
+ "git-widget-placeholder": "main",
39
+ "node.js.detected.package.eslint": "true",
40
+ "node.js.detected.package.tslint": "true",
41
+ "node.js.selected.package.eslint": "(autodetect)",
42
+ "node.js.selected.package.tslint": "(autodetect)",
43
+ "nodejs_package_manager_path": "npm",
44
+ "settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
45
+ "vue.rearranger.settings.migration": "true"
46
+ }
47
+ }]]></component>
48
+ <component name="RecentsManager">
49
+ <key name="MoveFile.RECENT_KEYS">
50
+ <recent name="$PROJECT_DIR$/src" />
51
+ <recent name="$PROJECT_DIR$/docs" />
52
+ <recent name="$PROJECT_DIR$/mcp_server/biz/storage" />
53
+ <recent name="$PROJECT_DIR$/src/consts" />
54
+ <recent name="$PROJECT_DIR$/src/tools" />
55
+ </key>
56
+ </component>
57
+ <component name="RunManager" selected="Python.test">
58
+ <configuration name="client" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
59
+ <module name="demo" />
60
+ <option name="ENV_FILES" value="" />
61
+ <option name="INTERPRETER_OPTIONS" value="" />
62
+ <option name="PARENT_ENVS" value="true" />
63
+ <envs>
64
+ <env name="PYTHONUNBUFFERED" value="1" />
65
+ </envs>
66
+ <option name="SDK_HOME" value="" />
67
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
68
+ <option name="IS_MODULE_SDK" value="true" />
69
+ <option name="ADD_CONTENT_ROOTS" value="true" />
70
+ <option name="ADD_SOURCE_ROOTS" value="true" />
71
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
72
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/client.py" />
73
+ <option name="PARAMETERS" value="" />
74
+ <option name="SHOW_COMMAND_LINE" value="false" />
75
+ <option name="EMULATE_TERMINAL" value="false" />
76
+ <option name="MODULE_MODE" value="false" />
77
+ <option name="REDIRECT_INPUT" value="false" />
78
+ <option name="INPUT_FILE" value="" />
79
+ <method v="2" />
80
+ </configuration>
81
+ <configuration name="server (1)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
82
+ <module name="demo" />
83
+ <option name="ENV_FILES" value="" />
84
+ <option name="INTERPRETER_OPTIONS" value="" />
85
+ <option name="PARENT_ENVS" value="true" />
86
+ <envs>
87
+ <env name="PYTHONUNBUFFERED" value="1" />
88
+ </envs>
89
+ <option name="SDK_HOME" value="" />
90
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/mcp_server" />
91
+ <option name="IS_MODULE_SDK" value="true" />
92
+ <option name="ADD_CONTENT_ROOTS" value="true" />
93
+ <option name="ADD_SOURCE_ROOTS" value="true" />
94
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
95
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/mcp_server/server.py" />
96
+ <option name="PARAMETERS" value="" />
97
+ <option name="SHOW_COMMAND_LINE" value="false" />
98
+ <option name="EMULATE_TERMINAL" value="false" />
99
+ <option name="MODULE_MODE" value="false" />
100
+ <option name="REDIRECT_INPUT" value="false" />
101
+ <option name="INPUT_FILE" value="" />
102
+ <method v="2" />
103
+ </configuration>
104
+ <configuration name="server" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
105
+ <module name="demo" />
106
+ <option name="ENV_FILES" value="" />
107
+ <option name="INTERPRETER_OPTIONS" value="" />
108
+ <option name="PARENT_ENVS" value="true" />
109
+ <envs>
110
+ <env name="PYTHONUNBUFFERED" value="1" />
111
+ </envs>
112
+ <option name="SDK_HOME" value="" />
113
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/mcp" />
114
+ <option name="IS_MODULE_SDK" value="true" />
115
+ <option name="ADD_CONTENT_ROOTS" value="true" />
116
+ <option name="ADD_SOURCE_ROOTS" value="true" />
117
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
118
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/mcp/server.py" />
119
+ <option name="PARAMETERS" value="" />
120
+ <option name="SHOW_COMMAND_LINE" value="false" />
121
+ <option name="EMULATE_TERMINAL" value="false" />
122
+ <option name="MODULE_MODE" value="false" />
123
+ <option name="REDIRECT_INPUT" value="false" />
124
+ <option name="INPUT_FILE" value="" />
125
+ <method v="2" />
126
+ </configuration>
127
+ <configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
128
+ <module name="demo" />
129
+ <option name="ENV_FILES" value="" />
130
+ <option name="INTERPRETER_OPTIONS" value="" />
131
+ <option name="PARENT_ENVS" value="true" />
132
+ <envs>
133
+ <env name="PYTHONUNBUFFERED" value="1" />
134
+ </envs>
135
+ <option name="SDK_HOME" value="" />
136
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/mcp_server" />
137
+ <option name="IS_MODULE_SDK" value="true" />
138
+ <option name="ADD_CONTENT_ROOTS" value="true" />
139
+ <option name="ADD_SOURCE_ROOTS" value="true" />
140
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
141
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/mcp_server/test.py" />
142
+ <option name="PARAMETERS" value="" />
143
+ <option name="SHOW_COMMAND_LINE" value="false" />
144
+ <option name="EMULATE_TERMINAL" value="false" />
145
+ <option name="MODULE_MODE" value="false" />
146
+ <option name="REDIRECT_INPUT" value="false" />
147
+ <option name="INPUT_FILE" value="" />
148
+ <method v="2" />
149
+ </configuration>
150
+ <recent_temporary>
151
+ <list>
152
+ <item itemvalue="Python.test" />
153
+ <item itemvalue="Python.server (1)" />
154
+ <item itemvalue="Python.server" />
155
+ <item itemvalue="Python.client" />
156
+ </list>
157
+ </recent_temporary>
158
+ </component>
159
+ <component name="SharedIndexes">
160
+ <attachedChunks>
161
+ <set>
162
+ <option value="bundled-js-predefined-d6986cc7102b-7c0b70fcd90d-JavaScript-PY-242.21829.153" />
163
+ <option value="bundled-python-sdk-464836ebc622-b74155a9e76b-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-242.21829.153" />
164
+ </set>
165
+ </attachedChunks>
166
+ </component>
167
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
168
+ <component name="TaskManager">
169
+ <task active="true" id="Default" summary="Default task">
170
+ <changelist id="fa567ce3-5664-44c9-99d5-2af592d41018" name="Changes" comment="" />
171
+ <created>1741858472943</created>
172
+ <option name="number" value="Default" />
173
+ <option name="presentableId" value="Default" />
174
+ <updated>1741858472943</updated>
175
+ <workItem from="1741858474073" duration="4607000" />
176
+ <workItem from="1741867136217" duration="599000" />
177
+ <workItem from="1741934215275" duration="9489000" />
178
+ <workItem from="1741945627423" duration="2208000" />
179
+ <workItem from="1741948344370" duration="116000" />
180
+ <workItem from="1741948472546" duration="5297000" />
181
+ <workItem from="1742953250766" duration="10839000" />
182
+ <workItem from="1742970629916" duration="4121000" />
183
+ <workItem from="1742983816785" duration="8358000" />
184
+ <workItem from="1743405438634" duration="734000" />
185
+ <workItem from="1743406257711" duration="126000" />
186
+ <workItem from="1743564699701" duration="7516000" />
187
+ <workItem from="1743577301559" duration="31287000" />
188
+ <workItem from="1743669402740" duration="79274000" />
189
+ <workItem from="1744194299783" duration="717000" />
190
+ <workItem from="1744255142075" duration="11042000" />
191
+ <workItem from="1744275969330" duration="1857000" />
192
+ <workItem from="1744277833149" duration="22359000" />
193
+ <workItem from="1744595899820" duration="38208000" />
194
+ </task>
195
+ <servers />
196
+ </component>
197
+ <component name="TypeScriptGeneratedFilesManager">
198
+ <option name="version" value="3" />
199
+ </component>
200
+ <component name="com.intellij.coverage.CoverageDataManagerImpl">
201
+ <SUITE FILE_PATH="coverage/demo$server__1_.coverage" NAME="server (1) Coverage Results" MODIFIED="1741949177226" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mcp_server" />
202
+ <SUITE FILE_PATH="coverage/qiniu_mcp_server$test.coverage" NAME="test Coverage Results" MODIFIED="1744275627541" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mcp_server" />
203
+ <SUITE FILE_PATH="coverage/demo$server.coverage" NAME="server Coverage Results" MODIFIED="1741948818126" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mcp" />
204
+ <SUITE FILE_PATH="coverage/qiniu_mcp$server__1_.coverage" NAME="server (1) Coverage Results" MODIFIED="1742969398555" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mcp_server" />
205
+ <SUITE FILE_PATH="coverage/demo$client.coverage" NAME="client Coverage Results" MODIFIED="1741864776694" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
206
+ <SUITE FILE_PATH="coverage/qiniu_mcp_server$server__1_.coverage" NAME="server (1) Coverage Results" MODIFIED="1743660431369" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mcp_server" />
207
+ </component>
208
+ </project>
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,3 @@
1
+ # v1.0.0
2
+
3
+ - 支持访问存储、多媒体服务
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Sufy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 2.4
2
+ Name: sufy-mcp-server
3
+ Version: 1.0.0
4
+ Summary: A MCP server project of Sufy.
5
+ License-File: LICENSE.txt
6
+ Requires-Python: >=3.12
7
+ Requires-Dist: aioboto3>=13.2.0
8
+ Requires-Dist: fastjsonschema>=2.21.1
9
+ Requires-Dist: httpx>=0.28.1
10
+ Requires-Dist: mcp[cli]>=1.0.0
11
+ Requires-Dist: openai>=1.66.3
12
+ Requires-Dist: pip>=25.0.1
13
+ Requires-Dist: python-dotenv>=1.0.1
@@ -0,0 +1,139 @@
1
+ # Sufy MCP Server
2
+
3
+ [Chinese Documentation](README_zh.md) | [English Documentation](README.md)
4
+
5
+ ## Overview
6
+
7
+ The Model Context Protocol (MCP) Server built on Sufy products allows users to access Sufy services through this MCP Server within the context of AI large model clients.
8
+
9
+ ## Environment Requirements
10
+
11
+ • Python 3.12 or higher
12
+ • uv package manager
13
+
14
+ If you haven't installed uv yet, you can install it with the following command:
15
+
16
+ ```bash
17
+ curl -LsSf https://astral.sh/uv/install.sh | sh
18
+ ```
19
+
20
+ ## Usage in Cline
21
+
22
+ Steps:
23
+
24
+ 1. Install the Cline plugin in VSCode (the Cline icon will appear in the sidebar after installation)
25
+ 2. Configure the Large Model
26
+ 3. Configure Sufy MCP
27
+ 1. Click the Cline icon to enter the plugin interface and select the MCP Server module
28
+ 2. Choose "Installed", click "Advanced MCP Settings", and configure using the following template:
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "Sufy": {
33
+ "command": "uvx",
34
+ "args": [
35
+ "sufy-mcp-server"
36
+ ],
37
+ "env": {
38
+ "SUFY_ACCESS_KEY": "YOUR_ACCESS_KEY",
39
+ "SUFY_SECRET_KEY": "YOUR_SECRET_KEY",
40
+ "SUFY_REGION_NAME": "YOUR_REGION_NAME",
41
+ "SUFY_ENDPOINT_URL": "YOUR_ENDPOINT_URL",
42
+ "SUFY_BUCKETS": "YOUR_BUCKET_A,YOUR_BUCKET_B"
43
+ },
44
+ "disabled": false
45
+ }
46
+ }
47
+ }
48
+ ```
49
+ 3. Toggle the connection switch for Sufy MCP Server to establish connection
50
+ 4. Create a chat window in Cline to interact with AI using sufy-mcp-server. Example prompts:
51
+ ◦ List Sufy resource information
52
+ ◦ List all Buckets in Sufy
53
+ ◦ List files in Sufy's xxx Bucket
54
+ ◦ Read content of yyy file in Sufy's xxx Bucket
55
+ ◦ Resize image yyy in Sufy's xxx Bucket by 20%
56
+
57
+ Note: When creating an MCP Server in Cline, you can directly use the above configuration.
58
+
59
+ ## Development
60
+
61
+ 1. Clone the repository:
62
+ ```bash
63
+ git clone git@github.com:sufy/sufy-mcp-server.git
64
+ cd sufy-mcp-server
65
+ ```
66
+
67
+ 2. Create and activate virtual environment:
68
+ ```bash
69
+ uv venv
70
+ source .venv/bin/activate # Linux/macOS
71
+ # or
72
+ .venv\Scripts\activate # Windows
73
+ ```
74
+
75
+ 3. Install dependencies:
76
+ ```bash
77
+ uv pip install -e .
78
+ ```
79
+
80
+ 4. Configuration
81
+
82
+ Copy environment template:
83
+ ```bash
84
+ cp .env.example .env
85
+ ```
86
+
87
+ Edit `.env` file with these parameters:
88
+ ```bash
89
+ # S3/Sufy credentials
90
+ SUFY_ACCESS_KEY=your_access_key
91
+ SUFY_SECRET_KEY=your_secret_key
92
+
93
+ # Region info
94
+ SUFY_REGION_NAME=your_region
95
+ SUFY_ENDPOINT_URL=endpoint_url # eg:https://s3.your_region.sufycs.com
96
+
97
+ # Configure buckets (comma-separated, max 20 recommended)
98
+ SUFY_BUCKETS=bucket1,bucket2,bucket3
99
+ ```
100
+
101
+ For feature extensions:
102
+ 1. Create a new business package directory under `core` (e.g., storage)
103
+ 2. Implement features in the package directory
104
+ 3. Register tools/resources via `load()` function in the package's `__init__.py`
105
+ 4. Call the load function in `core/__init__.py` to complete registration
106
+
107
+ Directory structure:
108
+ ```shell
109
+ core
110
+ ├── __init__.py # Load business tools/resources
111
+ └── storage # Storage service
112
+ ├── __init__.py # Load storage tools/resources
113
+ ├── resource.py # Storage resources
114
+ ├── storage.py # Storage utilities
115
+ └── tools.py # Storage tools
116
+ ```
117
+
118
+ ## Testing
119
+
120
+ ### Using Model Control Protocol Inspector
121
+
122
+ Recommended tool: [Model Control Protocol Inspector](https://github.com/modelcontextprotocol/inspector)
123
+
124
+ ```shell
125
+ # Requires node v22.4.0
126
+ npx @modelcontextprotocol/inspector uv --directory . run sufy-mcp-server
127
+ ```
128
+
129
+ ### Local MCP Server Examples
130
+
131
+ 1. Start in stdio mode (default):
132
+ ```bash
133
+ uv --directory . run sufy-mcp-server
134
+ ```
135
+
136
+ 2. Start in SSE mode (for web applications):
137
+ ```bash
138
+ uv --directory . run sufy-mcp-server --transport sse --port 8000
139
+ ```
@@ -0,0 +1,146 @@
1
+ # Sufy MCP Server
2
+
3
+ [中文文档](README_zh.md) | [英文文档](README.md)
4
+
5
+ ## 概述
6
+
7
+ 基于 Sufy 产品构建的 Model Context Protocol (MCP) Server,支持用户在 AI 大模型客户端的上下文中通过该 MCP
8
+ Server 来访问 Sufy 服务。
9
+
10
+ ## 环境要求
11
+
12
+ - Python 3.12 或更高版本
13
+ - uv 包管理器
14
+
15
+ 如果还没有安装 uv,可以使用以下命令安装:
16
+
17
+ ```bash
18
+ curl -LsSf https://astral.sh/uv/install.sh | sh
19
+ ```
20
+
21
+ ## 在 Cline 中使用:
22
+
23
+ 步骤:
24
+
25
+ 1. 在 vscode 下载 Cline 插件(下载后 Cline 插件后在侧边栏会增加 Cline 的图标)
26
+ 2. 配置大模型
27
+ 3. 配置 Sufy MCP
28
+ 1. 点击 Cline 图标进入 Cline 插件,选择 MCP Server 模块
29
+ 2. 选择 installed,点击 Advanced MCP Settings 配置 MCP Server,参考下面配置信息
30
+ ```
31
+ {
32
+ "mcpServers": {
33
+ "Sufy": {
34
+ "command": "uvx",
35
+ "args": [
36
+ "sufy-mcp-server"
37
+ ],
38
+ "env": {
39
+ "SUFY_ACCESS_KEY": "YOUR_ACCESS_KEY",
40
+ "SUFY_SECRET_KEY": "YOUR_SECRET_KEY",
41
+ "SUFY_REGION_NAME": "YOUR_REGION_NAME",
42
+ "SUFY_ENDPOINT_URL": "YOUR_ENDPOINT_URL",
43
+ "SUFY_BUCKETS": "YOUR_BUCKET_A,YOUR_BUCKET_B"
44
+ },
45
+ "disabled": false
46
+ }
47
+ }
48
+ }
49
+ ```
50
+ 3. 点击 Sufy MCP Server 的链接开关进行连接
51
+ 4. 在 Cline 中创建一个聊天窗口,此时我们可以和 AI 进行交互来使用 sufy-mcp-server ,下面给出几个示例:
52
+ - 列举 Sufy 的资源信息
53
+ - 列举 Sufy 中所有的 Bucket
54
+ - 列举 Sufy 中 xxx Bucket 的文件
55
+ - 读取 Sufy xxx Bucket 中 yyy 的文件内容
56
+ - 对 Sufy xxx Bucket 中 yyy 的图片缩小20%
57
+
58
+ 注:cursor 中创建 MCP Server 可以直接使用上述配置
59
+
60
+
61
+ ## 开发
62
+ 1. 克隆仓库:
63
+
64
+ ```bash
65
+ # 克隆项目并进入目录
66
+ git clone git@github.com:sufy/sufy-mcp-server.git
67
+ cd sufy-mcp-server
68
+ ```
69
+
70
+ 2. 创建并激活虚拟环境:
71
+
72
+ ```bash
73
+ uv venv
74
+ source .venv/bin/activate # Linux/macOS
75
+ # 或
76
+ .venv\Scripts\activate # Windows
77
+ ```
78
+
79
+ 3. 安装依赖:
80
+
81
+ ```bash
82
+ uv pip install -e .
83
+ ```
84
+
85
+ 4. 配置
86
+
87
+ 复制环境变量模板:
88
+ ```bash
89
+ cp .env.example .env
90
+ ```
91
+
92
+ 编辑 `.env` 文件,配置以下参数:
93
+ ```bash
94
+ # S3/Sufy 认证信息
95
+ SUFY_ACCESS_KEY=your_access_key
96
+ SUFY_SECRET_KEY=your_secret_key
97
+
98
+ # 区域信息
99
+ SUFY_REGION_NAME=your_region
100
+ SUFY_ENDPOINT_URL=endpoint_url # eg:https://s3.your_region.sufycs.com
101
+
102
+ # 配置 bucket,多个 bucket 使用逗号隔开,建议最多配置 20 个 bucket
103
+ SUFY_BUCKETS=bucket1,bucket2,bucket3
104
+ ```
105
+
106
+ 扩展功能,首先在 core 目录下新增一个业务包目录(eg: 存储 -> storage),在此业务包目录下完成功能拓展。
107
+ 在业务包目录下的 `__init__.py` 文件中定义 load 函数用于注册业务工具或者资源,最后在 `core` 目录下的 `__init__.py`
108
+ 中调用此 load 函数完成工具或资源的注册。
109
+
110
+ ```shell
111
+ core
112
+ ├── __init__.py # 各个业务工具或者资源加载
113
+ └── storage # 存储业务目录
114
+ ├── __init__.py # 加载存储工具或者资源
115
+ ├── resource.py # 存储资源扩展
116
+ ├── storage.py # 存储工具类
117
+ └── tools.py # 存储工具扩展
118
+ ```
119
+
120
+ ## 测试
121
+
122
+ ### 使用 Model Control Protocol Inspector 测试
123
+
124
+ 强烈推荐使用 [Model Control Protocol Inspector](https://github.com/modelcontextprotocol/inspector) 进行测试。
125
+
126
+ ```shell
127
+ # node 版本为:v22.4.0
128
+ npx @modelcontextprotocol/inspector uv --directory . run sufy-mcp-server
129
+ ```
130
+
131
+ ### 本地启动 MCP Server 示例
132
+
133
+ 1. 使用标准输入输出(stdio)模式启动(默认):
134
+
135
+ ```bash
136
+ uv --directory . run sufy-mcp-server
137
+ ```
138
+
139
+ 2. 使用 SSE 模式启动(用于 Web 应用):
140
+
141
+ ```bash
142
+ uv --directory . run sufy-mcp-server --transport sse --port 8000
143
+ ```
144
+
145
+
146
+
@@ -0,0 +1,24 @@
1
+ [project]
2
+ name = "sufy-mcp-server"
3
+ version = "1.0.0"
4
+ description = "A MCP server project of Sufy."
5
+ requires-python = ">=3.12"
6
+ dependencies = [
7
+ "aioboto3>=13.2.0",
8
+ "fastjsonschema>=2.21.1",
9
+ "httpx>=0.28.1",
10
+ "mcp[cli]>=1.0.0",
11
+ "openai>=1.66.3",
12
+ "pip>=25.0.1",
13
+ "python-dotenv>=1.0.1",
14
+ ]
15
+
16
+ [build-system]
17
+ requires = [ "hatchling",]
18
+ build-backend = "hatchling.build"
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ packages = ["src/mcp_server"]
22
+
23
+ [project.scripts]
24
+ sufy-mcp-server = "mcp_server:main"
@@ -0,0 +1,11 @@
1
+ import logging
2
+
3
+ from .consts import consts
4
+ from .server import main
5
+
6
+ # Configure logging
7
+ logging.basicConfig(level=logging.ERROR)
8
+ logger = logging.getLogger(consts.LOGGER_NAME)
9
+ logger.info("Initializing MCP server package")
10
+
11
+ __all__ = ["main"]