@samanhappy/mcphub 0.0.10 → 0.0.11

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 (97) hide show
  1. package/package.json +7 -4
  2. package/.env.example +0 -2
  3. package/.eslintrc.json +0 -25
  4. package/.github/workflows/build.yml +0 -51
  5. package/.github/workflows/release.yml +0 -19
  6. package/.prettierrc +0 -7
  7. package/Dockerfile +0 -51
  8. package/assets/amap-edit.png +0 -0
  9. package/assets/amap-result.png +0 -0
  10. package/assets/cherry-mcp.png +0 -0
  11. package/assets/cursor-mcp.png +0 -0
  12. package/assets/cursor-query.png +0 -0
  13. package/assets/cursor-tools.png +0 -0
  14. package/assets/dashboard.png +0 -0
  15. package/assets/dashboard.zh.png +0 -0
  16. package/assets/group.png +0 -0
  17. package/assets/group.zh.png +0 -0
  18. package/assets/market.zh.png +0 -0
  19. package/assets/wegroup.jpg +0 -0
  20. package/assets/wegroup.png +0 -0
  21. package/assets/wexin.png +0 -0
  22. package/bin/mcphub.js +0 -3
  23. package/doc/intro.md +0 -73
  24. package/doc/intro2.md +0 -232
  25. package/entrypoint.sh +0 -10
  26. package/frontend/favicon.ico +0 -0
  27. package/frontend/index.html +0 -13
  28. package/frontend/postcss.config.js +0 -6
  29. package/frontend/src/App.tsx +0 -44
  30. package/frontend/src/components/AddGroupForm.tsx +0 -132
  31. package/frontend/src/components/AddServerForm.tsx +0 -90
  32. package/frontend/src/components/ChangePasswordForm.tsx +0 -158
  33. package/frontend/src/components/EditGroupForm.tsx +0 -149
  34. package/frontend/src/components/EditServerForm.tsx +0 -76
  35. package/frontend/src/components/GroupCard.tsx +0 -143
  36. package/frontend/src/components/MarketServerCard.tsx +0 -153
  37. package/frontend/src/components/MarketServerDetail.tsx +0 -297
  38. package/frontend/src/components/ProtectedRoute.tsx +0 -27
  39. package/frontend/src/components/ServerCard.tsx +0 -230
  40. package/frontend/src/components/ServerForm.tsx +0 -276
  41. package/frontend/src/components/icons/LucideIcons.tsx +0 -14
  42. package/frontend/src/components/layout/Content.tsx +0 -17
  43. package/frontend/src/components/layout/Header.tsx +0 -61
  44. package/frontend/src/components/layout/Sidebar.tsx +0 -98
  45. package/frontend/src/components/ui/Badge.tsx +0 -33
  46. package/frontend/src/components/ui/Button.tsx +0 -0
  47. package/frontend/src/components/ui/DeleteDialog.tsx +0 -48
  48. package/frontend/src/components/ui/Pagination.tsx +0 -128
  49. package/frontend/src/components/ui/Toast.tsx +0 -96
  50. package/frontend/src/components/ui/ToggleGroup.tsx +0 -134
  51. package/frontend/src/components/ui/ToolCard.tsx +0 -38
  52. package/frontend/src/contexts/AuthContext.tsx +0 -159
  53. package/frontend/src/contexts/ToastContext.tsx +0 -60
  54. package/frontend/src/hooks/useGroupData.ts +0 -232
  55. package/frontend/src/hooks/useMarketData.ts +0 -410
  56. package/frontend/src/hooks/useServerData.ts +0 -306
  57. package/frontend/src/hooks/useSettingsData.ts +0 -131
  58. package/frontend/src/i18n.ts +0 -42
  59. package/frontend/src/index.css +0 -20
  60. package/frontend/src/layouts/MainLayout.tsx +0 -33
  61. package/frontend/src/locales/en.json +0 -214
  62. package/frontend/src/locales/zh.json +0 -214
  63. package/frontend/src/main.tsx +0 -12
  64. package/frontend/src/pages/Dashboard.tsx +0 -206
  65. package/frontend/src/pages/GroupsPage.tsx +0 -116
  66. package/frontend/src/pages/LoginPage.tsx +0 -104
  67. package/frontend/src/pages/MarketPage.tsx +0 -356
  68. package/frontend/src/pages/ServersPage.tsx +0 -144
  69. package/frontend/src/pages/SettingsPage.tsx +0 -149
  70. package/frontend/src/services/authService.ts +0 -141
  71. package/frontend/src/types/index.ts +0 -160
  72. package/frontend/src/utils/cn.ts +0 -10
  73. package/frontend/tsconfig.json +0 -31
  74. package/frontend/tsconfig.node.json +0 -10
  75. package/frontend/vite.config.ts +0 -26
  76. package/googled76ca578b6543fbc.html +0 -1
  77. package/jest.config.js +0 -10
  78. package/mcp_settings.json +0 -45
  79. package/servers.json +0 -74722
  80. package/src/config/index.ts +0 -46
  81. package/src/controllers/authController.ts +0 -179
  82. package/src/controllers/groupController.ts +0 -341
  83. package/src/controllers/marketController.ts +0 -154
  84. package/src/controllers/serverController.ts +0 -303
  85. package/src/index.ts +0 -17
  86. package/src/middlewares/auth.ts +0 -28
  87. package/src/middlewares/index.ts +0 -43
  88. package/src/models/User.ts +0 -103
  89. package/src/routes/index.ts +0 -96
  90. package/src/server.ts +0 -72
  91. package/src/services/groupService.ts +0 -232
  92. package/src/services/marketService.ts +0 -116
  93. package/src/services/mcpService.ts +0 -385
  94. package/src/services/sseService.ts +0 -119
  95. package/src/types/index.ts +0 -129
  96. package/src/utils/migration.ts +0 -52
  97. package/tsconfig.json +0 -17
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@samanhappy/mcphub",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "description": "A hub server for mcp servers",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
+ "bin": {
8
+ "mcphub": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
7
13
  "scripts": {
8
14
  "build": "tsc",
9
15
  "start": "node dist/index.js",
@@ -73,8 +79,5 @@
73
79
  "tsx": "^4.7.0",
74
80
  "typescript": "^5.2.2",
75
81
  "vite": "^5.4.18"
76
- },
77
- "bin": {
78
- "mcphub": "bin/mcphub.js"
79
82
  }
80
83
  }
