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.
- sufy_mcp_server-1.0.0/.env.example +6 -0
- sufy_mcp_server-1.0.0/.github/workflows/ruff.yml +8 -0
- sufy_mcp_server-1.0.0/.gitignore +13 -0
- sufy_mcp_server-1.0.0/.idea/.gitignore +8 -0
- sufy_mcp_server-1.0.0/.idea/demo.iml +10 -0
- sufy_mcp_server-1.0.0/.idea/inspectionProfiles/profiles_settings.xml +6 -0
- sufy_mcp_server-1.0.0/.idea/misc.xml +7 -0
- sufy_mcp_server-1.0.0/.idea/modules.xml +8 -0
- sufy_mcp_server-1.0.0/.idea/vcs.xml +6 -0
- sufy_mcp_server-1.0.0/.idea/workspace.xml +208 -0
- sufy_mcp_server-1.0.0/.python-version +1 -0
- sufy_mcp_server-1.0.0/CHANGELOG.md +3 -0
- sufy_mcp_server-1.0.0/LICENSE.txt +21 -0
- sufy_mcp_server-1.0.0/PKG-INFO +13 -0
- sufy_mcp_server-1.0.0/README.md +139 -0
- sufy_mcp_server-1.0.0/README_zh.md +146 -0
- sufy_mcp_server-1.0.0/docs/images/logo.png +0 -0
- sufy_mcp_server-1.0.0/pyproject.toml +24 -0
- sufy_mcp_server-1.0.0/src/mcp_server/__init__.py +11 -0
- sufy_mcp_server-1.0.0/src/mcp_server/application.py +53 -0
- sufy_mcp_server-1.0.0/src/mcp_server/config/__init__.py +0 -0
- sufy_mcp_server-1.0.0/src/mcp_server/config/config.py +52 -0
- sufy_mcp_server-1.0.0/src/mcp_server/consts/__init__.py +0 -0
- sufy_mcp_server-1.0.0/src/mcp_server/consts/consts.py +1 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/__init__.py +17 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/media_processing/__init__.py +11 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/media_processing/tools.py +179 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/media_processing/utils.py +157 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/storage/__init__.py +13 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/storage/resource.py +158 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/storage/storage.py +203 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/storage/tools.py +154 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/version/__init__.py +9 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/version/tools.py +31 -0
- sufy_mcp_server-1.0.0/src/mcp_server/core/version/version.py +2 -0
- sufy_mcp_server-1.0.0/src/mcp_server/resource/__init__.py +0 -0
- sufy_mcp_server-1.0.0/src/mcp_server/resource/resource.py +61 -0
- sufy_mcp_server-1.0.0/src/mcp_server/server.py +72 -0
- sufy_mcp_server-1.0.0/src/mcp_server/tools/__init__.py +0 -0
- sufy_mcp_server-1.0.0/src/mcp_server/tools/tools.py +138 -0
- sufy_mcp_server-1.0.0/uv.lock +887 -0
@@ -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,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,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
|
+
"associatedIndex": 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,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
|
+
|
Binary file
|
@@ -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"]
|