media-agent-mcp 2.6.7__tar.gz → 2.6.10__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 (56) hide show
  1. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/PKG-INFO +2 -2
  2. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/pyproject.toml +2 -2
  3. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/async_server.py +1 -122
  4. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/server.py +1 -84
  5. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp.egg-info/PKG-INFO +2 -2
  6. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp.egg-info/requires.txt +1 -1
  7. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/README.md +0 -0
  8. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/setup.cfg +0 -0
  9. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/__init__.py +0 -0
  10. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/__init__.py +0 -0
  11. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/omni_human.py +0 -0
  12. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/openaiedit.py +0 -0
  13. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/seed16.py +0 -0
  14. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/seedance.py +0 -0
  15. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/seededit.py +0 -0
  16. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/seedream.py +0 -0
  17. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/ai_models/tts.py +0 -0
  18. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/async_wrapper.py +0 -0
  19. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/audio/combiner.py +0 -0
  20. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/audio/speed_controller.py +0 -0
  21. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/audio/tts.py +0 -0
  22. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/README.md +0 -0
  23. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__init__.py +0 -0
  24. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__pycache__/__init__.cpython-312.pyc +0 -0
  25. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__pycache__/app.cpython-312.pyc +0 -0
  26. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__pycache__/routes_media.cpython-312.pyc +0 -0
  27. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__pycache__/routes_omni.cpython-312.pyc +0 -0
  28. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__pycache__/routes_subtitles.cpython-312.pyc +0 -0
  29. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/__pycache__/utils.cpython-312.pyc +0 -0
  30. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/app.py +0 -0
  31. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/fonts/en/EduNSWACTCursive-VariableFont_wght.ttf +0 -0
  32. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/fonts/en/MozillaText-VariableFont_wght.ttf +0 -0
  33. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/fonts/en/Roboto_Condensed-Regular.ttf +0 -0
  34. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/fonts/zh/MaShanZheng-Regular.ttf +0 -0
  35. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/fonts/zh/NotoSerifSC-VariableFont_wght.ttf +0 -0
  36. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/fonts/zh/ZCOOLXiaoWei-Regular.ttf +0 -0
  37. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/pyproject.toml +0 -0
  38. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/routes_media.py +0 -0
  39. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/routes_subtitles.py +0 -0
  40. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/utils.py +0 -0
  41. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/be/uv.lock +0 -0
  42. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/install_tools/__init__.py +0 -0
  43. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/install_tools/installer.py +0 -0
  44. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/media_selectors/__init__.py +0 -0
  45. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/media_selectors/image_selector.py +0 -0
  46. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/media_selectors/video_selector.py +0 -0
  47. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/storage/__init__.py +0 -0
  48. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/storage/tos_client.py +0 -0
  49. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/video/__init__.py +0 -0
  50. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/video/processor.py +0 -0
  51. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/video/stack.py +0 -0
  52. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp/video/subtitle.py +0 -0
  53. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp.egg-info/SOURCES.txt +0 -0
  54. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp.egg-info/dependency_links.txt +0 -0
  55. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp.egg-info/entry_points.txt +0 -0
  56. {media_agent_mcp-2.6.7 → media_agent_mcp-2.6.10}/src/media_agent_mcp.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-agent-mcp
3
- Version: 2.6.7
3
+ Version: 2.6.10
4
4
  Summary: A Model Context Protocol server for media processing with AI tools
5
5
  Author-email: Media Agent Team <team@mediaagent.com>
6
6
  Keywords: mcp,ai,media,video,image,processing
@@ -12,7 +12,6 @@ Classifier: Programming Language :: Python :: 3.12
12
12
  Requires-Python: >=3.12
13
13
  Description-Content-Type: text/markdown
14
14
  Requires-Dist: httpx>=0.28.1
15
- Requires-Dist: mcp[cli]>=1.12.2
16
15
  Requires-Dist: opencv-python>=4.12.0.88
17
16
  Requires-Dist: pillow>=11.3.0
18
17
  Requires-Dist: requests>=2.32.4
@@ -29,6 +28,7 @@ Requires-Dist: Flask>=3.0.0
29
28
  Requires-Dist: pydub>=0.25.1
30
29
  Requires-Dist: audioop-lts; python_version >= "3.13"
31
30
  Requires-Dist: google-genai>=1.33.0
31
+ Requires-Dist: mcp==1.11.0
32
32
 