package/.env.example DELETED
@@ -1,2 +0,0 @@
1
- PORT=3000
2
- NODE_ENV=development
package/.eslintrc.json DELETED
@@ -1,25 +0,0 @@
1
- {
2
- "parser": "@typescript-eslint/parser",
3
- "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
4
- "parserOptions": {
5
- "ecmaVersion": 2020,
6
- "sourceType": "module"
7
- },
8
- "env": {
9
- "node": true,
10
- "es6": true,
11
- "jest": true
12
- },
13
- "rules": {
14
- "no-console": "off",
15
- "@typescript-eslint/no-unused-vars": [
16
- "error",
17
- {
18
- "argsIgnorePattern": "^_",
19
- "varsIgnorePattern": "^_"
20
- }
21
- ],
22
- "@typescript-eslint/no-explicit-any": "off",
23
- "no-undef": "off",
24
- }
25
- }
@@ -1,51 +0,0 @@
1
- name: Build
2
-
3
- on:
4
- push:
5
- tags: ['v*.*.*']
6
- workflow_dispatch:
7
-
8
- jobs:
9
- build:
10
- runs-on: ubuntu-latest
11
- strategy:
12
- matrix:
13
- variant: ${{ startsWith(github.ref, 'refs/tags/') && fromJSON('["base", "full"]') || fromJSON('["base"]') }}
14
- steps:
15
- - uses: actions/checkout@v4
16
- with:
17
- fetch-depth: 0
18
-
19
- - name: Set up Docker Buildx
20
- uses: docker/setup-buildx-action@v3
21
-
22
- - name: Login to Docker Hub
23
- uses: docker/login-action@v3
24
- with:
25
- username: ${{ secrets.DOCKER_USERNAME }}
26
- password: ${{ secrets.DOCKER_PASSWORD }}
27
-
28
- - name: Docker metadata
29
- id: meta
30
- uses: docker/metadata-action@v5
31
- with:
32
- images: samanhappy/mcphub
33
- tags: |
34
- type=raw,value=edge${{ matrix.variant == 'full' && '-full' || '' }},enable=${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}
35
- type=semver,pattern={{version}}${{ matrix.variant == 'full' && '-full' || '' }},enable=${{ startsWith(github.ref, 'refs/tags/') }}
36
- type=raw,value=latest${{ matrix.variant == 'full' && '-full' || '' }},enable=${{ startsWith(github.ref, 'refs/tags/') }}
37
- flavor: |
38
- latest=false
39
-
40
- - name: Build and Push Docker Image
41
- uses: docker/build-push-action@v5
42
- with:
43
- context: .
44
- push: ${{ github.event_name != 'pull_request' }}
45
- tags: ${{ steps.meta.outputs.tags }}
46
- labels: ${{ steps.meta.outputs.labels }}
47
- cache-from: type=gha
48
- cache-to: type=gha,mode=max,scope=${{ matrix.variant }}
49
- platforms: linux/amd64,linux/arm64
50
- build-args: |
51
- INSTALL_EXT=${{ matrix.variant == 'full' && 'true' || 'false' }}
@@ -1,19 +0,0 @@
1
- name: GitHub Release
2
-
3
- on:
4
- push:
5
- tags: ['v*.*.*']
6
-
7
- permissions:
8
- contents: write
9
-
10
- jobs:
11
- build:
12
- runs-on: ubuntu-latest
13
- steps:
14
- - name: Checkout
15
- uses: actions/checkout@v4
16
- - name: Release
17
- uses: softprops/action-gh-release@v2
18
- with:
19
- generate_release_notes: true
package/.prettierrc DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "semi": true,
3
- "trailingComma": "all",
4
- "singleQuote": true,
5
- "printWidth": 100,
6
- "tabWidth": 2
7
- }
package/Dockerfile DELETED
@@ -1,51 +0,0 @@
1
- FROM python:3.13-slim-bookworm AS base
2
-
3
- COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
4
-
5
- RUN apt-get update && apt-get install -y curl gnupg git \
6
- && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
7
- && apt-get install -y nodejs \
8
- && apt-get clean && rm -rf /var/lib/apt/lists/*
9
-
10
- RUN npm install -g pnpm
11
-
12
- ARG REQUEST_TIMEOUT=60000
13
- ENV REQUEST_TIMEOUT=$REQUEST_TIMEOUT
14
-
15
- ENV PNPM_HOME=/usr/local/share/pnpm
16
- ENV PATH=$PNPM_HOME:$PATH
17
- RUN mkdir -p $PNPM_HOME && \
18
- pnpm add -g @amap/amap-maps-mcp-server @playwright/mcp@latest tavily-mcp@latest @modelcontextprotocol/server-github @modelcontextprotocol/server-slack
19
-
20
- ARG INSTALL_EXT=false
21
- RUN if [ "$INSTALL_EXT" = "true" ]; then \
22
- ARCH=$(uname -m); \
23
- if [ "$ARCH" = "x86_64" ]; then \
24
- npx -y playwright install --with-deps chrome; \
25
- else \
26
- echo "Skipping Chrome installation on non-amd64 architecture: $ARCH"; \
27
- fi; \
28
- fi
29
-
30
- RUN uv tool install mcp-server-fetch
31
- ENV UV_PYTHON_INSTALL_MIRROR="http://mirrors.aliyun.com/pypi/simple/"
32
-
33
- WORKDIR /app
34
-
35
- COPY package.json pnpm-lock.yaml ./
36
- RUN pnpm install
37
-
38
- COPY . .
39
-
40
- # Download the latest servers.json from mcpm.sh and replace the existing file
41
- RUN curl -s -f --connect-timeout 10 https://mcpm.sh/api/servers.json -o servers.json || echo "Failed to download servers.json, using bundled version"
42
-
43
- RUN pnpm frontend:build && pnpm build
44
-
45
- COPY entrypoint.sh /usr/local/bin/entrypoint.sh
46
- RUN chmod +x /usr/local/bin/entrypoint.sh
47
-
48
- EXPOSE 3000
49
-
50
- ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
51
- CMD ["pnpm", "start"]
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/assets/group.png DELETED
Binary file
Binary file
Binary file
Binary file
Binary file
package/assets/wexin.png DELETED
Binary file
package/bin/mcphub.js DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import('../dist/index.js');
package/doc/intro.md DELETED
@@ -1,73 +0,0 @@
1
- # 如何一键部署你的专属 MCP 服务
2
-
3
- 随着 MCP 逐渐成为行业事实标准,如何高效搭建和管理多个 MCP 服务已成为个人开发者面临的主要挑战。本文将介绍一种简便的解决方案,帮助您快速构建自己的 MCP 服务。
4
-
5
- ## 什么是 MCP?
6
-
7
- 模型上下文协议(Model Context Protocol,MCP)是由 Anthropic 推出的开放标准,旨在为大型语言模型(LLMs)提供标准化接口,使其能够直接连接外部数据源和工具。简言之,MCP 如同 AI 应用的 USB-C 接口,统一解决了数据孤岛和定制化集成的问题。
8
-
9
- 通过 MCP,AI 模型不仅可以实时获取最新信息,还能调用外部工具完成各类任务,实现跨平台、跨数据源的无缝交互,大幅提升 AI 应用的实用性和灵活性。
10
-
11
- ## 当下的 MCP 生态
12
-
13
- 尽管 MCP 的标准化接口为 AI 应用开发提供了便利,但在实际应用中,如何快速搭建和高效管理多个 MCP 服务仍然是一个不小的挑战。MCPHub 正是为解决这一痛点而诞生,它提供了集中管理和动态配置的解决方案,让个人开发者能够轻松应对多样化的需求,无需深入了解每个服务的具体实现细节。
14
-
15
- ## 一键部署,轻松满足个人需求
16
-
17
- 对于个人开发者而言,繁琐的部署流程常常成为创新的绊脚石。MCPHub 的最大亮点在于其"一键部署"功能:
18
-
19
- - **极简部署**:只需一条 Docker 命令,即可在几分钟内启动完整的 MCPHub 服务,快速搭建专属 MCP 服务平台,满足个人项目或实验室环境的各种需求。
20
-
21
- - **动态扩展**:在使用过程中,您可以随时通过 Web 仪表盘添加、移除或调整 MCP 服务器配置,无需重启整个系统。这种灵活性不仅适用于个人开发测试,也为未来功能扩展提供了无限可能。
22
-
23
- - **标准化接口**:基于 MCP 标准,您的服务可以无缝对接各种 AI 工具,无论是 Claude Desktop、Cursor 还是其他定制化应用,都能通过统一接口调用外部数据或执行工具操作,实现真正的多源协同工作流程。
24
-
25
- ## 快速上手指南
26
-
27
- 下面,我们将以一个实例演示如何使用 MCPHub 快速搭建基于高德地图 MCP 服务的行程规划助手。
28
-
29
- ### 使用 Docker 部署
30
-
31
- 执行以下命令,即可在本地快速启动 MCPHub 服务:
32
-
33
- ```bash
34
- docker run -p 3000:3000 samanhappy/mcphub
35
- ```
36
-
37
- ### 访问仪表盘
38
-
39
- MCPHub 已内置多个常用 MCP 服务,如高德地图、GitHub、Slack、Fetch、Tavily、Playwright 等,开箱即可使用。在浏览器中打开 `http://localhost:3000`,直观的仪表盘将实时显示各个 MCP 服务器的状态,让您轻松管理和监控服务运行情况。
40
-
41
- ![仪表盘预览](../assets/dashboard.png)
42
-
43
- 可以看到这些 MCP 服务都已成功连接并正常运行。
44
-
45
- ### 配置高德地图
46
-
47
- 由于高德地图的 MCP 服务需要 API Key,我们需要在仪表盘中进行配置。点击 amap-maps 右侧的 Edit 按钮,在弹出窗口的环境变量部分配置高德地图的 API Key。
48
-
49
- ![配置高德地图](../assets/amap-edit.png)
50
-
51
- 点击保存后,MCP Hub 将自动重启高德地图的 MCP 服务,使新配置生效。
52
-
53
- ### 配置 MCP Hub SSE
54
-
55
- MCP Hub 提供了单一聚合的 MCP Server SSE 端点:`http://localhost:3000/sse`,可在任意支持 MCP 的客户端中配置使用。这里我们选择开源的 Cherry Studio 进行演示。
56
-
57
- ![配置 Cherry Studio](../assets/cherry-mcp.png)
58
-
59
- 配置成功后,可用工具列表中将显示所有高德 MCP 服务支持的工具功能。
60
-
61
- ### 使用高德地图 MCP 服务
62
-
63
- 现在,我们可以在 Cherry Studio 中使用高德地图的 MCP 服务了。选择智源的 Qwen2.5-7B-Instruct 模型,并确保启用 MCP Server 开关,然后输入:"我明天要从南京去上海旅游,晚上想住在外滩附近,帮我规划一下交通和酒店行程",点击发送按钮。
64
-
65
- ![高德地图行程规划](../assets/amap-result.png)
66
-
67
- 可以看到,Cherry Studio 在回答过程中调用了高德地图 MCP 服务的多个工具,包括坐标解析、路线规划、周边搜索等,从而实现了一个更强大的行程规划助手。
68
-
69
- ## 结语
70
-
71
- MCPHub 的一键部署和动态配置功能,使个人开发者能够轻松搭建和管理多个 MCP 服务,极大地提升了开发效率和应用灵活性。无论是个人项目还是实验室环境,MCPHub 都能提供高效、便捷的解决方案。
72
-
73
- 随着 MCP 生态的不断扩展,我们将持续增加更多服务和功能,为开发者提供更加丰富的工具集。MCPHub 完全开源,采用 MIT 许可证,项目地址 [https://github.com/samanhappy/mcphub](https://github.com/samanhappy/mcphub),期待您的体验与反馈,共同推动 MCP 生态的繁荣发展!
package/doc/intro2.md DELETED
@@ -1,232 +0,0 @@
1
- # 本地部署、一键安装、分组路由:MCPHub 重塑 MCP 服务器体验
2
-
3
- ## 概述
4
-
5
- 现代 AI 应用场景中,将大模型(LLM)与各种数据源和工具无缝对接,往往需要手动编写大量胶水代码,并且无法快速复用​。MCP(Model Context Protocol)协议由 Anthropic 在 2024 年开源,旨在提供类似“USB‑C”接口般的标准化通信方式,简化 AI 助手与内容仓库、业务系统等的集成流程​。然而,MCP 服务器部署常常需要大量环境依赖、手动配置及持续运行,开发者常因安装和配置耗费大量时间和精力​。MCPHub 作为一款开源的一站式聚合平台,通过直观的 Web UI、Docker 镜像和热插拔配置,实现本地或容器里的“一键安装”与“分组路由”,大幅降低 MCP 服务器的使用门槛和运维成本​。
6
-
7
- ## MCPHub 是什么
8
-
9
- ### MCP 协议简介
10
-
11
- Model Context Protocol(MCP)是一种开放标准,类似“USB‑C”接口,为 AI 助手与内容仓库、业务系统和第三方服务之间提供统一通信协议。它支持 stdio 与 SSE(最新协议中被 Streamable HTTP 取代)两种通信方式,既能满足实时流式数据交换,也可用于批量任务。2024 年由 Anthropic 团队开源发布后,MCP 已在各类 AI 客户端(如 Claude Desktop)中得到应用,成功实现与 GitHub、Slack、网页自动化工具等的无缝对接。
12
-
13
- ### MCPHub 项目概览
14
-
15
- MCPHub 是一个统一的 MCP 服务器聚合平台,内置 MCP 服务器市场实现一键安装。前端基于 React、Vite 和 Tailwind CSS 构建,后端兼容任意使用 npx 或 uvx 命令启动的 MCP 服务器。它通过一个集中式 Dashboard 实时展示各服务器的运行状态,并支持在运行时热插拔增删改服务器配置,无需停机维护。支持分组式访问控制,可以通过独立的 SSE 端点访问不同的 MCP 服务器组合,管理员可灵活定义不同团队或环境的权限策略。官方提供 Docker 镜像,仅需一条命令即可快速启动本地或云端服务。
16
-
17
- ![MCPHub 控制面板](../assets/dashboard.zh.png)
18
-
19
- ## 为什么要使用 MCPHub
20
-
21
- ### 1. 复杂的环境依赖与配置
22
-
23
- - MCP 服务器常依赖 Node.js、Python 等多种运行时,需手动维护大量命令、参数和环境变量。
24
- - MCPHub 内置 MCP 服务器市场,包含众多常用 MCP 服务器,支持一键安装和自动配置,简化了环境搭建过程。
25
- - 通过 Docker 部署,MCPHub 可在任何支持 Docker 的平台上运行,避免了环境不一致的问题。
26
-
27
- ![MCPHub 市场](../assets/market.zh.png)
28
-
29
- ### 2. 持续运行的服务压力
30
-
31
- - MCP 要求长连接服务常驻内存,重启或升级时需要人工干预,缺乏弹性。
32
- - 借助 Docker 容器化部署,MCPHub 可快速重建环境,享受容器带来的弹性与隔离优势。
33
-
34
- ### 3. 路由与分组管理缺乏统一视图
35
-
36
- - 传统方式下,很难可视化地将不同 MCP 服务按场景分类,容易造成 token 浪费和工具选择精度下降。
37
- - MCPHub 支持动态创建分组(如“地图检索”、“网页自动化”、“聊天”等),为每个分组生成独立的 SSE 端点,实现各类用例的隔离与优化。
38
-
39
- ![MCPHub 分组](../assets/group.zh.png)
40
-
41
- ## 如何使用 MCPHub
42
-
43
- ### 快速部署
44
-
45
- ```bash
46
- docker run -p 3000:3000 samanhappy/mcphub
47
- ```
48
-
49
- 一条命令就可以在本地快速启动 MCPHub,默认监听 3000 端口。
50
-
51
- MCPHub 使用`mcp_settings.json`保存所有服务器、分组和用户的配置。你可以创建一个 `mcp_settings.json` 文件,并将其挂载到 Docker 容器中,以便在重启时保留配置。
52
-
53
- ```json
54
- {
55
- "mcpServers": {
56
- "amap": {
57
- "command": "npx",
58
- "args": ["-y", "@amap/amap-maps-mcp-server"],
59
- "env": {
60
- "AMAP_MAPS_API_KEY": "your-api-key"
61
- }
62
- },
63
- "time-mcp": {
64
- "command": "npx",
65
- "args": [
66
- "-y",
67
- "time-mcp"
68
- ]
69
- },
70
- "sequential-thinking": {
71
- "command": "npx",
72
- "args": [
73
- "-y",
74
- "@modelcontextprotocol/server-sequential-thinking"
75
- ]
76
- }
77
- }
78
- }
79
- ```
80
-
81
- 然后挂载配置文件启动:
82
-
83
- ```bash
84
- docker run -p 3000:3000 -v $(pwd)/mcp_settings.json:/app/mcp_settings.json samanhappy/mcphub
85
- ```
86
-
87
- > 注意:首次运行时,MCPHub 会自动下载并安装所需的依赖包,可能需要一些时间。
88
-
89
- ### 访问控制台
90
-
91
- 启动后访问 `http://localhost:3000` 即可进入控制台。
92
-
93
- > 默认登录用户名和密码为 `admin`/`admin123`,登录后可以修改密码以确保安全。
94
-
95
- 控制台提供了服务器管理、分组管理和市场管理等功能,你可以在这里查看所有已安装的 MCP 服务器、创建新的分组、添加或删除服务器等。
96
-
97
- ### 分组路由 & SSE 端点
98
-
99
- #### 全局 SSE 端点
100
-
101
- ```
102
- http://localhost:3000/sse
103
- ```
104
-
105
- 通过全局 SSE 端点可以访问所有已启用的 MCP 服务器。
106
-
107
- #### 基于分组的 SSE 端点
108
-
109
- 除了全局 SSE 端点,MCPHub 还支持基于分组的 SSE 端点。你可以为每个分组创建独立的 SSE 端点,以便更好地管理和路由请求。
110
- 分组的 SSE 端点格式如下:
111
-
112
- ```
113
- http://localhost:3000/sse/{groupId}
114
- ```
115
-
116
- 其中 `{groupId}` 是分组的唯一标识符,可以从控制台获取。比如我在上面的截图中创建了一个名为 `map` 的分组,选择了 `amap` 和 `sequential-thinking` 两个服务器,那么可以通过以下 URL 访问这个分组的 SSE 端点:
117
-
118
- ```
119
- http://localhost:3000/sse/a800bef7-c4c1-4460-9557-5f4404cdd0bd
120
- ```
121
-
122
- #### 使用分组路由
123
-
124
- 创建了路由分组后,我们就可以在任意支持 MCP 的客户端中使用这个分组的 SSE 端点了。比如在 `Cursor` 中,我们可以在配置文件中指定分组的 SSE 端点:
125
-
126
- ```json
127
- {
128
- "mcpServers": {
129
- "mcphub": {
130
- "url": "http://localhost:3000/sse/a800bef7-c4c1-4460-9557-5f4404cdd0bd"
131
- }
132
- }
133
- }
134
- ```
135
-
136
- 配置完成后,可以从 `Cursor` 中看到所有可用的 MCP 服务器工具列表。
137
-
138
- ![Cursor 中的 MCP 配置](../assets/cursor-mcp.png)
139
-
140
- 然后,我们可以测试一下,比如输入:深度思考一下,帮我制定一个五一假期从南京出发的自驾行出游计划,要求避开拥堵路线,结合天气情况,并且可以体验到不同的自然风光。
141
-
142
- ![Cursor 中的测试输入](../assets/cursor-query.png)
143
-
144
- 接着可以看到,`Cursor` 在运行过程中调用了多个工具。
145
-
146
- ![Cursor 中的工具调用](../assets/cursor-tools.png)
147
-
148
- 最终生成结果如下:
149
-
150
- ```markdown
151
- 基于对路线和天气的全面分析,我为你制定了一个四天的五一自驾游行程方案:
152
-
153
- ### 第一天(4月29日):南京→黄山
154
- - 出发时间:建议早上8点出发
155
- - 行驶路线:G42沪蓉高速 → S11巢黄高速
156
- - 行驶时间:约4.5小时(282公里)
157
- - 住宿地点:黄山风景区附近
158
- - 特别提醒:
159
- * 路线多隧道,注意安全
160
- * 天气较好,适合出行
161
- * 建议提前订好黄山景区附近酒店
162
-
163
- ### 第二天(4月30日):黄山→婺源
164
- - 游览时间:上午游览黄山景区
165
- - 下午出发前往婺源
166
- - 行驶路线:G3京台高速 → G56杭瑞高速
167
- - 行驶时间:约2.5小时(139公里)
168
- - 住宿地点:婺源县城或特色古村落
169
- - 特别提醒:
170
- * 注意天气可能有阵雨
171
- * 建议游览篁岭、李坑等著名古村落
172
-
173
- ### 第三天(5月1日):婺源→景德镇
174
- - 上午游览婺源景点
175
- - 中午后出发前往景德镇
176
- - 行驶路线:G56杭瑞高速
177
- - 行驶时间:约1.5小时(77公里)
178
- - 住宿地点:景德镇市区
179
- - 特别提醒:
180
- * 可能遇到阵雨天气
181
- * 建议参观陶瓷博物馆和古窑址
182
-
183
- ### 第四天(5月2日):景德镇→南京
184
- - 建议上午游览景德镇景点
185
- - 中午后出发返回南京
186
- - 行驶路线:G35济广高速 → G4211宁芜高速
187
- - 行驶时间:约5小时(429公里)
188
- - 特别提醒:
189
- * 路程较长,建议做好休息安排
190
- * 注意途中加油站分布
191
- * 建议错峰返程,避免拥堵
192
-
193
- ### 整体建议:
194
- 1. 避堵建议:
195
- - 选择错峰出行时间
196
- - 提前查看实时路况
197
- - 准备备选绕行路线
198
-
199
- 2. 安全建议:
200
- - 全程多雨,注意雨天行车安全
201
- - 保持车距,谨慎驾驶
202
- - 途经隧道较多,注意灯光使用
203
-
204
- 3. 行程准备:
205
- - 提前预订住宿
206
- - 准备雨具和应急用品
207
- - 建议下载离线地图
208
- - 检查车况,特别是雨刮和轮胎
209
-
210
- 4. 景点安排:
211
- - 黄山:建议游览迎客松、光明顶等
212
- - 婺源:篁岭、李坑、江岭等
213
- - 景德镇:陶瓷博物馆、古窑民俗博览区
214
-
215
- 这条路线可以让你体验到:
216
- - 黄山的壮丽山景
217
- - 婺源的田园风光
218
- - 景德镇的人文历史
219
- 既避开了主要拥堵路段,又能欣赏到不同的自然风光。
220
- ```
221
-
222
- 可以看到,`Cursor` 通过调用 `amap` 和 `sequential-thinking` 两个服务器,成功生成了一个五一假期的自驾游行程方案,并且避开了拥堵路线,结合了天气情况。但是细心的同学可能发现,计划中的开始时间是 4 月 29 日,而今年的五一假期是 5 月 1 日开始的,产生偏差的原因是 `sequential-thinking` 使用了错误的假期时间。如何解决这个问题呢?我们可以尝试在分组中添加支持搜索的 MCP 服务器,这样就可以在查询时自动纠正错误的假期时间了,具体就不在这里展开了。
223
-
224
- ## 结语
225
-
226
- MCPHub 将本地部署、一键安装、分组路由和可视化管理融为一体,以简洁而强大的设计,彻底解决了 MCP 服务器的部署、配置与运维难题。无论是追求快速验证的开发者,还是需要稳定可靠 AI 工具链的企业用户,都能通过 MCPHub 专注于核心业务与创新,而无需被底层细节所困扰。
227
-
228
- 尽管目前各家平台都在陆续推出各类 MCP 云服务,但在数据隐私、合规性和定制化需求日益增长的背景下,MCPHub 仍然是一个值得关注的本地部署解决方案​。
229
-
230
- MCPHub 只是我一时兴起开发的小项目,没想到竟收获了这么多关注,非常感谢大家的支持!目前 MCPHub 还有不少地方需要优化和完善,我也专门建了个交流群,方便大家交流反馈。如果你也对这个项目感兴趣,欢迎一起参与建设!项目地址为:https://github.com/samanhappy/mcphub。
231
-
232
- ![企业微信交流群](../assets/wegroup.jpg)
package/entrypoint.sh DELETED
@@ -1,10 +0,0 @@
1
- #!/bin/bash
2
-
3
- NPM_REGISTRY=${NPM_REGISTRY:-https://registry.npmjs.org/}
4
- echo "Setting npm registry to ${NPM_REGISTRY}"
5
- npm config set registry "$NPM_REGISTRY"
6
-
7
- echo "Using REQUEST_TIMEOUT: $REQUEST_TIMEOUT"
8
- echo "Using UV_PYTHON_INSTALL_MIRROR: $UV_PYTHON_INSTALL_MIRROR"
9
-
10
- exec "$@"
Binary file
@@ -1,13 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>MCP Hub Dashboard</title>
7
- <link rel="icon" type="image/x-icon" href="/favicon.ico">
8
- </head>
9
- <body class="bg-gray-100">
10
- <div id="root"></div>
11
- <script type="module" src="/src/main.tsx"></script>
12
- </body>
13
- </html>
@@ -1,6 +0,0 @@
1
- export default {
2
- plugins: {
3
- '@tailwindcss/postcss': {},
4
- autoprefixer: {},
5
- },
6
- };
@@ -1,44 +0,0 @@
1
- import React from 'react';
2
- import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom';
3
- import { AuthProvider } from './contexts/AuthContext';
4
- import { ToastProvider } from './contexts/ToastContext';
5
- import MainLayout from './layouts/MainLayout';
6
- import ProtectedRoute from './components/ProtectedRoute';
7
- import LoginPage from './pages/LoginPage';
8
- import DashboardPage from './pages/Dashboard';
9
- import ServersPage from './pages/ServersPage';
10
- import GroupsPage from './pages/GroupsPage';
11
- import SettingsPage from './pages/SettingsPage';
12
- import MarketPage from './pages/MarketPage';
13
-
14
- function App() {
15
- return (
16
- <AuthProvider>
17
- <ToastProvider>
18
- <Router>
19
- <Routes>
20
- {/* 公共路由 */}
21
- <Route path="/login" element={<LoginPage />} />
22
-
23
- {/* 受保护的路由,使用 MainLayout 作为布局容器 */}
24
- <Route element={<ProtectedRoute />}>
25
- <Route element={<MainLayout />}>
26
- <Route path="/" element={<DashboardPage />} />
27
- <Route path="/servers" element={<ServersPage />} />
28
- <Route path="/groups" element={<GroupsPage />} />
29
- <Route path="/market" element={<MarketPage />} />
30
- <Route path="/market/:serverName" element={<MarketPage />} />
31
- <Route path="/settings" element={<SettingsPage />} />
32
- </Route>
33
- </Route>
34
-
35
- {/* 未匹配的路由重定向到首页 */}
36
- <Route path="*" element={<Navigate to="/" />} />
37
- </Routes>
38
- </Router>
39
- </ToastProvider>
40
- </AuthProvider>
41
- );
42
- }
43
-
44
- export default App;