# Pero MCP Server
一个基于模型上下文协议(MCP)的多功能服务器集合,支持App Store Connect和SSH管理功能。
## 功能特性
### App Store Connect服务器
- 团队成员管理(邀请、移除、列表查看)
- 应用信息管理
- TestFlight测试组管理
- Beta测试者管理
- 支持完整的App Store Connect API操作
### SSH服务器
- 远程命令执行
- 文件上传下载
- 目录管理
- 系统信息获取
- 进程管理
- 文件搜索和内容查看
## 安装依赖
```bash
pip install -r requirements.txt
```
## 配置方式
所有配置均通过环境变量设置,确保安全性和便于部署。
### App Store Connect 配置
设置以下环境变量:
```bash
# 必需的环境变量
export APPSTORE_KEY_ID="your_api_key_id"
export APPSTORE_ISSUER_ID="your_issuer_id"
export APPSTORE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
your_private_key_content_here
-----END PRIVATE KEY-----"
# 可选的环境变量
export APPSTORE_APP_ID="your_app_id"
```
### SSH 配置
设置以下环境变量:
```bash
# 必需的环境变量
export SSH_HOSTNAME="your_server_ip_or_hostname"
export SSH_USERNAME="your_username"
# 认证方式(选择其一)
# 方式1:使用密码
export SSH_PASSWORD="your_password"
# 方式2:使用私钥文件
export SSH_PRIVATE_KEY_PATH="/path/to/your/private/key"
# 方式3:使用私钥内容
export SSH_PRIVATE_KEY_CONTENT="-----BEGIN RSA PRIVATE KEY-----
your_private_key_content_here
-----END RSA PRIVATE KEY-----"
# 可选的环境变量
export SSH_PORT="22" # 默认22
export SSH_TIMEOUT="30" # 默认30秒
```
## 使用方法
### 启动服务器
```python
from servers.appstoreconnect.appstore_connect_mcp_server import AppStoreConnectMCPServer
from servers.ssh.ssh_mcp_server import SSHMCPServer
# 启动App Store Connect服务器
appstore_server = AppStoreConnectMCPServer()
appstore_server.run()
# 启动SSH服务器
ssh_server = SSHMCPServer()
ssh_server.run()
```
### 主程序示例
```python
# main.py
import os
from servers.appstoreconnect.appstore_connect_mcp_server import AppStoreConnectMCPServer
from servers.ssh.ssh_mcp_server import SSHMCPServer
def main():
# 检查App Store Connect配置
if all([
os.getenv('APPSTORE_KEY_ID'),
os.getenv('APPSTORE_ISSUER_ID'),
os.getenv('APPSTORE_PRIVATE_KEY')
]):
print("启动App Store Connect服务器...")
appstore_server = AppStoreConnectMCPServer()
# appstore_server.run()
# 检查SSH配置
if all([
os.getenv('SSH_HOSTNAME'),
os.getenv('SSH_USERNAME'),
any([
os.getenv('SSH_PASSWORD'),
os.getenv('SSH_PRIVATE_KEY_PATH'),
os.getenv('SSH_PRIVATE_KEY_CONTENT')
])
]):
print("启动SSH服务器...")
ssh_server = SSHMCPServer()
# ssh_server.run()
if __name__ == "__main__":
main()
```
## 可用工具
### App Store Connect工具
- `list_team_members()` - 获取团队成员列表
- `invite_team_member(email, first_name, last_name, roles, provisioning_allowed)` - 邀请团队成员
- `remove_team_member(user_id)` - 移除团队成员
- `list_apps()` - 获取应用列表
- `create_testflight_group(app_id, group_name, is_internal, public_link_enabled)` - 创建TestFlight测试组
- `list_testflight_groups(app_id)` - 获取TestFlight测试组列表
- `add_tester_to_group(group_id, tester_email, first_name, last_name)` - 添加测试者到组
- `remove_tester_from_group(group_id, tester_id)` - 从组中移除测试者
### SSH工具
- `connect_ssh()` - 建立SSH连接
- `disconnect_ssh()` - 断开SSH连接
- `execute_command(command)` - 执行远程命令
- `list_directory(path)` - 列出目录内容
- `upload_file(local_path, remote_path)` - 上传文件
- `download_file(remote_path, local_path)` - 下载文件
- `get_system_info()` - 获取系统信息
- `create_directory(path)` - 创建目录
- `remove_file_or_directory(path, recursive)` - 删除文件或目录
- `get_file_content(path, lines)` - 获取文件内容
- `search_files(pattern, path, case_sensitive)` - 搜索文件
- `get_process_list()` - 获取进程列表
- `kill_process(pid, force)` - 终止进程
## 可用资源
### App Store Connect资源
- `appstore://apps` - 应用列表资源
- `appstore://members` - 团队成员资源
### SSH资源
- `ssh://system-info` - 系统信息资源
- `ssh://directory` - 当前目录内容资源
- `ssh://connection-status` - 连接状态资源
## 项目结构
```
pero-mcp-server/
├── main.py # 主程序入口
├── README.md # 项目说明文档
├── requirements.txt # Python依赖包
└── servers/ # 服务器模块
├── __init__.py
├── base_mcp_server.py # 基础MCP服务器类
├── appstoreconnect/ # App Store Connect服务器
│ ├── __init__.py
│ ├── models.py # 数据模型
│ ├── appstore_client.py # API客户端
│ └── appstore_connect_mcp_server.py # MCP服务器实现
└── ssh/ # SSH服务器
├── __init__.py
├── models.py # 数据模型
├── ssh_client.py # SSH客户端
└── ssh_mcp_server.py # MCP服务器实现
```
## 环境变量配置文件示例
创建 `.env` 文件来管理环境变量:
```bash
# App Store Connect 配置
APPSTORE_KEY_ID=your_key_id
APPSTORE_ISSUER_ID=your_issuer_id
APPSTORE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
your_private_key_content
-----END PRIVATE KEY-----"
APPSTORE_APP_ID=your_app_id
# SSH 配置
SSH_HOSTNAME=192.168.1.100
SSH_USERNAME=ubuntu
SSH_PASSWORD=your_password
SSH_PORT=22
SSH_TIMEOUT=30
```
然后使用 `python-dotenv` 加载:
```python
from dotenv import load_dotenv
load_dotenv()
```
## 注意事项
1. **安全性**:
- 私钥和密码等敏感信息务必通过环境变量设置
- 不要在代码中硬编码任何凭据
- 在生产环境中使用密钥管理服务
2. **App Store Connect API**:
- 需要先在App Store Connect中创建API密钥
- 确保API密钥有足够的权限执行所需操作
3. **SSH连接**:
- 支持密码和私钥两种认证方式
- 建议在生产环境中使用私钥认证
- 确保目标服务器的SSH服务正常运行
## 许可证
- MIT
## 贡献
欢迎提交Issue和Pull Request来改进项目。
Raw data
{
"_id": null,
"home_page": null,
"name": "pero-mcp-server",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "mcp, app-store-connect, ssh, automation, api",
"author": null,
"author_email": "peropero <tech@peropero.net>",
"download_url": "https://files.pythonhosted.org/packages/2e/4c/c221703c7940eb07e54434227d6c242b6e22d4a536bcb87975b936ca7ac7/pero_mcp_server-0.1.0.tar.gz",
"platform": null,
"description": "# Pero MCP Server\n\n\u4e00\u4e2a\u57fa\u4e8e\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff08MCP\uff09\u7684\u591a\u529f\u80fd\u670d\u52a1\u5668\u96c6\u5408\uff0c\u652f\u6301App Store Connect\u548cSSH\u7ba1\u7406\u529f\u80fd\u3002\n\n## \u529f\u80fd\u7279\u6027\n\n### App Store Connect\u670d\u52a1\u5668\n- \u56e2\u961f\u6210\u5458\u7ba1\u7406\uff08\u9080\u8bf7\u3001\u79fb\u9664\u3001\u5217\u8868\u67e5\u770b\uff09\n- \u5e94\u7528\u4fe1\u606f\u7ba1\u7406\n- TestFlight\u6d4b\u8bd5\u7ec4\u7ba1\u7406\n- Beta\u6d4b\u8bd5\u8005\u7ba1\u7406\n- \u652f\u6301\u5b8c\u6574\u7684App Store Connect API\u64cd\u4f5c\n\n### SSH\u670d\u52a1\u5668\n- \u8fdc\u7a0b\u547d\u4ee4\u6267\u884c\n- \u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d\n- \u76ee\u5f55\u7ba1\u7406\n- \u7cfb\u7edf\u4fe1\u606f\u83b7\u53d6\n- \u8fdb\u7a0b\u7ba1\u7406\n- \u6587\u4ef6\u641c\u7d22\u548c\u5185\u5bb9\u67e5\u770b\n\n## \u5b89\u88c5\u4f9d\u8d56\n\n```bash\npip install -r requirements.txt\n```\n\n## \u914d\u7f6e\u65b9\u5f0f\n\n\u6240\u6709\u914d\u7f6e\u5747\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\uff0c\u786e\u4fdd\u5b89\u5168\u6027\u548c\u4fbf\u4e8e\u90e8\u7f72\u3002\n\n### App Store Connect \u914d\u7f6e\n\n\u8bbe\u7f6e\u4ee5\u4e0b\u73af\u5883\u53d8\u91cf\uff1a\n\n```bash\n# \u5fc5\u9700\u7684\u73af\u5883\u53d8\u91cf\nexport APPSTORE_KEY_ID=\"your_api_key_id\"\nexport APPSTORE_ISSUER_ID=\"your_issuer_id\"\nexport APPSTORE_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\nyour_private_key_content_here\n-----END PRIVATE KEY-----\"\n\n# \u53ef\u9009\u7684\u73af\u5883\u53d8\u91cf\nexport APPSTORE_APP_ID=\"your_app_id\"\n```\n\n### SSH \u914d\u7f6e\n\n\u8bbe\u7f6e\u4ee5\u4e0b\u73af\u5883\u53d8\u91cf\uff1a\n\n```bash\n# \u5fc5\u9700\u7684\u73af\u5883\u53d8\u91cf\nexport SSH_HOSTNAME=\"your_server_ip_or_hostname\"\nexport SSH_USERNAME=\"your_username\"\n\n# \u8ba4\u8bc1\u65b9\u5f0f\uff08\u9009\u62e9\u5176\u4e00\uff09\n# \u65b9\u5f0f1\uff1a\u4f7f\u7528\u5bc6\u7801\nexport SSH_PASSWORD=\"your_password\"\n\n# \u65b9\u5f0f2\uff1a\u4f7f\u7528\u79c1\u94a5\u6587\u4ef6\nexport SSH_PRIVATE_KEY_PATH=\"/path/to/your/private/key\"\n\n# \u65b9\u5f0f3\uff1a\u4f7f\u7528\u79c1\u94a5\u5185\u5bb9\nexport SSH_PRIVATE_KEY_CONTENT=\"-----BEGIN RSA PRIVATE KEY-----\nyour_private_key_content_here\n-----END RSA PRIVATE KEY-----\"\n\n# \u53ef\u9009\u7684\u73af\u5883\u53d8\u91cf\nexport SSH_PORT=\"22\" # \u9ed8\u8ba422\nexport SSH_TIMEOUT=\"30\" # \u9ed8\u8ba430\u79d2\n```\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n### \u542f\u52a8\u670d\u52a1\u5668\n\n```python\nfrom servers.appstoreconnect.appstore_connect_mcp_server import AppStoreConnectMCPServer\nfrom servers.ssh.ssh_mcp_server import SSHMCPServer\n\n# \u542f\u52a8App Store Connect\u670d\u52a1\u5668\nappstore_server = AppStoreConnectMCPServer()\nappstore_server.run()\n\n# \u542f\u52a8SSH\u670d\u52a1\u5668\nssh_server = SSHMCPServer()\nssh_server.run()\n```\n\n### \u4e3b\u7a0b\u5e8f\u793a\u4f8b\n\n```python\n# main.py\nimport os\nfrom servers.appstoreconnect.appstore_connect_mcp_server import AppStoreConnectMCPServer\nfrom servers.ssh.ssh_mcp_server import SSHMCPServer\n\ndef main():\n # \u68c0\u67e5App Store Connect\u914d\u7f6e\n if all([\n os.getenv('APPSTORE_KEY_ID'),\n os.getenv('APPSTORE_ISSUER_ID'),\n os.getenv('APPSTORE_PRIVATE_KEY')\n ]):\n print(\"\u542f\u52a8App Store Connect\u670d\u52a1\u5668...\")\n appstore_server = AppStoreConnectMCPServer()\n # appstore_server.run()\n \n # \u68c0\u67e5SSH\u914d\u7f6e\n if all([\n os.getenv('SSH_HOSTNAME'),\n os.getenv('SSH_USERNAME'),\n any([\n os.getenv('SSH_PASSWORD'),\n os.getenv('SSH_PRIVATE_KEY_PATH'),\n os.getenv('SSH_PRIVATE_KEY_CONTENT')\n ])\n ]):\n print(\"\u542f\u52a8SSH\u670d\u52a1\u5668...\")\n ssh_server = SSHMCPServer()\n # ssh_server.run()\n\nif __name__ == \"__main__\":\n main()\n```\n\n## \u53ef\u7528\u5de5\u5177\n\n### App Store Connect\u5de5\u5177\n\n- `list_team_members()` - \u83b7\u53d6\u56e2\u961f\u6210\u5458\u5217\u8868\n- `invite_team_member(email, first_name, last_name, roles, provisioning_allowed)` - \u9080\u8bf7\u56e2\u961f\u6210\u5458\n- `remove_team_member(user_id)` - \u79fb\u9664\u56e2\u961f\u6210\u5458\n- `list_apps()` - \u83b7\u53d6\u5e94\u7528\u5217\u8868\n- `create_testflight_group(app_id, group_name, is_internal, public_link_enabled)` - \u521b\u5efaTestFlight\u6d4b\u8bd5\u7ec4\n- `list_testflight_groups(app_id)` - \u83b7\u53d6TestFlight\u6d4b\u8bd5\u7ec4\u5217\u8868\n- `add_tester_to_group(group_id, tester_email, first_name, last_name)` - \u6dfb\u52a0\u6d4b\u8bd5\u8005\u5230\u7ec4\n- `remove_tester_from_group(group_id, tester_id)` - \u4ece\u7ec4\u4e2d\u79fb\u9664\u6d4b\u8bd5\u8005\n\n### SSH\u5de5\u5177\n\n- `connect_ssh()` - \u5efa\u7acbSSH\u8fde\u63a5\n- `disconnect_ssh()` - \u65ad\u5f00SSH\u8fde\u63a5\n- `execute_command(command)` - \u6267\u884c\u8fdc\u7a0b\u547d\u4ee4\n- `list_directory(path)` - \u5217\u51fa\u76ee\u5f55\u5185\u5bb9\n- `upload_file(local_path, remote_path)` - \u4e0a\u4f20\u6587\u4ef6\n- `download_file(remote_path, local_path)` - \u4e0b\u8f7d\u6587\u4ef6\n- `get_system_info()` - \u83b7\u53d6\u7cfb\u7edf\u4fe1\u606f\n- `create_directory(path)` - \u521b\u5efa\u76ee\u5f55\n- `remove_file_or_directory(path, recursive)` - \u5220\u9664\u6587\u4ef6\u6216\u76ee\u5f55\n- `get_file_content(path, lines)` - \u83b7\u53d6\u6587\u4ef6\u5185\u5bb9\n- `search_files(pattern, path, case_sensitive)` - \u641c\u7d22\u6587\u4ef6\n- `get_process_list()` - \u83b7\u53d6\u8fdb\u7a0b\u5217\u8868\n- `kill_process(pid, force)` - \u7ec8\u6b62\u8fdb\u7a0b\n\n## \u53ef\u7528\u8d44\u6e90\n\n### App Store Connect\u8d44\u6e90\n\n- `appstore://apps` - \u5e94\u7528\u5217\u8868\u8d44\u6e90\n- `appstore://members` - \u56e2\u961f\u6210\u5458\u8d44\u6e90\n\n### SSH\u8d44\u6e90\n\n- `ssh://system-info` - \u7cfb\u7edf\u4fe1\u606f\u8d44\u6e90\n- `ssh://directory` - \u5f53\u524d\u76ee\u5f55\u5185\u5bb9\u8d44\u6e90\n- `ssh://connection-status` - \u8fde\u63a5\u72b6\u6001\u8d44\u6e90\n\n## \u9879\u76ee\u7ed3\u6784\n\n```\npero-mcp-server/\n\u251c\u2500\u2500 main.py # \u4e3b\u7a0b\u5e8f\u5165\u53e3\n\u251c\u2500\u2500 README.md # \u9879\u76ee\u8bf4\u660e\u6587\u6863\n\u251c\u2500\u2500 requirements.txt # Python\u4f9d\u8d56\u5305\n\u2514\u2500\u2500 servers/ # \u670d\u52a1\u5668\u6a21\u5757\n \u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 base_mcp_server.py # \u57fa\u7840MCP\u670d\u52a1\u5668\u7c7b\n \u251c\u2500\u2500 appstoreconnect/ # App Store Connect\u670d\u52a1\u5668\n \u2502 \u251c\u2500\u2500 __init__.py\n \u2502 \u251c\u2500\u2500 models.py # \u6570\u636e\u6a21\u578b\n \u2502 \u251c\u2500\u2500 appstore_client.py # API\u5ba2\u6237\u7aef\n \u2502 \u2514\u2500\u2500 appstore_connect_mcp_server.py # MCP\u670d\u52a1\u5668\u5b9e\u73b0\n \u2514\u2500\u2500 ssh/ # SSH\u670d\u52a1\u5668\n \u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 models.py # \u6570\u636e\u6a21\u578b\n \u251c\u2500\u2500 ssh_client.py # SSH\u5ba2\u6237\u7aef\n \u2514\u2500\u2500 ssh_mcp_server.py # MCP\u670d\u52a1\u5668\u5b9e\u73b0\n```\n\n## \u73af\u5883\u53d8\u91cf\u914d\u7f6e\u6587\u4ef6\u793a\u4f8b\n\n\u521b\u5efa `.env` \u6587\u4ef6\u6765\u7ba1\u7406\u73af\u5883\u53d8\u91cf\uff1a\n\n```bash\n# App Store Connect \u914d\u7f6e\nAPPSTORE_KEY_ID=your_key_id\nAPPSTORE_ISSUER_ID=your_issuer_id\nAPPSTORE_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\nyour_private_key_content\n-----END PRIVATE KEY-----\"\nAPPSTORE_APP_ID=your_app_id\n\n# SSH \u914d\u7f6e\nSSH_HOSTNAME=192.168.1.100\nSSH_USERNAME=ubuntu\nSSH_PASSWORD=your_password\nSSH_PORT=22\nSSH_TIMEOUT=30\n```\n\n\u7136\u540e\u4f7f\u7528 `python-dotenv` \u52a0\u8f7d\uff1a\n\n```python\nfrom dotenv import load_dotenv\nload_dotenv()\n```\n\n## \u6ce8\u610f\u4e8b\u9879\n\n1. **\u5b89\u5168\u6027**\uff1a\n - \u79c1\u94a5\u548c\u5bc6\u7801\u7b49\u654f\u611f\u4fe1\u606f\u52a1\u5fc5\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\n - \u4e0d\u8981\u5728\u4ee3\u7801\u4e2d\u786c\u7f16\u7801\u4efb\u4f55\u51ed\u636e\n - \u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4f7f\u7528\u5bc6\u94a5\u7ba1\u7406\u670d\u52a1\n\n2. **App Store Connect API**\uff1a\n - \u9700\u8981\u5148\u5728App Store Connect\u4e2d\u521b\u5efaAPI\u5bc6\u94a5\n - \u786e\u4fddAPI\u5bc6\u94a5\u6709\u8db3\u591f\u7684\u6743\u9650\u6267\u884c\u6240\u9700\u64cd\u4f5c\n\n3. **SSH\u8fde\u63a5**\uff1a\n - \u652f\u6301\u5bc6\u7801\u548c\u79c1\u94a5\u4e24\u79cd\u8ba4\u8bc1\u65b9\u5f0f\n - \u5efa\u8bae\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4f7f\u7528\u79c1\u94a5\u8ba4\u8bc1\n - \u786e\u4fdd\u76ee\u6807\u670d\u52a1\u5668\u7684SSH\u670d\u52a1\u6b63\u5e38\u8fd0\u884c\n\n## \u8bb8\u53ef\u8bc1\n\n- MIT\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\u6765\u6539\u8fdb\u9879\u76ee\u3002\n",
"bugtrack_url": null,
"license": null,
"summary": "A comprehensive MCP (Model Context Protocol) server supporting App Store Connect and SSH operations",
"version": "0.1.0",
"project_urls": {
"Bug Tracker": "https://github.com/peroperogames/pero-mcp-server/issues",
"Documentation": "https://github.com/peroperogames/pero-mcp-server#readme",
"Homepage": "https://github.com/peroperogames/pero-mcp-server",
"Repository": "https://github.com/peroperogames/pero-mcp-server"
},
"split_keywords": [
"mcp",
" app-store-connect",
" ssh",
" automation",
" api"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "677c56ae0bf12085fb98ae3a81ba188d9a28a62da5164b51f08349ae53347004",
"md5": "8328201523dcbaa16ea428e4666ae2b6",
"sha256": "978641aa01afcc45aea23ed4ac5dd040aa27e82b66350a915bbb3f163ae56281"
},
"downloads": -1,
"filename": "pero_mcp_server-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8328201523dcbaa16ea428e4666ae2b6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 17813,
"upload_time": "2025-09-03T07:00:01",
"upload_time_iso_8601": "2025-09-03T07:00:01.708921Z",
"url": "https://files.pythonhosted.org/packages/67/7c/56ae0bf12085fb98ae3a81ba188d9a28a62da5164b51f08349ae53347004/pero_mcp_server-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2e4cc221703c7940eb07e54434227d6c242b6e22d4a536bcb87975b936ca7ac7",
"md5": "285c75101e54d16979500d484c3c8dc5",
"sha256": "decd690777cbc853b40195e9e3c05b9524c57dfddcdc88d4bba586945cf762b7"
},
"downloads": -1,
"filename": "pero_mcp_server-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "285c75101e54d16979500d484c3c8dc5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 17444,
"upload_time": "2025-09-03T07:00:02",
"upload_time_iso_8601": "2025-09-03T07:00:02.882593Z",
"url": "https://files.pythonhosted.org/packages/2e/4c/c221703c7940eb07e54434227d6c242b6e22d4a536bcb87975b936ca7ac7/pero_mcp_server-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-03 07:00:02",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "peroperogames",
"github_project": "pero-mcp-server",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "fastmcp",
"specs": [
[
">=",
"0.1.0"
]
]
},
{
"name": "requests",
"specs": [
[
">=",
"2.31.0"
]
]
},
{
"name": "PyJWT",
"specs": [
[
">=",
"2.8.0"
]
]
},
{
"name": "cryptography",
"specs": [
[
">=",
"41.0.0"
]
]
},
{
"name": "pydantic",
"specs": [
[
">=",
"2.0.0"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
">=",
"2.8.0"
]
]
},
{
"name": "paramiko",
"specs": [
[
">=",
"3.0.0"
]
]
}
],
"lcname": "pero-mcp-server"
}