33
33
  # Media Agent MCP
34
34
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "media-agent-mcp"
3
- version = "2.6.7"
3
+ version = "2.6.10"
4
4
  description = "A Model Context Protocol server for media processing with AI tools"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -17,7 +17,6 @@ classifiers = [
17
17
  ]
18
18
  dependencies = [
19
19
  "httpx>=0.28.1",
20
- "mcp[cli]>=1.12.2",
21
20
  "opencv-python>=4.12.0.88",
22
21
  "pillow>=11.3.0",
23
22
  "requests>=2.32.4",
@@ -34,6 +33,7 @@ dependencies = [
34
33
  "pydub>=0.25.1",
35
34
  "audioop-lts; python_version >= '3.13'",
36
35
  "google-genai>=1.33.0",
36
+ "mcp==1.11.0",
37
37
  ]
38
38
 
39
39
  [project.scripts]
@@ -26,10 +26,6 @@ from dotenv import load_dotenv
26
26
  import uvicorn
27
27
  import anyio
28
28
  from functools import wraps
29
- import os
30
- import sys
31
- import signal
32
- import subprocess
33
29
 
34
30
  def async_retry(max_retries=3, delay=2):
35
31
  def decorator(func):
@@ -85,123 +81,6 @@ from media_agent_mcp.async_wrapper import (
85
81
  logging.basicConfig(level=logging.INFO)
86
82
  logger = logging.getLogger(__name__)
87
83
 
88
- # Swallow ClosedResourceError from AnyIO (e.g., SSE client disconnected)
89
- class IgnoreClosedResourceErrorMiddleware:
90
- def __init__(self, app):
91
- self.app = app
92
-
93
- async def __call__(self, scope, receive, send):
94
- try:
95
- await self.app(scope, receive, send)
96
- except anyio.ClosedResourceError:
97
- logger.warning("SSE client disconnected (ClosedResourceError). Ignoring.")
98
- return
99
-
100
- # Enhanced middleware that supports reconnection for SSE clients
101
- class ReconnectableSSEMiddleware:
102
- def __init__(self, app):
103
- self.app = app
104
- self.connections = {} # 存储活跃连接
105
-
106
- async def __call__(self, scope, receive, send):
107
- # 为每个连接生成唯一ID
108
- connection_id = scope.get('client', ('unknown', 0))[0] + ':' + str(scope.get('client', ('unknown', 0))[1])
109
-
110
- # 包装send函数以跟踪连接状态
111
- original_send = send
112
-
113
- async def wrapped_send(message):
114
- if message.get('type') == 'http.response.start':
115
- # 记录新连接
116
- self.connections[connection_id] = {'active': True}
117
- logger.info(f"New SSE connection established: {connection_id}")
118
- elif message.get('type') == 'http.response.body' and message.get('more_body', False) is False:
119
- # 连接结束
120
- if connection_id in self.connections:
121
- self.connections[connection_id]['active'] = False
122
- logger.info(f"SSE connection closed normally: {connection_id}")
123
-
124
- # 调用原始send
125
- await original_send(message)
126
-
127
- try:
128
- # 使用包装后的send函数
129
- await self.app(scope, receive, wrapped_send)
130
- except anyio.ClosedResourceError:
131
- # 客户端断开连接
132
- if connection_id in self.connections:
133
- self.connections[connection_id]['active'] = False
134
-
135
- logger.warning(f"SSE client disconnected (ClosedResourceError): {connection_id}. Client can reconnect.")
136
- # 不抛出异常,允许客户端重连
137
- return
138
-
139
- # 在出现错误时重启应用的中间件
140
- class RestartOnErrorMiddleware:
141
- def __init__(self, app):
142
- self.app = app
143
- self.restart_cooldown = 5 # 重启冷却时间(秒)
144
- self.script_path = os.path.abspath(sys.argv[0])
145
- self.args = sys.argv[1:]
146
-
147
- async def __call__(self, scope, receive, send):
148
- try:
149
- await self.app(scope, receive, send)
150
- except anyio.ClosedResourceError:
151
- logger.warning("检测到 ClosedResourceError,准备重启应用...")
152
- # 等待一段时间,确保日志输出
153
- await asyncio.sleep(1)
154
-
155
- # 启动新进程,使用不同的端口避免冲突
156
- # 解析当前命令行参数以获取当前端口
157
- temp_parser = argparse.ArgumentParser()
158
- temp_parser.add_argument('--port', type=int, default=8000)
159
- temp_parser.add_argument('--host', type=str, default='127.0.0.1')
160
- temp_parser.add_argument('--transport', type=str, default='stdio')
161
- # 添加其他可能的参数,避免解析错误
162
- temp_parser.add_argument('--run-be', action='store_true')
163
- temp_parser.add_argument('--be-host', type=str, default='0.0.0.0')
164
- temp_parser.add_argument('--be-port', type=int, default=5000)
165
- temp_parser.add_argument('--version', action='store_true')
166
-
167
- # 忽略未知参数,避免解析错误
168
- known_args, _ = temp_parser.parse_known_args(self.args)
169
-
170
- # 计算新端口,当前端口+1
171
- new_port = known_args.port + 1
172
- logger.info(f"将使用新端口 {new_port} 启动新进程")
173
-
174
- # 准备新的命令行参数
175
- new_args = self.args.copy()
176
-
177
- # 如果命令行参数中有端口参数,则替换为新端口
178
- if '--port' in new_args:
179
- port_index = new_args.index('--port') + 1
180
- if port_index < len(new_args):
181
- new_args[port_index] = str(new_port)
182
- else:
183
- new_args.extend(['--port', str(new_port)])
184
-
185
- logger.info(f"启动新进程: {self.script_path} {' '.join(new_args)}")
186
- new_process = subprocess.Popen([sys.executable, self.script_path] + new_args)
187
-
188
- # 等待确认新进程已启动
189
- logger.info(f"等待确认新进程已启动...")
190
- await asyncio.sleep(3)
191
-
192
- # 检查新进程是否成功启动
193
- if new_process.poll() is None: # None表示进程仍在运行
194
- logger.info(f"新进程成功启动,将在 {self.restart_cooldown} 秒后终止当前进程...")
195
- await asyncio.sleep(self.restart_cooldown)
196
-
197
- # 终止当前进程
198
- logger.info("终止当前进程")
199
- sys.exit(0)
200
- else:
201
- logger.error(f"新进程启动失败,退出码: {new_process.returncode},当前进程将继续运行")
202
- return
203
- return
204
-
205
84
  # Initialize FastMCP server (will be configured in main function)
206
85
  load_dotenv()
207
86
  mcp = FastMCP("Media-Agent-MCP-Async")
@@ -646,7 +525,7 @@ def main():
646
525
  mcp.settings.port = args.port
647
526
  # Use uvicorn to run SSE app with extended keep-alive timeout (5 minutes)
648
527
  uvicorn.run(
649
- RestartOnErrorMiddleware(mcp.sse_app()),
528
+ mcp.sse_app(),
650
529
  host=args.host,
651
530
  port=args.port,
652
531
  timeout_keep_alive=300
@@ -21,12 +21,6 @@ import json
21
21
  from dotenv import load_dotenv
22
22
  import uvicorn
23
23
  import anyio
24
- import uuid
25
- import os
26
- import sys
27
- import signal
28
- import subprocess
29
- import asyncio
30
24
 
31
25
  from mcp.server.fastmcp import FastMCP
32
26
 
@@ -56,83 +50,6 @@ class IgnoreClosedResourceErrorMiddleware:
56
50
  await self.app(scope, receive, send)
57
51
  except anyio.ClosedResourceError:
58
52
  logger.warning("SSE client disconnected (ClosedResourceError). Ignoring.")
59
- return
60
-
61
- # Enhanced middleware that supports reconnection for SSE clients
62
- class ReconnectableSSEMiddleware:
63
- def __init__(self, app):
64
- self.app = app
65
- self.connections = {} # 存储活跃连接
66
-
67
- async def __call__(self, scope, receive, send):
68
- # 为每个连接生成唯一ID
69
- connection_id = scope.get('client', ('unknown', 0))[0] + ':' + str(scope.get('client', ('unknown', 0))[1])
70
-
71
- # 包装send函数以跟踪连接状态
72
- original_send = send
73
-
74
- async def wrapped_send(message):
75
- if message.get('type') == 'http.response.start':
76
- # 记录新连接
77
- self.connections[connection_id] = {'active': True}
78
- logger.info(f"New SSE connection established: {connection_id}")
79
- elif message.get('type') == 'http.response.body' and message.get('more_body', False) is False:
80
- # 连接结束
81
- if connection_id in self.connections:
82
- self.connections[connection_id]['active'] = False
83
- logger.info(f"SSE connection closed normally: {connection_id}")
84
-
85
- # 调用原始send
86
- await original_send(message)
87
-
88
- try:
89
- # 使用包装后的send函数
90
- await self.app(scope, receive, wrapped_send)
91
- except anyio.ClosedResourceError:
92
- # 客户端断开连接
93
- if connection_id in self.connections:
94
- self.connections[connection_id]['active'] = False
95
-
96
- logger.warning(f"SSE client disconnected (ClosedResourceError): {connection_id}. Client can reconnect.")
97
- # 不抛出异常,允许客户端重连
98
- return
99
-
100
- # 在出现错误时重启应用的中间件
101
- class RestartOnErrorMiddleware:
102
- def __init__(self, app):
103
- self.app = app
104
- self.restart_cooldown = 5 # 重启冷却时间(秒)
105
- self.script_path = os.path.abspath(sys.argv[0])
106
- self.args = sys.argv[1:]
107
-
108
- async def __call__(self, scope, receive, send):
109
- try:
110
- await self.app(scope, receive, send)
111
- except anyio.ClosedResourceError:
112
- logger.warning("检测到 ClosedResourceError,准备重启应用...")
113
- # 等待一段时间,确保日志输出
114
- await asyncio.sleep(1)
115
-
116
- # 启动新进程
117
- logger.info(f"启动新进程: {self.script_path} {' '.join(self.args)}")
118
- subprocess.Popen([sys.executable, self.script_path] + self.args)
119
-
120
- # 等待冷却时间
121
- logger.info(f"等待 {self.restart_cooldown} 秒后终止当前进程...")
122
- await asyncio.sleep(self.restart_cooldown)
123
-
124
- # 终止当前进程
125
- logger.info("终止当前进程")
126
- os.kill(os.getpid(), signal.SIGTERM)
127
- return
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
53
  return
137
54
 
138
55
  # Initialize FastMCP server (will be configured in main function)
@@ -673,7 +590,7 @@ def main():
673
590
  # Configure and run the server
674
591
  if args.transport == 'sse':
675
592
  # SSE transport
676
- uvicorn.run(RestartOnErrorMiddleware(mcp.create_sse_app()), host=args.host, port=args.port)
593
+ uvicorn.run(IgnoreClosedResourceErrorMiddleware(mcp.create_sse_app()), host=args.host, port=args.port)
677
594
  else:
678
595
  # STDIO transport (default)
679
596
  mcp.run()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-agent-mcp
3
- Version: 2.6.7
3
+ Version: 2.6.10
4
4
  Summary: A Model Context Protocol server for media processing with AI tools
5
5
  Author-email: Media Agent Team <team@mediaagent.com>
6
6
  Keywords: mcp,ai,media,video,image,processing
@@ -12,7 +12,6 @@ Classifier: Programming Language :: Python :: 3.12
12
12
  Requires-Python: >=3.12
13
13
  Description-Content-Type: text/markdown
14
14
  Requires-Dist: httpx>=0.28.1
15
- Requires-Dist: mcp[cli]>=1.12.2
16
15
  Requires-Dist: opencv-python>=4.12.0.88
17
16
  Requires-Dist: pillow>=11.3.0
18
17
  Requires-Dist: requests>=2.32.4
@@ -29,6 +28,7 @@ Requires-Dist: Flask>=3.0.0
29
28
  Requires-Dist: pydub>=0.25.1
30
29
  Requires-Dist: audioop-lts; python_version >= "3.13"
31
30
  Requires-Dist: google-genai>=1.33.0
31
+ Requires-Dist: mcp==1.11.0
32
32
 
33
33
  # Media Agent MCP
34
34
 
@@ -1,5 +1,4 @@
1
1
  httpx>=0.28.1
2
- mcp[cli]>=1.12.2
3
2
  opencv-python>=4.12.0.88
4
3
  pillow>=11.3.0
5
4
  requests>=2.32.4
@@ -15,6 +14,7 @@ imageio-ffmpeg>=0.4.0
15
14
  Flask>=3.0.0
16
15
  pydub>=0.25.1
17
16
  google-genai>=1.33.0
17
+ mcp==1.11.0
18
18
 
19
19
  [:python_version >= "3.13"]
20
20
  audioop-lts