Compare commits

...

117 Commits

Author SHA1 Message Date
comeback01
9a65532a50 feat: add french localization (#337)
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-09-12 14:27:05 +08:00
dependabot[bot]
c5aa97de50 chore(deps-dev): bump vite from 6.3.5 to 6.3.6 (#334)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-10 12:42:00 +08:00
dependabot[bot]
271c9fe2c3 chore(deps-dev): bump i18next from 24.2.3 to 25.4.2 (#329)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 08:51:54 +08:00
dependabot[bot]
d59961c4d4 chore(deps-dev): bump next from 15.5.0 to 15.5.2 (#328)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 08:51:23 +08:00
dependabot[bot]
d0ec80303a chore(deps-dev): bump jest-mock-extended from 4.0.0-beta1 to 4.0.0 (#330)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 22:49:30 +08:00
dependabot[bot]
69e92b5aa8 chore(deps): bump @apidevtools/swagger-parser from 11.0.1 to 12.0.0 (#331)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 22:48:29 +08:00
dependabot[bot]
5acae64b29 chore(deps-dev): bump @typescript-eslint/eslint-plugin from 6.21.0 to 7.0.0 (#327)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 22:47:30 +08:00
samanhappy
a5fc4a429d fix: ensure settings cache is cleared after saving and clearing cache (#326) 2025-09-01 10:15:50 +08:00
Junsen Huang
ce15330016 fix(server-context): fix server edite error (#325) 2025-08-30 17:37:30 +08:00
samanhappy
621bc36560 feat: Add OpenAPI-compatible tool execution endpoints for named APIs (#316) 2025-08-30 16:00:15 +08:00
Junsen Huang
c398223824 feat: refactor server data management to use global context (#319) 2025-08-28 22:15:16 +08:00
Copilot
5dd3e7978e Generate comprehensive GitHub Copilot instructions for MCPHub development (#314)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: samanhappy <2755122+samanhappy@users.noreply.github.com>
2025-08-27 21:58:06 +08:00
samanhappy
f577351f04 fix: set current working directory for StdioClientTransport to homedir (#311) 2025-08-27 19:23:00 +08:00
Copilot
62de87b1a4 Add granular OpenAPI endpoints for server-level and group-level tool access (#309)
Co-authored-by: samanhappy <samanhappy@gmail.com>
2025-08-27 17:25:32 +08:00
samanhappy
bbd6c891c9 feat(dao): Implement comprehensive DAO layer (#308)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-08-27 15:21:30 +08:00
Copilot
f9019545c3 Fix integer parameter conversion in OpenAPI endpoints (#306)
Co-authored-by: samanhappy <samanhappy@gmail.com>
2025-08-27 11:04:25 +08:00
samanhappy
d778536388 fix: update tool call API endpoint structure and enhance error handling (#300) 2025-08-26 18:49:34 +08:00
Copilot
976e90679d Add OpenAPI specification generation for OpenWebUI integration (#295)
Co-authored-by: samanhappy <samanhappy@gmail.com>
2025-08-26 14:54:19 +08:00
samanhappy
f6ee9beed3 refactor: remove MCPRouter referer and title input sections from SettingsPage (#294) 2025-08-25 15:51:02 +08:00
samanhappy
69a800fa7a fix: update MCPRouter referer URL to new domain (#293) 2025-08-25 13:25:37 +08:00
Copilot
83cbd16821 Fix Dependabot security alert #11 - resolve sha.js and brace-expansion vulnerabilities (#292)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: samanhappy <2755122+samanhappy@users.noreply.github.com>
2025-08-25 12:26:04 +08:00
samanhappy
9300814994 Add .git to .dockerignore to prevent Git files from being included in Docker builds (#290) 2025-08-24 15:37:38 +08:00
Rilomilo
9952927a13 remove redundant code (#288) 2025-08-24 11:40:33 +08:00
samanhappy
4547ae526a fix: adjust spacing and heading size in LoginPage for improved layout (#286)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-08-20 22:14:41 +08:00
Copilot
80b83bb029 Fix missing i18n translation for api.errors.invalid_credentials (#285)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: samanhappy <2755122+samanhappy@users.noreply.github.com>
2025-08-20 21:06:03 +08:00
Copilot
fa2de88fea Center login form and simplify layout with main slogan only (#283)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: samanhappy <2755122+samanhappy@users.noreply.github.com>
Co-authored-by: samanhappy <samanhappy@gmail.com>
2025-08-20 14:37:10 +08:00
samanhappy
6020611f57 Add prompt management functionality to MCP server (#281) 2025-08-20 14:23:55 +08:00
samanhappy
81c3091a5c fix: filter out empty values in tool arguments for improved functionality (#280)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-20 14:21:51 +08:00
samanhappy
6a8f246dff fix: adjust layout for LoginPage to improve responsiveness and styling (#278) 2025-08-14 16:28:47 +08:00
samanhappy
2bef1fb0bd fix: update @modelcontextprotocol/sdk dependency to version 1.17.2 (#277) 2025-08-14 15:17:19 +08:00
samanhappy
bdb5b37cf5 Add API documentation (#275) 2025-08-14 14:12:15 +08:00
samanhappy
cbb3b15ba2 fix: standardize naming to MCPHub across documentation and UI (#271)
Co-authored-by: samanhappy@qq.com <my6051199>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-13 21:54:41 +08:00
samanhappy
77b423fbcc Refactor JWT secret management and enhance documentation (#270) 2025-08-11 19:09:33 +08:00
samanhappy
604fe4f71d fix: remove registration endpoint from authentication bypass in middleware (#267) 2025-08-11 14:18:28 +08:00
samanhappy
907bca8aac Refactor cloud and market pages for improved functionality and UI consistency (#265) 2025-08-10 17:39:34 +08:00
samanhappy
8c58200dcc feat: add health check endpoint to monitor MCP server status (#264) 2025-08-10 16:46:22 +08:00
samanhappy
0b4dc453a5 fix: reinitialize mcp server connection on update (#263) 2025-08-10 16:20:36 +08:00
samanhappy
35012f99fc refine docs 2025-08-10 12:52:54 +08:00
samanhappy
22ad4f83f6 fix: handle undefined and null values for number inputs in DynamicForm (#261)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-10 12:52:20 +08:00
samanhappy
26720d9e49 feat: introduce cloud server market (#260) 2025-08-09 21:14:26 +08:00
samanhappy
a9aa4a9a08 feat: Update registerService to handle environment-specific service overrides (#257) 2025-08-05 14:48:48 +08:00
samanhappy
48bcf9f5f0 feat: Add cleanInputSchema function to remove $schema field from inputSchema (#255) 2025-08-05 13:45:52 +08:00
samanhappy
f63f06d879 feat: Enhance authentication flow by integrating permissions retrieval and updating related services (#256) 2025-08-05 13:45:31 +08:00
samanhappy
63b356b8d7 Add Chinese localization support and i18n middleware (#253) 2025-08-03 11:53:04 +08:00
samanhappy
a6cea2ad3f feat: Enhance group management with server tool configuration (#250) 2025-07-29 17:31:05 +08:00
samanhappy
5bb2715094 refactor: simplify LanguageSwitch component by removing unnecessary language count checks and enhancing dropdown behavior (#249) 2025-07-27 20:44:50 +08:00
samanhappy
9b40f7e101 feat: enhance LanguageSwitch component with language toggle functionality and improve dropdown behavior; update UserProfileMenu styles (#248) 2025-07-26 22:58:01 +08:00
samanhappy
df872823c1 Implement language and theme switchers in Header (#247) 2025-07-26 21:46:14 +08:00
samanhappy
9304653c34 feat: enhance GroupCard with copy options for ID, URL, and JSON; update translations (#246)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-25 14:30:52 +08:00
dependabot[bot]
b5685b7010 chore(deps): bump axios from 1.10.0 to 1.11.0 (#245)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-24 10:39:17 +08:00
samanhappy
89c37b2f02 Enhance operation name generation in OpenAPIClient (#244) 2025-07-23 19:02:43 +08:00
Oven
c316cb896e fix: create when dxt upload path does not exist (#243) 2025-07-23 13:47:11 +08:00
samanhappy
bc3c8facfa feat: add replaceEnvVarsInArray function and integrate it into server transport configuration (#241)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-07-22 23:24:04 +08:00
dependabot[bot]
69afb865c0 chore(deps): bump brace-expansion from 1.1.11 to 1.1.12 (#231)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 23:07:20 +08:00
dependabot[bot]
ba30d88840 chore(deps): bump multer from 2.0.1 to 2.0.2 (#229)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 23:06:24 +08:00
samanhappy
6d0d622bd8 feat: add permissions for contents and packages in build workflow (#238) 2025-07-22 10:05:16 +08:00
samanhappy
ab50c7e9eb feat: add conditional check for repository in build and npm publish workflows (#236)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-07-22 08:56:50 +08:00
samanhappy
e507bea2e3 Refactor service registration and revert lazy loading implementation (#234) 2025-07-20 22:30:09 +08:00
samanhappy
0f00ad7200 feat: implement lazy loading for data service and enhance service registration (#233) 2025-07-20 21:37:43 +08:00
samanhappy
b0b0c93337 feat: enable immediate loading of service overrides during registration (#232) 2025-07-20 20:35:00 +08:00
samanhappy
20fd355b87 feat: enhance JSON serialization safety & add dxt upload limit (#230) 2025-07-20 19:18:10 +08:00
dependabot[bot]
4388084704 chore(deps): bump typeorm from 0.3.24 to 0.3.25 (#210)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-07 09:54:52 +08:00
dependabot[bot]
fe2535461d chore(deps-dev): bump @types/react-dom from 19.1.5 to 19.1.6 (#211)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-07 09:39:52 +08:00
dependabot[bot]
985598e529 chore(deps): bump pg from 8.16.0 to 8.16.3 (#212)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-05 15:24:37 +08:00
dependabot[bot]
b2b6d0588b chore(deps-dev): bump tailwindcss from 4.1.8 to 4.1.11 (#213)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-03 14:11:24 +08:00
dependabot[bot]
64628ee3ed chore(deps-dev): bump tsx from 4.19.4 to 4.20.3 (#214)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-02 18:04:25 +08:00
samanhappy
66d4142039 feat: add variable detection and confirmation dialogs in server forms (#205) 2025-06-29 22:23:42 +08:00
samanhappy
cf72295f99 Refactor UI components across multiple pages for improved styling and consistency (#204) 2025-06-29 22:01:00 +08:00
samanhappy
89f85c73ff fix: resolve race conditions in initializeClientsFromSettings (#201) 2025-06-28 22:11:14 +08:00
samanhappy
adabf1d92b feat:support DXT file server installation (#200) 2025-06-27 14:45:24 +08:00
samanhappy
c3a6dfadb4 feat: Add dynamic header input fields for server configuration in ServerForm (#193) 2025-06-20 14:52:22 +08:00
samanhappy
d119be0f82 feat: Implement bearer token validation in auth middleware (#186) 2025-06-19 12:11:35 +08:00
samanhappy
1e308ec4c5 feat: add Jest testing framework and CI/CD configuration (#187)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-06-18 14:02:52 +08:00
samanhappy
1bd4fd6d9c feat: Add OpenAPI support with comprehensive configuration options and client integration (#184)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-16 17:50:51 +08:00
Imgodmaoyouknow
4b3bb26301 fix: 修复从市场安装服务器时,选择SSE和Streamable HTTP不生效的问题 (#180) 2025-06-13 22:50:36 +08:00
samanhappy
40af398f68 chore: update @modelcontextprotocol/sdk to version 1.12.1 (#176) 2025-06-10 16:50:28 +08:00
samanhappy
4726f00a22 feat: add request options configuration to server form (#171) 2025-06-10 13:51:01 +08:00
samanhappy
77f64b7b98 feat: enhance DynamicForm to support array and object (#173)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-06-10 13:50:14 +08:00
samanhappy
d9cbc5381a feat: implement keep-alive functionality for SSE connections (#166)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-06-07 20:41:51 +08:00
samanhappy
56c6447469 feat: implement settings cache with load, save, clear, and status functions (#167) 2025-06-07 20:36:52 +08:00
samanhappy
f8149c4b0b fix: update SSE transport path to use basePath from config (#165)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-06-07 20:35:20 +08:00
purefkh
e259f30539 fix: save user config when install mcp server from market (#168) 2025-06-07 20:34:51 +08:00
samanhappy
3a421bc476 fix: update tool name formatting from '/' to '-' in ToolCard and mcpService (#164)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-05 15:34:49 +08:00
samanhappy
503b60edb7 feat: add tool management features including toggle and description updates (#163)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-06-04 16:03:45 +08:00
dependabot[bot]
4039a85ee1 chore(deps-dev): bump concurrently from 8.2.2 to 9.1.2 (#156)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-02 19:49:58 +08:00
dependabot[bot]
3a83b83a9e chore(deps-dev): bump @vitejs/plugin-react from 4.4.1 to 4.5.0 (#160)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-02 19:47:04 +08:00
samanhappy
c1621805de fix: expand environment variables in database and OpenAI configuration (#162) 2025-06-02 19:46:39 +08:00
samanhappy
ecf79eaef3 fix: update error response status for missing transport in SSE service (#161) 2025-06-02 10:56:23 +08:00
samanhappy
e2cb5fa467 fix: update favicon path from "/favicon.svg" to "/favicon.ico" in documentation (#155) 2025-06-01 08:27:05 +08:00
samanhappy
7193ca4cdc fix: update "Get Started" button link to point to the correct documentation URL (#154) 2025-06-01 00:23:18 +08:00
samanhappy
9675cd8533 generate documents using mintlify (#153) 2025-06-01 00:17:09 +08:00
samanhappy
65c95aaa0b feat: Implement tool management features including tool execution and result handling (#152) 2025-05-31 22:00:05 +08:00
samanhappy
d2bbadea83 Add HTTP headers support and batch update for routing configuration (#151) 2025-05-31 18:36:41 +08:00
samanhappy
394945bbc5 fix: enhance environment variable handling in replaceEnvVars and expandEnvVars functions (#149)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-05-31 08:41:20 +08:00
samanhappy
bfc184afc6 fix: enhance database initialization by adding required PostgreSQL extensions and improving error handling (#144)
Co-authored-by: samanhappy@qq.com <my6051199>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-30 23:03:42 +08:00
Oven
1acacfab88 配置MCP Server时,env中填写的${xxx}值可以从环境变量中读取 (#135) 2025-05-30 23:02:34 +08:00
terrydash
63c55875b5 add env var for setting file (#147)
Co-authored-by: Xu, Guoxu | Terry | CNTD <guoxu.xu@rakuten.com>
2025-05-30 23:01:52 +08:00
samanhappy
80c6aae116 Add comprehensive documentation for MCPHub including deployment, configuration, and smart routing features (#142) 2025-05-29 15:44:39 +08:00
samanhappy
e2c5cc8ed1 fix: refine sessionId handling in handleMcpPostRequest for initialization requests (#138)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-05-28 23:25:21 +08:00
samanhappy
b0a65cc6d0 fix: streamline sessionId handling in handleMcpPostRequest (#137)
Co-authored-by: samanhappy@qq.com <my6051199>
2025-05-28 22:15:14 +08:00
samanhappy
e019c9e8b3 fix: simplify server status labels in English and Chinese locales (#128) 2025-05-28 18:20:43 +08:00
samanhappy
39b69bf550 fix: improve sessionId validation and error handling in handleSseMessage (#134) 2025-05-28 14:30:35 +08:00
samanhappy
a1047321d1 feat: introduce runtime path (#132) 2025-05-27 18:34:23 +08:00
samanhappy
268ce5cce6 feat: Refactor API URL handling and add base path support (#131) 2025-05-27 16:11:35 +08:00
samanhappy
37bb3414c8 feat: add VITE_BASE_PATH environment variable and update routing in App component (#130) 2025-05-27 13:08:41 +08:00
samanhappy
c3e1fa1eee Update asset paths to use relative URLs (#129) 2025-05-27 11:55:50 +08:00
samanhappy
edfbdb7123 fix: update README and README.zh.md for clarity and consistency (#124) 2025-05-25 21:32:46 +08:00
samanhappy
9e5c2b5525 feat: introduce auto routing (#122) 2025-05-25 21:09:47 +08:00
samanhappy
27b7e766af fix: downgrade express and @types/express to compatible versions (#119) 2025-05-22 15:14:05 +08:00
dependabot[bot]
9c55f63bb1 chore(deps-dev): bump @types/node from 20.17.28 to 22.15.21 (#114)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 14:57:56 +08:00
dependabot[bot]
b1674cc630 chore(deps): bump express and @types/express (#113)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 14:56:06 +08:00
dependabot[bot]
3570232ccc chore(deps-dev): bump tailwind-merge from 3.1.0 to 3.3.0 (#112)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 14:54:29 +08:00
dependabot[bot]
f50bb08816 chore(deps-dev): bump @tailwindcss/postcss from 4.1.3 to 4.1.7 (#115)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 14:54:03 +08:00
dependabot[bot]
721674e7eb chore(deps-dev): bump @radix-ui/react-slot from 1.1.2 to 1.2.3 (#116)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 14:53:50 +08:00
samanhappy
1337eeed84 Update dependabot.yml (#111) 2025-05-21 09:39:56 +08:00
samanhappy
b14be9955b Create dependabot.yml (#110) 2025-05-21 09:37:39 +08:00
samanhappy
da45d49a5e feat: Bump Vite to v6 and update esbuild (#109)
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-05-21 09:34:24 +08:00
275 changed files with 58445 additions and 4915 deletions

16
.coveragerc Normal file
View File

@@ -0,0 +1,16 @@
# Test coverage configuration
# This file tells Jest what to include/exclude from coverage reports
# Coverage patterns
- "src/**/*.{ts,tsx}"
# Exclusions
- "!src/**/*.d.ts"
- "!src/index.ts"
- "!src/**/__tests__/**"
- "!src/**/*.test.{ts,tsx}"
- "!src/**/*.spec.{ts,tsx}"
- "!**/node_modules/**"
- "!coverage/**"
- "!dist/**"
- "!build/**"

1
.dockerignore Normal file
View File

@@ -0,0 +1 @@
.git

View File

@@ -20,6 +20,6 @@
}
],
"@typescript-eslint/no-explicit-any": "off",
"no-undef": "off",
"no-undef": "off"
}
}

237
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,237 @@
# MCPHub Coding Instructions
**ALWAYS follow these instructions first and only fallback to additional search and context gathering if the information here is incomplete or found to be in error.**
## Project Overview
MCPHub is a TypeScript/Node.js MCP (Model Context Protocol) server management hub that provides unified access through HTTP endpoints. It serves as a centralized dashboard for managing multiple MCP servers with real-time monitoring, authentication, and flexible routing.
**Core Components:**
- **Backend**: Express.js + TypeScript + ESM (`src/server.ts`)
- **Frontend**: React/Vite + Tailwind CSS (`frontend/`)
- **MCP Integration**: Connects multiple MCP servers (`src/services/mcpService.ts`)
- **Authentication**: JWT-based with bcrypt password hashing
- **Configuration**: JSON-based MCP server definitions (`mcp_settings.json`)
## Working Effectively
### Bootstrap and Setup (CRITICAL - Follow Exact Steps)
```bash
# Install pnpm if not available
npm install -g pnpm
# Install dependencies - takes ~30 seconds
pnpm install
# Setup environment (optional)
cp .env.example .env
# Build and test to verify setup
pnpm lint # ~3 seconds - NEVER CANCEL
pnpm backend:build # ~5 seconds - NEVER CANCEL
pnpm test:ci # ~16 seconds - NEVER CANCEL. Set timeout to 60+ seconds
pnpm frontend:build # ~5 seconds - NEVER CANCEL
pnpm build # ~10 seconds total - NEVER CANCEL. Set timeout to 60+ seconds
```
**CRITICAL TIMING**: These commands are fast but NEVER CANCEL them. Always wait for completion.
### Development Environment
```bash
# Start both backend and frontend (recommended for most development)
pnpm dev # Backend on :3001, Frontend on :5173
# OR start separately (required on Windows, optional on Linux/macOS)
# Terminal 1: Backend only
pnpm backend:dev # Runs on port 3000 (or PORT env var)
# Terminal 2: Frontend only
pnpm frontend:dev # Runs on port 5173, proxies API to backend
```
**NEVER CANCEL**: Development servers may take 10-15 seconds to fully initialize all MCP servers.
### Build Commands (Production)
```bash
# Full production build - takes ~10 seconds total
pnpm build # NEVER CANCEL - Set timeout to 60+ seconds
# Individual builds
pnpm backend:build # TypeScript compilation - ~5 seconds
pnpm frontend:build # Vite build - ~5 seconds
# Start production server
pnpm start # Requires dist/ and frontend/dist/ to exist
```
### Testing and Validation
```bash
# Run all tests - takes ~16 seconds with 73 tests
pnpm test:ci # NEVER CANCEL - Set timeout to 60+ seconds
# Development testing
pnpm test # Interactive mode
pnpm test:watch # Watch mode for development
pnpm test:coverage # With coverage report
# Code quality
pnpm lint # ESLint - ~3 seconds
pnpm format # Prettier formatting - ~3 seconds
```
**CRITICAL**: All tests MUST pass before committing. Do not modify tests to make them pass unless specifically required for your changes.
## Manual Validation Requirements
**ALWAYS perform these validation steps after making changes:**
### 1. Basic Application Functionality
```bash
# Start the application
pnpm dev
# Verify backend responds (in another terminal)
curl http://localhost:3000/api/health
# Expected: Should return health status
# Verify frontend serves
curl -I http://localhost:3000/
# Expected: HTTP 200 OK with HTML content
```
### 2. MCP Server Integration Test
```bash
# Check MCP servers are loading (look for log messages)
# Expected log output should include:
# - "Successfully connected client for server: [name]"
# - "Successfully listed [N] tools for server: [name]"
# - Some servers may fail due to missing API keys (normal in dev)
```
### 3. Build Verification
```bash
# Verify production build works
pnpm build
node scripts/verify-dist.js
# Expected: "✅ Verification passed! Frontend and backend dist files are present."
```
**NEVER skip these validation steps**. If any fail, debug and fix before proceeding.
## Project Structure and Key Files
### Critical Backend Files
- `src/index.ts` - Application entry point
- `src/server.ts` - Express server setup and middleware
- `src/services/mcpService.ts` - **Core MCP server management logic**
- `src/config/index.ts` - Configuration management
- `src/routes/` - HTTP route definitions
- `src/controllers/` - HTTP request handlers
- `src/dao/` - Data access layer for users, groups, servers
- `src/types/index.ts` - TypeScript type definitions
### Critical Frontend Files
- `frontend/src/` - React application source
- `frontend/src/pages/` - Page components (development entry point)
- `frontend/src/components/` - Reusable UI components
### Configuration Files
- `mcp_settings.json` - **MCP server definitions and user accounts**
- `package.json` - Dependencies and scripts
- `tsconfig.json` - TypeScript configuration
- `jest.config.cjs` - Test configuration
- `.eslintrc.json` - Linting rules
### Docker and Deployment
- `Dockerfile` - Multi-stage build with Python base + Node.js
- `entrypoint.sh` - Docker startup script
- `bin/cli.js` - NPM package CLI entry point
## Development Process and Conventions
### Code Style Requirements
- **ESM modules**: Always use `.js` extensions in imports, not `.ts`
- **English only**: All code comments must be written in English
- **TypeScript strict**: Follow strict type checking rules
- **Import style**: `import { something } from './file.js'` (note .js extension)
### Key Configuration Notes
- **MCP servers**: Defined in `mcp_settings.json` with command/args
- **Endpoints**: `/mcp/{group|server}` and `/mcp/$smart` for routing
- **i18n**: Frontend uses react-i18next with files in `locales/` folder
- **Authentication**: JWT tokens with bcrypt password hashing
- **Default credentials**: admin/admin123 (configured in mcp_settings.json)
### Development Entry Points
- **Add MCP server**: Modify `mcp_settings.json` and restart
- **New API endpoint**: Add route in `src/routes/`, controller in `src/controllers/`
- **Frontend feature**: Start from `frontend/src/pages/` or `frontend/src/components/`
- **Add tests**: Follow patterns in `tests/` directory
### Common Development Tasks
#### Adding a new MCP server:
1. Add server definition to `mcp_settings.json`
2. Restart backend to load new server
3. Check logs for successful connection
4. Test via dashboard or API endpoints
#### API development:
1. Define route in `src/routes/`
2. Implement controller in `src/controllers/`
3. Add types in `src/types/index.ts` if needed
4. Write tests in `tests/controllers/`
#### Frontend development:
1. Create/modify components in `frontend/src/components/`
2. Add pages in `frontend/src/pages/`
3. Update routing if needed
4. Test in development mode with `pnpm frontend:dev`
## Validation and CI Requirements
### Before Committing - ALWAYS Run:
```bash
pnpm lint # Must pass - ~3 seconds
pnpm backend:build # Must compile - ~5 seconds
pnpm test:ci # All tests must pass - ~16 seconds
pnpm build # Full build must work - ~10 seconds
```
**CRITICAL**: CI will fail if any of these commands fail. Fix issues locally first.
### CI Pipeline (.github/workflows/ci.yml)
- Runs on Node.js 20.x
- Tests: linting, type checking, unit tests with coverage
- **NEVER CANCEL**: CI builds may take 2-3 minutes total
## Troubleshooting
### Common Issues
- **"uvx command not found"**: Some MCP servers require `uvx` (Python package manager) - this is expected in development
- **Port already in use**: Change PORT environment variable or kill existing processes
- **Frontend not loading**: Ensure frontend was built with `pnpm frontend:build`
- **MCP server connection failed**: Check server command/args in `mcp_settings.json`
### Build Failures
- **TypeScript errors**: Run `pnpm backend:build` to see compilation errors
- **Test failures**: Run `pnpm test:verbose` for detailed test output
- **Lint errors**: Run `pnpm lint` and fix reported issues
### Development Issues
- **Backend not starting**: Check for port conflicts, verify `mcp_settings.json` syntax
- **Frontend proxy errors**: Ensure backend is running before starting frontend
- **Hot reload not working**: Restart development server
## Performance Notes
- **Install time**: pnpm install takes ~30 seconds
- **Build time**: Full build takes ~10 seconds
- **Test time**: Complete test suite takes ~16 seconds
- **Startup time**: Backend initialization takes 10-15 seconds (MCP server connections)
**Remember**: NEVER CANCEL any build or test commands. Always wait for completion even if they seem slow.

11
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "npm" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "monthly"

View File

@@ -8,6 +8,9 @@ on:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
strategy:
matrix:
variant: ${{ startsWith(github.ref, 'refs/tags/') && fromJSON('["base", "full"]') || fromJSON('["base"]') }}
@@ -30,16 +33,27 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
if: endsWith(github.repository, 'mcphub')
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
if: endsWith(github.repository, 'mcphubx')
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: samanhappy/mcphub
images: |
${{ endsWith(github.repository, 'mcphub') && github.repository || '' }}
${{ endsWith(github.repository, 'mcphubx') && format('ghcr.io/{0}', github.repository) || '' }}
tags: |
type=raw,value=edge${{ matrix.variant == 'full' && '-full' || '' }},enable=${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}
type=semver,pattern={{version}}${{ matrix.variant == 'full' && '-full' || '' }},enable=${{ startsWith(github.ref, 'refs/tags/') }}
@@ -48,6 +62,7 @@ jobs:
latest=false
- name: Build and Push Docker Image
if: endsWith(github.repository, 'mcphub') || endsWith(github.repository, 'mcphubx')
uses: docker/build-push-action@v5
with:
context: .

112
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,112 @@
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Enable Corepack
run: corepack enable
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run linter
run: pnpm lint
- name: Run type checking
run: pnpm backend:build
- name: Run tests
run: pnpm test:ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
file: ./coverage/lcov.info
flags: unittests
name: codecov-umbrella
# build:
# runs-on: ubuntu-latest
# needs: test
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: '20.x'
# - name: Enable Corepack
# run: corepack enable
# - name: Install dependencies
# run: pnpm install --frozen-lockfile
# - name: Build application
# run: pnpm build
# - name: Verify build artifacts
# run: node scripts/verify-dist.js
# integration-test:
# runs-on: ubuntu-latest
# needs: test
# services:
# postgres:
# image: postgres:15
# env:
# POSTGRES_PASSWORD: postgres
# POSTGRES_DB: mcphub_test
# options: >-
# --health-cmd pg_isready
# --health-interval 10s
# --health-timeout 5s
# --health-retries 5
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: '20.x'
# - name: Enable Corepack
# run: corepack enable
# - name: Install dependencies
# run: pnpm install --frozen-lockfile
# - name: Build application
# run: pnpm build
# - name: Run integration tests
# run: |
# export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/mcphub_test"
# node test-integration.ts
# env:
# NODE_ENV: test

View File

@@ -7,6 +7,7 @@ on:
jobs:
publish-npm:
runs-on: ubuntu-latest
if: endsWith(github.repository, 'mcphub')
steps:
- name: Checkout
uses: actions/checkout@v4

2
.gitignore vendored
View File

@@ -24,3 +24,5 @@ yarn-error.log*
.vscode/
*.log
coverage/
data/

View File

@@ -2,12 +2,6 @@ FROM python:3.13-slim-bookworm AS base
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
# 添加 HTTP_PROXY 和 HTTPS_PROXY 环境变量
ARG HTTP_PROXY=""
ARG HTTPS_PROXY=""
ENV HTTP_PROXY=$HTTP_PROXY
ENV HTTPS_PROXY=$HTTPS_PROXY
RUN apt-get update && apt-get install -y curl gnupg git \
&& curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y nodejs \
@@ -15,23 +9,20 @@ RUN apt-get update && apt-get install -y curl gnupg git \
RUN npm install -g pnpm
ARG REQUEST_TIMEOUT=60000
ENV REQUEST_TIMEOUT=$REQUEST_TIMEOUT
ENV PNPM_HOME=/usr/local/share/pnpm
ENV PATH=$PNPM_HOME:$PATH
RUN mkdir -p $PNPM_HOME && \
pnpm add -g @amap/amap-maps-mcp-server @playwright/mcp@latest tavily-mcp@latest @modelcontextprotocol/server-github @modelcontextprotocol/server-slack
pnpm add -g @amap/amap-maps-mcp-server @playwright/mcp@latest tavily-mcp@latest @modelcontextprotocol/server-github @modelcontextprotocol/server-slack
ARG INSTALL_EXT=false
RUN if [ "$INSTALL_EXT" = "true" ]; then \
ARCH=$(uname -m); \
if [ "$ARCH" = "x86_64" ]; then \
npx -y playwright install --with-deps chrome; \
else \
echo "Skipping Chrome installation on non-amd64 architecture: $ARCH"; \
fi; \
fi
ARCH=$(uname -m); \
if [ "$ARCH" = "x86_64" ]; then \
npx -y playwright install --with-deps chrome; \
else \
echo "Skipping Chrome installation on non-amd64 architecture: $ARCH"; \
fi; \
fi
RUN uv tool install mcp-server-fetch

126
QWEN.md Normal file
View File

@@ -0,0 +1,126 @@
# MCPHub Project Overview
## Project Summary
MCPHub is a centralized hub server for managing multiple Model Context Protocol (MCP) servers. It allows organizing these servers into flexible Streamable HTTP (SSE) endpoints, supporting access to all servers, individual servers, or logical server groups. It provides a web dashboard for monitoring and managing servers, along with features like authentication, group-based access control, and Smart Routing using vector semantic search.
## Technology Stack
### Backend
- **Language:** TypeScript (Node.js)
- **Framework:** Express
- **Key Libraries:**
- `@modelcontextprotocol/sdk`: Core library for MCP interactions.
- `typeorm`: ORM for database interactions.
- `pg` & `pgvector`: PostgreSQL database and vector support.
- `jsonwebtoken` & `bcryptjs`: Authentication (JWT) and password hashing.
- `openai`: For embedding generation in Smart Routing.
- Various utility and validation libraries (e.g., `dotenv`, `express-validator`, `uuid`).
### Frontend
- **Framework:** React (via Vite)
- **Language:** TypeScript
- **UI Library:** Tailwind CSS
- **Routing:** `react-router-dom`
- **Internationalization:** `i18next`
- **Component Structure:** Modular components and pages within `frontend/src`.
### Infrastructure
- **Build Tool:** `pnpm` (package manager and script runner).
- **Containerization:** Docker (`Dockerfile` provided).
- **Process Management:** Not explicitly defined in core files, but likely managed by Docker or host system.
## Key Features
- **MCP Server Management:** Configure, start, stop, and monitor multiple upstream MCP servers via `stdio`, `SSE`, or `Streamable HTTP` protocols.
- **Centralized Dashboard:** Web UI for server status, group management, user administration, and logs.
- **Flexible Endpoints:**
- Global MCP/SSE endpoint (`/mcp`, `/sse`) for all enabled servers.
- Group-based endpoints (`/mcp/{group}`, `/sse/{group}`).
- Server-specific endpoints (`/mcp/{server}`, `/sse/{server}`).
- Smart Routing endpoint (`/mcp/$smart`, `/sse/$smart`) using vector search.
- **Authentication & Authorization:** JWT-based user authentication with role-based access control (admin/user).
- **Group Management:** Logical grouping of servers for targeted access and permission control.
- **Smart Routing (Experimental):** Uses pgvector and OpenAI embeddings to semantically search and find relevant tools across all connected servers.
- **Configuration:** Managed via `mcp_settings.json`.
- **Logging:** Server logs are captured and viewable via the dashboard.
- **Marketplace Integration:** Access to a marketplace of MCP servers (`servers.json`).
## Project Structure
```
C:\code\mcphub\
├───src\ # Backend source code (TypeScript)
├───frontend\ # Frontend source code (React/TypeScript)
│ ├───src\
│ ├───components\ # Reusable UI components
│ ├───pages\ # Top-level page components
│ ├───contexts\ # React contexts (Auth, Theme, Toast)
│ ├───layouts\ # Page layouts
│ ├───utils\ # Frontend utilities
│ └───...
├───dist\ # Compiled backend output
├───frontend\dist\ # Compiled frontend output
├───tests\ # Backend tests
├───docs\ # Documentation
├───scripts\ # Utility scripts
├───bin\ # CLI entry points
├───assets\ # Static assets (e.g., images for README)
├───.github\ # GitHub workflows
├───.vscode\ # VS Code settings
├───mcp_settings.json # Main configuration file for MCP servers and users
├───servers.json # Marketplace server definitions
├───package.json # Node.js project definition, dependencies, and scripts
├───pnpm-lock.yaml # Dependency lock file
├───tsconfig.json # TypeScript compiler configuration (Backend)
├───README.md # Project documentation
├───Dockerfile # Docker image definition
└───...
```
## Building and Running
### Prerequisites
- Node.js (>=18.0.0 or >=20.0.0)
- pnpm
- Python 3.13 (for some upstream servers and uvx)
- Docker (optional, for containerized deployment)
- PostgreSQL with pgvector (optional, for Smart Routing)
### Local Development
1. Clone the repository.
2. Install dependencies: `pnpm install`.
3. Start development servers: `pnpm dev`.
- This runs `pnpm backend:dev` (Node.js with `tsx watch`) and `pnpm frontend:dev` (Vite dev server) concurrently.
- Access the dashboard at `http://localhost:5173` (Vite default) or the configured port/path.
### Production Build
1. Install dependencies: `pnpm install`.
2. Build the project: `pnpm build`.
- This runs `pnpm backend:build` (TypeScript compilation to `dist/`) and `pnpm frontend:build` (Vite build to `frontend/dist/`).
3. Start the production server: `pnpm start`.
- This runs `node dist/index.js`.
### Docker Deployment
- Pull the image: `docker pull samanhappy/mcphub`.
- Run with default settings: `docker run -p 3000:3000 samanhappy/mcphub`.
- Run with custom config: `docker run -p 3000:3000 -v ./mcp_settings.json:/app/mcp_settings.json -v ./data:/app/data samanhappy/mcphub`.
- Access the dashboard at `http://localhost:3000`.
## Configuration
The main configuration file is `mcp_settings.json`. It defines:
- `mcpServers`: A map of server configurations (command, args, env, URL, etc.).
- `users`: A list of user accounts (username, hashed password, admin status).
- `groups`: A map of server groups.
- `systemConfig`: System-wide settings (e.g., proxy, registry, installation options).
## Development Conventions
- **Language:** TypeScript for both backend and frontend.
- **Backend Style:** Modular structure with clear separation of concerns (controllers, services, models, middlewares, routes, config, utils).
- **Frontend Style:** Component-based React architecture with contexts for state management.
- **Database:** TypeORM with PostgreSQL is used, leveraging decorators for entity definition.
- **Testing:** Uses `jest` for backend testing.
- **Linting/Formatting:** Uses `eslint` and `prettier`.
- **Scripts:** Defined in `package.json` under the `scripts` section for common tasks (dev, build, start, test, lint, format).

View File

@@ -1,14 +1,19 @@
# MCPHub: Your Ultimate MCP Server Hub
# MCPHub: The Unified Hub for Model Context Protocol (MCP) Servers
English | [中文版](README.zh.md)
MCPHub is a unified management platform that aggregates multiple MCP (Model Context Protocol) servers into separate Streamable HTTP (SSE) endpoints for different scenarios by group. It streamlines your AI tool integrations through an intuitive interface and robust protocol handling.
MCPHub makes it easy to manage and scale multiple MCP (Model Context Protocol) servers by organizing them into flexible Streamable HTTP (SSE) endpoints—supporting access to all servers, individual servers, or logical server groups.
![Dashboard Preview](assets/dashboard.png)
## 🌐 Live Demo & Docs
- **Documentation**: [docs.mcphubx.com](https://docs.mcphubx.com/)
- **Demo Environment**: [demo.mcphubx.com](https://demo.mcphubx.com/)
## 🚀 Features
- **Out-of-the-Box MCP Server Support**: Seamlessly integrate popular servers like `amap-maps`, `playwright`, `fetch`, `slack`, and more.
- **Broadened MCP Server Support**: Seamlessly integrate any MCP server with minimal configuration.
- **Centralized Dashboard**: Monitor real-time status and performance metrics from one sleek web UI.
- **Flexible Protocol Handling**: Full compatibility with both stdio and SSE MCP protocols.
- **Hot-Swappable Configuration**: Add, remove, or update MCP servers on the fly — no downtime required.
@@ -18,7 +23,7 @@ MCPHub is a unified management platform that aggregates multiple MCP (Model Cont
## 🔧 Quick Start
### Optional Configuration
### Configuration
Create a `mcp_settings.json` file to customize your server settings:
@@ -48,29 +53,16 @@ Create a `mcp_settings.json` file to customize your server settings:
"SLACK_TEAM_ID": "your-team-id"
}
}
},
"users": [
{
"username": "admin",
"password": "$2b$10$Vt7krIvjNgyN67LXqly0uOcTpN0LI55cYRbcKC71pUDAP0nJ7RPa.",
"isAdmin": true
}
]
}
}
```
> **Note**: Default credentials are `admin` / `admin123`. Passwords are securely hashed with bcrypt. Generate a new hash with:
>
> ```bash
> npx bcryptjs your-password
> ```
### Docker Deployment
**Recommended**: Mount your custom config:
```bash
docker run -p 3000:3000 -v $(pwd)/mcp_settings.json:/app/mcp_settings.json samanhappy/mcphub
docker run -p 3000:3000 -v ./mcp_settings.json:/app/mcp_settings.json -v ./data:/app/data samanhappy/mcphub
```
or run with default settings:
@@ -109,6 +101,31 @@ This endpoint provides a unified streamable HTTP interface for all your MCP serv
- Easily integrate with various AI clients and tools
- Use the same endpoint for all servers, simplifying your integration process
**Smart Routing (Experimental)**:
Smart Routing is MCPHub's intelligent tool discovery system that uses vector semantic search to automatically find the most relevant tools for any given task.
```
http://localhost:3000/mcp/$smart
```
**How it Works:**
1. **Tool Indexing**: All MCP tools are automatically converted to vector embeddings and stored in PostgreSQL with pgvector
2. **Semantic Search**: User queries are converted to vectors and matched against tool embeddings using cosine similarity
3. **Intelligent Filtering**: Dynamic thresholds ensure relevant results without noise
4. **Precise Execution**: Found tools can be directly executed with proper parameter validation
**Setup Requirements:**
![Smart Routing](assets/smart-routing.png)
To enable Smart Routing, you need:
- PostgreSQL with pgvector extension
- OpenAI API key (or compatible embedding service)
- Enable Smart Routing in MCPHub settings
**Group-Specific Endpoints (Recommended)**:
![Group Management](assets/group.png)
@@ -144,6 +161,12 @@ Connect AI clients (e.g., Claude Desktop, Cursor, DeepChat, etc.) via:
http://localhost:3000/sse
```
For smart routing, use:
```
http://localhost:3000/sse/$smart
```
For targeted access to specific server groups, use the group-based SSE endpoint:
```

View File

@@ -2,13 +2,18 @@
[English Version](README.md) | 中文版
MCPHub 是一个统一的 MCPModel Context Protocol,模型上下文协议)服务器聚合平台,可以根据场景将多个服务器聚合到不同的流式 HTTPSSE端点。它通过直观的界面和强大的协议处理能力简化了您的 AI 工具集成流程
MCPHub 通过将多个 MCPModel Context Protocol)服务器组织为灵活的流式 HTTPSSE端点简化了管理与扩展工作。系统支持按需访问全部服务器、单个服务器或按场景分组的服务器集合
![控制面板预览](assets/dashboard.zh.png)
## 🌐 在线文档与演示
- **文档地址**: [docs.mcphubx.com](https://docs.mcphubx.com/)
- **演示环境**: [demo.mcphubx.com](https://demo.mcphubx.com/)
## 🚀 功能亮点
- **开箱即用的 MCP 服务器支持**:无缝集成 `amap-maps``playwright``fetch``slack` 等常见服务器
- **广泛的 MCP 服务器支持**:无缝集成任何 MCP 服务器,配置简单
- **集中式管理控制台**:在一个简洁的 Web UI 中实时监控所有服务器的状态和性能指标。
- **灵活的协议兼容**:完全支持 stdio 和 SSE 两种 MCP 协议。
- **热插拔式配置**:在运行时动态添加、移除或更新服务器配置,无需停机。
@@ -18,7 +23,7 @@ MCPHub 是一个统一的 MCPModel Context Protocol模型上下文协议
## 🔧 快速开始
### 可选配置
### 配置
通过创建 `mcp_settings.json` 自定义服务器设置:
@@ -48,29 +53,16 @@ MCPHub 是一个统一的 MCPModel Context Protocol模型上下文协议
"SLACK_TEAM_ID": "your-team-id"
}
}
},
"users": [
{
"username": "admin",
"password": "$2b$10$Vt7krIvjNgyN67LXqly0uOcTpN0LI55cYRbcKC71pUDAP0nJ7RPa.",
"isAdmin": true
}
]
}
}
```
> **提示**:默认用户名/密码为 `admin` / `admin123`。密码已通过 bcrypt 安全哈希。生成新密码哈希:
>
> ```bash
> npx bcryptjs your-password
> ```
### Docker 部署
**推荐**:挂载自定义配置:
```bash
docker run -p 3000:3000 -v $(pwd)/mcp_settings.json:/app/mcp_settings.json samanhappy/mcphub
docker run -p 3000:3000 -v ./mcp_settings.json:/app/mcp_settings.json -v ./data:/app/data samanhappy/mcphub
```
或使用默认配置运行:
@@ -109,6 +101,31 @@ http://localhost:3000/mcp
- 轻松与各种 AI 客户端和工具集成
- 对所有服务器使用相同的端点,简化集成过程
**智能路由(实验性功能)**
智能路由是 MCPHub 的智能工具发现系统,使用向量语义搜索自动为任何给定任务找到最相关的工具。
```
http://localhost:3000/mcp/$smart
```
**工作原理:**
1. **工具索引**:所有 MCP 工具自动转换为向量嵌入并存储在 PostgreSQL 与 pgvector 中
2. **语义搜索**:用户查询转换为向量并使用余弦相似度与工具嵌入匹配
3. **智能筛选**:动态阈值确保相关结果且无噪声
4. **精确执行**:找到的工具可以直接执行并进行适当的参数验证
**设置要求:**
![智能路由](assets/smart-routing.zh.png)
为了启用智能路由,您需要:
- 支持 pgvector 扩展的 PostgreSQL
- OpenAI API 密钥(或兼容的嵌入服务)
- 在 MCPHub 设置中启用智能路由
**基于分组的 HTTP 端点(推荐)**
![分组](assets/group.zh.png)
要针对特定服务器分组进行访问,请使用基于分组的 HTTP 端点:
@@ -144,6 +161,12 @@ http://localhost:3000/mcp/{server}
http://localhost:3000/sse
```
要启用智能路由,请使用:
```
http://localhost:3000/sse/$smart
```
要针对特定服务器分组进行访问,请使用基于分组的 SSE 端点:
```

BIN
articals/assets/sr-conf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
articals/assets/sr-dc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
articals/assets/sr-time.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
articals/assets/sr-web.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -48,11 +48,11 @@ MCPHub 已内置多个常用 MCP 服务如高德地图、GitHub、Slack、Fet
![配置高德地图](../assets/amap-edit.png)
点击保存后MCP Hub 将自动重启高德地图的 MCP 服务,使新配置生效。
点击保存后MCPHub 将自动重启高德地图的 MCP 服务,使新配置生效。
### 配置 MCP Hub SSE
### 配置 MCPHub SSE
MCP Hub 提供了单一聚合的 MCP Server SSE 端点:`http://localhost:3000/sse`,可在任意支持 MCP 的客户端中配置使用。这里我们选择开源的 Cherry Studio 进行演示。
MCPHub 提供了单一聚合的 MCP Server SSE 端点:`http://localhost:3000/sse`,可在任意支持 MCP 的客户端中配置使用。这里我们选择开源的 Cherry Studio 进行演示。
![配置 Cherry Studio](../assets/cherry-mcp.png)

177
articals/smart-routing.md Normal file
View File

@@ -0,0 +1,177 @@
# 无限工具智能路由MCPHub 引领 AI 工具使用新范式
## 概述
在现代 AI 应用中,随着 MCP 服务器数量的快速增长和工具种类的不断丰富,如何从数百个可用工具中快速定位最适合当前任务的工具,成为开发者和 AI 助手面临的一项重要挑战。
传统做法要么将所有工具暴露给 AI 助手处理,导致 token 消耗巨大、响应延迟严重;要么依赖开发者手动分组配置,灵活性和智能性不足。
MCPHub 推出的智能路由功能,基于向量语义搜索技术,实现了自然语言驱动的工具发现与精准推荐。它让 AI 助手能够像人类专家一样,根据任务描述自动选择最优工具组合,大幅提升了系统效率和用户体验。
## 什么是智能路由
### 技术原理
智能路由是 MCPHub 的核心功能之一。它将每个 MCP 工具的名称和描述嵌入为高维语义向量。当用户发起自然语言任务请求时,系统会将该请求也转换为向量,通过计算相似度,快速返回最相关的工具列表。
这一过程摒弃了传统的关键词匹配,具备更强的语义理解能力,能够处理自然语言的模糊性和多样性。
### 核心组件
- **向量嵌入引擎**:支持如 `text-embedding-3-small``bge-m3` 等主流模型,将文本描述转为语义向量。
- **PostgreSQL + pgvector**:使用开源向量数据库方案,支持高效的向量索引和搜索。
- **两步工作流分离**
- `search_tools`:负责语义工具发现
- `call_tool`:执行实际工具调用逻辑
## 为什么需要智能路由
### 1. 减少认知负荷
- 当工具数量超过 100 个AI 模型难以处理所有工具上下文。
- 智能路由通过语义压缩,将候选工具缩小至 510 个,提高决策效率。
### 2. 显著降低 token 消耗
- 传统做法传入全量工具描述,可能消耗上千 token。
- 使用智能路由,通常可将 token 使用降低 7090%。
### 3. 提升调用准确率
- 理解任务语义:如“图片增强”→选择图像处理工具,而不是依赖命名关键词。
- 上下文感知:考虑输入/输出格式和工具组合能力,匹配更合理的执行链路。
## 智能路由配置指南
### 1. 启动支持 `pgvector` 的 PostgreSQL 数据库
```bash
docker run --name mcphub-postgres \
-e POSTGRES_DB=mcphub \
-e POSTGRES_USER=mcphub \
-e POSTGRES_PASSWORD=your_password \
-p 5432:5432 \
-d pgvector/pgvector:pg17
```
如已部署 PostgreSQL可直接创建数据库并启用 `pgvector` 扩展:
```sql
CREATE DATABASE mcphub;
CREATE EXTENSION vector;
```
### 2. 获取 embedding 模型的 API Key
前往 OpenAI 或其他提供商获取嵌入模型的 API Key。国内用户推荐使用硅基流动 `bge-m3` 免费模型,没有注册过的用户可以使用我的邀请链接:[https://cloud.siliconflow.cn/i/TQhVYBvA](https://cloud.siliconflow.cn/i/TQhVYBvA)。
### 3. 控制台配置
![配置](./assets/sr-conf.png)
在 MCPHub 控制台中,进入「智能路由」配置页面,填写以下信息:
- **数据库 URL**`postgresql://mcphub:your_password@localhost:5432/mcphub`
- **OpenAI API Key** :填写你获取的嵌入模型 API Key
- **OpenAI 基础 URL**`https://api.siliconflow.cn/v1`
- **嵌入模型**:推荐使用 `BAAI/bge-m3`
开启「启用智能路由」后系统会自动:
- 对所有工具生成向量嵌入
- 构建向量索引
- 自动监听新增工具,更新索引
## 工具定义
### search_tools - 工具搜索
```ts
{
"name": "search_tools",
"arguments": {
"query": "help me resize and convert images",
"limit": 10
}
}
```
### call_tool - 工具执行
```ts
{
"name": "call_tool",
"arguments": {
"toolName": "image_resizer",
"arguments": {
"input_path": "/path/to/image.png",
"width": 800,
"height": 600
}
}
}
```
## 演示
下面我将通过几个示例来展示如何使用智能路由。
首先,我们需要在 mcphub 添加几个不同类型的 MCP 服务器:`amap``time-map``fetch`
![添加服务器](./assets/sr-servers.png)
然后我们需要选择一个支持 MCP 的客户端,这里选择国产的 DeepChat聊天模型选择 `Qwen3-14B`
接着,在 DeepChat 中添加 mcphub 的智能路由端点:
![添加智能路由](./assets/sr-dc.png)
添加成功后,就可以在工具中看到 `search_tools``call_tool` 两个工具了:
![工具列表](./assets/sr-tools.png)
### 示例 1地图导航
输入:从北京如何导航到上海。
结果:
![地图导航](./assets/sr-map-result.png)
可以看到DeepChat 先调用了 `search_tools` 工具:
![搜索工具](./assets/sr-map-search.png)
然后再调用 `call_tool` 查询具体的导航信息:
![调用工具](./assets/sr-map-call.png)
### 示例 2查询时间
输入:使用工具查询美国现在的时间是几点
结果:
![查询时间](./assets/sr-time.png)
需要说明的是,由于不同的模型对工具调用的支持程度不同,可能会出现一些差异。比如在这个例子中,为了提高准确性,我在输入中明确提到了“使用工具”。
### 示例 3查看网页
输入:打开 baidu.com 看看有什么
结果:
![查看网页](./assets/sr-web.png)
可以看到DeepChat 成功调用了工具,不过由于百度的 robots.txt 限制,无法获取到具体内容。
## 结语
借助 MCPHub 的智能路由功能AI 助手能够更高效地处理复杂任务,显著减少不必要的 token 消耗,同时提升工具调用的准确性与灵活性。作为面向未来的 AI 工具发现与调用基础设施,智能路由不仅使 AI 更聪明地选择和组合工具,还为多 Agent 协同提供了清晰、可控且可扩展的底层能力支撑。
> MCPHub 只是我一时兴起开发的小项目,没想到收获了这么多关注,非常感谢大家的支持!目前 MCPHub 还有不少地方需要优化和完善,我也专门建了个交流群,感兴趣的可以添加下面的微信。
![微信](../assets/wexin.png)
> 同时,欢迎大家一起参与建设!项目地址为:[https://github.com/samanhappy/mcphub](https://github.com/samanhappy/mcphub)。

BIN
assets/smart-routing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
assets/smart-routing.zh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

147
docs/api-reference/auth.mdx Normal file
View File

@@ -0,0 +1,147 @@
---
title: "Authentication"
description: "Manage users and authentication."
---
import { Card, Cards } from 'mintlify';
<Card
title="POST /api/auth/login"
href="#login"
>
Log in to get a JWT token.
</Card>
<Card
title="POST /api/auth/register"
href="#register"
>
Register a new user.
</Card>
<Card
title="GET /api/auth/user"
href="#get-current-user"
>
Get the currently authenticated user.
</Card>
<Card
title="POST /api/auth/change-password"
href="#change-password"
>
Change the password for the current user.
</Card>
---
### Login
Authenticates a user and returns a JWT token along with user details.
- **Endpoint**: `/api/auth/login`
- **Method**: `POST`
- **Body**:
- `username` (string, required): The user's username.
- `password` (string, required): The user's password.
- **Request Example**:
```json
{
"username": "admin",
"password": "admin123"
}
```
- **Success Response**:
```json
{
"success": true,
"message": "Login successful",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"username": "admin",
"isAdmin": true,
"permissions": { ... }
}
}
```
---
### Register
Registers a new user and returns a JWT token.
- **Endpoint**: `/api/auth/register`
- **Method**: `POST`
- **Body**:
- `username` (string, required): The desired username.
- `password` (string, required): The desired password (must be at least 6 characters).
- `isAdmin` (boolean, optional): Whether the user should have admin privileges.
- **Request Example**:
```json
{
"username": "newuser",
"password": "password123",
"isAdmin": false
}
```
- **Success Response**:
```json
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"username": "newuser",
"isAdmin": false,
"permissions": { ... }
}
}
```
---
### Get Current User
Retrieves the profile of the currently authenticated user.
- **Endpoint**: `/api/auth/user`
- **Method**: `GET`
- **Authentication**: Bearer Token required.
- **Success Response**:
```json
{
"success": true,
"user": {
"username": "admin",
"isAdmin": true,
"permissions": { ... }
}
}
```
---
### Change Password
Allows the authenticated user to change their password.
- **Endpoint**: `/api/auth/change-password`
- **Method**: `POST`
- **Authentication**: Bearer Token required.
- **Body**:
- `currentPassword` (string, required): The user's current password.
- `newPassword` (string, required): The desired new password (must be at least 6 characters).
- **Request Example**:
```json
{
"currentPassword": "oldpassword",
"newPassword": "newpassword123"
}
```
- **Success Response**:
```json
{
"success": true,
"message": "Password updated successfully"
}
```

View File

@@ -0,0 +1,111 @@
---
title: "Config"
description: "Manage and retrieve system-wide configurations."
---
import { Card, Cards } from 'mintlify';
<Card title="PUT /api/system-config" href="#update-system-config">Update the main system configuration.</Card>
<Card title="GET /api/settings" href="#get-all-settings">Get all system settings, including servers and groups.</Card>
<Card title="GET /config" href="#get-runtime-config">Get public runtime configuration for the frontend.</Card>
<Card title="GET /public-config" href="#get-public-config">Get public configuration to check for auth skip.</Card>
---
### Update System Config
Updates various parts of the system configuration. You only need to provide the keys for the sections you want to update.
- **Endpoint**: `/api/system-config`
- **Method**: `PUT`
- **Body**: A JSON object containing one or more of the following top-level keys: `routing`, `install`, `smartRouting`, `mcpRouter`.
#### Routing Configuration (`routing`)
- `enableGlobalRoute` (boolean): Enable or disable the global `/api/mcp` route.
- `enableGroupNameRoute` (boolean): Enable or disable group-based routing (e.g., `/api/mcp/group/:groupName`).
- `enableBearerAuth` (boolean): Enable bearer token authentication for MCP routes.
- `bearerAuthKey` (string): The secret key to use for bearer authentication.
- `skipAuth` (boolean): If true, skips all authentication, making the instance public.
#### Install Configuration (`install`)
- `pythonIndexUrl` (string): The base URL of the Python Package Index (PyPI) to use for installations.
- `npmRegistry` (string): The URL of the npm registry to use for installations.
- `baseUrl` (string): The public base URL of this MCPHub instance.
#### Smart Routing Configuration (`smartRouting`)
- `enabled` (boolean): Enable or disable the Smart Routing feature.
- `dbUrl` (string): The database connection URL for storing embeddings.
- `openaiApiBaseUrl` (string): The base URL for the OpenAI-compatible API for generating embeddings.
- `openaiApiKey` (string): The API key for the embeddings service.
- `openaiApiEmbeddingModel` (string): The name of the embedding model to use.
#### MCP Router Configuration (`mcpRouter`)
- `apiKey` (string): The API key for the MCP Router service.
- `referer` (string): The referer header to use for MCP Router requests.
- `title` (string): The title to display for this instance on MCP Router.
- `baseUrl` (string): The base URL for the MCP Router API.
- **Request Example**:
```json
{
"routing": {
"skipAuth": true
},
"smartRouting": {
"enabled": true,
"dbUrl": "postgresql://user:pass@host:port/db"
}
}
```
---
### Get All Settings
Retrieves the entire settings object for the instance, including all server configurations, groups, and system settings. This is a comprehensive dump of the `mcp_settings.json` file.
- **Endpoint**: `/api/settings`
- **Method**: `GET`
---
### Get Runtime Config
Retrieves the essential runtime configuration required for the frontend application. This endpoint does not require authentication.
- **Endpoint**: `/config`
- **Method**: `GET`
- **Success Response**:
```json
{
"success": true,
"data": {
"basePath": "",
"version": "1.0.0",
"name": "MCPHub"
}
}
```
---
### Get Public Config
Retrieves public configuration, primarily to check if authentication is skipped. This allows the frontend to adjust its behavior accordingly before a user has logged in. This endpoint does not require authentication.
- **Endpoint**: `/public-config`
- **Method**: `GET`
- **Success Response**:
```json
{
"success": true,
"data": {
"skipAuth": false,
"permissions": {}
}
}
```

View File

@@ -1,4 +0,0 @@
---
title: 'Create Plant'
openapi: 'POST /plants'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Delete Plant'
openapi: 'DELETE /plants/{id}'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Get Plants'
openapi: 'GET /plants'
---

View File

@@ -1,4 +0,0 @@
---
title: 'New Plant'
openapi: 'WEBHOOK /plant/webhook'
---

View File

@@ -0,0 +1,212 @@
---
title: "Groups"
description: "Manage server groups to organize and route requests."
---
import { Card, Cards } from 'mintlify';
<Card title="GET /api/groups" href="#get-all-groups">Get a list of all groups.</Card>
<Card title="POST /api/groups" href="#create-a-new-group">Create a new group.</Card>
<Card title="GET /api/groups/:id" href="#get-a-group">Get details of a specific group.</Card>
<Card title="PUT /api/groups/:id" href="#update-a-group">Update an existing group.</Card>
<Card title="DELETE /api/groups/:id" href="#delete-a-group">Delete a group.</Card>
<Card title="POST /api/groups/:id/servers" href="#add-server-to-group">Add a server to a group.</Card>
<Card title="DELETE /api/groups/:id/servers/:serverName" href="#remove-server-from-group">Remove a server from a group.</Card>
<Card title="PUT /api/groups/:id/servers/batch" href="#batch-update-group-servers">Batch update servers in a group.</Card>
<Card title="GET /api/groups/:id/server-configs" href="#get-group-server-configs">Get detailed server configurations in a group.</Card>
<Card title="PUT /api/groups/:id/server-configs/:serverName/tools" href="#update-group-server-tools">Update tool selection for a server in a group.</Card>
---
### Get All Groups
Retrieves a list of all server groups.
- **Endpoint**: `/api/groups`
- **Method**: `GET`
- **Success Response**:
```json
{
"success": true,
"data": [
{
"id": "group-1",
"name": "My Group",
"description": "A collection of servers.",
"servers": ["server1", "server2"],
"owner": "admin"
}
]
}
```
---
### Create a New Group
Creates a new server group.
- **Endpoint**: `/api/groups`
- **Method**: `POST`
- **Body**:
- `name` (string, required): The name of the group.
- `description` (string, optional): A description for the group.
- `servers` (array of strings, optional): A list of server names to include in the group.
- **Request Example**:
```json
{
"name": "My New Group",
"description": "A description for the new group",
"servers": ["server1", "server2"]
}
```
---
### Get a Group
Retrieves details for a specific group by its ID or name.
- **Endpoint**: `/api/groups/:id`
- **Method**: `GET`
- **Parameters**:
- `:id` (string, required): The ID or name of the group.
---
### Update a Group
Updates an existing group's name, description, or server list.
- **Endpoint**: `/api/groups/:id`
- **Method**: `PUT`
- **Parameters**:
- `:id` (string, required): The ID or name of the group to update.
- **Body**:
- `name` (string, optional): The new name for the group.
- `description` (string, optional): The new description for the group.
- `servers` (array, optional): The new list of servers for the group. See [Batch Update Group Servers](#batch-update-group-servers) for format.
- **Request Example**:
```json
{
"name": "Updated Group Name",
"description": "Updated description"
}
```
---
### Delete a Group
Deletes a group by its ID or name.
- **Endpoint**: `/api/groups/:id`
- **Method**: `DELETE`
- **Parameters**:
- `:id` (string, required): The ID or name of the group to delete.
---
### Add Server to Group
Adds a single server to a group.
- **Endpoint**: `/api/groups/:id/servers`
- **Method**: `POST`
- **Parameters**:
- `:id` (string, required): The ID or name of the group.
- **Body**:
- `serverName` (string, required): The name of the server to add.
- **Request Example**:
```json
{
"serverName": "my-server"
}
```
---
### Remove Server from Group
Removes a single server from a group.
- **Endpoint**: `/api/groups/:id/servers/:serverName`
- **Method**: `DELETE`
- **Parameters**:
- `:id` (string, required): The ID or name of the group.
- `:serverName` (string, required): The name of the server to remove.
---
### Batch Update Group Servers
Replaces all servers in a group with a new list. The list can be simple strings or detailed configuration objects.
- **Endpoint**: `/api/groups/:id/servers/batch`
- **Method**: `PUT`
- **Parameters**:
- `:id` (string, required): The ID or name of the group.
- **Body**:
- `servers` (array, required): An array of server names (strings) or server configuration objects.
- **Request Example (Simple)**:
```json
{
"servers": ["server1", "server2"]
}
```
- **Request Example (Detailed)**:
```json
{
"servers": [
{ "name": "server1", "tools": "all" },
{ "name": "server2", "tools": ["toolA", "toolB"] }
]
}
```
---
### Get Group Server Configs
Retrieves the detailed configuration for all servers within a group, including which tools are enabled.
- **Endpoint**: `/api/groups/:id/server-configs`
- **Method**: `GET`
- **Parameters**:
- `:id` (string, required): The ID or name of the group.
- **Success Response**:
```json
{
"success": true,
"data": [
{
"name": "server1",
"tools": "all"
},
{
"name": "server2",
"tools": ["toolA", "toolB"]
}
]
}
```
---
### Update Group Server Tools
Updates the tool selection for a specific server within a group.
- **Endpoint**: `/api/groups/:id/server-configs/:serverName/tools`
- **Method**: `PUT`
- **Parameters**:
- `:id` (string, required): The ID or name of the group.
- `:serverName` (string, required): The name of the server to update.
- **Body**:
- `tools` (string or array of strings, required): Either the string `"all"` to enable all tools, or an array of tool names to enable specifically.
- **Request Example**:
```json
{
"tools": ["toolA", "toolC"]
}
```

View File

@@ -1,33 +1,13 @@
---
title: 'Introduction'
description: 'Example section for showcasing API endpoints'
title: "Introduction"
description: "Welcome to the MCPHub API documentation."
---
<Note>
If you're not looking to build API reference documentation, you can delete
this section by removing the api-reference folder.
</Note>
The MCPHub API provides a comprehensive set of endpoints to manage your MCP servers, groups, users, and more. The API is divided into two main categories:
## Welcome
- **MCP Endpoints**: These are the primary endpoints for interacting with your MCP servers. They provide a unified interface for sending requests to your servers and receiving responses in real-time.
- **Management API**: These endpoints are used for managing the MCPHub instance itself. This includes managing servers, groups, users, and system settings.
There are two ways to build API documentation: [OpenAPI](https://mintlify.com/docs/api-playground/openapi/setup) and [MDX components](https://mintlify.com/docs/api-playground/mdx/configuration). For the starter kit, we are using the following OpenAPI specification.
All API endpoints are available under the `/api` path. For example, the endpoint to get all servers is `/api/servers`.
<Card
title="Plant Store Endpoints"
icon="leaf"
href="https://github.com/mintlify/starter/blob/main/api-reference/openapi.json"
>
View the OpenAPI specification file
</Card>
## Authentication
All API endpoints are authenticated using Bearer tokens and picked up from the specification file.
```json
"security": [
{
"bearerAuth": []
}
]
```
Authentication is required for most Management API endpoints. See the [Authentication](/api-reference/auth) section for more details.

View File

@@ -0,0 +1,81 @@
---
title: "Logs"
description: "Access and manage server logs."
---
import { Card, Cards } from 'mintlify';
<Card
title="GET /api/logs"
href="#get-all-logs"
>
Get all logs.
</Card>
<Card
title="DELETE /api/logs"
href="#clear-logs"
>
Clear all logs.
</Card>
<Card
title="GET /api/logs/stream"
href="#stream-logs"
>
Stream logs in real-time.
</Card>
---
### Get All Logs
Retrieves all stored logs.
- **Endpoint**: `/api/logs`
- **Method**: `GET`
- **Success Response**:
```json
{
"success": true,
"data": [
{
"timestamp": "2023-10-27T10:00:00.000Z",
"level": "info",
"message": "Server started successfully.",
"service": "system"
}
]
}
```
---
### Clear Logs
Deletes all stored logs.
- **Endpoint**: `/api/logs`
- **Method**: `DELETE`
- **Success Response**:
```json
{
"success": true,
"message": "Logs cleared successfully"
}
```
---
### Stream Logs
Streams logs in real-time using Server-Sent Events (SSE). The connection will remain open, and new log entries will be sent as they occur.
- **Endpoint**: `/api/logs/stream`
- **Method**: `GET`
- **Response Format**: The stream sends events with a `data` field containing a JSON object. The first event has `type: 'initial'` and contains all historical logs. Subsequent events have `type: 'log'` and contain a single new log entry.
- **Example Event**:
```
data: {"type":"log","log":{"timestamp":"2023-10-27T10:00:05.000Z","level":"debug","message":"Processing request for /api/some-endpoint","service":"mcp-server"}}
```

View File

@@ -0,0 +1,33 @@
---
title: "MCP HTTP Endpoints"
description: "Connect to your MCP servers using the unified HTTP endpoint."
---
MCPHub provides a unified streamable HTTP interface for all your MCP servers. This allows you to send requests to any configured MCP server and receive responses in real-time.
### Unified Endpoint
This endpoint provides access to all enabled MCP servers.
- **Endpoint**: `http://localhost:3000/mcp`
- **Method**: `POST`
### Group-Specific Endpoint
For targeted access to specific server groups, use the group-based HTTP endpoint.
- **Endpoint**: `http://localhost:3000/mcp/{group}`
- **Method**: `POST`
- **Parameters**:
- `{group}`: The ID or name of the group.
### Server-Specific Endpoint
For direct access to individual servers, use the server-specific HTTP endpoint.
- **Endpoint**: `http://localhost:3000/mcp/{server}`
- **Method**: `POST`
- **Parameters**:
- `{server}`: The name of the server.
> **Note**: If a server name and group name are the same, the group will take precedence.

View File

@@ -0,0 +1,25 @@
---
title: "MCP SSE Endpoints (Deprecated)"
description: "Connect to your MCP servers using the SSE endpoint."
---
The SSE endpoint is deprecated and will be removed in a future version. Please use the [MCP HTTP Endpoints](/api-reference/mcp-http) instead.
### Unified Endpoint
- **Endpoint**: `http://localhost:3000/sse`
- **Method**: `GET`
### Group-Specific Endpoint
- **Endpoint**: `http://localhost:3000/sse/{group}`
- **Method**: `GET`
- **Parameters**:
- `{group}`: The ID or name of the group.
### Server-Specific Endpoint
- **Endpoint**: `http://localhost:3000/sse/{server}`
- **Method**: `GET`
- **Parameters**:
- `{server}`: The name of the server.

View File

@@ -0,0 +1,250 @@
---
title: "OpenAPI Integration"
description: "Generate OpenAPI specifications from MCP tools for seamless integration with OpenWebUI and other systems"
---
# OpenAPI Generation for OpenWebUI Integration
MCPHub now supports generating OpenAPI 3.0.3 specifications from MCP tools, enabling seamless integration with OpenWebUI and other OpenAPI-compatible systems without requiring MCPO as an intermediary proxy.
## Features
- ✅ **Automatic OpenAPI Generation**: Converts MCP tools to OpenAPI 3.0.3 specification
- ✅ **OpenWebUI Compatible**: Direct integration without MCPO proxy
- ✅ **Real-time Tool Discovery**: Dynamically includes tools from connected MCP servers
- ✅ **Dual Parameter Support**: Supports both GET (query params) and POST (JSON body) for tool execution
- ✅ **No Authentication Required**: OpenAPI endpoints are public for easy integration
- ✅ **Comprehensive Metadata**: Full OpenAPI specification with proper schemas and documentation
## API Endpoints
### OpenAPI Specification
<CodeGroup>
```bash GET /api/openapi.json
curl "http://localhost:3000/api/openapi.json"
```
```bash With Parameters
curl "http://localhost:3000/api/openapi.json?title=My MCP API&version=2.0.0"
```
</CodeGroup>
Generates and returns the complete OpenAPI 3.0.3 specification for all connected MCP tools.
**Query Parameters:**
<ParamField query="title" type="string" optional>
Custom API title
</ParamField>
<ParamField query="description" type="string" optional>
Custom API description
</ParamField>
<ParamField query="version" type="string" optional>
Custom API version
</ParamField>
<ParamField query="serverUrl" type="string" optional>
Custom server URL
</ParamField>
<ParamField query="includeDisabled" type="boolean" optional default="false">
Include disabled tools
</ParamField>
<ParamField query="servers" type="string" optional>
Comma-separated list of server names to include
</ParamField>
### Available Servers
<CodeGroup>
```bash GET /api/openapi/servers
curl "http://localhost:3000/api/openapi/servers"
```
</CodeGroup>
Returns a list of connected MCP server names.
<ResponseExample>
```json Example Response
{
"success": true,
"data": ["amap", "playwright", "slack"]
}
```
</ResponseExample>
### Tool Statistics
<CodeGroup>
```bash GET /api/openapi/stats
curl "http://localhost:3000/api/openapi/stats"
```
</CodeGroup>
Returns statistics about available tools and servers.
<ResponseExample>
```json Example Response
{
"success": true,
"data": {
"totalServers": 3,
"totalTools": 41,
"serverBreakdown": [
{"name": "amap", "toolCount": 12, "status": "connected"},
{"name": "playwright", "toolCount": 21, "status": "connected"},
{"name": "slack", "toolCount": 8, "status": "connected"}
]
}
}
```
</ResponseExample>
### Tool Execution
<CodeGroup>
```bash GET /api/tools/{serverName}/{toolName}
curl "http://localhost:3000/api/tools/amap/amap-maps_weather?city=Beijing"
```
```bash POST /api/tools/{serverName}/{toolName}
curl -X POST "http://localhost:3000/api/tools/playwright/playwright-browser_navigate" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
```
</CodeGroup>
Execute MCP tools via OpenAPI-compatible endpoints.
**Path Parameters:**
<ParamField path="serverName" type="string" required>
The name of the MCP server
</ParamField>
<ParamField path="toolName" type="string" required>
The name of the tool to execute
</ParamField>
## OpenWebUI Integration
To integrate MCPHub with OpenWebUI:
<Steps>
<Step title="Start MCPHub">
Ensure MCPHub is running with your MCP servers configured
</Step>
<Step title="Get OpenAPI Specification">
```bash
curl http://localhost:3000/api/openapi.json > mcphub-api.json
```
</Step>
<Step title="Add to OpenWebUI">
Import the OpenAPI specification file or point to the URL directly in OpenWebUI
</Step>
</Steps>
### Configuration Example
In OpenWebUI, you can add MCPHub as an OpenAPI tool by using:
<CardGroup cols={2}>
<Card title="OpenAPI URL" icon="link">
`http://localhost:3000/api/openapi.json`
</Card>
<Card title="Base URL" icon="server">
`http://localhost:3000/api`
</Card>
</CardGroup>
## Generated OpenAPI Structure
The generated OpenAPI specification includes:
### Tool Conversion Logic
- **Simple tools** (≤10 primitive parameters) → GET endpoints with query parameters
- **Complex tools** (objects, arrays, or >10 parameters) → POST endpoints with JSON request body
- **All tools** include comprehensive response schemas and error handling
### Example Generated Operation
```yaml
/tools/amap/amap-maps_weather:
get:
summary: "根据城市名称或者标准adcode查询指定城市的天气"
operationId: "amap_amap-maps_weather"
tags: ["amap"]
parameters:
- name: city
in: query
required: true
description: "城市名称或者adcode"
schema:
type: string
responses:
'200':
description: "Successful tool execution"
content:
application/json:
schema:
$ref: '#/components/schemas/ToolResponse'
```
### Security
- Bearer authentication is defined but not enforced for tool execution endpoints
- Enables flexible integration with various OpenAPI-compatible systems
## Benefits over MCPO
<CardGroup cols={2}>
<Card title="Direct Integration" icon="plug">
No need for intermediate proxy
</Card>
<Card title="Real-time Updates" icon="refresh">
OpenAPI spec updates automatically as MCP servers connect/disconnect
</Card>
<Card title="Better Performance" icon="bolt">
Direct tool execution without proxy overhead
</Card>
<Card title="Simplified Architecture" icon="layer-group">
One less component to manage
</Card>
</CardGroup>
## Troubleshooting
<AccordionGroup>
<Accordion title="OpenAPI spec shows no tools">
Ensure MCP servers are connected. Check `/api/openapi/stats` for server status.
</Accordion>
<Accordion title="Tool execution fails">
Verify the tool name and parameters match the OpenAPI specification. Check server logs for details.
</Accordion>
<Accordion title="OpenWebUI can't connect">
Ensure MCPHub is accessible from OpenWebUI and the OpenAPI URL is correct.
</Accordion>
<Accordion title="Missing tools in specification">
Check if tools are enabled in your MCP server configuration. Use `includeDisabled=true` to see all tools.
</Accordion>
</AccordionGroup>

View File

@@ -0,0 +1,209 @@
---
title: "Servers"
description: "Manage your MCP servers."
---
import { Card, Cards } from 'mintlify';
<Card
title="GET /api/servers"
href="#get-all-servers"
>
Get a list of all MCP servers.
</Card>
<Card
title="POST /api/servers"
href="#create-a-new-server"
>
Create a new MCP server.
</Card>
<Card
title="PUT /api/servers/:name"
href="#update-a-server"
>
Update an existing MCP server.
</Card>
<Card
title="DELETE /api/servers/:name"
href="#delete-a-server"
>
Delete an MCP server.
</Card>
<Card
title="POST /api/servers/:name/toggle"
href="#toggle-a-server"
>
Toggle the enabled state of a server.
</Card>
<Card
title="POST /api/servers/:serverName/tools/:toolName/toggle"
href="#toggle-a-tool"
>
Toggle the enabled state of a tool.
</Card>
<Card
title="PUT /api/servers/:serverName/tools/:toolName/description"
href="#update-tool-description"
>
Update the description of a tool.
</Card>
---
### Get All Servers
Retrieves a list of all configured MCP servers, including their status and available tools.
- **Endpoint**: `/api/servers`
- **Method**: `GET`
- **Response**:
```json
{
"success": true,
"data": [
{
"name": "example-server",
"status": "connected",
"tools": [
{
"name": "tool1",
"description": "Description of tool 1"
}
],
"config": {
"type": "stdio",
"command": "node",
"args": ["server.js"]
}
}
]
}
```
---
### Create a New Server
Adds a new MCP server to the configuration.
- **Endpoint**: `/api/servers`
- **Method**: `POST`
- **Body**:
```json
{
"name": "my-new-server",
"config": {
"type": "stdio",
"command": "python",
"args": ["-u", "my_script.py"],
"owner": "admin"
}
}
```
- `name` (string, required): The unique name for the server.
- `config` (object, required): The server configuration object.
- `type` (string): `stdio`, `sse`, `streamable-http`, or `openapi`.
- `command` (string): Command to execute for `stdio` type.
- `args` (array of strings): Arguments for the command.
- `url` (string): URL for `sse`, `streamable-http`, or `openapi` types.
- `openapi` (object): OpenAPI configuration.
- `url` (string): URL to the OpenAPI schema.
- `schema` (object): The OpenAPI schema object itself.
- `headers` (object): Headers to send with requests for `sse`, `streamable-http`, and `openapi` types.
- `keepAliveInterval` (number): Keep-alive interval in milliseconds for `sse` type. Defaults to 60000.
- `owner` (string): The owner of the server. Defaults to the current user or 'admin'.
---
### Update a Server
Updates the configuration of an existing MCP server.
- **Endpoint**: `/api/servers/:name`
- **Method**: `PUT`
- **Parameters**:
- `:name` (string, required): The name of the server to update.
- **Body**:
```json
{
"config": {
"type": "stdio",
"command": "node",
"args": ["new_server.js"]
}
}
```
- `config` (object, required): The updated server configuration object. See "Create a New Server" for details.
---
### Delete a Server
Removes an MCP server from the configuration.
- **Endpoint**: `/api/servers/:name`
- **Method**: `DELETE`
- **Parameters**:
- `:name` (string, required): The name of the server to delete.
---
### Toggle a Server
Enables or disables an MCP server.
- **Endpoint**: `/api/servers/:name/toggle`
- **Method**: `POST`
- **Parameters**:
- `:name` (string, required): The name of the server to toggle.
- **Body**:
```json
{
"enabled": true
}
```
- `enabled` (boolean, required): `true` to enable the server, `false` to disable it.
---
### Toggle a Tool
Enables or disables a specific tool on a server.
- **Endpoint**: `/api/servers/:serverName/tools/:toolName/toggle`
- **Method**: `POST`
- **Parameters**:
- `:serverName` (string, required): The name of the server.
- `:toolName` (string, required): The name of the tool.
- **Body**:
```json
{
"enabled": true
}
```
- `enabled` (boolean, required): `true` to enable the tool, `false` to disable it.
---
### Update Tool Description
Updates the description of a specific tool.
- **Endpoint**: `/api/servers/:serverName/tools/:toolName/description`
- **Method**: `PUT`
- **Parameters**:
- `:serverName` (string, required): The name of the server.
- `:toolName` (string, required): The name of the tool.
- **Body**:
```json
{
"description": "New tool description"
}
```
- `description` (string, required): The new description for the tool.

View File

@@ -0,0 +1,29 @@
---
title: "Smart Routing"
description: "Intelligent tool discovery using vector semantic search."
---
Smart Routing is MCPHub's intelligent tool discovery system that uses vector semantic search to automatically find the most relevant tools for any given task.
### HTTP Endpoint
- **Endpoint**: `http://localhost:3000/mcp/$smart`
- **Method**: `POST`
### SSE Endpoint (Deprecated)
- **Endpoint**: `http://localhost:3000/sse/$smart`
- **Method**: `GET`
### How it Works
1. **Tool Indexing**: All MCP tools are automatically converted to vector embeddings and stored in PostgreSQL with pgvector.
2. **Semantic Search**: User queries are converted to vectors and matched against tool embeddings using cosine similarity.
3. **Intelligent Filtering**: Dynamic thresholds ensure relevant results without noise.
4. **Precise Execution**: Found tools can be directly executed with proper parameter validation.
### Setup Requirements
- PostgreSQL with pgvector extension
- OpenAI API key (or compatible embedding service)
- Enable Smart Routing in MCPHub settings

View File

@@ -0,0 +1,539 @@
---
title: 'Docker Setup'
description: 'Deploy MCPHub using Docker and Docker Compose'
---
# Docker Setup
This guide covers deploying MCPHub using Docker, including development and production configurations.
## Quick Start with Docker
### Using Pre-built Image
```bash
# Pull the latest image
docker pull mcphub/mcphub:latest
# Run with default configuration
docker run -d \
--name mcphub \
-p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
mcphub/mcphub:latest
```
### Building from Source
```bash
# Clone the repository
git clone https://github.com/your-username/mcphub.git
cd mcphub
# Build the Docker image
docker build -t mcphub:local .
# Run the container
docker run -d \
--name mcphub \
-p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
mcphub:local
```
## Docker Compose Setup
### Basic Configuration
Create a `docker-compose.yml` file:
```yaml
version: '3.8'
services:
mcphub:
image: mcphub/mcphub:latest
# For local development, use:
# build: .
container_name: mcphub
ports:
- '3000:3000'
environment:
- NODE_ENV=production
- PORT=3000
- JWT_SECRET=${JWT_SECRET:-your-jwt-secret}
- DATABASE_URL=postgresql://mcphub:password@postgres:5432/mcphub
volumes:
- ./mcp_settings.json:/app/mcp_settings.json:ro
- ./servers.json:/app/servers.json:ro
- mcphub_data:/app/data
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
networks:
- mcphub-network
postgres:
image: postgres:15-alpine
container_name: mcphub-postgres
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql:ro
ports:
- '5432:5432'
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U mcphub -d mcphub']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- mcphub-network
volumes:
postgres_data:
mcphub_data:
networks:
mcphub-network:
driver: bridge
```
### Production Configuration with Nginx
```yaml
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: mcphub-nginx
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./ssl:/etc/nginx/ssl:ro
- nginx_logs:/var/log/nginx
depends_on:
- mcphub
restart: unless-stopped
networks:
- mcphub-network
mcphub:
image: mcphub/mcphub:latest
container_name: mcphub-app
expose:
- '3000'
environment:
- NODE_ENV=production
- PORT=3000
- JWT_SECRET=${JWT_SECRET}
- JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-24h}
- DATABASE_URL=postgresql://mcphub:${POSTGRES_PASSWORD}@postgres:5432/mcphub
- OPENAI_API_KEY=${OPENAI_API_KEY}
- REDIS_URL=redis://redis:6379
volumes:
- ./mcp_settings.json:/app/mcp_settings.json:ro
- ./servers.json:/app/servers.json:ro
- mcphub_data:/app/data
- mcphub_logs:/app/logs
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
networks:
- mcphub-network
healthcheck:
test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:3000/health']
interval: 30s
timeout: 10s
retries: 3
postgres:
image: postgres:15-alpine
container_name: mcphub-postgres
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./backups:/backups
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U mcphub -d mcphub']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- mcphub-network
redis:
image: redis:7-alpine
container_name: mcphub-redis
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- mcphub-network
volumes:
postgres_data:
redis_data:
mcphub_data:
mcphub_logs:
nginx_logs:
networks:
mcphub-network:
driver: bridge
```
### Environment Variables
Create a `.env` file for Docker Compose:
```env
# Application
NODE_ENV=production
JWT_SECRET=your-super-secret-jwt-key-change-this
JWT_EXPIRES_IN=24h
# Database
POSTGRES_PASSWORD=your-secure-database-password
# Redis
REDIS_PASSWORD=your-secure-redis-password
# External APIs
OPENAI_API_KEY=your-openai-api-key
# Optional: Custom port
# PORT=3000
```
## Development Setup
### Development Docker Compose
Create `docker-compose.dev.yml`:
```yaml
version: '3.8'
services:
mcphub-dev:
build:
context: .
dockerfile: Dockerfile.dev
container_name: mcphub-dev
ports:
- '3000:3000'
- '5173:5173' # Frontend dev server
- '9229:9229' # Debug port
environment:
- NODE_ENV=development
- PORT=3000
- DATABASE_URL=postgresql://mcphub:password@postgres:5432/mcphub
volumes:
- .:/app
- /app/node_modules
- /app/frontend/node_modules
depends_on:
- postgres
command: pnpm dev
networks:
- mcphub-dev
postgres:
image: postgres:15-alpine
container_name: mcphub-postgres-dev
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=password
ports:
- '5432:5432'
volumes:
- postgres_dev_data:/var/lib/postgresql/data
networks:
- mcphub-dev
volumes:
postgres_dev_data:
networks:
mcphub-dev:
driver: bridge
```
### Development Dockerfile
Create `Dockerfile.dev`:
```dockerfile
FROM node:20-alpine
# Install pnpm
RUN npm install -g pnpm
# Set working directory
WORKDIR /app
# Copy package files
COPY package.json pnpm-lock.yaml ./
COPY frontend/package.json ./frontend/
# Install dependencies
RUN pnpm install
# Copy source code
COPY . .
# Expose ports
EXPOSE 3000 5173 9229
# Start development server
CMD ["pnpm", "dev"]
```
## Running the Application
### Development Mode
```bash
# Start development environment
docker-compose -f docker-compose.dev.yml up -d
# View logs
docker-compose -f docker-compose.dev.yml logs -f mcphub-dev
# Stop development environment
docker-compose -f docker-compose.dev.yml down
```
### Production Mode
```bash
# Start production environment
docker-compose up -d
# View logs
docker-compose logs -f mcphub
# Stop production environment
docker-compose down
```
## Configuration Management
### MCP Settings Volume Mount
Create your `mcp_settings.json`:
```json
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
},
"amap": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "your-api-key"
}
}
}
}
```
### Secrets Management
For production, use Docker secrets:
```yaml
version: '3.8'
services:
mcphub:
image: mcphub/mcphub:latest
environment:
- JWT_SECRET_FILE=/run/secrets/jwt_secret
- DATABASE_PASSWORD_FILE=/run/secrets/db_password
secrets:
- jwt_secret
- db_password
secrets:
jwt_secret:
file: ./secrets/jwt_secret.txt
db_password:
file: ./secrets/db_password.txt
```
## Data Persistence
### Database Backups
Add backup service to your `docker-compose.yml`:
```yaml
services:
backup:
image: postgres:15-alpine
container_name: mcphub-backup
environment:
- PGPASSWORD=${POSTGRES_PASSWORD}
volumes:
- ./backups:/backups
- ./scripts/backup.sh:/backup.sh:ro
command: /bin/sh -c "chmod +x /backup.sh && /backup.sh"
depends_on:
- postgres
profiles:
- backup
networks:
- mcphub-network
```
Create `scripts/backup.sh`:
```bash
#!/bin/sh
BACKUP_FILE="/backups/mcphub_$(date +%Y%m%d_%H%M%S).sql"
pg_dump -h postgres -U mcphub -d mcphub > "$BACKUP_FILE"
echo "Backup created: $BACKUP_FILE"
# Keep only last 7 days of backups
find /backups -name "mcphub_*.sql" -mtime +7 -delete
```
Run backup:
```bash
docker-compose --profile backup run --rm backup
```
## Monitoring and Health Checks
### Health Check Endpoint
Add to your application:
```javascript
// In your Express app
app.get('/health', (req, res) => {
res.json({
status: 'healthy',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
memory: process.memoryUsage(),
version: process.env.npm_package_version,
});
});
```
### Docker Health Checks
```yaml
services:
mcphub:
# ... other config
healthcheck:
test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:3000/health']
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
```
### Monitoring with Watchtower
Add automatic updates:
```yaml
services:
watchtower:
image: containrrr/watchtower
container_name: mcphub-watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=3600
- WATCHTOWER_INCLUDE_STOPPED=true
restart: unless-stopped
```
## Troubleshooting
### Common Issues
**Container fails to start**: Check logs with `docker-compose logs mcphub`
**Database connection errors**: Ensure PostgreSQL is healthy and accessible
**Port conflicts**: Check if ports 3000/5432 are already in use
**Volume mount issues**: Verify file paths and permissions
### Debug Commands
```bash
# Check container status
docker-compose ps
# View logs
docker-compose logs -f [service_name]
# Execute commands in container
docker-compose exec mcphub sh
# Check database connection
docker-compose exec postgres psql -U mcphub -d mcphub
# Restart specific service
docker-compose restart mcphub
# Rebuild and restart
docker-compose up --build -d
```
### Performance Optimization
```yaml
services:
mcphub:
# ... other config
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
cpus: '0.25'
```
This Docker setup provides a complete containerized environment for MCPHub with development and production configurations.

View File

@@ -0,0 +1,104 @@
---
title: 'Environment Variables'
description: 'Configure MCPHub using environment variables'
---
# Environment Variables
MCPHub uses environment variables for configuration. This guide covers all available variables and their usage.
## Core Application Settings
### Server Configuration
| Variable | Default | Description |
| --- | --- | --- |
| `PORT` | `3000` | Port number for the HTTP server |
| `INIT_TIMEOUT` | `300000` | Initial timeout for the application |
| `BASE_PATH` | `''` | The base path of the application |
| `READONLY` | `false` | Set to `true` to enable readonly mode |
| `MCPHUB_SETTING_PATH` | | Path to the MCPHub settings |
| `NODE_ENV` | `development` | Application environment (`development`, `production`, `test`) |
```env
PORT=3000
INIT_TIMEOUT=300000
BASE_PATH=/api
READONLY=true
MCPHUB_SETTING_PATH=/path/to/settings
NODE_ENV=production
```
## Authentication & Security
### JWT Configuration
| Variable | Default | Description |
| --- | --- | --- |
| `JWT_SECRET` | - | Secret key for JWT token signing (required) |
```env
JWT_SECRET=your-super-secret-key-change-this-in-production
```
## Configuration Examples
### Development Environment
```env
# .env.development
NODE_ENV=development
PORT=3000
# Auth
JWT_SECRET=dev-secret-key
```
### Production Environment
```env
# .env.production
NODE_ENV=production
PORT=3000
# Security
JWT_SECRET=your-super-secure-production-secret
```
### Docker Environment
```env
# .env.docker
NODE_ENV=production
PORT=3000
# Security
JWT_SECRET_FILE=/run/secrets/jwt_secret
```
## Environment Variable Loading
MCPHub loads environment variables in the following order:
1. System environment variables
2. `.env.local` (ignored by git)
3. `.env.{NODE_ENV}` (e.g., `.env.production`)
4. `.env`
### Using dotenv-expand
MCPHub supports variable expansion:
```env
BASE_URL=https://api.example.com
API_ENDPOINT=${BASE_URL}/v1
```
## Security Best Practices
1. **Never commit secrets** to version control
2. **Use strong, unique secrets** for production
3. **Rotate secrets regularly**
4. **Use environment-specific files**
5. **Validate all environment variables** at startup
6. **Use Docker secrets** for container deployments

View File

@@ -0,0 +1,519 @@
---
title: 'MCP Settings Configuration'
description: 'Configure MCP servers and their settings for MCPHub'
---
# MCP Settings Configuration
This guide explains how to configure MCP servers in MCPHub using the `mcp_settings.json` file and related configurations.
## Configuration Files Overview
MCPHub uses several configuration files:
- **`mcp_settings.json`**: Main MCP server configurations
- **`servers.json`**: Server metadata and grouping
- **`.env`**: Environment variables and secrets
## Basic MCP Settings Structure
### mcp_settings.json
```json
{
"mcpServers": {
"server-name": {
"command": "command-to-run",
"args": ["arg1", "arg2"],
"env": {
"ENV_VAR": "value"
}
}
}
}
```
### Example Configuration
```json
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {
"USER_AGENT": "MCPHub/1.0"
}
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
},
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
"SLACK_TEAM_ID": "${SLACK_TEAM_ID}"
}
}
}
}
```
## Server Configuration Options
### Required Fields
| Field | Type | Description |
| --------- | ------ | -------------------------- |
| `command` | string | Executable command or path |
| `args` | array | Command-line arguments |
### Optional Fields
| Field | Type | Default | Description |
| -------------- | ------- | --------------- | --------------------------- |
| `env` | object | `{}` | Environment variables |
## Common MCP Server Examples
### Web and API Servers
#### Fetch Server
```json
{
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {
"USER_AGENT": "MCPHub/1.0",
"MAX_REDIRECTS": "10"
}
}
}
```
#### Web Scraping with Playwright
```json
{
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"],
"timeout": 60000,
"env": {
"PLAYWRIGHT_BROWSERS_PATH": "/tmp/browsers"
}
}
}
```
### File and System Servers
#### Filesystem Server
```json
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"],
"env": {
"ALLOWED_OPERATIONS": "read,write,list"
}
}
}
```
#### SQLite Server
```json
{
"sqlite": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "/path/to/database.db"],
"env": {
"SQLITE_READONLY": "false"
}
}
}
```
### Communication Servers
#### Slack Server
```json
{
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
"SLACK_TEAM_ID": "${SLACK_TEAM_ID}",
"SLACK_APP_TOKEN": "${SLACK_APP_TOKEN}"
}
}
}
```
#### Email Server
```json
{
"email": {
"command": "python",
"args": ["-m", "mcp_server_email"],
"env": {
"SMTP_HOST": "smtp.gmail.com",
"SMTP_PORT": "587",
"EMAIL_USER": "${EMAIL_USER}",
"EMAIL_PASSWORD": "${EMAIL_PASSWORD}"
}
}
}
```
### Development and API Servers
#### GitHub Server
```json
{
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
```
#### Google Drive Server
```json
{
"gdrive": {
"command": "npx",
"args": ["-y", "@google/mcp-server-gdrive"],
"env": {
"GOOGLE_CLIENT_ID": "${GOOGLE_CLIENT_ID}",
"GOOGLE_CLIENT_SECRET": "${GOOGLE_CLIENT_SECRET}",
"GOOGLE_REFRESH_TOKEN": "${GOOGLE_REFRESH_TOKEN}"
}
}
}
```
### Map and Location Services
#### Amap (高德地图) Server
```json
{
"amap": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "${AMAP_API_KEY}",
"AMAP_LANGUAGE": "zh-cn"
}
}
}
```
#### OpenStreetMap Server
```json
{
"osm": {
"command": "python",
"args": ["-m", "mcp_server_osm"],
"env": {
"OSM_USER_AGENT": "MCPHub/1.0"
}
}
}
```
## Advanced Configuration
### Environment Variable Substitution
MCPHub supports environment variable substitution using `${VAR_NAME}` syntax:
```json
{
"mcpServers": {
"api-server": {
"command": "python",
"args": ["-m", "api_server"],
"env": {
"API_KEY": "${API_KEY}",
"API_URL": "${API_BASE_URL}/v1"
}
}
}
}
```
{/* ### Custom Server Scripts
#### Local Python Server
```json
{
"custom-python": {
"command": "python",
"args": ["./servers/custom_server.py"],
"cwd": "/app/custom-servers",
"env": {
"PYTHONPATH": "/app/custom-servers",
"CONFIG_FILE": "./config.json"
}
}
}
```
#### Local Node.js Server
```json
{
"custom-node": {
"command": "node",
"args": ["./servers/custom-server.js"],
"cwd": "/app/custom-servers",
"env": {
"NODE_ENV": "production"
}
}
}
```
## Server Metadata Configuration
### servers.json
Complement `mcp_settings.json` with server metadata:
```json
{
"servers": {
"fetch": {
"name": "Fetch Server",
"description": "HTTP client for web requests",
"category": "web",
"tags": ["http", "api", "web"],
"version": "1.0.0",
"author": "MCPHub Team",
"documentation": "https://docs.mcphub.com/servers/fetch",
"enabled": true
},
"playwright": {
"name": "Playwright Browser",
"description": "Web automation and scraping",
"category": "automation",
"tags": ["browser", "scraping", "automation"],
"version": "2.0.0",
"enabled": true
}
},
"groups": {
"web-tools": {
"name": "Web Tools",
"description": "Tools for web interaction",
"servers": ["fetch", "playwright"],
"access": "public"
},
"admin-tools": {
"name": "Admin Tools",
"description": "Administrative utilities",
"servers": ["filesystem", "database"],
"access": "admin"
}
}
}
``` */}
## Group Management
### Group Configuration
```json
{
"groups": {
"production": {
"name": "Production Tools",
"description": "Stable production servers",
"servers": ["fetch", "slack", "github"]
},
"experimental": {
"name": "Experimental Features",
"description": "Beta and experimental servers",
"servers": ["experimental-ai", "beta-search"]
}
}
}
```
{/* ### Access Control
| Access Level | Description |
| --------------- | -------------------------- |
| `public` | No authentication required |
| `authenticated` | Valid JWT token required |
| `admin` | Admin role required |
| `custom` | Custom permission logic |
## Dynamic Configuration
### Hot Reloading
MCPHub supports hot reloading of configurations:
```bash
# Reload configurations without restart
curl -X POST http://localhost:3000/api/admin/reload-config \
-H "Authorization: Bearer your-admin-token"
``` */}
{/* ### Configuration Validation
MCPHub validates configurations on startup and reload:
```json
{
"validation": {
"strict": true,
"allowUnknownServers": false,
"requireDocumentation": true
}
}
``` */}
## Best Practices
### Security
1. **Use environment variables** for sensitive data:
```json
{
"env": {
"API_KEY": "${API_KEY}",
"DATABASE_PASSWORD": "${DB_PASSWORD}"
}
}
```
{/* 2. **Limit server permissions**:
```json
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/restricted/path"],
"env": {
"READONLY": "true"
}
}
}
``` */}
{/* ### Performance
1. **Set appropriate timeouts**:
```json
{
"timeout": 30000,
"maxRestarts": 3,
"restartDelay": 5000
}
```
2. **Resource limits**:
```json
{
"env": {
"NODE_OPTIONS": "--max-old-space-size=512",
"MEMORY_LIMIT": "512MB"
}
}
``` */}
{/* ### Monitoring
1. **Enable health checks**:
```json
{
"healthCheck": {
"enabled": true,
"interval": 30000,
"timeout": 5000
}
}
```
2. **Logging configuration**:
```json
{
"env": {
"LOG_LEVEL": "info",
"LOG_FORMAT": "json"
}
}
``` */}
{/* ## Troubleshooting
### Common Issues
**Server won't start**: Check command and arguments
```bash
# Test command manually
uvx mcp-server-fetch
``` */}
{/* **Environment variables not found**: Verify `.env` file
```bash
# Check environment
printenv | grep API_KEY
```
**Permission errors**: Check file permissions and paths
```bash
# Verify executable permissions
ls -la /path/to/server
``` */}
{/* ### Debug Configuration
Enable debug mode for detailed logging:
```json
{
"debug": {
"enabled": true,
"logLevel": "debug",
"includeEnv": false,
"logStartup": true
}
}
``` */}
{/*
### Validation Errors
Common validation errors and solutions:
1. **Missing required fields**: Add `command` and `args`
2. **Invalid timeout**: Use number, not string
3. **Environment variable not found**: Check `.env` file
4. **Command not found**: Verify installation and PATH */}
This comprehensive guide covers all aspects of configuring MCP servers in MCPHub for various use cases and environments.

View File

@@ -0,0 +1,373 @@
---
title: 'Nginx Configuration'
description: 'Configure Nginx as a reverse proxy for MCPHub'
---
# Nginx Configuration
This guide explains how to configure Nginx as a reverse proxy for MCPHub, including SSL termination, load balancing, and caching strategies.
## Basic Reverse Proxy Setup
### Configuration File
Create or update your Nginx configuration file (`/etc/nginx/sites-available/mcphub`):
```nginx
server {
listen 80;
server_name your-domain.com;
# Redirect HTTP to HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL Configuration
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# Security Headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Gzip Compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# Main application
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 86400;
}
# API endpoints with longer timeout for MCP operations
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 300;
proxy_connect_timeout 60;
proxy_send_timeout 60;
}
# Static assets caching
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://127.0.0.1:3000;
proxy_cache_valid 200 1d;
proxy_cache_valid 404 1m;
add_header Cache-Control "public, immutable";
expires 1y;
}
}
```
### Enable the Configuration
```bash
# Create symbolic link to enable the site
sudo ln -s /etc/nginx/sites-available/mcphub /etc/nginx/sites-enabled/
# Test configuration
sudo nginx -t
# Reload Nginx
sudo systemctl reload nginx
```
## Load Balancing Configuration
For high-availability setups with multiple MCPHub instances:
```nginx
upstream mcphub_backend {
least_conn;
server 127.0.0.1:3000 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3002 weight=1 max_fails=3 fail_timeout=30s;
# Health check (Nginx Plus feature)
# health_check interval=5s fails=3 passes=2;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL and other configurations...
location / {
proxy_pass http://mcphub_backend;
# Other proxy settings...
}
}
```
## Caching Configuration
### Browser Caching
```nginx
# Cache static assets
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://127.0.0.1:3000;
expires 1y;
add_header Cache-Control "public, immutable";
}
# Cache API responses (be careful with dynamic content)
location /api/public/ {
proxy_pass http://127.0.0.1:3000;
proxy_cache mcphub_cache;
proxy_cache_valid 200 5m;
proxy_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
}
```
### Nginx Proxy Cache
Add to the `http` block in `nginx.conf`:
```nginx
http {
# Proxy cache configuration
proxy_cache_path /var/cache/nginx/mcphub
levels=1:2
keys_zone=mcphub_cache:10m
max_size=1g
inactive=60m
use_temp_path=off;
# Other configurations...
}
```
## WebSocket Support
For real-time features and SSE (Server-Sent Events):
```nginx
location /api/stream {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Disable buffering for real-time responses
proxy_buffering off;
proxy_cache off;
# Timeouts for long-lived connections
proxy_read_timeout 24h;
proxy_send_timeout 24h;
}
```
## Security Configuration
### Rate Limiting
```nginx
http {
# Define rate limiting zones
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
# Apply rate limiting to API endpoints
location /api/ {
limit_req zone=api burst=20 nodelay;
# Other configurations...
}
# Strict rate limiting for login endpoints
location /api/auth/login {
limit_req zone=login burst=5;
# Other configurations...
}
}
}
```
### IP Whitelisting
```nginx
# Allow specific IPs for admin endpoints
location /api/admin/ {
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
proxy_pass http://127.0.0.1:3000;
# Other proxy settings...
}
```
## Monitoring and Logging
### Access Logs
```nginx
http {
# Custom log format
log_format mcphub_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
server {
# Enable access logging
access_log /var/log/nginx/mcphub_access.log mcphub_format;
error_log /var/log/nginx/mcphub_error.log;
# Other configurations...
}
}
```
### Status Page
```nginx
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
```
## Docker Integration
When running MCPHub in Docker, update the proxy configuration:
```nginx
upstream mcphub_docker {
server mcphub:3000; # Docker service name
}
server {
location / {
proxy_pass http://mcphub_docker;
# Other proxy settings...
}
}
```
## Complete Example Configuration
Here's a production-ready example using the provided `nginx.conf.example`:
```bash
# Copy the example configuration
cp nginx.conf.example /etc/nginx/sites-available/mcphub
# Update the configuration with your domain and paths
sudo nano /etc/nginx/sites-available/mcphub
# Enable the site
sudo ln -s /etc/nginx/sites-available/mcphub /etc/nginx/sites-enabled/
# Test and reload
sudo nginx -t && sudo systemctl reload nginx
```
## Troubleshooting
### Common Issues
**502 Bad Gateway**: Check if MCPHub is running and accessible
**504 Gateway Timeout**: Increase `proxy_read_timeout` for long-running operations
**WebSocket connection failures**: Ensure proper `Upgrade` and `Connection` headers
**Cache issues**: Clear proxy cache or disable for development
### Debug Commands
```bash
# Test Nginx configuration
sudo nginx -t
# Check Nginx status
sudo systemctl status nginx
# View error logs
sudo tail -f /var/log/nginx/error.log
# Check if MCPHub is responding
curl -I http://localhost:3000
```
## Performance Optimization
### Worker Processes
```nginx
# In nginx.conf
worker_processes auto;
worker_connections 1024;
```
### Buffer Sizes
```nginx
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
```
### Keep-Alive
```nginx
upstream mcphub_backend {
server 127.0.0.1:3000;
keepalive 32;
}
location / {
proxy_pass http://mcphub_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
```
This configuration provides a solid foundation for running MCPHub behind Nginx with proper security, performance, and reliability features.

View File

@@ -0,0 +1,210 @@
# MCPHub DAO Layer 实现总结
## 项目概述
本次开发为MCPHub项目引入了独立的数据访问对象(DAO)层,用于管理`mcp_settings.json`中的不同类型数据的增删改查操作。
## 已实现的功能
### 1. 核心DAO层架构
#### 基础架构
- **BaseDao.ts**: 定义了通用的CRUD接口和抽象实现
- **JsonFileBaseDao.ts**: 提供JSON文件操作的基础类包含缓存机制
- **DaoFactory.ts**: 工厂模式实现提供DAO实例的创建和管理
#### 具体DAO实现
1. **UserDao**: 用户数据管理
- 用户创建(含密码哈希)
- 密码验证
- 权限管理
- 管理员查询
2. **ServerDao**: 服务器配置管理
- 服务器CRUD操作
- 按所有者/类型/状态查询
- 工具和提示配置管理
- 启用/禁用控制
3. **GroupDao**: 群组管理
- 群组CRUD操作
- 服务器成员管理
- 按所有者查询
- 群组-服务器关系管理
4. **SystemConfigDao**: 系统配置管理
- 系统级配置的读取和更新
- 分段配置管理
- 配置重置功能
5. **UserConfigDao**: 用户个人配置管理
- 用户个人配置的CRUD操作
- 分段配置管理
- 批量配置查询
### 2. 配置服务集成
#### DaoConfigService
- 使用DAO层重新实现配置加载和保存
- 支持用户权限过滤
- 提供配置合并和验证功能
#### ConfigManager
- 双模式支持:传统文件方式 + 新DAO层
- 运行时切换机制
- 环境变量控制 (`USE_DAO_LAYER`)
- 迁移工具集成
### 3. 迁移和验证工具
#### 迁移功能
- 从传统JSON文件格式迁移到DAO层
- 数据完整性验证
- 性能对比分析
- 迁移报告生成
#### 测试工具
- DAO操作完整性测试
- 示例数据生成和清理
- 性能基准测试
## 文件结构
```
src/
├── dao/ # DAO层核心
│ ├── base/
│ │ ├── BaseDao.ts # 基础DAO接口
│ │ └── JsonFileBaseDao.ts # JSON文件基础类
│ ├── UserDao.ts # 用户数据访问
│ ├── ServerDao.ts # 服务器配置访问
│ ├── GroupDao.ts # 群组数据访问
│ ├── SystemConfigDao.ts # 系统配置访问
│ ├── UserConfigDao.ts # 用户配置访问
│ ├── DaoFactory.ts # DAO工厂
│ ├── examples.ts # 使用示例
│ └── index.ts # 统一导出
├── config/
│ ├── DaoConfigService.ts # DAO配置服务
│ ├── configManager.ts # 配置管理器
│ └── migrationUtils.ts # 迁移工具
├── scripts/
│ └── dao-demo.ts # 演示脚本
└── docs/
└── dao-layer.md # 详细文档
```
## 主要特性
### 1. 类型安全
- 完整的TypeScript类型定义
- 编译时类型检查
- 接口约束和验证
### 2. 模块化设计
- 每种数据类型独立的DAO
- 清晰的关注点分离
- 可插拔的实现方式
### 3. 缓存机制
- JSON文件读取缓存
- 文件修改时间检测
- 缓存失效和刷新
### 4. 向后兼容
- 保持现有API不变
- 支持传统和DAO双模式
- 平滑迁移路径
### 5. 未来扩展性
- 数据库切换准备
- 新数据类型支持
- 复杂查询能力
## 使用方法
### 启用DAO层
```bash
# 环境变量配置
export USE_DAO_LAYER=true
```
### 基本操作示例
```typescript
import { getUserDao, getServerDao } from './dao/index.js';
// 用户操作
const userDao = getUserDao();
await userDao.createWithHashedPassword('admin', 'password', true);
const user = await userDao.findByUsername('admin');
// 服务器操作
const serverDao = getServerDao();
await serverDao.create({
name: 'my-server',
command: 'node',
args: ['server.js']
});
```
### 迁移操作
```typescript
import { migrateToDao, validateMigration } from './config/configManager.js';
// 执行迁移
await migrateToDao();
// 验证迁移
await validateMigration();
```
## 依赖包
新增的依赖包:
- `bcrypt`: 用户密码哈希
- `@types/bcrypt`: bcrypt类型定义
- `uuid`: UUID生成群组ID
- `@types/uuid`: uuid类型定义
## 测试状态
**编译测试**: 项目成功编译无TypeScript错误
**类型检查**: 所有类型定义正确
**依赖安装**: 必要依赖包已安装
**运行时测试**: 需要在实际环境中测试
**迁移测试**: 需要使用真实数据测试迁移
## 下一步计划
### 短期目标
1. 在开发环境中测试DAO层功能
2. 完善错误处理和边界情况
3. 添加更多单元测试
4. 性能优化和监控
### 中期目标
1. 集成到现有业务逻辑中
2. 提供Web界面的DAO层管理
3. 添加数据备份和恢复功能
4. 实现配置版本控制
### 长期目标
1. 实现数据库后端支持
2. 添加分布式配置管理
3. 实现实时配置同步
4. 支持配置审计和日志
## 优势总结
通过引入DAO层MCPHub获得了以下优势
1. **🏗️ 架构清晰**: 数据访问逻辑与业务逻辑分离
2. **🔄 易于扩展**: 为未来数据库支持做好准备
3. **🧪 便于测试**: 接口可以轻松模拟和单元测试
4. **🔒 类型安全**: 完整的TypeScript类型支持
5. **⚡ 性能优化**: 内置缓存和批量操作
6. **🛡️ 数据完整性**: 强制数据验证和约束
7. **📦 模块化**: 每种数据类型独立管理
8. **🔧 可维护性**: 代码结构清晰,易于维护
这个DAO层的实现为MCPHub项目提供了坚实的数据管理基础支持项目的长期发展和扩展需求。

254
docs/dao-layer.md Normal file
View File

@@ -0,0 +1,254 @@
# MCPHub DAO Layer 设计文档
## 概述
MCPHub的数据访问对象(DAO)层为项目中`mcp_settings.json`文件中的不同数据类型提供了统一的增删改查操作接口。这个设计使得未来从JSON文件存储切换到数据库存储变得更加容易。
## 架构设计
### 核心组件
```
src/dao/
├── base/
│ ├── BaseDao.ts # 基础DAO接口和抽象实现
│ └── JsonFileBaseDao.ts # JSON文件操作的基础类
├── UserDao.ts # 用户数据访问对象
├── ServerDao.ts # 服务器配置数据访问对象
├── GroupDao.ts # 群组数据访问对象
├── SystemConfigDao.ts # 系统配置数据访问对象
├── UserConfigDao.ts # 用户配置数据访问对象
├── DaoFactory.ts # DAO工厂类
├── examples.ts # 使用示例
└── index.ts # 统一导出
```
### 数据类型映射
| 数据类型 | 原始位置 | DAO类 | 主要功能 |
|---------|---------|-------|---------|
| IUser | `settings.users[]` | UserDao | 用户管理、密码验证、权限控制 |
| ServerConfig | `settings.mcpServers{}` | ServerDao | 服务器配置、启用/禁用、工具管理 |
| IGroup | `settings.groups[]` | GroupDao | 群组管理、服务器分组、成员管理 |
| SystemConfig | `settings.systemConfig` | SystemConfigDao | 系统级配置、路由设置、安装配置 |
| UserConfig | `settings.userConfigs{}` | UserConfigDao | 用户个人配置 |
## 主要特性
### 1. 统一的CRUD接口
所有DAO都实现了基础的CRUD操作
```typescript
interface BaseDao<T, K = string> {
findAll(): Promise<T[]>;
findById(id: K): Promise<T | null>;
create(entity: Omit<T, 'id'>): Promise<T>;
update(id: K, entity: Partial<T>): Promise<T | null>;
delete(id: K): Promise<boolean>;
exists(id: K): Promise<boolean>;
count(): Promise<number>;
}
```
### 2. 特定业务操作
每个DAO还提供了针对其数据类型的特定操作
#### UserDao 特殊功能
- `createWithHashedPassword()` - 创建用户时自动哈希密码
- `validateCredentials()` - 验证用户凭据
- `updatePassword()` - 更新用户密码
- `findAdmins()` - 查找管理员用户
#### ServerDao 特殊功能
- `findByOwner()` - 按所有者查找服务器
- `findEnabled()` - 查找启用的服务器
- `findByType()` - 按类型查找服务器
- `setEnabled()` - 启用/禁用服务器
- `updateTools()` - 更新服务器工具配置
#### GroupDao 特殊功能
- `findByOwner()` - 按所有者查找群组
- `findByServer()` - 查找包含特定服务器的群组
- `addServerToGroup()` - 向群组添加服务器
- `removeServerFromGroup()` - 从群组移除服务器
- `findByName()` - 按名称查找群组
### 3. 配置管理特殊功能
#### SystemConfigDao
- `getSection()` - 获取特定配置段
- `updateSection()` - 更新特定配置段
- `reset()` - 重置为默认配置
#### UserConfigDao
- `getSection()` - 获取用户特定配置段
- `updateSection()` - 更新用户特定配置段
- `getAll()` - 获取所有用户配置
## 使用方法
### 1. 基本使用
```typescript
import { getUserDao, getServerDao, getGroupDao } from './dao/index.js';
// 用户操作
const userDao = getUserDao();
const newUser = await userDao.createWithHashedPassword('username', 'password', false);
const user = await userDao.findByUsername('username');
const isValid = await userDao.validateCredentials('username', 'password');
// 服务器操作
const serverDao = getServerDao();
const server = await serverDao.create({
name: 'my-server',
command: 'node',
args: ['server.js'],
enabled: true
});
// 群组操作
const groupDao = getGroupDao();
const group = await groupDao.create({
name: 'my-group',
description: 'Test group',
servers: ['my-server']
});
```
### 2. 配置服务集成
```typescript
import { DaoConfigService, createDaoConfigService } from './config/DaoConfigService.js';
const daoService = createDaoConfigService();
// 加载完整配置
const settings = await daoService.loadSettings();
// 保存配置
await daoService.saveSettings(updatedSettings);
```
### 3. 迁移管理
```typescript
import { migrateToDao, switchToDao, switchToLegacy } from './config/configManager.js';
// 迁移到DAO层
const success = await migrateToDao();
// 运行时切换
switchToDao(); // 切换到DAO层
switchToLegacy(); // 切换回传统方式
```
## 配置选项
可以通过环境变量控制使用哪种数据访问方式:
```bash
# 使用DAO层 (推荐)
USE_DAO_LAYER=true
# 使用传统文件方式 (默认,向后兼容)
USE_DAO_LAYER=false
```
## 未来扩展
### 数据库支持
DAO层的设计使得切换到数据库变得容易只需要
1. 实现新的DAO实现类如DatabaseUserDao
2. 创建新的DaoFactory
3. 更新配置以使用新的工厂
```typescript
// 未来的数据库实现示例
class DatabaseUserDao implements UserDao {
constructor(private db: Database) {}
async findAll(): Promise<IUser[]> {
return this.db.query('SELECT * FROM users');
}
// ... 其他方法
}
```
### 新数据类型
添加新数据类型只需要:
1. 定义数据接口
2. 创建对应的DAO接口和实现
3. 更新DaoFactory
4. 更新配置服务
## 迁移指南
### 从传统方式迁移到DAO层
1. **备份数据**
```bash
cp mcp_settings.json mcp_settings.json.backup
```
2. **运行迁移**
```typescript
import { performMigration } from './config/migrationUtils.js';
await performMigration();
```
3. **验证迁移**
```typescript
import { validateMigration } from './config/migrationUtils.js';
const isValid = await validateMigration();
```
4. **切换到DAO层**
```bash
export USE_DAO_LAYER=true
```
### 性能对比
可以使用内置工具对比性能:
```typescript
import { performanceComparison } from './config/migrationUtils.js';
await performanceComparison();
```
## 最佳实践
1. **类型安全**: 始终使用TypeScript接口确保类型安全
2. **错误处理**: 在DAO操作周围实现适当的错误处理
3. **事务**: 对于复杂操作,考虑使用事务(未来数据库实现)
4. **缓存**: DAO层包含内置缓存机制
5. **测试**: 使用DAO接口进行单元测试的模拟
## 示例代码
查看以下文件获取完整示例:
- `src/dao/examples.ts` - 基本DAO操作示例
- `src/config/migrationUtils.ts` - 迁移和验证工具
- `src/scripts/dao-demo.ts` - 交互式演示脚本
## 总结
DAO层为MCPHub提供了
- 🏗️ **模块化设计**: 每种数据类型都有专门的访问层
- 🔄 **易于迁移**: 为未来切换到数据库做好准备
- 🧪 **可测试性**: 接口可以轻松模拟和测试
- 🔒 **类型安全**: 完整的TypeScript类型支持
-**性能优化**: 内置缓存和批量操作支持
- 🛡️ **数据完整性**: 强制数据验证和约束
通过引入DAO层MCPHub的数据管理变得更加结构化、可维护和可扩展。

View File

@@ -0,0 +1,724 @@
---
title: 'Architecture Overview'
description: "Understand MCPHub's system architecture and design principles"
---
## System Overview
MCPHub is designed as a scalable, modular platform for managing Model Context Protocol (MCP) servers. The architecture follows modern web application patterns with clear separation of concerns, microservices-ready design, and extensibility in mind.
## High-Level Architecture
```mermaid
graph TB
subgraph "Client Layer"
WEB[Web Dashboard]
API[External APIs]
CLI[CLI Tools]
end
subgraph "Application Layer"
LB[Load Balancer/Nginx]
APP[MCPHub Server]
WS[WebSocket Server]
end
subgraph "Service Layer"
MCP[MCP Service]
AUTH[Auth Service]
ROUTE[Smart Routing]
MON[Monitoring Service]
end
subgraph "Data Layer"
PG[(PostgreSQL)]
REDIS[(Redis)]
VECTOR[(Vector Store)]
end
subgraph "MCP Servers"
GITHUB[GitHub MCP]
FS[Filesystem MCP]
DB[Database MCP]
CUSTOM[Custom MCP]
end
WEB --> LB
API --> LB
CLI --> LB
LB --> APP
APP --> WS
APP --> MCP
APP --> AUTH
APP --> ROUTE
APP --> MON
MCP --> GITHUB
MCP --> FS
MCP --> DB
MCP --> CUSTOM
AUTH --> PG
AUTH --> REDIS
ROUTE --> VECTOR
MON --> PG
MON --> REDIS
```
## Core Components
### 1. Application Server
The main Node.js/Express application that handles all HTTP requests and coordinates between services.
```typescript
// src/server.ts - Main application entry point
class MCPHubServer {
private app: Express;
private httpServer: Server;
private wsServer: WebSocketServer;
async start(): Promise<void> {
await this.initializeDatabase();
await this.initializeServices();
await this.setupRoutes();
await this.startServer();
}
}
```
**Key Responsibilities:**
- HTTP request handling
- WebSocket connections for real-time features
- Service coordination
- Middleware chain management
- Error handling and logging
### 2. MCP Service Layer
Manages the lifecycle and communication with MCP servers.
```typescript
// src/services/mcpService.ts
class MCPService {
private servers: Map<string, MCPServerInstance> = new Map();
private processManager: ProcessManager;
async startServer(config: MCPServerConfig): Promise<void> {
const instance = await this.processManager.spawn(config);
this.servers.set(config.name, instance);
await this.waitForHealthy(instance);
}
async executeRequest(serverName: string, request: MCPRequest): Promise<MCPResponse> {
const server = this.servers.get(serverName);
return await server.sendRequest(request);
}
}
```
**Key Features:**
- Process lifecycle management
- Health monitoring
- Request routing
- Error recovery
- Resource management
### 3. Smart Routing Engine
Provides AI-powered tool discovery and routing using vector embeddings.
```typescript
// src/services/smartRouting.ts
class SmartRoutingService {
private vectorStore: VectorStore;
private embeddingService: EmbeddingService;
async findRelevantTools(query: string): Promise<ToolMatch[]> {
const queryEmbedding = await this.embeddingService.embed(query);
const matches = await this.vectorStore.similaritySearch(queryEmbedding);
return this.rankResults(matches, query);
}
async indexTool(tool: ToolDefinition): Promise<void> {
const embedding = await this.embeddingService.embed(tool.description);
await this.vectorStore.upsert(tool.id, embedding, tool);
}
}
```
**Components:**
- Vector embedding generation
- Similarity search
- Result ranking and filtering
- Tool metadata management
### 4. Authentication & Authorization
Handles user authentication, session management, and access control.
```typescript
// src/services/authService.ts
class AuthService {
async authenticate(credentials: Credentials): Promise<User> {
const user = await this.validateCredentials(credentials);
const token = await this.generateJWT(user);
await this.createSession(user, token);
return user;
}
async authorize(user: User, resource: string, action: string): Promise<boolean> {
const permissions = await this.getUserPermissions(user);
return this.checkPermission(permissions, resource, action);
}
}
```
**Features:**
- JWT-based authentication
- Role-based access control (RBAC)
- Session management
- API key authentication
- Group-based permissions
### 5. Monitoring & Logging
Provides comprehensive monitoring, metrics collection, and logging.
```typescript
// src/services/monitoringService.ts
class MonitoringService {
private metricsCollector: MetricsCollector;
private alertManager: AlertManager;
async collectMetrics(): Promise<void> {
const systemMetrics = await this.getSystemMetrics();
const serverMetrics = await this.getMCPServerMetrics();
await this.metricsCollector.record(systemMetrics, serverMetrics);
await this.checkAlerts(systemMetrics, serverMetrics);
}
}
```
**Capabilities:**
- Real-time metrics collection
- Performance monitoring
- Error tracking
- Alert management
- Audit logging
## Data Architecture
### Database Schema
```sql
-- Core entities
CREATE TABLE users (
id UUID PRIMARY KEY,
username VARCHAR UNIQUE NOT NULL,
email VARCHAR UNIQUE NOT NULL,
password_hash VARCHAR NOT NULL,
role VARCHAR NOT NULL DEFAULT 'user',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE servers (
id UUID PRIMARY KEY,
name VARCHAR UNIQUE NOT NULL,
command VARCHAR NOT NULL,
args JSONB NOT NULL DEFAULT '[]',
env JSONB DEFAULT '{}',
group_name VARCHAR,
status VARCHAR DEFAULT 'stopped',
config JSONB DEFAULT '{}',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE groups (
id UUID PRIMARY KEY,
name VARCHAR UNIQUE NOT NULL,
description TEXT,
config JSONB DEFAULT '{}',
created_at TIMESTAMP DEFAULT NOW()
);
-- Vector search for smart routing
CREATE TABLE tool_embeddings (
id UUID PRIMARY KEY,
server_name VARCHAR NOT NULL,
tool_name VARCHAR NOT NULL,
description TEXT,
embedding vector(1536),
metadata JSONB DEFAULT '{}',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- Monitoring and logging
CREATE TABLE request_logs (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
server_name VARCHAR NOT NULL,
tool_name VARCHAR,
request_data JSONB,
response_data JSONB,
status VARCHAR NOT NULL,
duration_ms INTEGER,
created_at TIMESTAMP DEFAULT NOW()
);
```
### Caching Strategy
```typescript
// src/services/cacheService.ts
class CacheService {
// Multi-layer caching strategy
private memoryCache: Map<string, CacheEntry> = new Map();
private redisCache: Redis;
async get<T>(key: string): Promise<T | null> {
// L1: Memory cache
const memoryEntry = this.memoryCache.get(key);
if (memoryEntry && !this.isExpired(memoryEntry)) {
return memoryEntry.value;
}
// L2: Redis cache
const redisValue = await this.redisCache.get(key);
if (redisValue) {
const value = JSON.parse(redisValue);
this.memoryCache.set(key, { value, expiry: Date.now() + 60000 });
return value;
}
return null;
}
}
```
**Cache Layers:**
- **L1 (Memory)**: Fast access for frequently used data
- **L2 (Redis)**: Shared cache across instances
- **L3 (Database)**: Persistent storage with query optimization
## Communication Patterns
### Request Flow
```mermaid
sequenceDiagram
participant Client
participant API
participant Auth
participant Router
participant MCP
participant Server
Client->>API: HTTP Request
API->>Auth: Validate Token
Auth-->>API: User Context
API->>Router: Route Request
Router->>Router: Find Target Server
Router->>MCP: Execute Request
MCP->>Server: MCP Protocol
Server-->>MCP: MCP Response
MCP-->>Router: Formatted Response
Router-->>API: Response Data
API-->>Client: HTTP Response
```
### WebSocket Communication
```typescript
// src/services/websocketService.ts
class WebSocketService {
private connections: Map<string, WebSocket> = new Map();
handleConnection(ws: WebSocket, userId: string): void {
this.connections.set(userId, ws);
ws.on('message', async (data) => {
const message = JSON.parse(data.toString());
await this.handleMessage(userId, message);
});
ws.on('close', () => {
this.connections.delete(userId);
});
}
broadcast(event: string, data: any): void {
this.connections.forEach((ws) => {
ws.send(JSON.stringify({ event, data }));
});
}
}
```
### Event-Driven Architecture
```typescript
// src/events/eventBus.ts
class EventBus {
private listeners: Map<string, EventListener[]> = new Map();
emit(event: string, data: any): void {
const handlers = this.listeners.get(event) || [];
handlers.forEach((handler) => handler(data));
}
on(event: string, handler: EventListener): void {
const handlers = this.listeners.get(event) || [];
handlers.push(handler);
this.listeners.set(event, handlers);
}
}
// Usage
eventBus.on('server.started', (data) => {
logger.info(`Server ${data.name} started`);
monitoringService.updateServerStatus(data.name, 'running');
});
```
## Security Architecture
### Authentication Flow
```mermaid
graph LR
A[Client] --> B[Login Request]
B --> C[Validate Credentials]
C --> D[Generate JWT]
D --> E[Create Session]
E --> F[Return Token]
F --> G[Store in Cookie/Header]
G --> H[Subsequent Requests]
H --> I[Validate Token]
I --> J[Check Permissions]
J --> K[Allow/Deny Access]
```
### Authorization Model
```typescript
// Role-Based Access Control (RBAC)
interface Permission {
resource: string; // e.g., 'servers', 'groups', 'users'
action: string; // e.g., 'create', 'read', 'update', 'delete'
scope?: string; // e.g., 'own', 'group', 'all'
}
interface Role {
name: string;
permissions: Permission[];
}
const roles: Role[] = [
{
name: 'admin',
permissions: [{ resource: '*', action: '*', scope: 'all' }],
},
{
name: 'manager',
permissions: [
{ resource: 'servers', action: '*', scope: 'group' },
{ resource: 'groups', action: 'read', scope: 'all' },
],
},
{
name: 'user',
permissions: [
{ resource: 'servers', action: 'read', scope: 'group' },
{ resource: 'tools', action: 'execute', scope: 'group' },
],
},
];
```
## Scalability Considerations
### Horizontal Scaling
```yaml
# Kubernetes deployment for scaling
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcphub
spec:
replicas: 3
selector:
matchLabels:
app: mcphub
template:
spec:
containers:
- name: mcphub
image: mcphub:latest
resources:
requests:
memory: '256Mi'
cpu: '200m'
limits:
memory: '512Mi'
cpu: '500m'
```
### Load Balancing Strategy
```typescript
// src/services/loadBalancer.ts
class LoadBalancer {
private servers: ServerInstance[] = [];
private algorithm: 'round-robin' | 'least-connections' | 'weighted';
selectServer(): ServerInstance {
switch (this.algorithm) {
case 'round-robin':
return this.roundRobin();
case 'least-connections':
return this.leastConnections();
case 'weighted':
return this.weighted();
}
}
}
```
### Database Scaling
```typescript
// Database connection management
class DatabaseManager {
private readPool: Pool; // Read replicas
private writePool: Pool; // Primary database
async query(sql: string, params: any[]): Promise<any> {
if (this.isReadOperation(sql)) {
return this.readPool.query(sql, params);
} else {
return this.writePool.query(sql, params);
}
}
}
```
## Performance Optimization
### Query Optimization
```sql
-- Optimized queries with proper indexing
CREATE INDEX CONCURRENTLY idx_servers_status_group
ON servers(status, group_name)
WHERE status IN ('running', 'starting');
CREATE INDEX CONCURRENTLY idx_tool_embeddings_similarity
ON tool_embeddings USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
CREATE INDEX CONCURRENTLY idx_request_logs_performance
ON request_logs(created_at, status, duration_ms)
WHERE created_at > NOW() - INTERVAL '30 days';
```
### Caching Strategy
```typescript
// Multi-level caching
class CacheManager {
// Cache server configurations
@Cache({ ttl: 300, key: 'server-config' })
async getServerConfig(name: string): Promise<ServerConfig> {
return this.database.getServerConfig(name);
}
// Cache tool metadata for smart routing
@Cache({ ttl: 3600, key: 'tool-metadata' })
async getToolMetadata(): Promise<ToolMetadata[]> {
return this.database.getToolMetadata();
}
// Cache user permissions
@Cache({ ttl: 600, key: 'user-permissions' })
async getUserPermissions(userId: string): Promise<Permission[]> {
return this.authService.getUserPermissions(userId);
}
}
```
## Monitoring & Observability
### Metrics Collection
```typescript
// src/services/metricsService.ts
class MetricsService {
private prometheus: PrometheusRegistry;
constructor() {
this.initializeMetrics();
}
private initializeMetrics(): void {
// Request metrics
this.requestCount = new Counter({
name: 'mcphub_requests_total',
help: 'Total number of requests',
labelNames: ['method', 'route', 'status'],
});
// Server metrics
this.serverStatus = new Gauge({
name: 'mcphub_server_status',
help: 'Status of MCP servers',
labelNames: ['server_name', 'status'],
});
// Performance metrics
this.responseTime = new Histogram({
name: 'mcphub_response_time_seconds',
help: 'Response time in seconds',
labelNames: ['route'],
});
}
}
```
### Distributed Tracing
```typescript
// OpenTelemetry integration
import { trace } from '@opentelemetry/api';
class MCPService {
async executeRequest(serverName: string, request: MCPRequest): Promise<MCPResponse> {
const span = trace.getActiveSpan();
span?.setAttributes({
'mcp.server': serverName,
'mcp.tool': request.tool,
'mcp.request_id': request.id,
});
try {
const response = await this.sendRequest(serverName, request);
span?.setStatus({ code: SpanStatusCode.OK });
return response;
} catch (error) {
span?.setStatus({
code: SpanStatusCode.ERROR,
message: error.message,
});
throw error;
}
}
}
```
## Extension Points
### Plugin Architecture
```typescript
// Plugin interface
interface MCPHubPlugin {
name: string;
version: string;
init(context: PluginContext): Promise<void>;
destroy(): Promise<void>;
}
// Plugin manager
class PluginManager {
private plugins: Map<string, MCPHubPlugin> = new Map();
async loadPlugin(plugin: MCPHubPlugin): Promise<void> {
await plugin.init(this.createContext());
this.plugins.set(plugin.name, plugin);
}
private createContext(): PluginContext {
return {
eventBus: this.eventBus,
logger: this.logger,
database: this.database,
// ... other services
};
}
}
```
### Custom Middleware
```typescript
// Custom middleware registration
class MiddlewareManager {
register(middleware: Middleware): void {
this.app.use(middleware);
}
registerRoute(path: string, middleware: Middleware): void {
this.app.use(path, middleware);
}
}
// Example custom middleware
const customAuthMiddleware: Middleware = (req, res, next) => {
// Custom authentication logic
next();
};
```
## Deployment Architecture
### Container Strategy
```dockerfile
# Multi-stage build for optimized images
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:18-alpine AS runtime
RUN addgroup -g 1001 -S nodejs
RUN adduser -S mcphub -u 1001
WORKDIR /app
COPY --from=builder --chown=mcphub:nodejs /app .
USER mcphub
EXPOSE 3000
CMD ["node", "dist/server.js"]
```
### Infrastructure as Code
```terraform
# Terraform configuration for AWS deployment
resource "aws_ecs_cluster" "mcphub" {
name = "mcphub-cluster"
}
resource "aws_ecs_service" "mcphub" {
name = "mcphub"
cluster = aws_ecs_cluster.mcphub.id
task_definition = aws_ecs_task_definition.mcphub.arn
desired_count = 3
load_balancer {
target_group_arn = aws_lb_target_group.mcphub.arn
container_name = "mcphub"
container_port = 3000
}
}
```
This architecture provides a solid foundation for building a scalable, maintainable, and extensible MCP server management platform while following modern software development best practices.

View File

@@ -0,0 +1,597 @@
---
title: 'Contributing to MCPHub'
description: 'Learn how to contribute to the MCPHub project'
---
## Welcome Contributors! 🎉
Thank you for your interest in contributing to MCPHub! This guide will help you get started with contributing to the project, whether you're fixing bugs, adding features, improving documentation, or helping with testing.
## Quick Start
1. **Fork the repository** on GitHub
2. **Clone your fork** locally
3. **Create a branch** for your changes
4. **Make your changes** following our guidelines
5. **Test your changes** thoroughly
6. **Submit a pull request**
## Ways to Contribute
### 🐛 Bug Reports
Help us improve MCPHub by reporting bugs:
- **Search existing issues** first to avoid duplicates
- **Use the bug report template** when creating issues
- **Provide detailed information** including steps to reproduce
- **Include system information** (OS, Node.js version, etc.)
```markdown
## Bug Report Template
**Description**
A clear description of what the bug is.
**Steps to Reproduce**
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected Behavior**
What you expected to happen.
**Actual Behavior**
What actually happened.
**Environment**
- OS: [e.g. macOS 12.0]
- Node.js: [e.g. 18.17.0]
- MCPHub Version: [e.g. 1.2.3]
- Browser: [e.g. Chrome 91.0]
**Additional Context**
Any other context about the problem.
```
### ✨ Feature Requests
We welcome feature suggestions:
- **Check existing feature requests** to avoid duplicates
- **Use the feature request template**
- **Explain the use case** and why it would be valuable
- **Consider implementation complexity**
### 🔧 Code Contributions
Ready to write some code? Here's how:
#### Setting Up Development Environment
```bash
# 1. Fork and clone the repository
git clone https://github.com/YOUR_USERNAME/mcphub.git
cd mcphub
# 2. Add upstream remote
git remote add upstream https://github.com/mcphub/mcphub.git
# 3. Install dependencies
pnpm install
# 4. Set up environment
cp .env.example .env.development
# 5. Start development environment
docker-compose -f docker-compose.dev.yml up -d
pnpm run migrate
pnpm run seed
# 6. Start development server
pnpm run dev
```
#### Branch Naming Convention
Use descriptive branch names with prefixes:
```bash
# Features
git checkout -b feature/smart-routing-improvements
git checkout -b feature/user-authentication
# Bug fixes
git checkout -b fix/server-startup-error
git checkout -b fix/memory-leak-in-cache
# Documentation
git checkout -b docs/api-reference-update
git checkout -b docs/deployment-guide
# Refactoring
git checkout -b refactor/auth-service-cleanup
git checkout -b refactor/database-queries
```
### 📚 Documentation
Help improve our documentation:
- **Fix typos and grammar**
- **Improve existing guides**
- **Add missing documentation**
- **Create tutorials and examples**
- **Translate documentation**
## Development Guidelines
### Code Style
We use ESLint and Prettier to maintain code quality:
```bash
# Check code style
pnpm run lint
# Fix automatically fixable issues
pnpm run lint:fix
# Format code
pnpm run format
# Type check
pnpm run type-check
```
#### TypeScript Best Practices
```typescript
// ✅ Good: Use proper types
interface MCPServerConfig {
name: string;
command: string;
args: string[];
env?: Record<string, string>;
}
// ✅ Good: Use async/await
async function startServer(config: MCPServerConfig): Promise<void> {
try {
await mcpService.start(config);
} catch (error) {
logger.error('Failed to start server', { error, config });
throw error;
}
}
// ❌ Bad: Using any type
function processData(data: any): any {
return data.something();
}
// ❌ Bad: Not handling errors
async function riskyOperation(): Promise<void> {
await dangerousFunction(); // Could throw
}
```
#### React/Frontend Guidelines
```tsx
// ✅ Good: Functional components with proper typing
interface ServerCardProps {
server: MCPServer;
onStart: (serverId: string) => void;
onStop: (serverId: string) => void;
}
const ServerCard: React.FC<ServerCardProps> = ({ server, onStart, onStop }) => {
const handleStart = useCallback(() => {
onStart(server.id);
}, [server.id, onStart]);
return (
<Card data-testid={`server-card-${server.id}`}>
<CardHeader>
<CardTitle>{server.name}</CardTitle>
<Badge variant={server.status === 'running' ? 'success' : 'secondary'}>
{server.status}
</Badge>
</CardHeader>
<CardContent>
<p>{server.description}</p>
</CardContent>
<CardActions>
{server.status === 'stopped' ? (
<Button onClick={handleStart}>Start</Button>
) : (
<Button onClick={() => onStop(server.id)}>Stop</Button>
)}
</CardActions>
</Card>
);
};
```
### Testing Requirements
All contributions must include appropriate tests:
#### Unit Tests
```typescript
// src/services/__tests__/mcpService.test.ts
import { MCPService } from '../mcpService';
import { mockLogger, mockDatabase } from '../../__mocks__';
describe('MCPService', () => {
let service: MCPService;
beforeEach(() => {
service = new MCPService(mockLogger, mockDatabase);
});
describe('startServer', () => {
it('should start a server successfully', async () => {
const config = {
name: 'test-server',
command: 'node',
args: ['server.js'],
};
await service.startServer(config);
expect(service.getServerStatus('test-server')).toBe('running');
});
it('should handle server startup failures', async () => {
const invalidConfig = {
name: 'invalid-server',
command: 'invalid-command',
args: [],
};
await expect(service.startServer(invalidConfig)).rejects.toThrow(
'Failed to start server: Command not found',
);
});
});
});
```
#### Integration Tests
```typescript
// src/__tests__/integration/server-api.test.ts
import request from 'supertest';
import { app } from '../../app';
import { setupTestDatabase, teardownTestDatabase } from '../helpers/database';
describe('Server API Integration', () => {
beforeAll(async () => {
await setupTestDatabase();
});
afterAll(async () => {
await teardownTestDatabase();
});
describe('POST /api/servers', () => {
it('should create a new server', async () => {
const serverData = {
name: 'test-server',
command: 'node',
args: ['server.js'],
group: 'development',
};
const response = await request(app).post('/api/servers').send(serverData).expect(201);
expect(response.body).toMatchObject({
name: 'test-server',
status: 'stopped',
group: 'development',
});
});
});
});
```
#### End-to-End Tests
```typescript
// tests/e2e/server-management.spec.ts
import { test, expect } from '@playwright/test';
test.describe('Server Management', () => {
test('should create and manage MCP servers', async ({ page }) => {
await page.goto('/dashboard');
// Create new server
await page.click('[data-testid="add-server-button"]');
await page.fill('[data-testid="server-name-input"]', 'test-server');
await page.fill('[data-testid="server-command-input"]', 'node server.js');
await page.click('[data-testid="save-server-button"]');
// Verify server appears in list
await expect(page.locator('[data-testid="server-list"]')).toContainText('test-server');
// Start the server
await page.click('[data-testid="start-server-test-server"]');
// Verify server is running
await expect(page.locator('[data-testid="server-status-test-server"]')).toContainText(
'running',
);
});
});
```
### Commit Guidelines
We follow [Conventional Commits](https://www.conventionalcommits.org/):
```bash
# Format: <type>[optional scope]: <description>
# Features
git commit -m "feat(auth): add JWT token refresh functionality"
git commit -m "feat(ui): implement server status dashboard"
# Bug fixes
git commit -m "fix(api): resolve memory leak in server manager"
git commit -m "fix(db): handle connection timeout gracefully"
# Documentation
git commit -m "docs(api): add examples for server endpoints"
git commit -m "docs(readme): update installation instructions"
# Refactoring
git commit -m "refactor(services): extract auth logic into separate module"
# Tests
git commit -m "test(api): add integration tests for server management"
# Chores
git commit -m "chore(deps): update dependencies to latest versions"
```
#### Commit Types
- **feat**: New feature
- **fix**: Bug fix
- **docs**: Documentation changes
- **style**: Code style changes (formatting, etc.)
- **refactor**: Code refactoring
- **test**: Adding or updating tests
- **chore**: Maintenance tasks
- **perf**: Performance improvements
- **ci**: CI/CD changes
### Pull Request Process
#### Before Submitting
```bash
# 1. Sync with upstream
git fetch upstream
git checkout main
git merge upstream/main
# 2. Rebase your feature branch
git checkout feature/your-feature
git rebase main
# 3. Run all checks
pnpm run lint
pnpm run type-check
pnpm run test
pnpm run build
# 4. Update documentation if needed
# 5. Add/update tests for your changes
```
#### Pull Request Template
```markdown
## Description
Brief description of the changes and motivation.
## Type of Change
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
## Testing
- [ ] Unit tests pass
- [ ] Integration tests pass
- [ ] E2E tests pass (if applicable)
- [ ] Manual testing completed
## Documentation
- [ ] Code is self-documenting
- [ ] API documentation updated
- [ ] User documentation updated
- [ ] README updated (if needed)
## Checklist
- [ ] My code follows the project's style guidelines
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
## Screenshots (if applicable)
Add screenshots to help explain your changes.
## Additional Notes
Any additional information that reviewers should know.
```
### Code Review Process
#### For Contributors
- **Be patient**: Reviews take time, and reviewers may have questions
- **Be responsive**: Address feedback promptly and clearly
- **Be open**: Accept constructive criticism and suggestions
- **Ask questions**: If feedback is unclear, ask for clarification
#### For Reviewers
- **Be constructive**: Provide helpful suggestions, not just criticism
- **Be specific**: Point out exact issues and suggest solutions
- **Be timely**: Review PRs within a reasonable timeframe
- **Be encouraging**: Recognize good work and improvements
## Community Guidelines
### Code of Conduct
We are committed to providing a welcoming and inspiring community for all:
- **Be respectful**: Treat everyone with respect and kindness
- **Be inclusive**: Welcome people of all backgrounds and skill levels
- **Be collaborative**: Work together towards common goals
- **Be patient**: Help others learn and grow
- **Be professional**: Maintain professional communication
### Communication Channels
- **GitHub Issues**: Bug reports and feature requests
- **GitHub Discussions**: General questions and community chat
- **Discord**: Real-time community chat (link in README)
- **Email**: Security issues and private matters
## Getting Help
### Documentation
- [Getting Started Guide](./getting-started.mdx)
- [Architecture Overview](./architecture.mdx)
- [API Reference](../api-reference/introduction.mdx)
- [Configuration Guide](../configuration/mcp-settings.mdx)
### Common Issues
**Build Failures**
```bash
# Clear and reinstall dependencies
rm -rf node_modules pnpm-lock.yaml
pnpm install
# Clear build cache
rm -rf dist/
pnpm run build
```
**Test Failures**
```bash
# Run tests with verbose output
pnpm run test -- --verbose
# Run specific test file
pnpm test src/services/mcpService.test.ts
# Debug tests
pnpm run test:debug
```
**Database Issues**
```bash
# Reset database
pnpm run db:reset
# Run migrations
pnpm run migrate
# Seed development data
pnpm run seed
```
### Getting Support
If you need help:
1. **Check the documentation** first
2. **Search existing issues** on GitHub
3. **Ask in GitHub Discussions** for general questions
4. **Create an issue** if you found a bug
5. **Join our Discord** for real-time help
## Recognition
Contributors will be recognized in several ways:
- **Contributors file**: All contributors are listed in CONTRIBUTORS.md
- **Release notes**: Significant contributions are mentioned in release notes
- **GitHub badges**: Active contributors receive special recognition
- **Community showcase**: Outstanding contributions are featured in our blog
## Advanced Topics
### Maintainer Guidelines
For project maintainers:
#### Release Process
```bash
# 1. Create release branch
git checkout -b release/v1.2.0
# 2. Update version
npm version 1.2.0 --no-git-tag-version
# 3. Update changelog
# Edit CHANGELOG.md
# 4. Commit changes
git add .
git commit -m "chore(release): prepare v1.2.0"
# 5. Create PR for review
# 6. After merge, tag release
git tag v1.2.0
git push origin v1.2.0
```
#### Security Handling
For security issues:
1. **Do not** create public issues
2. **Email** security@mcphub.dev
3. **Wait** for response before disclosure
4. **Coordinate** with maintainers on fixes
### Architectural Decisions
When making significant changes:
1. **Create an RFC** (Request for Comments) issue
2. **Discuss** with the community
3. **Get approval** from maintainers
4. **Document** decisions in ADR (Architecture Decision Records)
## Thank You! 🙏
Thank you for taking the time to contribute to MCPHub! Every contribution, no matter how small, helps make the project better for everyone. We look forward to collaborating with you!

View File

@@ -0,0 +1,244 @@
---
title: 'Getting Started with Development'
description: 'Learn how to set up your development environment for MCPHub'
---
# Getting Started with Development
This guide will help you set up your development environment for contributing to MCPHub.
## Prerequisites
Before you begin, ensure you have the following installed:
- **Node.js** (version 18 or higher)
- **pnpm** (recommended package manager)
- **Git**
- **Docker** (optional, for containerized development)
## Setting Up the Development Environment
### 1. Clone the Repository
```bash
git clone https://github.com/your-username/mcphub.git
cd mcphub
```
### 2. Install Dependencies
```bash
pnpm install
```
### 3. Environment Configuration
Create a `.env` file in the root directory:
```bash
cp .env.example .env
```
Configure the following environment variables:
```env
# Server Configuration
PORT=3000
NODE_ENV=development
# Database Configuration
DATABASE_URL=postgresql://username:password@localhost:5432/mcphub
# JWT Configuration
JWT_SECRET=your-secret-key
JWT_EXPIRES_IN=24h
# OpenAI Configuration (for smart routing)
OPENAI_API_KEY=your-openai-api-key
```
### 4. Database Setup
If using PostgreSQL, create a database:
```bash
createdb mcphub
```
### 5. MCP Server Configuration
Create or modify `mcp_settings.json`:
```json
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
}
```
## Development Workflow
### Running the Development Server
Start both backend and frontend in development mode:
```bash
pnpm dev
```
This will start:
- Backend server on `http://localhost:3000`
- Frontend development server on `http://localhost:5173`
### Running Backend Only
```bash
pnpm backend:dev
```
### Running Frontend Only
```bash
pnpm frontend:dev
```
### Building the Project
Build both backend and frontend:
```bash
pnpm build
```
## Project Structure
```
mcphub/
├── src/ # Backend source code
│ ├── controllers/ # Express controllers
│ ├── routes/ # API routes
│ ├── services/ # Business logic
│ ├── models/ # Database models
│ └── utils/ # Utility functions
├── frontend/ # Frontend React application
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── pages/ # Page components
│ │ ├── services/ # API services
│ │ └── utils/ # Frontend utilities
├── docs/ # Documentation
├── bin/ # CLI scripts
└── scripts/ # Build and utility scripts
```
## Development Tools
### Linting and Formatting
```bash
# Run ESLint
pnpm lint
# Format code with Prettier
pnpm format
```
### Testing
```bash
# Run tests
pnpm test
# Run tests in watch mode
pnpm test --watch
```
### Debugging
To debug the backend with Node.js inspector:
```bash
pnpm backend:debug
```
Then attach your debugger to `http://localhost:9229`.
## Making Changes
### Backend Development
1. **Controllers**: Handle HTTP requests and responses
2. **Services**: Implement business logic
3. **Models**: Define database schemas
4. **Routes**: Define API endpoints
### Frontend Development
1. **Components**: Reusable React components
2. **Pages**: Route-specific components
3. **Services**: API communication
4. **Hooks**: Custom React hooks
### Adding New MCP Servers
1. Update `mcp_settings.json` with the new server configuration
2. Test the server integration
3. Update documentation if needed
## Common Development Tasks
### Adding a New API Endpoint
1. Create a controller in `src/controllers/`
2. Define the route in `src/routes/`
3. Add any necessary middleware
4. Write tests for the new endpoint
### Adding a New Frontend Feature
1. Create components in `frontend/src/components/`
2. Add routes if needed
3. Implement API integration
4. Style with Tailwind CSS
### Database Migrations
When modifying database schemas:
1. Update models in `src/models/`
2. Create migration scripts if using TypeORM
3. Test migrations locally
## Troubleshooting
### Common Issues
**Port conflicts**: Ensure ports 3000 and 5173 are available
**Database connection**: Verify PostgreSQL is running and credentials are correct
**MCP server startup**: Check server configurations in `mcp_settings.json`
**Permission issues**: Ensure MCP servers have necessary permissions
### Getting Help
- Check the [Contributing Guide](/development/contributing)
- Review [Architecture Documentation](/development/architecture)
- Open an issue on GitHub for bugs
- Join our community discussions
## Next Steps
- Read the [Architecture Overview](/development/architecture)
- Learn about [Contributing Guidelines](/development/contributing)
- Explore [Configuration Options](/configuration/environment-variables)

View File

@@ -1,78 +1,139 @@
{
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "Mint Starter Kit",
"name": "MCPHub Documentation",
"description": "The Unified Hub for Model Context Protocol (MCP) Servers",
"colors": {
"primary": "#16A34A",
"light": "#07C983",
"dark": "#15803D"
},
"favicon": "/favicon.svg",
"favicon": "/favicon.ico",
"navigation": {
"tabs": [
{
"tab": "Guides",
"tab": "English",
"groups": [
{
"group": "Get Started",
"pages": [
"index",
"quickstart",
"development"
"installation"
]
},
{
"group": "Essentials",
"group": "Core Features",
"pages": [
"essentials/markdown",
"essentials/code",
"essentials/images",
"essentials/settings",
"essentials/navigation",
"essentials/reusable-snippets"
"features/server-management",
"features/group-management",
"features/smart-routing"
]
},
{
"group": "Configuration",
"pages": [
"configuration/mcp-settings",
"configuration/environment-variables",
"configuration/docker-setup",
"configuration/nginx"
]
}
]
},
{
"tab": "API Reference",
"tab": "中文",
"groups": [
{
"group": "API Documentation",
"group": "开始使用",
"pages": [
"api-reference/introduction"
"zh/index",
"zh/quickstart",
"zh/installation"
]
},
{
"group": "Endpoint Examples",
"group": "核心功能",
"pages": [
"api-reference/endpoint/get",
"api-reference/endpoint/create",
"api-reference/endpoint/delete",
"api-reference/endpoint/webhook"
"zh/features/server-management",
"zh/features/group-management",
"zh/features/smart-routing"
]
},
{
"group": "配置指南",
"pages": [
"zh/configuration/mcp-settings",
"zh/configuration/environment-variables",
"zh/configuration/docker-setup",
"zh/configuration/nginx"
]
}
]
},
{
"tab": "API",
"groups": [
{
"group": "MCP Endpoints",
"pages": [
"api-reference/introduction",
"api-reference/mcp-http",
"api-reference/mcp-sse",
"api-reference/smart-routing"
]
},
{
"group": "OpenAPI Endpoints",
"pages": [
"api-reference/openapi"
]
},
{
"group": "Management Endpoints",
"pages": [
"api-reference/servers",
"api-reference/groups",
"api-reference/auth",
"api-reference/logs",
"api-reference/config"
]
}
]
},
{
"tab": "接口",
"groups": [
{
"group": "MCP 端点",
"pages": [
"zh/api-reference/introduction",
"zh/api-reference/mcp-http",
"zh/api-reference/mcp-sse",
"zh/api-reference/smart-routing"
]
},
{
"group": "OpenAPI 端点",
"pages": [
"zh/api-reference/openapi"
]
},
{
"group": "管理端点",
"pages": [
"zh/api-reference/servers",
"zh/api-reference/groups",
"zh/api-reference/auth",
"zh/api-reference/logs",
"zh/api-reference/config"
]
}
]
}
],
"global": {
"anchors": [
{
"anchor": "Documentation",
"href": "https://mintlify.com/docs",
"icon": "book-open-cover"
},
{
"anchor": "Community",
"href": "https://mintlify.com/community",
"icon": "slack"
},
{
"anchor": "Blog",
"href": "https://mintlify.com/blog",
"icon": "newspaper"
}
]
"anchors": []
}
},
"logo": {
@@ -82,21 +143,20 @@
"navbar": {
"links": [
{
"label": "Support",
"href": "mailto:hi@mintlify.com"
"label": "Demo",
"href": "https://demo.mcphubx.com"
}
],
"primary": {
"type": "button",
"label": "Dashboard",
"href": "https://dashboard.mintlify.com"
"label": "Get Started",
"href": "https://docs.mcphubx.com/quickstart"
}
},
"footer": {
"socials": {
"x": "https://x.com/mintlify",
"github": "https://github.com/mintlify",
"linkedin": "https://linkedin.com/company/mintlify"
"github": "https://github.com/samanhappy/mcphub",
"discord": "https://discord.gg/qMKNsn5Q"
}
}
}

BIN
docs/favicon.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,338 @@
---
title: 'Authentication & Security'
description: 'Configure authentication and security settings for MCPHub'
---
## Overview
MCPHub provides flexible authentication mechanisms to secure your MCP server management platform. The system supports multiple authentication methods and role-based access control.
## Authentication Methods
### Environment-based Authentication
Configure basic authentication using environment variables:
```bash
# Basic auth credentials
AUTH_USERNAME=admin
AUTH_PASSWORD=your-secure-password
# JWT settings
JWT_SECRET=your-jwt-secret-key
JWT_EXPIRES_IN=24h
```
### Database Authentication
For production deployments, enable database-backed user management:
```json
{
"auth": {
"provider": "database",
"database": {
"url": "postgresql://user:pass@localhost:5432/mcphub",
"userTable": "users"
}
}
}
```
## User Management
### Creating Users
Create users via the admin interface or API:
```bash
# Via API
curl -X POST http://localhost:3000/api/auth/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-d '{
"username": "newuser",
"email": "user@example.com",
"password": "securepassword",
"role": "user"
}'
```
### User Roles
MCPHub supports role-based access control:
- **Admin**: Full system access, user management, server configuration
- **Manager**: Server management, group management, monitoring
- **User**: Basic server access within assigned groups
- **Viewer**: Read-only access to assigned resources
## Group-based Access Control
### Assigning Users to Groups
```bash
# Add user to group
curl -X POST http://localhost:3000/api/groups/{groupId}/users \
-H "Authorization: Bearer $TOKEN" \
-d '{"userId": "user123"}'
```
### Group Permissions
Configure group-level permissions:
```json
{
"groupId": "dev-team",
"permissions": {
"servers": ["read", "write", "execute"],
"tools": ["read", "execute"],
"logs": ["read"],
"config": ["read"]
}
}
```
## API Authentication
### JWT Token Authentication
```javascript
// Login to get token
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username: 'your-username',
password: 'your-password',
}),
});
const { token } = await response.json();
// Use token for authenticated requests
const serversResponse = await fetch('/api/servers', {
headers: { Authorization: `Bearer ${token}` },
});
```
### API Key Authentication
For service-to-service communication:
```bash
# Generate API key
curl -X POST http://localhost:3000/api/auth/api-keys \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-d '{
"name": "my-service",
"permissions": ["servers:read", "tools:execute"]
}'
# Use API key
curl -H "X-API-Key: your-api-key" \
http://localhost:3000/api/servers
```
## Security Configuration
### HTTPS Setup
Configure HTTPS for production:
```yaml
# docker-compose.yml
services:
mcphub:
environment:
- HTTPS_ENABLED=true
- SSL_CERT_PATH=/certs/cert.pem
- SSL_KEY_PATH=/certs/key.pem
volumes:
- ./certs:/certs:ro
```
### CORS Configuration
Configure CORS for web applications:
```json
{
"cors": {
"origin": ["https://your-frontend.com"],
"credentials": true,
"methods": ["GET", "POST", "PUT", "DELETE"]
}
}
```
### Rate Limiting
Protect against abuse with rate limiting:
```json
{
"rateLimit": {
"windowMs": 900000,
"max": 100,
"message": "Too many requests from this IP"
}
}
```
## Session Management
### Session Configuration
```json
{
"session": {
"secret": "your-session-secret",
"cookie": {
"secure": true,
"httpOnly": true,
"maxAge": 86400000
},
"store": "redis",
"redis": {
"host": "localhost",
"port": 6379
}
}
}
```
### Logout and Session Cleanup
```javascript
// Logout endpoint
app.post('/api/auth/logout', (req, res) => {
req.session.destroy();
res.json({ message: 'Logged out successfully' });
});
```
## Security Best Practices
### Password Security
- Use strong password requirements
- Implement password hashing with bcrypt
- Support password reset functionality
- Enable two-factor authentication (2FA)
### Token Security
- Use secure JWT secrets
- Implement token rotation
- Set appropriate expiration times
- Store tokens securely in httpOnly cookies
### Network Security
- Use HTTPS in production
- Implement proper CORS policies
- Enable request validation
- Use security headers (helmet.js)
### Monitoring Security Events
```javascript
// Log security events
const auditLog = {
event: 'login_attempt',
user: username,
ip: req.ip,
userAgent: req.headers['user-agent'],
success: true,
timestamp: new Date(),
};
```
## Troubleshooting
### Common Authentication Issues
**Invalid Credentials**
```bash
# Check user exists and password is correct
curl -X POST http://localhost:3000/api/auth/verify \
-d '{"username": "user", "password": "pass"}'
```
**Token Expiration**
```javascript
// Handle token refresh
if (response.status === 401) {
const newToken = await refreshToken();
// Retry request with new token
}
```
**Permission Denied**
```bash
# Check user permissions
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:3000/api/auth/permissions
```
### Debug Authentication
Enable authentication debugging:
```bash
DEBUG=mcphub:auth npm start
```
## Integration Examples
### Frontend Integration
```javascript
// React authentication hook
const useAuth = () => {
const [user, setUser] = useState(null);
const login = async (credentials) => {
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(credentials),
});
if (response.ok) {
const userData = await response.json();
setUser(userData.user);
return true;
}
return false;
};
return { user, login };
};
```
### Middleware Integration
```javascript
// Express middleware
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
res.status(401).json({ error: 'Invalid token' });
}
};
```

View File

@@ -0,0 +1,578 @@
---
title: 'Group Management'
description: 'Organize servers into logical groups for streamlined access control'
---
## Overview
Group Management in MCPHub allows you to organize your MCP servers into logical collections based on functionality, use case, or access requirements. This enables fine-grained control over which tools are available to different AI clients and users.
## Core Concepts
### What are Groups?
Groups are named collections of MCP servers that can be accessed through dedicated endpoints. Instead of connecting to all servers at once, AI clients can connect to specific groups to access only relevant tools.
### Benefits of Groups
- **Focused Tool Access**: AI clients see only relevant tools for their use case
- **Better Performance**: Reduced tool discovery overhead
- **Enhanced Security**: Limit access to sensitive tools
- **Improved Organization**: Logical separation of functionality
- **Simplified Management**: Easier to manage related servers together
## Creating Groups
### Via Dashboard
1. **Navigate to Groups Section**: Click "Groups" in the main navigation
2. **Click "Create Group"**: Start the group creation process
3. **Fill Group Details**:
- **Name**: Unique identifier for the group
4. **Add Servers**: Select servers to include in the group
### Via API
Create groups programmatically:
```bash
curl -X POST http://localhost:3000/api/groups \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "web-automation",
"servers": ["playwright", "fetch"]
}'
```
{/* ### Via Configuration File
Define groups in your `mcp_settings.json`:
```json
{
"mcpServers": {
"fetch": { "command": "uvx", "args": ["mcp-server-fetch"] },
"playwright": { "command": "npx", "args": ["@playwright/mcp@latest"] },
"slack": { "command": "npx", "args": ["@modelcontextprotocol/server-slack"] }
},
"groups": {
"web-tools": {
"name": "web",
"servers": ["fetch", "playwright"],
},
"communication": {
"name": "communication",
"servers": ["slack"],
}
}
}
``` */}
## Group Types and Use Cases
<AccordionGroup>
<Accordion title="Web Automation Group">
**Purpose**: Browser automation and web scraping
**Servers**:
- `playwright`: Browser automation
- `fetch`: HTTP requests and web scraping
- `selenium`: Alternative browser automation
**Use Cases**:
- Automated testing
- Data collection
- Web monitoring
- Content analysis
**Endpoint**: `http://localhost:3000/mcp/web-automation`
</Accordion>
<Accordion title="Data Processing Group">
**Purpose**: Data manipulation and analysis
**Servers**:
- `sqlite`: Database operations
- `filesystem`: File operations
- `spreadsheet`: Excel/CSV processing
**Use Cases**:
- Data analysis
- Report generation
- File processing
- Database queries
**Endpoint**: `http://localhost:3000/mcp/data-processing`
</Accordion>
<Accordion title="Communication Group">
**Purpose**: Messaging and collaboration
**Servers**:
- `slack`: Slack integration
- `discord`: Discord bot
- `email`: Email sending
- `sms`: SMS notifications
**Use Cases**:
- Team notifications
- Customer communication
- Alert systems
- Social media management
**Endpoint**: `http://localhost:3000/mcp/communication`
</Accordion>
<Accordion title="Development Group">
**Purpose**: Software development tools
**Servers**:
- `github`: GitHub operations
- `gitlab`: GitLab integration
- `docker`: Container management
- `kubernetes`: K8s operations
**Use Cases**:
- Code deployment
- Repository management
- CI/CD operations
- Infrastructure management
**Endpoint**: `http://localhost:3000/mcp/development`
</Accordion>
<Accordion title="AI/ML Group">
**Purpose**: Machine learning and AI tools
**Servers**:
- `openai`: OpenAI API integration
- `huggingface`: Hugging Face models
- `vector-db`: Vector database operations
**Use Cases**:
- Model inference
- Data embeddings
- Natural language processing
- Computer vision
**Endpoint**: `http://localhost:3000/mcp/ai-ml`
</Accordion>
</AccordionGroup>
{/* ## Group Access Control
### Access Levels
<Tabs>
<Tab title="Public">
**Public Groups**:
- Accessible to all authenticated users
- No additional permissions required
- Visible in group listings
- Default access level
```json
{
"name": "public-tools",
"accessLevel": "public",
"servers": ["fetch", "calculator"]
}
```
</Tab>
<Tab title="Private">
**Private Groups**:
- Only visible to group members
- Requires explicit user assignment
- Hidden from public listings
- Admin-controlled membership
```json
{
"name": "internal-tools",
"accessLevel": "private",
"members": ["user1", "user2"],
"servers": ["internal-api", "database"]
}
```
</Tab>
<Tab title="Restricted">
**Restricted Groups**:
- Role-based access control
- Requires specific permissions
- Audit logging enabled
- Time-limited access
```json
{
"name": "admin-tools",
"accessLevel": "restricted",
"requiredRoles": ["admin", "operator"],
"servers": ["system-control", "user-management"]
}
```
</Tab>
</Tabs>
### User Management
Assign users to groups:
```bash
# Add user to group
curl -X POST http://localhost:3000/api/groups/web-tools/members \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{"userId": "user123"}'
# Remove user from group
curl -X DELETE http://localhost:3000/api/groups/web-tools/members/user123 \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# List group members
curl http://localhost:3000/api/groups/web-tools/members \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
``` */}
## Group Endpoints
### Accessing Groups
Each group gets its own MCP endpoint:
<Tabs>
<Tab title="HTTP MCP">
```
http://localhost:3000/mcp/{group-name}
```
Examples:
- `http://localhost:3000/mcp/web-tools`
- `http://localhost:3000/mcp/data-processing`
- `http://localhost:3000/mcp/communication`
</Tab>
<Tab title="SSE (Legacy)">
```
http://localhost:3000/sse/{group-name}
```
Examples:
- `http://localhost:3000/sse/web-tools`
- `http://localhost:3000/sse/data-processing`
- `http://localhost:3000/sse/communication`
</Tab>
</Tabs>
### Group Tool Discovery
When connecting to a group endpoint, AI clients will only see tools from servers within that group:
```bash
# List tools in web-tools group
curl -X POST http://localhost:3000/mcp/web-tools \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
```
Response will only include tools from `fetch` and `playwright` servers.
## Dynamic Group Management
### Adding Servers to Groups
<Tabs>
<Tab title="Dashboard">
1. Navigate to the group in the dashboard
2. Click "Manage Servers"
3. Select additional servers to add
4. Click "Save Changes"
</Tab>
<Tab title="API">
```bash
curl -X POST http://localhost:3000/api/groups/web-tools/servers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{"serverId": "new-server"}'
```
</Tab>
</Tabs>
### Removing Servers from Groups
<Tabs>
<Tab title="Dashboard">
1. Navigate to the group in the dashboard
2. Click "Manage Servers"
3. Unselect servers to remove
4. Click "Save Changes"
</Tab>
<Tab title="API">
```bash
curl -X DELETE http://localhost:3000/api/groups/web-tools/servers/server-name \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
</Tab>
</Tabs>
{/* ### Batch Server Updates
Update multiple servers at once:
```bash
curl -X PUT http://localhost:3000/api/groups/web-tools/servers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"servers": ["fetch", "playwright", "selenium"]
}'
``` */}
{/* ## Group Monitoring
### Group Status
Monitor group health and activity:
```bash
# Get group status
curl http://localhost:3000/api/groups/web-tools/status \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
Response includes:
- Number of active servers
- Tool count
- Active connections
- Recent activity
### Group Analytics
Track group usage:
```bash
# Get group analytics
curl http://localhost:3000/api/groups/web-tools/analytics \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
Metrics include:
- Request count by tool
- Response times
- Error rates
- User activity */}
{/* ## Advanced Group Features
### Nested Groups
Create hierarchical group structures:
```json
{
"groups": {
"development": {
"displayName": "Development Tools",
"subGroups": ["frontend-dev", "backend-dev", "devops"]
},
"frontend-dev": {
"displayName": "Frontend Development",
"servers": ["playwright", "webpack-server"],
"parent": "development"
},
"backend-dev": {
"displayName": "Backend Development",
"servers": ["database", "api-server"],
"parent": "development"
}
}
}
```
### Group Templates
Use templates for quick group creation:
```json
{
"groupTemplates": {
"web-project": {
"description": "Standard web project toolset",
"servers": ["fetch", "playwright", "filesystem"],
"accessLevel": "public"
},
"data-science": {
"description": "Data science and ML tools",
"servers": ["python-tools", "jupyter", "vector-db"],
"accessLevel": "private"
}
}
}
```
Apply template:
```bash
curl -X POST http://localhost:3000/api/groups/from-template \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "my-web-project",
"template": "web-project",
"displayName": "My Web Project Tools"
}'
```
### Group Policies
Define policies for group behavior:
```json
{
"groupPolicies": {
"web-tools": {
"maxConcurrentConnections": 10,
"requestTimeout": 30000,
"rateLimiting": {
"requestsPerMinute": 100,
"burstLimit": 20
},
"allowedOrigins": ["localhost", "myapp.com"]
}
}
}
``` */}
## Best Practices
### Group Organization
<Tip>
**Organize by Use Case**: Group servers based on what users want to accomplish, not just technical
similarity.
</Tip>
<Tip>
**Keep Groups Focused**: Avoid creating groups with too many diverse tools. Smaller, focused
groups are more useful.
</Tip>
<Tip>
**Use Descriptive Names**: Choose names that clearly indicate the group's purpose and contents.
</Tip>
{/* ### Security Considerations
<Warning>
**Principle of Least Privilege**: Only give users access to groups they actually need.
</Warning>
<Warning>
**Sensitive Tool Isolation**: Keep sensitive tools in restricted groups with proper access
controls.
</Warning>
<Warning>
**Regular Access Reviews**: Periodically review group memberships and remove unnecessary access.
</Warning> */}
### Performance Optimization
<Info>
**Balance Group Size**: Very large groups may have slower tool discovery. Consider splitting into
smaller groups.
</Info>
<Info>
**Monitor Usage**: Use analytics to identify which groups are heavily used and optimize
accordingly.
</Info>
## Troubleshooting
<AccordionGroup>
<Accordion title="Group Not Accessible">
**Check:**
- User has proper permissions
- Group exists and is active
- Servers in group are running
- Network connectivity
**Solutions:**
1. Verify user group membership
2. Check group configuration
3. Test individual server connections
4. Review access logs
</Accordion>
<Accordion title="Tools Missing from Group">
**Possible causes:**
- Server not properly added to group
- Server is not running
- Tool discovery failed
- Caching issues
**Debug steps:**
1. Verify server is in group configuration
2. Check server status
3. Force refresh tool discovery
4. Clear group cache
</Accordion>
<Accordion title="Group Performance Issues">
**Common issues:**
- Too many servers in group
- Slow server responses
- Network latency
- Resource constraints
**Optimizations:**
1. Split large groups
2. Monitor server performance
3. Implement request caching
4. Use connection pooling
</Accordion>
</AccordionGroup>
## Next Steps
<CardGroup cols={2}>
<Card title="Smart Routing" icon="route" href="/features/smart-routing">
AI-powered tool discovery across groups
</Card>
<Card title="Authentication" icon="shield" href="/features/authentication">
User management and access control
</Card>
<Card title="API Reference" icon="code" href="/api-reference/groups">
Complete group management API
</Card>
<Card title="Configuration" icon="cog" href="/configuration/mcp-settings">
Advanced group configuration options
</Card>
</CardGroup>

View File

@@ -0,0 +1,526 @@
---
title: 'Monitoring & Logging'
description: 'Monitor your MCP servers and analyze system logs with MCPHub'
---
## Overview
MCPHub provides comprehensive monitoring and logging capabilities to help you track server performance, debug issues, and maintain system health.
## Real-time Monitoring
### Server Status Dashboard
The MCPHub dashboard provides real-time monitoring of all registered MCP servers:
- **Server Health**: Online/offline status with automatic health checks
- **Response Times**: Average, min, max response times per server
- **Request Volume**: Requests per second/minute/hour
- **Error Rates**: Success/failure ratios and error trends
- **Resource Usage**: Memory and CPU utilization (when available)
### Health Check Configuration
Configure health checks for your MCP servers:
```json
{
"healthCheck": {
"enabled": true,
"interval": 30000,
"timeout": 5000,
"retries": 3,
"endpoints": {
"ping": "/health",
"tools": "/tools/list"
}
}
}
```
### Monitoring API
Get monitoring data programmatically:
```bash
# Get server health status
curl http://localhost:3000/api/monitoring/health
# Get performance metrics
curl http://localhost:3000/api/monitoring/metrics?server=my-server&range=1h
# Get system overview
curl http://localhost:3000/api/monitoring/overview
```
## Logging System
### Log Levels
MCPHub supports standard log levels:
- **ERROR**: Critical errors requiring immediate attention
- **WARN**: Warning conditions that should be monitored
- **INFO**: General operational messages
- **DEBUG**: Detailed debugging information
- **TRACE**: Very detailed trace information
### Log Configuration
Configure logging in your environment:
```bash
# Set log level
LOG_LEVEL=info
# Enable structured logging
LOG_FORMAT=json
# Log file location
LOG_FILE=/var/log/mcphub/app.log
# Enable request logging
ENABLE_REQUEST_LOGS=true
```
### Structured Logging
MCPHub uses structured logging for better analysis:
```json
{
"timestamp": "2024-01-20T10:30:00Z",
"level": "info",
"message": "MCP server request completed",
"server": "github-mcp",
"tool": "search_repositories",
"duration": 245,
"status": "success",
"requestId": "req_123456",
"userId": "user_789"
}
```
## Log Management
### Log Storage Options
#### File-based Logging
```yaml
# docker-compose.yml
services:
mcphub:
volumes:
- ./logs:/app/logs
environment:
- LOG_FILE=/app/logs/mcphub.log
- LOG_ROTATION=daily
- LOG_MAX_SIZE=100MB
- LOG_MAX_FILES=7
```
#### Database Logging
```json
{
"logging": {
"database": {
"enabled": true,
"table": "logs",
"retention": "30d",
"indexes": ["timestamp", "level", "server"]
}
}
}
```
#### External Log Services
```bash
# Syslog integration
SYSLOG_ENABLED=true
SYSLOG_HOST=localhost
SYSLOG_PORT=514
SYSLOG_FACILITY=local0
# ELK Stack integration
ELASTICSEARCH_URL=http://localhost:9200
ELASTICSEARCH_INDEX=mcphub-logs
```
### Log Rotation
Automatic log rotation configuration:
```json
{
"logRotation": {
"enabled": true,
"maxSize": "100MB",
"maxFiles": 10,
"compress": true,
"interval": "daily"
}
}
```
## Metrics Collection
### System Metrics
MCPHub collects various system metrics:
```javascript
// Example metrics collected
{
"timestamp": "2024-01-20T10:30:00Z",
"metrics": {
"requests": {
"total": 1547,
"success": 1523,
"errors": 24,
"rate": 12.5
},
"servers": {
"online": 8,
"offline": 2,
"total": 10
},
"performance": {
"avgResponseTime": 156,
"p95ResponseTime": 324,
"p99ResponseTime": 567
},
"system": {
"memoryUsage": "245MB",
"cpuUsage": "15%",
"uptime": "72h 35m"
}
}
}
```
### Custom Metrics
Add custom metrics for your use case:
```javascript
// Custom metric example
const customMetric = {
name: 'tool_usage',
type: 'counter',
tags: {
server: 'github-mcp',
tool: 'search_repositories',
result: 'success',
},
value: 1,
};
// Send to metrics endpoint
await fetch('/api/monitoring/metrics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(customMetric),
});
```
## Alerting
### Alert Configuration
Set up alerts for critical conditions:
```json
{
"alerts": {
"serverDown": {
"condition": "server.status == 'offline'",
"duration": "5m",
"severity": "critical",
"channels": ["email", "slack"]
},
"highErrorRate": {
"condition": "errors.rate > 0.1",
"duration": "2m",
"severity": "warning",
"channels": ["slack"]
},
"slowResponse": {
"condition": "response.p95 > 1000",
"duration": "5m",
"severity": "warning",
"channels": ["email"]
}
}
}
```
### Notification Channels
#### Email Notifications
```bash
# Email configuration
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=alerts@yourcompany.com
SMTP_PASS=your-app-password
ALERT_EMAIL_TO=admin@yourcompany.com
```
#### Slack Integration
```bash
# Slack webhook
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
SLACK_CHANNEL=#mcphub-alerts
```
#### Webhook Notifications
```json
{
"webhooks": [
{
"url": "https://your-service.com/webhooks/mcphub",
"events": ["server.down", "error.rate.high"],
"headers": {
"Authorization": "Bearer your-token"
}
}
]
}
```
## Log Analysis
### Query Logs
Use the logs API to query and analyze logs:
```bash
# Get recent errors
curl "http://localhost:3000/api/logs?level=error&since=1h"
# Search logs by server
curl "http://localhost:3000/api/logs?server=github-mcp&limit=100"
# Get logs for specific request
curl "http://localhost:3000/api/logs?requestId=req_123456"
# Filter by time range
curl "http://localhost:3000/api/logs?from=2024-01-20T00:00:00Z&to=2024-01-20T23:59:59Z"
```
### Log Aggregation
Aggregate logs for insights:
```bash
# Error summary by server
curl "http://localhost:3000/api/logs/aggregate?groupBy=server&level=error&since=24h"
# Request volume over time
curl "http://localhost:3000/api/logs/aggregate?groupBy=hour&type=request&since=7d"
```
## Performance Monitoring
### Response Time Tracking
Monitor MCP server response times:
```javascript
// Response time metrics
{
"server": "github-mcp",
"tool": "search_repositories",
"metrics": {
"calls": 156,
"avgTime": 234,
"minTime": 89,
"maxTime": 1205,
"p50": 201,
"p95": 567,
"p99": 892
}
}
```
### Error Rate Monitoring
Track error rates and patterns:
```bash
# Get error rates by server
curl "http://localhost:3000/api/monitoring/errors?groupBy=server&since=1h"
# Get error details
curl "http://localhost:3000/api/monitoring/errors?server=github-mcp&details=true"
```
## Integration with External Tools
### Prometheus Integration
Export metrics to Prometheus:
```yaml
# prometheus.yml
scrape_configs:
- job_name: 'mcphub'
static_configs:
- targets: ['localhost:3000']
metrics_path: '/api/monitoring/prometheus'
scrape_interval: 30s
```
### Grafana Dashboards
Import MCPHub Grafana dashboard:
```json
{
"dashboard": {
"title": "MCPHub Monitoring",
"panels": [
{
"title": "Server Status",
"type": "stat",
"targets": [
{
"expr": "mcphub_servers_online",
"legendFormat": "Online"
}
]
},
{
"title": "Request Rate",
"type": "graph",
"targets": [
{
"expr": "rate(mcphub_requests_total[5m])",
"legendFormat": "Requests/sec"
}
]
}
]
}
}
```
### ELK Stack Integration
Configure Logstash for log processing:
```ruby
# logstash.conf
input {
beats {
port => 5044
}
}
filter {
if [fields][service] == "mcphub" {
json {
source => "message"
}
date {
match => [ "timestamp", "ISO8601" ]
}
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "mcphub-logs-%{+YYYY.MM.dd}"
}
}
```
## Troubleshooting
### Common Monitoring Issues
**Missing Metrics**
```bash
# Check metrics endpoint
curl http://localhost:3000/api/monitoring/health
# Verify configuration
grep -r "monitoring" /path/to/config/
```
**Log File Issues**
```bash
# Check log file permissions
ls -la /var/log/mcphub/
# Verify disk space
df -h /var/log/
# Check log rotation
logrotate -d /etc/logrotate.d/mcphub
```
**Performance Issues**
```bash
# Monitor system resources
top -p $(pgrep -f mcphub)
# Check database connections
curl http://localhost:3000/api/monitoring/database
# Analyze slow queries
curl http://localhost:3000/api/monitoring/slow-queries
```
### Debug Mode
Enable debug logging for troubleshooting:
```bash
# Enable debug mode
DEBUG=mcphub:* npm start
# Or set environment variable
export DEBUG=mcphub:monitoring,mcphub:logging
```
## Best Practices
### Log Management
- Use structured logging with consistent formats
- Implement proper log levels and filtering
- Set up log rotation and retention policies
- Monitor log file sizes and disk usage
### Monitoring Setup
- Configure appropriate health check intervals
- Set up alerts for critical conditions
- Monitor both system and application metrics
- Use dashboards for visual monitoring
### Performance Optimization
- Index log database tables appropriately
- Use log sampling for high-volume scenarios
- Implement proper caching for metrics
- Regular cleanup of old logs and metrics
### Security Considerations
- Sanitize sensitive data in logs
- Secure access to monitoring endpoints
- Use authentication for external integrations
- Encrypt log transmission when using external services

View File

@@ -0,0 +1,509 @@
---
title: 'Server Management'
description: 'Centrally manage multiple MCP servers with hot-swappable configuration'
---
## Overview
MCPHub's server management system allows you to centrally configure, monitor, and control multiple MCP (Model Context Protocol) servers from a single dashboard. All changes are applied in real-time without requiring server restarts.
## Adding MCP Servers
### Via Dashboard
1. **Access the Dashboard**: Navigate to `http://localhost:3000` and log in
2. **Click "Add Server"**: Located in the servers section
3. **Fill Server Details**:
- **Name**: Unique identifier for the server
- **Command**: Executable command (e.g., `npx`, `uvx`, `python`)
- **Arguments**: Array of command arguments
- **Environment Variables**: Key-value pairs for environment setup
- **Working Directory**: Optional working directory for the command
### Via Configuration File
Edit your `mcp_settings.json` file:
```json
{
"mcpServers": {
"server-name": {
"command": "command-to-run",
"args": ["arg1", "arg2"],
"env": {
"API_KEY": "your-api-key",
"CONFIG_VALUE": "some-value"
},
"cwd": "/optional/working/directory"
}
}
}
```
### Via API
Use the REST API to add servers programmatically:
```bash
curl -X POST http://localhost:3000/api/servers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "fetch-server",
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {}
}'
```
## Popular MCP Server Examples
<AccordionGroup>
<Accordion title="Web Fetch Server">
Provides web scraping and HTTP request capabilities:
```json
{
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
```
**Available Tools:**
- `fetch`: Make HTTP requests
- `fetch_html`: Scrape web pages
- `fetch_json`: Get JSON data from APIs
</Accordion>
<Accordion title="Playwright Browser Automation">
Browser automation for web interactions:
```json
{
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
```
**Available Tools:**
- `playwright_navigate`: Navigate to web pages
- `playwright_screenshot`: Take screenshots
- `playwright_click`: Click elements
- `playwright_fill`: Fill forms
</Accordion>
<Accordion title="File System Operations">
File and directory management:
```json
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
}
}
```
**Available Tools:**
- `read_file`: Read file contents
- `write_file`: Write to files
- `create_directory`: Create directories
- `list_directory`: List directory contents
</Accordion>
<Accordion title="SQLite Database">
Database operations:
```json
{
"sqlite": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite", "/path/to/database.db"]
}
}
```
**Available Tools:**
- `execute_query`: Execute SQL queries
- `describe_tables`: Get table schemas
- `create_table`: Create new tables
</Accordion>
<Accordion title="Slack Integration">
Slack workspace integration:
```json
{
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-bot-token",
"SLACK_TEAM_ID": "T1234567890"
}
}
}
```
**Available Tools:**
- `send_slack_message`: Send messages to channels
- `list_slack_channels`: List available channels
- `get_slack_thread`: Get thread messages
</Accordion>
<Accordion title="GitHub Integration">
GitHub repository operations:
```json
{
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_your_token"
}
}
}
```
**Available Tools:**
- `create_or_update_file`: Create/update repository files
- `search_repositories`: Search GitHub repositories
- `create_issue`: Create issues
- `create_pull_request`: Create pull requests
</Accordion>
<Accordion title="Google Drive">
Google Drive file operations:
```json
{
"gdrive": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-gdrive"],
"env": {
"GDRIVE_CLIENT_ID": "your-client-id",
"GDRIVE_CLIENT_SECRET": "your-client-secret",
"GDRIVE_REDIRECT_URI": "your-redirect-uri"
}
}
}
```
**Available Tools:**
- `gdrive_search`: Search files and folders
- `gdrive_read`: Read file contents
- `gdrive_create`: Create new files
</Accordion>
<Accordion title="Amap Maps (China)">
Chinese mapping and location services:
```json
{
"amap": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "your-api-key"
}
}
}
```
**Available Tools:**
- `search_location`: Search for locations
- `get_directions`: Get route directions
- `reverse_geocode`: Convert coordinates to addresses
</Accordion>
</AccordionGroup>
## Server Lifecycle Management
### Starting Servers
Servers are automatically started when:
- MCPHub boots up
- A server is added via the dashboard or API
- A server configuration is updated
- A stopped server is manually restarted
### Stopping Servers
You can stop servers:
- **Via Dashboard**: Toggle the server status switch
- **Via API**: Send a POST request to `/api/servers/{name}/toggle`
- **Automatically**: Servers stop if they crash or encounter errors
### Restarting Servers
Servers are automatically restarted:
- When configuration changes are made
- After environment variable updates
- When manually triggered via dashboard or API
## Server Status Monitoring
### Status Indicators
Each server displays a status indicator:
- 🟢 **Running**: Server is active and responding
- 🟡 **Starting**: Server is initializing
- 🔴 **Stopped**: Server is not running
- ⚠️ **Error**: Server encountered an error
### Real-time Logs
View server logs in real-time:
1. **Dashboard Logs**: Click on a server to view its logs
2. **API Logs**: Access logs via `/api/logs` endpoint
3. **Streaming Logs**: Subscribe to log streams via WebSocket
### Health Checks
MCPHub automatically performs health checks:
- **Initialization Check**: Verifies server starts successfully
- **Tool Discovery**: Confirms available tools are detected
- **Response Check**: Tests server responsiveness
- **Resource Monitoring**: Tracks CPU and memory usage
## Configuration Management
### Environment Variables
Servers can use environment variables for configuration:
```json
{
"server-name": {
"command": "python",
"args": ["server.py"],
"env": {
"API_KEY": "${YOUR_API_KEY}",
"DEBUG": "true",
"MAX_CONNECTIONS": "10"
}
}
}
```
**Environment Variable Expansion:**
- `${VAR_NAME}`: Expands to environment variable value
- `${VAR_NAME:-default}`: Uses default if variable not set
- `${VAR_NAME:+value}`: Uses value if variable is set
{/* ### Working Directory
Set the working directory for server execution:
```json
{
"server-name": {
"command": "./local-script.sh",
"args": [],
"cwd": "/path/to/server/directory"
}
}
``` */}
### Command Variations
Different ways to specify server commands:
<Tabs>
<Tab title="npm/npx">
```json
{
"npm-server": {
"command": "npx",
"args": ["-y", "package-name", "--option", "value"]
}
}
```
</Tab>
<Tab title="Python/uvx">
```json
{
"python-server": {
"command": "uvx",
"args": ["package-name", "--config", "config.json"]
}
}
```
</Tab>
{/* <Tab title="Direct Python">
```json
{
"direct-python": {
"command": "python",
"args": ["-m", "module_name", "--arg", "value"]
}
}
```
</Tab>
<Tab title="Local Script">
```json
{
"local-script": {
"command": "./server.sh",
"args": ["--port", "8080"],
"cwd": "/path/to/script"
}
}
```
</Tab> */}
</Tabs>
## Advanced Features
### Hot Reloading
MCPHub supports hot reloading of server configurations:
{/* 1. **Config File Changes**: Automatically detects changes to `mcp_settings.json` */}
1. **Dashboard Updates**: Immediately applies changes made through the web interface
2. **API Updates**: Real-time updates via REST API calls
3. **Zero Downtime**: Graceful server restarts without affecting other servers
{/* ### Resource Limits
Control server resource usage:
```json
{
"resource-limited-server": {
"command": "memory-intensive-server",
"args": [],
"limits": {
"memory": "512MB",
"cpu": "50%",
"timeout": "30s"
}
}
}
``` */}
{/* ### Dependency Management
Handle server dependencies:
<AccordionGroup>
<Accordion title="Auto-installation">
MCPHub can automatically install missing packages:
```json
{
"auto-install-server": {
"command": "npx",
"args": ["-y", "package-that-might-not-exist"],
"autoInstall": true
}
}
```
</Accordion>
<Accordion title="Pre-installation Scripts">
Run setup scripts before starting servers:
```json
{
"setup-server": {
"preStart": ["npm install", "pip install -r requirements.txt"],
"command": "python",
"args": ["server.py"]
}
}
```
</Accordion>
</AccordionGroup> */}
## Troubleshooting
<AccordionGroup>
<Accordion title="Server Won't Start">
**Check the following:**
- Command is available in PATH
- All required environment variables are set
- Working directory exists and is accessible
- Network ports are not blocked
- Dependencies are installed
**Debug steps:**
1. Check server logs in the dashboard
2. Test command manually in terminal
3. Verify environment variable expansion
4. Check file permissions
</Accordion>
<Accordion title="Server Keeps Crashing">
**Common causes:**
- Invalid configuration parameters
- Missing API keys or credentials
- Resource limits exceeded
- Dependency conflicts
**Solutions:**
1. Review server logs for error messages
2. Test with minimal configuration
3. Verify all credentials and API keys
4. Check system resource availability
</Accordion>
<Accordion title="Tools Not Appearing">
**Possible issues:**
- Server not fully initialized
- Tool discovery timeout
- Communication protocol mismatch
- Server reporting errors
**Debug steps:**
1. Wait for server initialization to complete
2. Check server logs for tool registration messages
3. Test direct communication with server
4. Verify MCP protocol compatibility
</Accordion>
</AccordionGroup>
## Next Steps
<CardGroup cols={2}>
<Card title="Group Management" icon="users" href="/features/group-management">
Organize servers into logical groups
</Card>
<Card title="Smart Routing" icon="route" href="/features/smart-routing">
Set up AI-powered tool discovery
</Card>
<Card title="API Reference" icon="code" href="/api-reference/servers">
Server management API documentation
</Card>
<Card title="Configuration Guide" icon="cog" href="/configuration/mcp-settings">
Detailed configuration options
</Card>
</CardGroup>

View File

@@ -0,0 +1,720 @@
---
title: 'Smart Routing'
description: 'AI-powered tool discovery using vector semantic search'
---
## Overview
Smart Routing is MCPHub's intelligent tool discovery system that uses vector semantic search to automatically find the most relevant tools for any given task. Instead of manually specifying which tools to use, AI clients can describe what they want to accomplish, and Smart Routing will identify and provide access to the most appropriate tools.
## How Smart Routing Works
### 1. Tool Indexing
When servers start up, Smart Routing automatically:
- Discovers all available tools from MCP servers
- Extracts tool metadata (names, descriptions, parameters)
- Converts tool information to vector embeddings
- Stores embeddings in PostgreSQL with pgvector
### 2. Semantic Search
When a query is made:
- User queries are converted to vector embeddings
- Similarity search finds matching tools using cosine similarity
- Dynamic thresholds filter out irrelevant results
- Results are ranked by relevance score
### 3. Intelligent Filtering
Smart Routing applies several filters:
- **Relevance Threshold**: Only returns tools above similarity threshold
- **Context Awareness**: Considers conversation context
- **Tool Availability**: Ensures tools are currently accessible
- **Permission Filtering**: Respects user access permissions
### 4. Tool Execution
Found tools can be directly executed:
- Parameter validation ensures correct tool usage
- Error handling provides helpful feedback
- Response formatting maintains consistency
- Logging tracks tool usage for analytics
## Prerequisites
Smart Routing requires additional setup compared to basic MCPHub usage:
### Required Components
1. **PostgreSQL with pgvector**: Vector database for embeddings storage
2. **Embedding Service**: OpenAI API or compatible service
3. **Environment Configuration**: Proper configuration variables
{/* ### Quick Setup
<Tabs>
<Tab title="Docker Compose">
Use this `docker-compose.yml` for complete setup:
```yaml
version: '3.8'
services:
mcphub:
image: samanhappy/mcphub:latest
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://mcphub:password@postgres:5432/mcphub
- OPENAI_API_KEY=your_openai_api_key
- ENABLE_SMART_ROUTING=true
depends_on:
- postgres
volumes:
- ./mcp_settings.json:/app/mcp_settings.json
postgres:
image: pgvector/pgvector:pg16
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
```
Start with:
```bash
docker-compose up -d
```
</Tab>
<Tab title="Manual Setup">
1. **Install PostgreSQL with pgvector**:
```bash
# Using Docker
docker run -d \
--name mcphub-postgres \
-e POSTGRES_DB=mcphub \
-e POSTGRES_USER=mcphub \
-e POSTGRES_PASSWORD=your_password \
-p 5432:5432 \
pgvector/pgvector:pg16
```
2. **Set Environment Variables**:
```bash
export DATABASE_URL="postgresql://mcphub:your_password@localhost:5432/mcphub"
export OPENAI_API_KEY="your_openai_api_key"
export ENABLE_SMART_ROUTING="true"
```
3. **Start MCPHub**:
```bash
mcphub
```
</Tab>
<Tab title="Kubernetes">
Deploy with these Kubernetes manifests:
```yaml
# postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: pgvector/pgvector:pg16
env:
- name: POSTGRES_DB
value: mcphub
- name: POSTGRES_USER
value: mcphub
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
ports:
- containerPort: 5432
---
# mcphub-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcphub
spec:
selector:
matchLabels:
app: mcphub
template:
metadata:
labels:
app: mcphub
spec:
containers:
- name: mcphub
image: samanhappy/mcphub:latest
env:
- name: DATABASE_URL
value: "postgresql://mcphub:password@postgres:5432/mcphub"
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: openai-secret
key: api-key
- name: ENABLE_SMART_ROUTING
value: "true"
ports:
- containerPort: 3000
```
</Tab>
</Tabs>
## Configuration
### Environment Variables
Configure Smart Routing with these environment variables:
```bash
# Required
DATABASE_URL=postgresql://user:password@host:5432/database
OPENAI_API_KEY=your_openai_api_key
# Optional
ENABLE_SMART_ROUTING=true
EMBEDDING_MODEL=text-embedding-3-small
SIMILARITY_THRESHOLD=0.7
MAX_TOOLS_RETURNED=10
EMBEDDING_BATCH_SIZE=100
```
### Configuration Options
<AccordionGroup>
<Accordion title="Database Configuration">
```bash
# Full PostgreSQL connection string
DATABASE_URL=postgresql://username:password@host:port/database?schema=public
# SSL configuration for cloud databases
DATABASE_URL=postgresql://user:pass@host:5432/db?sslmode=require
# Connection pool settings
DATABASE_POOL_SIZE=20
DATABASE_TIMEOUT=30000
```
</Accordion>
<Accordion title="Embedding Service">
```bash
# OpenAI (default)
OPENAI_API_KEY=sk-your-api-key
EMBEDDING_MODEL=text-embedding-3-small
# Azure OpenAI
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
AZURE_OPENAI_API_KEY=your-api-key
AZURE_OPENAI_DEPLOYMENT=your-embedding-deployment
# Custom embedding service
EMBEDDING_SERVICE_URL=https://your-embedding-service.com
EMBEDDING_SERVICE_API_KEY=your-api-key
```
</Accordion>
<Accordion title="Search Parameters">
```bash
# Similarity threshold (0.0 to 1.0)
SIMILARITY_THRESHOLD=0.7
# Maximum tools to return
MAX_TOOLS_RETURNED=10
# Minimum query length for smart routing
MIN_QUERY_LENGTH=5
# Cache TTL for embeddings (seconds)
EMBEDDING_CACHE_TTL=3600
```
</Accordion>
</AccordionGroup> */}
## Using Smart Routing
### Smart Routing Endpoint
Access Smart Routing through the special `$smart` endpoint:
<Tabs>
<Tab title="HTTP MCP">
```
http://localhost:3000/mcp/$smart
```
</Tab>
<Tab title="SSE (Legacy)">
```
http://localhost:3000/sse/$smart
```
</Tab>
</Tabs>
{/* ### Basic Usage
Connect your AI client to the Smart Routing endpoint and make natural language requests:
```bash
# Example: Find tools for web scraping
curl -X POST http://localhost:3000/mcp/$smart \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/search",
"params": {
"query": "scrape website content and extract text"
}
}'
```
Response:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "fetch_html",
"server": "fetch",
"description": "Fetch and parse HTML content from a URL",
"relevanceScore": 0.92,
"parameters": { ... }
},
{
"name": "playwright_navigate",
"server": "playwright",
"description": "Navigate to a web page and extract content",
"relevanceScore": 0.87,
"parameters": { ... }
}
]
}
}
``` */}
{/* ### Advanced Queries
Smart Routing supports various query types:
<AccordionGroup>
<Accordion title="Task-Based Queries">
```bash
# What you want to accomplish
curl -X POST http://localhost:3000/mcp/$smart \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/search",
"params": {
"query": "send a message to a slack channel"
}
}'
```
</Accordion>
<Accordion title="Domain-Specific Queries">
```bash
# Specific domain or technology
curl -X POST http://localhost:3000/mcp/$smart \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/search",
"params": {
"query": "database operations SQL queries"
}
}'
```
</Accordion>
<Accordion title="Action-Oriented Queries">
```bash
# Specific actions
curl -X POST http://localhost:3000/mcp/$smart \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/search",
"params": {
"query": "create file upload to github repository"
}
}'
```
</Accordion>
<Accordion title="Context-Aware Queries">
```bash
# Include context for better results
curl -X POST http://localhost:3000/mcp/$smart \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/search",
"params": {
"query": "automated testing web application",
"context": {
"project": "e-commerce website",
"technologies": ["React", "Node.js"],
"environment": "staging"
}
}
}'
```
</Accordion>
</AccordionGroup> */}
{/* ### Tool Execution
Once Smart Routing finds relevant tools, you can execute them directly:
```bash
# Execute a found tool
curl -X POST http://localhost:3000/mcp/$smart \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "fetch_html",
"arguments": {
"url": "https://example.com"
}
}
}'
``` */}
{/* ## Performance Optimization
### Embedding Cache
Smart Routing caches embeddings to improve performance:
```bash
# Configure cache settings
EMBEDDING_CACHE_TTL=3600 # Cache for 1 hour
EMBEDDING_CACHE_SIZE=10000 # Cache up to 10k embeddings
EMBEDDING_CACHE_CLEANUP=300 # Cleanup every 5 minutes
```
### Batch Processing
Tools are indexed in batches for efficiency:
```bash
# Batch size for embedding generation
EMBEDDING_BATCH_SIZE=100
# Concurrent embedding requests
EMBEDDING_CONCURRENCY=5
# Index update frequency
INDEX_UPDATE_INTERVAL=3600 # Re-index every hour
```
### Database Optimization
Optimize PostgreSQL for vector operations:
```sql
-- Create indexes for better performance
CREATE INDEX ON tool_embeddings USING hnsw (embedding vector_cosine_ops);
-- Adjust PostgreSQL settings
ALTER SYSTEM SET shared_preload_libraries = 'vector';
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
```
## Monitoring and Analytics
### Smart Routing Metrics
Monitor Smart Routing performance:
```bash
# Get Smart Routing statistics
curl http://localhost:3000/api/smart-routing/stats \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
Response includes:
- Query count and frequency
- Average response time
- Embedding cache hit rate
- Most popular tools
- Query patterns
### Tool Usage Analytics
Track which tools are found and used:
```bash
# Get tool usage analytics
curl http://localhost:3000/api/smart-routing/analytics \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
Metrics include:
- Tool discovery rates
- Execution success rates
- User satisfaction scores
- Query-to-execution conversion
### Performance Monitoring
Monitor system performance:
```bash
# Database performance
curl http://localhost:3000/api/smart-routing/db-stats \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# Embedding service status
curl http://localhost:3000/api/smart-routing/embedding-stats \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
## Advanced Features
### Custom Embeddings
Use custom embedding models:
```bash
# Hugging Face models
EMBEDDING_SERVICE=huggingface
HUGGINGFACE_MODEL=sentence-transformers/all-MiniLM-L6-v2
HUGGINGFACE_API_KEY=your_api_key
# Local embedding service
EMBEDDING_SERVICE=local
EMBEDDING_SERVICE_URL=http://localhost:8080/embeddings
```
### Query Enhancement
Enhance queries for better results:
```json
{
"queryEnhancement": {
"enabled": true,
"expandAcronyms": true,
"addSynonyms": true,
"contextualExpansion": true
}
}
```
### Result Filtering
Filter results based on criteria:
```json
{
"resultFiltering": {
"minRelevanceScore": 0.7,
"maxResults": 10,
"preferredServers": ["fetch", "playwright"],
"excludeServers": ["deprecated-server"]
}
}
```
### Feedback Learning
Improve results based on user feedback:
```bash
# Provide feedback on search results
curl -X POST http://localhost:3000/api/smart-routing/feedback \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"queryId": "search-123",
"toolName": "fetch_html",
"rating": 5,
"successful": true,
"comments": "Perfect tool for the task"
}'
``` */}
## Troubleshooting
<AccordionGroup>
<Accordion title="Database Connection Issues">
**Symptoms:**
- Smart Routing not available
- Database connection errors
- Embedding storage failures
**Solutions:**
1. Verify PostgreSQL is running
2. Check DATABASE_URL format
3. Ensure pgvector extension is installed
4. Test connection manually:
```bash
psql $DATABASE_URL -c "SELECT 1;"
```
</Accordion>
<Accordion title="Embedding Service Problems">
**Symptoms:**
- Tool indexing failures
- Query processing errors
- API rate limit errors
**Solutions:**
1. Verify API key validity
2. Check network connectivity
3. Monitor rate limits
4. Test embedding service:
```bash
curl -X POST https://api.openai.com/v1/embeddings \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": "test", "model": "text-embedding-3-small"}'
```
</Accordion>
<Accordion title="Poor Search Results">
**Symptoms:**
- Irrelevant tools returned
- Low relevance scores
- Missing expected tools
**Solutions:**
1. Adjust similarity threshold
2. Re-index tools with better descriptions
3. Use more specific queries
4. Check tool metadata quality
```bash
# Re-index all tools
curl -X POST http://localhost:3000/api/smart-routing/reindex \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
</Accordion>
<Accordion title="Performance Issues">
**Symptoms:**
- Slow query responses
- High database load
- Memory usage spikes
**Solutions:**
1. Optimize database configuration
2. Increase cache sizes
3. Reduce batch sizes
4. Monitor system resources
```bash
# Check system performance
curl http://localhost:3000/api/smart-routing/performance \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
</Accordion>
</AccordionGroup>
## Best Practices
### Query Writing
<Tip>
**Be Descriptive**: Use specific, descriptive language in queries for better tool matching.
</Tip>
<Tip>
**Include Context**: Provide relevant context about your task or domain for more accurate results.
</Tip>
<Tip>**Use Natural Language**: Write queries as you would describe the task to a human.</Tip>
### Tool Descriptions
<Warning>
**Quality Metadata**: Ensure MCP servers provide high-quality tool descriptions and metadata.
</Warning>
<Warning>**Regular Updates**: Keep tool descriptions current as functionality evolves.</Warning>
<Warning>
**Consistent Naming**: Use consistent naming conventions across tools and servers.
</Warning>
### System Maintenance
<Info>**Regular Re-indexing**: Periodically re-index tools to ensure embedding quality.</Info>
<Info>**Monitor Performance**: Track query patterns and optimize based on usage.</Info>
<Info>
**Update Models**: Consider updating to newer embedding models as they become available.
</Info>
## Next Steps
<CardGroup cols={2}>
<Card title="Authentication" icon="shield" href="/features/authentication">
User management and access control
</Card>
<Card title="Monitoring" icon="chart-line" href="/features/monitoring">
System monitoring and analytics
</Card>
<Card title="API Reference" icon="code" href="/api-reference/smart-routing">
Complete Smart Routing API documentation
</Card>
<Card title="Configuration" icon="cog" href="/configuration/environment-variables">
Advanced configuration options
</Card>
</CardGroup>

View File

@@ -1,71 +1,95 @@
---
title: Introduction
description: "Welcome to the home of your new documentation"
title: MCPHub
description: 'The Unified Hub for Model Context Protocol (MCP) Servers'
---
<img
className="block dark:hidden"
src="/images/hero-light.png"
alt="Hero Light"
/>
<img
className="hidden dark:block"
src="/images/hero-dark.png"
alt="Hero Dark"
/>
{/* <img className="block dark:hidden" src="/images/hero-light.png" alt="Hero Light" />
<img className="hidden dark:block" src="/images/hero-dark.png" alt="Hero Dark" /> */}
## Setting up
# Welcome to MCPHub
The first step to world-class documentation is setting up your editing environments.
MCPHub makes it easy to manage and scale multiple MCP (Model Context Protocol) servers by organizing them into flexible Streamable HTTP (SSE) endpoints—supporting access to all servers, individual servers, or logical server groups.
## Key Features
<CardGroup cols={2}>
<Card
title="Edit Your Docs"
icon="pen-to-square"
href="https://mintlify.com/docs/quickstart"
>
Get your docs set up locally for easy development
<Card title="Unified Management" icon="server" href="/features/server-management">
Centrally manage multiple MCP servers with hot-swappable configuration
</Card>
<Card
title="Preview Changes"
icon="image"
href="https://mintlify.com/docs/development"
>
Preview your changes before you push to make sure they're perfect
<Card title="Group Management" icon="users" href="/features/group-management">
Organize servers into logical groups for streamlined access control
</Card>
<Card title="Smart Routing" icon="route" href="/features/smart-routing">
AI-powered tool discovery using vector semantic search
</Card>
<Card title="Real-time Monitoring" icon="chart-line" href="/features/monitoring">
Monitor server status and performance from a unified dashboard
</Card>
</CardGroup>
## Make it yours
## Quick Start
Update your docs to your brand and add valuable content for the best user conversion.
Get MCPHub running in minutes with Docker:
```bash
docker run -p 3000:3000 samanhappy/mcphub
```
Or with custom configuration:
```bash
docker run -p 3000:3000 -v $(pwd)/mcp_settings.json:/app/mcp_settings.json samanhappy/mcphub
```
Access the dashboard at `http://localhost:3000` with default credentials:
- Username: `admin`
- Password: `admin123`
## Core Concepts
### MCP Endpoints
MCPHub provides multiple ways to access your MCP servers:
- **Unified Access**: `http://localhost:3000/mcp` - Access all servers
- **Group Access**: `http://localhost:3000/mcp/{group}` - Access specific groups
- **Server Access**: `http://localhost:3000/mcp/{server}` - Access individual servers
- **Smart Routing**: `http://localhost:3000/mcp/$smart` - AI-powered tool discovery
### Protocol Support
- **HTTP MCP**: Modern streamable HTTP interface (recommended)
- **SSE**: Server-Sent Events for legacy compatibility
- **stdio**: Native MCP protocol for server communication
## Getting Started
<CardGroup cols={2}>
<Card
title="Customize Style"
icon="palette"
href="https://mintlify.com/docs/settings/global"
>
Customize your docs to your company's colors and brands
<Card title="Quick Start Guide" icon="rocket" href="/quickstart">
Get MCPHub running in 5 minutes
</Card>
<Card
title="Reference APIs"
icon="code"
href="https://mintlify.com/docs/api-playground/openapi"
>
Automatically generate endpoints from an OpenAPI spec
<Card title="Installation Guide" icon="download" href="/installation">
Detailed installation instructions for all platforms
</Card>
<Card
title="Add Components"
icon="screwdriver-wrench"
href="https://mintlify.com/docs/content/components/accordions"
>
Build interactive features and designs to guide your users
<Card title="Configuration" icon="cog" href="/configuration/mcp-settings">
Learn how to configure your MCP servers
</Card>
<Card
title="Get Inspiration"
icon="stars"
href="https://mintlify.com/customers"
>
Check out our showcase of our favorite documentation
<Card title="API Reference" icon="code" href="/api-reference/introduction">
Complete API documentation
</Card>
</CardGroup>
## Community & Support
<CardGroup cols={3}>
<Card title="GitHub" icon="github" href="https://github.com/samanhappy/mcphub">
Source code and issue tracking
</Card>
<Card title="Discord" icon="discord" href="https://discord.gg/qMKNsn5Q">
Join our community discussions
</Card>
<Card title="Sponsor" icon="heart" href="https://ko-fi.com/samanhappy">
Support the project development
</Card>
</CardGroup>

570
docs/installation.mdx Normal file
View File

@@ -0,0 +1,570 @@
---
title: 'Installation Guide'
description: 'Detailed installation instructions for all platforms'
---
## Prerequisites
Before installing MCPHub, ensure you have the following prerequisites:
- **Node.js** 18+ (for local development)
- **Docker** (recommended for production)
- **pnpm** (for local development)
Optional for Smart Routing:
- **PostgreSQL** with pgvector extension
- **OpenAI API Key** or compatible embedding service
## Installation Methods
<Tabs>
<Tab title="Docker (Recommended)">
### Docker Installation
Docker is the recommended way to deploy MCPHub in production.
#### 1. Basic Installation
```bash
# Pull the latest image
docker pull samanhappy/mcphub:latest
# Run with default settings
docker run -d \
--name mcphub \
-p 3000:3000 \
samanhappy/mcphub:latest
```
#### 2. With Custom Configuration
```bash
# Create your configuration file
cat > mcp_settings.json << 'EOF'
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
}
EOF
# Run with mounted config
docker run -d \
--name mcphub \
-p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
samanhappy/mcphub:latest
```
#### 3. With Environment Variables
```bash
docker run -d \
--name mcphub \
-p 3000:3000 \
-e PORT=3000 \
-e BASE_PATH="" \
samanhappy/mcphub:latest
```
#### 4. Docker Compose
Create a `docker-compose.yml` file:
```yaml
version: '3.8'
services:
mcphub:
image: samanhappy/mcphub:latest
ports:
- "3000:3000"
volumes:
- ./mcp_settings.json:/app/mcp_settings.json
environment:
- PORT=3000
- BASE_PATH=""
- REQUEST_TIMEOUT=60000
restart: unless-stopped
# Optional: PostgreSQL for Smart Routing
postgres:
image: pgvector/pgvector:pg16
environment:
POSTGRES_DB: mcphub
POSTGRES_USER: mcphub
POSTGRES_PASSWORD: mcphub_password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
```
Run with:
```bash
docker-compose up -d
```
</Tab>
<Tab title="npm Package">
### npm Package Installation
Install MCPHub as a global npm package:
#### 1. Global Installation
```bash
# Install globally
npm install -g @samanhappy/mcphub
# Or with yarn
yarn global add @samanhappy/mcphub
# Or with pnpm
pnpm add -g @samanhappy/mcphub
```
#### 2. Running MCPHub
```bash
# Run with default settings
mcphub
# Run with custom port
PORT=8080 mcphub
```
{/* #### 3. Local Installation
You can also install MCPHub locally in a project:
```bash
# Create a new directory
mkdir my-mcphub
cd my-mcphub
# Initialize package.json
npm init -y
# Install MCPHub locally
npm install @samanhappy/mcphub
# Create a start script
echo '#!/bin/bash\nnpx mcphub' > start.sh
chmod +x start.sh
# Run MCPHub
./start.sh
``` */}
</Tab>
<Tab title="Local Development">
### Local Development Setup
For development, customization, or contribution:
#### 1. Clone Repository
```bash
# Clone the repository
git clone https://github.com/samanhappy/mcphub.git
cd mcphub
```
#### 2. Install Dependencies
```bash
# Install dependencies with pnpm (recommended)
pnpm install
# Or with npm
npm install
# Or with yarn
yarn install
```
#### 3. Development Mode
```bash
# Start both backend and frontend in development mode
pnpm dev
# This will start:
# - Backend on http://localhost:3001
# - Frontend on http://localhost:5173
# - Frontend proxies API calls to backend
```
#### 4. Build for Production
```bash
# Build both backend and frontend
pnpm build
# Start production server
pnpm start
```
#### 5. Development Scripts
```bash
# Backend only (for API development)
pnpm backend:dev
# Frontend only (when backend is running separately)
pnpm frontend:dev
# Run tests
pnpm test
# Lint code
pnpm lint
# Format code
pnpm format
```
<Note>
On Windows, you may need to run backend and frontend separately:
```bash
# Terminal 1: Backend
pnpm backend:dev
# Terminal 2: Frontend
pnpm frontend:dev
```
</Note>
</Tab>
<Tab title="Kubernetes">
### Kubernetes Deployment
Deploy MCPHub on Kubernetes with these manifests:
#### 1. ConfigMap for Settings
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mcphub-config
data:
mcp_settings.json: |
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
}
```
#### 2. Deployment
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcphub
spec:
replicas: 1
selector:
matchLabels:
app: mcphub
template:
metadata:
labels:
app: mcphub
spec:
containers:
- name: mcphub
image: samanhappy/mcphub:latest
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
volumeMounts:
- name: config
mountPath: /app/mcp_settings.json
subPath: mcp_settings.json
volumes:
- name: config
configMap:
name: mcphub-config
```
#### 3. Service
```yaml
apiVersion: v1
kind: Service
metadata:
name: mcphub-service
spec:
selector:
app: mcphub
ports:
- port: 80
targetPort: 3000
type: ClusterIP
```
#### 4. Ingress (Optional)
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mcphub-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-buffering: "off"
spec:
rules:
- host: mcphub.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mcphub-service
port:
number: 80
```
Deploy with:
```bash
kubectl apply -f mcphub-configmap.yaml
kubectl apply -f mcphub-deployment.yaml
kubectl apply -f mcphub-service.yaml
kubectl apply -f mcphub-ingress.yaml
```
</Tab>
</Tabs>
## Smart Routing Setup (Optional)
Smart Routing provides AI-powered tool discovery using vector semantic search.
### Prerequisites
1. **PostgreSQL with pgvector**
2. **OpenAI API Key** (or compatible embedding service)
### Database Setup
<Tabs>
<Tab title="Docker PostgreSQL">
```bash
# Run PostgreSQL with pgvector
docker run -d \
--name mcphub-postgres \
-e POSTGRES_DB=mcphub \
-e POSTGRES_USER=mcphub \
-e POSTGRES_PASSWORD=your_password \
-p 5432:5432 \
pgvector/pgvector:pg16
```
</Tab>
<Tab title="Existing PostgreSQL">
If you have an existing PostgreSQL instance:
```sql
-- Connect to your PostgreSQL instance
-- Create database
CREATE DATABASE mcphub;
-- Connect to the mcphub database
\c mcphub;
-- Enable pgvector extension
CREATE EXTENSION IF NOT EXISTS vector;
```
</Tab>
<Tab title="Cloud PostgreSQL">
For cloud providers (AWS RDS, Google Cloud SQL, etc.):
1. Enable the pgvector extension in your cloud provider's console
2. Create a database named `mcphub`
3. Note down the connection details
</Tab>
</Tabs>
{/* ### Environment Configuration
Set the following environment variables:
```bash
# Database connection
DATABASE_URL=postgresql://mcphub:your_password@localhost:5432/mcphub
# OpenAI API for embeddings
OPENAI_API_KEY=your_openai_api_key
# Optional: Custom embedding model
EMBEDDING_MODEL=text-embedding-3-small
# Optional: Enable smart routing
ENABLE_SMART_ROUTING=true
``` */}
## Verification
After installation, verify MCPHub is working:
{/* ### 1. Health Check
```bash
curl http://localhost:3000/api/health
```
Expected response:
```json
{
"status": "ok",
"version": "x.x.x",
"uptime": 123
}
``` */}
### Dashboard Access
Open your browser and navigate to:
```
http://localhost:3000
```
{/* ### 3. API Test
```bash
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
``` */}
## Troubleshooting
<AccordionGroup>
<Accordion title="Docker Issues">
**Port already in use:**
```bash
# Check what's using port 3000
lsof -i :3000
# Use a different port
docker run -p 8080:3000 samanhappy/mcphub
```
**Container won't start:**
```bash
# Check container logs
docker logs mcphub
# Run interactively for debugging
docker run -it --rm samanhappy/mcphub /bin/bash
```
</Accordion>
<Accordion title="npm Installation Issues">
**Permission errors:**
```bash
# Use npx instead of global install
npx @samanhappy/mcphub
# Or fix npm permissions
npm config set prefix ~/.npm-global
export PATH=~/.npm-global/bin:$PATH
```
**Node version issues:**
```bash
# Check Node version
node --version
# Install Node 18+ using nvm
nvm install 18
nvm use 18
```
</Accordion>
<Accordion title="Network Issues">
**Can't access dashboard:**
- Check if MCPHub is running: `ps aux | grep mcphub`
- Verify port binding: `netstat -tlnp | grep 3000`
- Check firewall settings
- Try accessing via `127.0.0.1:3000` instead of `localhost:3000`
**AI clients can't connect:**
- Ensure the endpoint URL is correct
- Check if MCPHub is behind a proxy
- Verify network policies in Kubernetes/Docker environments
</Accordion>
<Accordion title="Smart Routing Issues">
**Database connection failed:**
```bash
# Test database connection
psql $DATABASE_URL -c "SELECT 1;"
# Check if pgvector is installed
psql $DATABASE_URL -c "CREATE EXTENSION IF NOT EXISTS vector;"
```
**Embedding service errors:**
- Verify OpenAI API key is valid
- Check internet connectivity
- Monitor rate limits
</Accordion>
</AccordionGroup>
## Next Steps
<CardGroup cols={2}>
<Card title="Configuration" icon="cog" href="/configuration/mcp-settings">
Configure your MCP servers and settings
</Card>
<Card title="Quick Start" icon="rocket" href="/quickstart">
Get up and running in 5 minutes
</Card>
<Card title="Server Management" icon="server" href="/features/server-management">
Learn how to manage your MCP servers
</Card>
<Card title="API Reference" icon="code" href="/api-reference/introduction">
Explore the complete API documentation
</Card>
</CardGroup>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,149 @@
# OpenAPI Schema Support in MCPHub
MCPHub now supports both OpenAPI specification URLs and complete JSON schemas for OpenAPI server configuration. This allows you to either reference an external OpenAPI specification file or embed the complete schema directly in your configuration.
## Configuration Options
### 1. Using OpenAPI Specification URL (Traditional)
```json
{
"type": "openapi",
"openapi": {
"url": "https://api.example.com/openapi.json",
"version": "3.1.0",
"security": {
"type": "apiKey",
"apiKey": {
"name": "X-API-Key",
"in": "header",
"value": "your-api-key"
}
}
}
}
```
### 2. Using Complete JSON Schema (New)
```json
{
"type": "openapi",
"openapi": {
"schema": {
"openapi": "3.1.0",
"info": {
"title": "My API",
"version": "1.0.0"
},
"servers": [
{
"url": "https://api.example.com"
}
],
"paths": {
"/users": {
"get": {
"operationId": "getUsers",
"summary": "Get all users",
"responses": {
"200": {
"description": "List of users"
}
}
}
}
}
},
"version": "3.1.0",
"security": {
"type": "apiKey",
"apiKey": {
"name": "X-API-Key",
"in": "header",
"value": "your-api-key"
}
}
}
}
```
## Benefits of JSON Schema Support
1. **Offline Development**: No need for external URLs during development
2. **Version Control**: Schema changes can be tracked in your configuration
3. **Security**: No external dependencies or network calls required
4. **Customization**: Full control over the API specification
5. **Testing**: Easy to create test configurations with mock schemas
## Frontend Form Support
The web interface now includes:
- **Input Mode Selection**: Choose between "Specification URL" or "JSON Schema"
- **URL Input**: Traditional URL input field for external specifications
- **Schema Editor**: Large text area with syntax highlighting for JSON schema input
- **Validation**: Client-side JSON validation before submission
- **Help Text**: Contextual help for schema format
## API Validation
The backend validates that:
- At least one of `url` or `schema` is provided for OpenAPI servers
- JSON schemas are properly formatted when provided
- Security configurations are valid for both input modes
- All required OpenAPI fields are present
## Migration Guide
### From URL to Schema
If you want to convert an existing URL-based configuration to schema-based:
1. Download your OpenAPI specification from the URL
2. Copy the JSON content
3. Update your configuration to use the `schema` field instead of `url`
4. Paste the JSON content as the value of the `schema` field
### Maintaining Both
You can include both `url` and `schema` in your configuration. The system will prioritize the `schema` field if both are present.
## Examples
See the `examples/openapi-schema-config.json` file for complete configuration examples showing both URL and schema-based configurations.
## Technical Implementation
- **Backend**: OpenAPI client supports both SwaggerParser.dereference() with URLs and direct schema objects
- **Frontend**: Dynamic form rendering based on selected input mode
- **Validation**: Enhanced validation logic in server controllers
- **Type Safety**: Updated TypeScript interfaces for both input modes
## Security Considerations
When using JSON schemas:
- Ensure schemas are properly validated before use
- Be aware that large schemas increase configuration file size
- Consider using URL-based approach for frequently changing APIs
- Store sensitive information (like API keys) in environment variables, not in schemas
## Troubleshooting
### Common Issues
1. **Invalid JSON**: Ensure your schema is valid JSON format
2. **Missing Required Fields**: OpenAPI schemas must include `openapi`, `info`, and `paths` fields
3. **Schema Size**: Very large schemas may impact performance
4. **Server Configuration**: Ensure the `servers` field in your schema points to the correct endpoints
### Validation Errors
The system provides detailed error messages for:
- Malformed JSON in schema field
- Missing required OpenAPI fields
- Invalid security configurations
- Network issues with URL-based configurations

172
docs/openapi-support.md Normal file
View File

@@ -0,0 +1,172 @@
# OpenAPI Support in MCPHub
MCPHub now supports OpenAPI 3.1.1 servers as a new server type, allowing you to integrate REST APIs directly into your MCP workflow.
## Features
-**Full OpenAPI 3.1.1 Support**: Load and parse OpenAPI specifications
-**Multiple Security Types**: None, API Key, HTTP Authentication, OAuth 2.0, OpenID Connect
-**Dynamic Tool Generation**: Automatically creates MCP tools from OpenAPI operations
-**Type Safety**: Full TypeScript support with proper type definitions
-**Frontend Integration**: Easy-to-use forms for configuring OpenAPI servers
-**Internationalization**: Support for English and Chinese languages
## Configuration
### Basic Configuration
```json
{
"type": "openapi",
"openapi": {
"url": "https://api.example.com/v1/openapi.json",
"version": "3.1.0",
"security": {
"type": "none"
}
}
}
```
### With API Key Authentication
```json
{
"type": "openapi",
"openapi": {
"url": "https://api.example.com/v1/openapi.json",
"version": "3.1.0",
"security": {
"type": "apiKey",
"apiKey": {
"name": "X-API-Key",
"in": "header",
"value": "your-api-key-here"
}
}
},
"headers": {
"Accept": "application/json"
}
}
```
### With HTTP Bearer Authentication
```json
{
"type": "openapi",
"openapi": {
"url": "https://api.example.com/v1/openapi.json",
"version": "3.1.0",
"security": {
"type": "http",
"http": {
"scheme": "bearer",
"credentials": "your-bearer-token-here"
}
}
}
}
```
## Supported Security Types
1. **None**: No authentication required
2. **API Key**: API key in header or query parameter
3. **HTTP**: Basic, Bearer, or Digest authentication
4. **OAuth 2.0**: OAuth 2.0 access tokens
5. **OpenID Connect**: OpenID Connect ID tokens
## How It Works
1. **Specification Loading**: The OpenAPI client fetches and parses the OpenAPI specification
2. **Tool Generation**: Each operation in the spec becomes an MCP tool
3. **Request Handling**: Tools handle parameter validation and API calls
4. **Response Processing**: API responses are returned as tool results
## Frontend Usage
1. Navigate to the Servers page
2. Click "Add Server"
3. Select "OpenAPI" as the server type
4. Enter the OpenAPI specification URL
5. Configure security settings if needed
6. Add any additional headers
7. Save the configuration
## Testing
You can test the OpenAPI integration using the provided test scripts:
```bash
# Test OpenAPI client directly
npx tsx test-openapi.ts
# Test full integration
npx tsx test-integration.ts
```
## Example: Swagger Petstore
The Swagger Petstore API is a perfect example for testing:
```json
{
"type": "openapi",
"openapi": {
"url": "https://petstore3.swagger.io/api/v3/openapi.json",
"version": "3.1.0",
"security": {
"type": "none"
}
}
}
```
This will create tools like:
- `addPet`: Add a new pet to the store
- `findPetsByStatus`: Find pets by status
- `getPetById`: Find pet by ID
- And many more...
## Error Handling
The OpenAPI client includes comprehensive error handling:
- Network errors are properly caught and reported
- Invalid specifications are rejected with clear error messages
- API errors include response status and body information
- Type validation ensures proper parameter handling
## Limitations
- Only supports OpenAPI 3.x specifications (3.0.0 and above)
- Complex authentication flows (like OAuth 2.0 authorization code flow) require manual token management
- Large specifications may take time to parse initially
- Some advanced OpenAPI features may not be fully supported
## Contributing
To add new features or fix bugs in the OpenAPI integration:
1. Backend types: `src/types/index.ts`
2. OpenAPI client: `src/clients/openapi.ts`
3. Service integration: `src/services/mcpService.ts`
4. Frontend forms: `frontend/src/components/ServerForm.tsx`
5. Internationalization: `frontend/src/locales/`
## Troubleshooting
**Q: My OpenAPI server won't connect**
A: Check that the specification URL is accessible and returns valid JSON/YAML
**Q: Tools aren't showing up**
A: Verify that your OpenAPI specification includes valid operations with required fields
**Q: Authentication isn't working**
A: Double-check your security configuration matches the API's requirements
**Q: Getting CORS errors**
A: The API server needs to allow CORS requests from your MCPHub domain

View File

@@ -1,97 +1,226 @@
---
title: 'Quickstart'
description: 'Start building awesome documentation in under 5 minutes'
title: 'Quick Start Guide'
description: 'Get MCPHub running in 5 minutes'
---
## Setup your development
## Installation
Learn how to update your docs locally and deploy them to the public.
<Tabs>
<Tab title="Docker (Recommended)">
The fastest way to get started with MCPHub is using Docker:
### Edit and preview
```bash
# Run with default configuration
docker run -p 3000:3000 samanhappy/mcphub
```
Or mount your custom configuration:
```bash
# Run with custom MCP settings
docker run -p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
samanhappy/mcphub
```
</Tab>
<Tab title="Local Development">
For development or customization:
```bash
# Clone the repository
git clone https://github.com/samanhappy/mcphub.git
cd mcphub
# Install dependencies
pnpm install
# Start development servers
pnpm dev
```
This starts both backend (port 3001) and frontend (port 5173) in development mode.
</Tab>
<Tab title="npm Package">
Install MCPHub as a global package:
```bash
# Install globally
npm install -g @samanhappy/mcphub
# Run MCPHub
mcphub
```
</Tab>
</Tabs>
## Initial Setup
### 1. Access the Dashboard
Open your browser and navigate to:
```
http://localhost:3000
```
### 2. Login
Use the default credentials:
- **Username**: `admin`
- **Password**: `admin123`
<Warning>Change these default credentials immediately after first login for security.</Warning>
### 3. Configure Your First MCP Server
1. Click **"Add Server"** in the dashboard
2. Enter server details:
- **Name**: A unique identifier (e.g., `fetch`)
- **Command**: The executable command (`uvx`)
- **Args**: Command arguments (`["mcp-server-fetch"]`)
- **Environment**: Any required environment variables
Example configuration for a fetch server:
```json
{
"name": "fetch",
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {}
}
```
## Basic Usage
### Connecting AI Clients
Once your servers are configured, connect your AI clients using MCPHub endpoints:
<Tabs>
<Tab title="All Servers">
Access all configured MCP servers: ``` http://localhost:3000/mcp ```
</Tab>
<Tab title="Specific Group">
Access servers in a specific group: ``` http://localhost:3000/mcp/{groupName} ```
</Tab>
<Tab title="Individual Server">
Access a single server: ``` http://localhost:3000/mcp/{serverName} ```
</Tab>
<Tab title="Smart Routing">
Use AI-powered tool discovery: ``` http://localhost:3000/mcp/$smart ```
<Info>Smart routing requires PostgreSQL with pgvector and an OpenAI API key.</Info>
</Tab>
</Tabs>
### Example: Adding Popular MCP Servers
Here are some popular MCP servers you can add:
<AccordionGroup>
<Accordion icon="github" title="Clone your docs locally">
During the onboarding process, we created a repository on your Github with
your docs content. You can find this repository on our
[dashboard](https://dashboard.mintlify.com). To clone the repository
locally, follow these
[instructions](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)
in your terminal.
<Accordion title="Web Fetch Server">
```json
{
"name": "fetch",
"command": "uvx",
"args": ["mcp-server-fetch"]
}
```
</Accordion>
<Accordion icon="rectangle-terminal" title="Preview changes">
Previewing helps you make sure your changes look as intended. We built a
command line interface to render these changes locally.
1. Install the
[Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the
documentation changes locally with this command: ``` npm i -g mintlify ```
2. Run the following command at the root of your documentation (where
`docs.json` is): ``` mintlify dev ```
<Note>
If youre currently using the legacy ```mint.json``` configuration file, please update the Mintlify CLI:
```npm i -g mintlify@latest```
And run the new upgrade command in your docs repository:
```mintlify upgrade```
You should now be using the new ```docs.json``` configuration file. Feel free to delete the ```mint.json``` file from your repository.
</Note>
<Accordion title="Playwright Browser Automation">
```json
{
"name": "playwright",
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
```
</Accordion>
<Accordion title="Amap Maps (with API key)">
```json
{
"name": "amap",
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "your-api-key-here"
}
}
```
</Accordion>
<Accordion title="Slack Integration">
```json
{
"name": "slack",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "your-bot-token",
"SLACK_TEAM_ID": "your-team-id"
}
}
```
</Accordion>
</AccordionGroup>
### Deploy your changes
{/* ## Verification
<AccordionGroup>
Test your setup by making a simple request:
<Accordion icon="message-bot" title="Install our Github app">
Our Github app automatically deploys your changes to your docs site, so you
don't need to manage deployments yourself. You can find the link to install on
your [dashboard](https://dashboard.mintlify.com). Once the bot has been
successfully installed, there should be a check mark next to the commit hash
of the repo.
</Accordion>
<Accordion icon="rocket" title="Push your changes">
[Commit and push your changes to
Git](https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository#about-git-push)
for your changes to update in your docs site. If you push and don't see that
the Github app successfully deployed your changes, you can also manually
update your docs through our [dashboard](https://dashboard.mintlify.com).
</Accordion>
```bash
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
```
</AccordionGroup>
You should receive a list of available tools from your configured MCP servers. */}
## Update your docs
Add content directly in your files with MDX syntax and React components. You can use any of our components, or even build your own.
<CardGroup>
<Card title="Add Content With MDX" icon="file" href="/essentials/markdown">
Add content to your docs with MDX syntax.
</Card>
<Card
title="Add Code Blocks"
icon="square-code"
href="/essentials/code"
>
Add code directly to your docs with syntax highlighting.
</Card>
<Card
title="Add Images"
icon="image"
href="/essentials/images"
>
Add images to your docs to make them more engaging.
</Card>
<Card
title="Add Custom Components"
icon="puzzle-piece"
href="/essentials/reusable-snippets"
>
Add templates to your docs to make them more reusable.
</Card>
## Next Steps
<CardGroup cols={2}>
<Card title="Server Management" icon="server" href="/features/server-management">
Learn advanced server configuration and management
</Card>
<Card title="Group Management" icon="users" href="/features/group-management">
Organize servers into logical groups
</Card>
<Card title="Smart Routing" icon="route" href="/features/smart-routing">
Set up AI-powered tool discovery
</Card>
<Card title="API Reference" icon="code" href="/api-reference/introduction">
Explore the complete API documentation
</Card>
</CardGroup>
## Troubleshooting
<AccordionGroup>
<Accordion title="Server won't start">
- Check if the MCP server command is accessible in your PATH - Verify environment variables are
correctly set - Check MCPHub logs for detailed error messages
</Accordion>
<Accordion title="Can't connect from AI client">
- Ensure MCPHub is running on the correct port - Check firewall settings - Verify the endpoint
URL format
</Accordion>
<Accordion title="Authentication issues">
- Verify credentials are correct - Check if JWT token is valid - Try clearing browser cache and
cookies
</Accordion>
</AccordionGroup>
Need more help? Join our [Discord community](https://discord.gg/qMKNsn5Q) for support!

172
docs/testing-framework.md Normal file
View File

@@ -0,0 +1,172 @@
# 测试框架和自动化测试实现报告
## 概述
本项目已成功引入现代化的测试框架和自动化测试流程。实现了基于Jest的测试环境支持TypeScript、ES模块并包含完整的CI/CD配置。
## 已实现的功能
### 1. 测试框架配置
- **Jest配置**: 使用`jest.config.cjs`配置文件支持ES模块和TypeScript
- **覆盖率报告**: 配置了代码覆盖率收集和报告
- **测试环境**: 支持Node.js环境的单元测试和集成测试
- **模块映射**: 配置了路径别名支持
### 2. 测试工具和辅助函数
创建了完善的测试工具库 (`tests/utils/testHelpers.ts`):
- **认证工具**: JWT token生成和管理
- **HTTP测试**: Supertest集成用于API测试
- **数据生成**: 测试数据工厂函数
- **响应断言**: 自定义API响应验证器
- **环境管理**: 测试环境变量配置
### 3. 测试用例实现
已实现的测试场景:
#### 基础配置测试 (`tests/basic.test.ts`)
- Jest配置验证
- 异步操作支持测试
- 自定义匹配器验证
#### 认证逻辑测试 (`tests/auth.logic.test.ts`)
- 用户登录逻辑
- 密码验证
- JWT生成和验证
- 错误处理场景
- 用户数据验证
#### 路径工具测试 (`tests/utils/pathLogic.test.ts`)
- 配置文件路径解析
- 环境变量处理
- 文件系统操作
- 错误处理和边界条件
- 跨平台路径处理
### 4. CI/CD配置
GitHub Actions配置 (`.github/workflows/ci.yml`):
- **多Node.js版本支持**: 18.x和20.x
- **自动化测试流程**:
- 代码检查 (ESLint)
- 类型检查 (TypeScript)
- 单元测试执行
- 覆盖率报告
- **构建验证**: 应用构建和产物验证
- **集成测试**: 包含数据库环境的集成测试
### 5. 测试脚本
`package.json`中添加的测试命令:
```json
{
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"test:verbose": "jest --verbose",
"test:ci": "jest --ci --coverage --watchAll=false"
}
```
## 测试结果
当前测试统计:
- **测试套件**: 3个
- **测试用例**: 19个
- **通过率**: 100%
- **执行时间**: ~15秒
### 测试覆盖的功能模块
1. **认证系统**: 用户登录、JWT处理、密码验证
2. **配置管理**: 文件路径解析、环境变量处理
3. **基础设施**: Jest配置、测试工具验证
## 技术特点
### 现代化特性
- **ES模块支持**: 完全支持ES2022模块语法
- **TypeScript集成**: 类型安全的测试编写
- **异步测试**: Promise和async/await支持
- **模拟系统**: Jest mock功能的深度使用
- **参数化测试**: 数据驱动的测试用例
### 最佳实践
- **测试隔离**: 每个测试用例独立运行
- **Mock管理**: 统一的mock清理和重置
- **错误处理**: 完整的错误场景测试
- **边界测试**: 输入验证和边界条件覆盖
- **文档化**: 清晰的测试用例命名和描述
## 后续扩展计划
### 短期目标
1. **API测试**: 为REST API端点添加集成测试
2. **数据库测试**: 添加数据模型和存储层测试
3. **中间件测试**: 认证和权限中间件测试
4. **服务层测试**: 核心业务逻辑测试
### 中期目标
1. **端到端测试**: 使用Playwright或Cypress
2. **性能测试**: API响应时间和负载测试
3. **安全测试**: 输入验证和安全漏洞测试
4. **契约测试**: API契约验证
### 长期目标
1. **测试数据管理**: 测试数据库和fixture管理
2. **视觉回归测试**: UI组件的视觉测试
3. **监控集成**: 生产环境测试监控
4. **自动化测试报告**: 详细的测试报告和趋势分析
## 开发指南
### 添加新测试用例
1.`tests/`目录下创建对应的测试文件
2. 使用`testHelpers.ts`中的工具函数
3. 遵循命名约定: `*.test.ts``*.spec.ts`
4. 确保测试用例具有清晰的描述和断言
### 运行测试
```bash
# 运行所有测试
pnpm test
# 监听模式
pnpm test:watch
# 生成覆盖率报告
pnpm test:coverage
# CI模式运行
pnpm test:ci
```
### Mock最佳实践
-`beforeEach`中清理所有mock
- 使用具体的mock实现而不是空函数
- 验证mock被正确调用
- 保持mock的一致性和可维护性
## 结论
本项目已成功建立了完整的现代化测试框架,具备以下优势:
1. **高度可扩展**: 易于添加新的测试用例和测试类型
2. **开发友好**: 丰富的工具函数和清晰的结构
3. **CI/CD就绪**: 完整的自动化流水线配置
4. **质量保证**: 代码覆盖率和持续测试验证
这个测试框架为项目的持续发展和质量保证提供了坚实的基础,支持敏捷开发和持续集成的最佳实践。

View File

@@ -0,0 +1,147 @@
---
title: "身份验证"
description: "管理用户和身份验证。"
---
import { Card, Cards } from 'mintlify';
<Card
title="POST /api/auth/login"
href="#login"
>
登录以获取 JWT 令牌。
</Card>
<Card
title="POST /api/auth/register"
href="#register"
>
注册一个新用户。
</Card>
<Card
title="GET /api/auth/user"
href="#get-current-user"
>
获取当前已验证的用户。
</Card>
<Card
title="POST /api/auth/change-password"
href="#change-password"
>
更改当前用户的密码。
</Card>
---
### 登录
验证用户身份并返回 JWT 令牌及用户详细信息。
- **端点**: `/api/auth/login`
- **方法**: `POST`
- **正文**:
- `username` (string, 必填): 用户名。
- `password` (string, 必填): 用户密码。
- **请求示例**:
```json
{
"username": "admin",
"password": "admin123"
}
```
- **成功响应**:
```json
{
"success": true,
"message": "登录成功",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"username": "admin",
"isAdmin": true,
"permissions": { ... }
}
}
```
---
### 注册
注册一个新用户并返回 JWT 令牌。
- **端点**: `/api/auth/register`
- **方法**: `POST`
- **正文**:
- `username` (string, 必填): 新的用户名。
- `password` (string, 必填): 新的用户密码 (至少6个字符)。
- `isAdmin` (boolean, 可选): 用户是否应有管理员权限。
- **请求示例**:
```json
{
"username": "newuser",
"password": "password123",
"isAdmin": false
}
```
- **成功响应**:
```json
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"username": "newuser",
"isAdmin": false,
"permissions": { ... }
}
}
```
---
### 获取当前用户
检索当前通过身份验证的用户的个人资料。
- **端点**: `/api/auth/user`
- **方法**: `GET`
- **身份验证**: 需要承载令牌 (Bearer Token)。
- **成功响应**:
```json
{
"success": true,
"user": {
"username": "admin",
"isAdmin": true,
"permissions": { ... }
}
}
```
---
### 更改密码
允许通过身份验证的用户更改其密码。
- **端点**: `/api/auth/change-password`
- **方法**: `POST`
- **身份验证**: 需要承载令牌 (Bearer Token)。
- **正文**:
- `currentPassword` (string, 必填): 用户的当前密码。
- `newPassword` (string, 必填): 新的密码 (至少6个字符)。
- **请求示例**:
```json
{
"currentPassword": "oldpassword",
"newPassword": "newpassword123"
}
```
- **成功响应**:
```json
{
"success": true,
"message": "密码更新成功"
}
```

View File

@@ -0,0 +1,111 @@
---
title: "配置"
description: "管理和检索系统级配置。"
---
import { Card, Cards } from 'mintlify';
<Card title="PUT /api/system-config" href="#update-system-config">更新主系统配置。</Card>
<Card title="GET /api/settings" href="#get-all-settings">获取所有系统设置,包括服务器和群组。</Card>
<Card title="GET /config" href="#get-runtime-config">获取前端的公共运行时配置。</Card>
<Card title="GET /public-config" href="#get-public-config">获取公共配置以检查是否跳过身份验证。</Card>
---
### 更新系统配置
更新系统配置的各个部分。您只需提供要更新部分的键。
- **端点**: `/api/system-config`
- **方法**: `PUT`
- **正文**: 一个 JSON 对象,包含以下一个或多个顶级键:`routing`、`install`、`smartRouting`、`mcpRouter`。
#### 路由配置 (`routing`)
- `enableGlobalRoute` (boolean): 启用或禁用全局 `/api/mcp` 路由。
- `enableGroupNameRoute` (boolean): 启用或禁用基于群组的路由 (例如 `/api/mcp/group/:groupName`)。
- `enableBearerAuth` (boolean): 为 MCP 路由启用承载令牌身份验证。
- `bearerAuthKey` (string): 用于承载身份验证的密钥。
- `skipAuth` (boolean): 如果为 true则跳过所有身份验证使实例公开。
#### 安装配置 (`install`)
- `pythonIndexUrl` (string): 用于安装的 Python 包索引 (PyPI) 的基础 URL。
- `npmRegistry` (string): 用于安装的 npm 注册表 URL。
- `baseUrl` (string): 此 MCPHub 实例的公共基础 URL。
#### 智能路由配置 (`smartRouting`)
- `enabled` (boolean): 启用或禁用智能路由功能。
- `dbUrl` (string): 用于存储嵌入的数据库连接 URL。
- `openaiApiBaseUrl` (string): 用于生成嵌入的 OpenAI 兼容 API 的基础 URL。
- `openaiApiKey` (string): 嵌入服务的 API 密钥。
- `openaiApiEmbeddingModel` (string): 要使用的嵌入模型的名称。
#### MCP 路由器配置 (`mcpRouter`)
- `apiKey` (string): MCP 路由器服务的 API 密钥。
- `referer` (string): 用于 MCP 路由器请求的 referer 头。
- `title` (string): 在 MCP 路由器上显示的此实例的标题。
- `baseUrl` (string): MCP 路由器 API 的基础 URL。
- **请求示例**:
```json
{
"routing": {
"skipAuth": true
},
"smartRouting": {
"enabled": true,
"dbUrl": "postgresql://user:pass@host:port/db"
}
}
```
---
### 获取所有设置
检索实例的整个设置对象,包括所有服务器配置、群组和系统设置。这是 `mcp_settings.json` 文件的完整转储。
- **端点**: `/api/settings`
- **方法**: `GET`
---
### 获取运行时配置
检索前端应用程序所需的基本运行时配置。此端点不需要身份验证。
- **端点**: `/config`
- **方法**: `GET`
- **成功响应**:
```json
{
"success": true,
"data": {
"basePath": "",
"version": "1.0.0",
"name": "MCPHub"
}
}
```
---
### 获取公共配置
检索公共配置,主要用于检查是否跳过身份验证。这允许前端在用户登录前相应地调整其行为。此端点不需要身份验证。
- **端点**: `/public-config`
- **方法**: `GET`
- **成功响应**:
```json
{
"success": true,
"data": {
"skipAuth": false,
"permissions": {}
}
}
```

View File

@@ -0,0 +1,212 @@
---
title: "群组"
description: "管理服务器群组以组织和路由请求。"
---
import { Card, Cards } from 'mintlify';
<Card title="GET /api/groups" href="#get-all-groups">获取所有群组的列表。</Card>
<Card title="POST /api/groups" href="#create-a-new-group">创建一个新群组。</Card>
<Card title="GET /api/groups/:id" href="#get-a-group">获取特定群组的详细信息。</Card>
<Card title="PUT /api/groups/:id" href="#update-a-group">更新现有群组。</Card>
<Card title="DELETE /api/groups/:id" href="#delete-a-group">删除一个群组。</Card>
<Card title="POST /api/groups/:id/servers" href="#add-server-to-group">将服务器添加到群组。</Card>
<Card title="DELETE /api/groups/:id/servers/:serverName" href="#remove-server-from-group">从群组中删除服务器。</Card>
<Card title="PUT /api/groups/:id/servers/batch" href="#batch-update-group-servers">批量更新群组中的服务器。</Card>
<Card title="GET /api/groups/:id/server-configs" href="#get-group-server-configs">获取群组中详细的服务器配置。</Card>
<Card title="PUT /api/groups/:id/server-configs/:serverName/tools" href="#update-group-server-tools">更新群组中服务器的工具选择。</Card>
---
### 获取所有群组
检索所有服务器群组的列表。
- **端点**: `/api/groups`
- **方法**: `GET`
- **成功响应**:
```json
{
"success": true,
"data": [
{
"id": "group-1",
"name": "我的群组",
"description": "服务器的集合。",
"servers": ["server1", "server2"],
"owner": "admin"
}
]
}
```
---
### 创建一个新群组
创建一个新的服务器群组。
- **端点**: `/api/groups`
- **方法**: `POST`
- **正文**:
- `name` (string, 必填): 群组的名称。
- `description` (string, 可选): 群组的描述。
- `servers` (array of strings, 可选): 要包含在群组中的服务器名称列表。
- **请求示例**:
```json
{
"name": "我的新群组",
"description": "新群组的描述",
"servers": ["server1", "server2"]
}
```
---
### 获取一个群组
通过 ID 或名称检索特定群组的详细信息。
- **端点**: `/api/groups/:id`
- **方法**: `GET`
- **参数**:
- `:id` (string, 必填): 群组的 ID 或名称。
---
### 更新一个群组
更新现有群组的名称、描述或服务器列表。
- **端点**: `/api/groups/:id`
- **方法**: `PUT`
- **参数**:
- `:id` (string, 必填): 要更新的群组的 ID 或名称。
- **正文**:
- `name` (string, 可选): 群组的新名称。
- `description` (string, 可选): 群组的新描述。
- `servers` (array, 可选): 群组的新服务器列表。格式请参阅 [批量更新群组服务器](#batch-update-group-servers)。
- **请求示例**:
```json
{
"name": "更新后的群组名称",
"description": "更新后的描述"
}
```
---
### 删除一个群组
通过 ID 或名称删除一个群组。
- **端点**: `/api/groups/:id`
- **方法**: `DELETE`
- **参数**:
- `:id` (string, 必填): 要删除的群组的 ID 或名称。
---
### 将服务器添加到群组
将单个服务器添加到群组。
- **端点**: `/api/groups/:id/servers`
- **方法**: `POST`
- **参数**:
- `:id` (string, 必填): 群组的 ID 或名称。
- **正文**:
- `serverName` (string, 必填): 要添加的服务器的名称。
- **请求示例**:
```json
{
"serverName": "my-server"
}
```
---
### 从群组中删除服务器
从群组中删除单个服务器。
- **端点**: `/api/groups/:id/servers/:serverName`
- **方法**: `DELETE`
- **参数**:
- `:id` (string, 必填): 群组的 ID 或名称。
- `:serverName` (string, 必填): 要删除的服务器的名称。
---
### 批量更新群组服务器
用新的列表替换群组中的所有服务器。该列表可以是简单的字符串或详细的配置对象。
- **端点**: `/api/groups/:id/servers/batch`
- **方法**: `PUT`
- **参数**:
- `:id` (string, 必填): 群组的 ID 或名称。
- **正文**:
- `servers` (array, 必填): 服务器名称(字符串)或服务器配置对象的数组。
- **请求示例 (简单)**:
```json
{
"servers": ["server1", "server2"]
}
```
- **请求示例 (详细)**:
```json
{
"servers": [
{ "name": "server1", "tools": "all" },
{ "name": "server2", "tools": ["toolA", "toolB"] }
]
}
```
---
### 获取群组服务器配置
检索群组内所有服务器的详细配置,包括启用了哪些工具。
- **端点**: `/api/groups/:id/server-configs`
- **方法**: `GET`
- **参数**:
- `:id` (string, 必填): 群组的 ID 或名称。
- **成功响应**:
```json
{
"success": true,
"data": [
{
"name": "server1",
"tools": "all"
},
{
"name": "server2",
"tools": ["toolA", "toolB"]
}
]
}
```
---
### 更新群组服务器工具
更新群组内特定服务器的工具选择。
- **端点**: `/api/groups/:id/server-configs/:serverName/tools`
- **方法**: `PUT`
- **参数**:
- `:id` (string, 必填): 群组的 ID 或名称。
- `:serverName` (string, 必填): 要更新的服务器的名称。
- **正文**:
- `tools` (string or array of strings, 必填): 字符串 `"all"` 表示启用所有工具,或一个工具名称数组以指定启用哪些工具。
- **请求示例**:
```json
{
"tools": ["toolA", "toolC"]
}
```

View File

@@ -0,0 +1,13 @@
---
title: "介绍"
description: "欢迎来到 MCPHub API 文档。"
---
MCPHub API 提供了一整套端点来管理您的 MCP 服务器、群组、用户等。该 API 分为两个主要类别:
- **MCP 端点**: 这些是与您的 MCP 服务器交互的主要端点。它们提供了一个统一的界面,用于向您的服务器发送请求并实时接收响应。
- **管理 API**: 这些端点用于管理 MCPHub 实例本身。这包括管理服务器、群组、用户和系统设置。
所有 API 端点都在 `/api` 路径下可用。例如,获取所有服务器的端点是 `/api/servers`。
大多数管理 API 端点都需要身份验证。有关更多详细信息,请参阅[身份验证](/api-reference/auth)部分。

View File

@@ -0,0 +1,81 @@
---
title: "日志"
description: "访问和管理服务器日志。"
---
import { Card, Cards } from 'mintlify';
<Card
title="GET /api/logs"
href="#get-all-logs"
>
获取所有日志。
</Card>
<Card
title="DELETE /api/logs"
href="#clear-logs"
>
清除所有日志。
</Card>
<Card
title="GET /api/logs/stream"
href="#stream-logs"
>
实时流式传输日志。
</Card>
---
### 获取所有日志
检索所有存储的日志。
- **端点**: `/api/logs`
- **方法**: `GET`
- **成功响应**:
```json
{
"success": true,
"data": [
{
"timestamp": "2023-10-27T10:00:00.000Z",
"level": "info",
"message": "服务器成功启动。",
"service": "system"
}
]
}
```
---
### 清除日志
删除所有存储的日志。
- **端点**: `/api/logs`
- **方法**: `DELETE`
- **成功响应**:
```json
{
"success": true,
"message": "日志清除成功"
}
```
---
### 流式传输日志
使用服务器发送事件 (SSE) 实时流式传输日志。连接将保持打开状态,新的日志条目将在发生时发送。
- **端点**: `/api/logs/stream`
- **方法**: `GET`
- **响应格式**: 该流发送带有包含 JSON 对象的 `data` 字段的事件。第一个事件的 `type` 为 `initial`,包含所有历史日志。后续事件的 `type` 为 `log`,包含单个新日志条目。
- **事件示例**:
```
data: {"type":"log","log":{"timestamp":"2023-10-27T10:00:05.000Z","level":"debug","message":"正在处理 /api/some-endpoint 的请求","service":"mcp-server"}}
```

View File

@@ -0,0 +1,33 @@
---
title: "MCP HTTP 端点"
description: "使用统一的 HTTP 端点连接到您的 MCP 服务器。"
---
MCPHub 为您的所有 MCP 服务器提供统一的可流式 HTTP 接口。这使您可以向任何配置的 MCP 服务器发送请求并实时接收响应。
### 统一端点
此端点提供对所有已启用的 MCP 服务器的访问。
- **端点**: `http://localhost:3000/mcp`
- **方法**: `POST`
### 特定群组的端点
要定向访问特定的服务器群组,请使用基于群组的 HTTP 端点。
- **端点**: `http://localhost:3000/mcp/{group}`
- **方法**: `POST`
- **参数**:
- `{group}`: 群组的 ID 或名称。
### 特定服务器的端点
要直接访问单个服务器,请使用特定于服务器的 HTTP 端点。
- **端点**: `http://localhost:3000/mcp/{server}`
- **方法**: `POST`
- **参数**:
- `{server}`: 服务器的名称。
> **注意**: 如果服务器名称和群组名称相同,则群组将优先。

View File

@@ -0,0 +1,25 @@
---
title: "MCP SSE 端点 (已弃用)"
description: "使用 SSE 端点连接到您的 MCP 服务器。"
---
SSE 端点已弃用,并将在未来版本中删除。请改用 [MCP HTTP 端点](/api-reference/mcp-http)。
### 统一端点
- **端点**: `http://localhost:3000/sse`
- **方法**: `GET`
### 特定群组的端点
- **端点**: `http://localhost:3000/sse/{group}`
- **方法**: `GET`
- **参数**:
- `{group}`: 群组的 ID 或名称。
### 特定服务器的端点
- **端点**: `http://localhost:3000/sse/{server}`
- **方法**: `GET`
- **参数**:
- `{server}`: 服务器的名称。

View File

@@ -0,0 +1,250 @@
---
title: "OpenAPI 集成"
description: "从 MCP 工具生成 OpenAPI 规范,与 OpenWebUI 和其他系统无缝集成"
---
# OpenWebUI 集成的 OpenAPI 生成
MCPHub 现在支持从 MCP 工具生成 OpenAPI 3.0.3 规范,实现与 OpenWebUI 和其他 OpenAPI 兼容系统的无缝集成,无需 MCPO 作为中间代理。
## 功能特性
- ✅ **自动 OpenAPI 生成**:将 MCP 工具转换为 OpenAPI 3.0.3 规范
- ✅ **OpenWebUI 兼容**:无需 MCPO 代理的直接集成
- ✅ **实时工具发现**:动态包含已连接 MCP 服务器的工具
- ✅ **双参数支持**:支持 GET查询参数和 POSTJSON 正文)进行工具执行
- ✅ **无需身份验证**OpenAPI 端点公开,便于集成
- ✅ **完整元数据**:具有适当模式和文档的完整 OpenAPI 规范
## API 端点
### OpenAPI 规范
<CodeGroup>
```bash GET /api/openapi.json
curl "http://localhost:3000/api/openapi.json"
```
```bash 带参数
curl "http://localhost:3000/api/openapi.json?title=我的 MCP API&version=2.0.0"
```
</CodeGroup>
生成并返回所有已连接 MCP 工具的完整 OpenAPI 3.0.3 规范。
**查询参数:**
<ParamField query="title" type="string" optional>
自定义 API 标题
</ParamField>
<ParamField query="description" type="string" optional>
自定义 API 描述
</ParamField>
<ParamField query="version" type="string" optional>
自定义 API 版本
</ParamField>
<ParamField query="serverUrl" type="string" optional>
自定义服务器 URL
</ParamField>
<ParamField query="includeDisabled" type="boolean" optional default="false">
包含禁用的工具
</ParamField>
<ParamField query="servers" type="string" optional>
要包含的服务器名称列表(逗号分隔)
</ParamField>
### 可用服务器
<CodeGroup>
```bash GET /api/openapi/servers
curl "http://localhost:3000/api/openapi/servers"
```
</CodeGroup>
返回已连接的 MCP 服务器名称列表。
<ResponseExample>
```json 示例响应
{
"success": true,
"data": ["amap", "playwright", "slack"]
}
```
</ResponseExample>
### 工具统计
<CodeGroup>
```bash GET /api/openapi/stats
curl "http://localhost:3000/api/openapi/stats"
```
</CodeGroup>
返回有关可用工具和服务器的统计信息。
<ResponseExample>
```json 示例响应
{
"success": true,
"data": {
"totalServers": 3,
"totalTools": 41,
"serverBreakdown": [
{"name": "amap", "toolCount": 12, "status": "connected"},
{"name": "playwright", "toolCount": 21, "status": "connected"},
{"name": "slack", "toolCount": 8, "status": "connected"}
]
}
}
```
</ResponseExample>
### 工具执行
<CodeGroup>
```bash GET /api/tools/{serverName}/{toolName}
curl "http://localhost:3000/api/tools/amap/amap-maps_weather?city=Beijing"
```
```bash POST /api/tools/{serverName}/{toolName}
curl -X POST "http://localhost:3000/api/tools/playwright/playwright-browser_navigate" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
```
</CodeGroup>
通过 OpenAPI 兼容端点执行 MCP 工具。
**路径参数:**
<ParamField path="serverName" type="string" required>
MCP 服务器的名称
</ParamField>
<ParamField path="toolName" type="string" required>
要执行的工具名称
</ParamField>
## OpenWebUI 集成
要将 MCPHub 与 OpenWebUI 集成:
<Steps>
<Step title="启动 MCPHub">
确保 MCPHub 正在运行,并且已配置 MCP 服务器
</Step>
<Step title="获取 OpenAPI 规范">
```bash
curl http://localhost:3000/api/openapi.json > mcphub-api.json
```
</Step>
<Step title="添加到 OpenWebUI">
在 OpenWebUI 中导入 OpenAPI 规范文件或直接指向 URL
</Step>
</Steps>
### 配置示例
在 OpenWebUI 中,您可以通过以下方式将 MCPHub 添加为 OpenAPI 工具:
<CardGroup cols={2}>
<Card title="OpenAPI URL" icon="link">
`http://localhost:3000/api/openapi.json`
</Card>
<Card title="基础 URL" icon="server">
`http://localhost:3000/api`
</Card>
</CardGroup>
## 生成的 OpenAPI 结构
生成的 OpenAPI 规范包括:
### 工具转换逻辑
- **简单工具**≤10 个原始参数)→ 带查询参数的 GET 端点
- **复杂工具**(对象、数组或 >10 个参数)→ 带 JSON 请求正文的 POST 端点
- **所有工具**都包含完整的响应模式和错误处理
### 生成操作示例
```yaml
/tools/amap/amap-maps_weather:
get:
summary: "根据城市名称或者标准adcode查询指定城市的天气"
operationId: "amap_amap-maps_weather"
tags: ["amap"]
parameters:
- name: city
in: query
required: true
description: "城市名称或者adcode"
schema:
type: string
responses:
'200':
description: "Successful tool execution"
content:
application/json:
schema:
$ref: '#/components/schemas/ToolResponse'
```
### 安全性
- 定义了 Bearer 身份验证但不对工具执行端点强制执行
- 支持与各种 OpenAPI 兼容系统的灵活集成
## 相比 MCPO 的优势
<CardGroup cols={2}>
<Card title="直接集成" icon="plug">
无需中间代理
</Card>
<Card title="实时更新" icon="refresh">
OpenAPI 规范随着 MCP 服务器连接/断开自动更新
</Card>
<Card title="更好的性能" icon="bolt">
直接工具执行,无代理开销
</Card>
<Card title="简化架构" icon="layer-group">
减少一个需要管理的组件
</Card>
</CardGroup>
## 故障排除
<AccordionGroup>
<Accordion title="OpenAPI 规范显示没有工具">
确保 MCP 服务器已连接。检查 `/api/openapi/stats` 查看服务器状态。
</Accordion>
<Accordion title="工具执行失败">
验证工具名称和参数是否与 OpenAPI 规范匹配。检查服务器日志以获取详细信息。
</Accordion>
<Accordion title="OpenWebUI 无法连接">
确保 MCPHub 可从 OpenWebUI 访问,并且 OpenAPI URL 正确。
</Accordion>
<Accordion title="规范中缺少工具">
检查您的 MCP 服务器配置中是否启用了工具。使用 `includeDisabled=true` 查看所有工具。
</Accordion>
</AccordionGroup>

View File

@@ -0,0 +1,209 @@
---
title: "服务器"
description: "管理您的 MCP 服务器。"
---
import { Card, Cards } from 'mintlify';
<Card
title="GET /api/servers"
href="#get-all-servers"
>
获取所有 MCP 服务器的列表。
</Card>
<Card
title="POST /api/servers"
href="#create-a-new-server"
>
创建一个新的 MCP 服务器。
</Card>
<Card
title="PUT /api/servers/:name"
href="#update-a-server"
>
更新现有的 MCP 服务器。
</Card>
<Card
title="DELETE /api/servers/:name"
href="#delete-a-server"
>
删除一个 MCP 服务器。
</Card>
<Card
title="POST /api/servers/:name/toggle"
href="#toggle-a-server"
>
切换服务器的启用状态。
</Card>
<Card
title="POST /api/servers/:serverName/tools/:toolName/toggle"
href="#toggle-a-tool"
>
切换工具的启用状态。
</Card>
<Card
title="PUT /api/servers/:serverName/tools/:toolName/description"
href="#update-tool-description"
>
更新工具的描述。
</Card>
---
### 获取所有服务器
检索所有已配置的 MCP 服务器的列表,包括其状态和可用工具。
- **端点**: `/api/servers`
- **方法**: `GET`
- **响应**:
```json
{
"success": true,
"data": [
{
"name": "example-server",
"status": "connected",
"tools": [
{
"name": "tool1",
"description": "工具1的描述"
}
],
"config": {
"type": "stdio",
"command": "node",
"args": ["server.js"]
}
}
]
}
```
---
### 创建一个新服务器
将一个新的 MCP 服务器添加到配置中。
- **端点**: `/api/servers`
- **方法**: `POST`
- **正文**:
```json
{
"name": "my-new-server",
"config": {
"type": "stdio",
"command": "python",
"args": ["-u", "my_script.py"],
"owner": "admin"
}
}
```
- `name` (string, 必填): 服务器的唯一名称。
- `config` (object, 必填): 服务器配置对象。
- `type` (string): `stdio`、`sse`、`streamable-http` 或 `openapi`。
- `command` (string): `stdio` 类型要执行的命令。
- `args` (array of strings): 命令的参数。
- `url` (string): `sse`、`streamable-http` 或 `openapi` 类型的 URL。
- `openapi` (object): OpenAPI 配置。
- `url` (string): OpenAPI 模式的 URL。
- `schema` (object): OpenAPI 模式对象本身。
- `headers` (object): `sse`、`streamable-http` 和 `openapi` 类型请求要发送的标头。
- `keepAliveInterval` (number): `sse` 类型的保持活动间隔(毫秒)。默认为 60000。
- `owner` (string): 服务器的所有者。默认为当前用户或“admin”。
---
### 更新一个服务器
更新现有 MCP 服务器的配置。
- **端点**: `/api/servers/:name`
- **方法**: `PUT`
- **参数**:
- `:name` (string, 必填): 要更新的服务器的名称。
- **正文**:
```json
{
"config": {
"type": "stdio",
"command": "node",
"args": ["new_server.js"]
}
}
```
- `config` (object, 必填): 更新后的服务器配置对象。详情请参阅“创建一个新服务器”。
---
### 删除一个服务器
从配置中删除一个 MCP 服务器。
- **端点**: `/api/servers/:name`
- **方法**: `DELETE`
- **参数**:
- `:name` (string, 必填): 要删除的服务器的名称。
---
### 切换一个服务器
启用或禁用一个 MCP 服务器。
- **端点**: `/api/servers/:name/toggle`
- **方法**: `POST`
- **参数**:
- `:name` (string, 必填): 要切换的服务器的名称。
- **正文**:
```json
{
"enabled": true
}
```
- `enabled` (boolean, 必填): `true` 启用服务器,`false` 禁用服务器。
---
### 切换一个工具
启用或禁用服务器上的特定工具。
- **端点**: `/api/servers/:serverName/tools/:toolName/toggle`
- **方法**: `POST`
- **参数**:
- `:serverName` (string, 必填): 服务器的名称。
- `:toolName` (string, 必填): 工具的名称。
- **正文**:
```json
{
"enabled": true
}
```
- `enabled` (boolean, 必填): `true` 启用工具,`false` 禁用工具。
---
### 更新工具描述
更新特定工具的描述。
- **端点**: `/api/servers/:serverName/tools/:toolName/description`
- **方法**: `PUT`
- **参数**:
- `:serverName` (string, 必填): 服务器的名称。
- `:toolName` (string, 必填): 工具的名称。
- **正文**:
```json
{
"description": "新的工具描述"
}
```
- `description` (string, 必填): 工具的新描述。

View File

@@ -0,0 +1,29 @@
---
title: "智能路由"
description: "使用向量语义搜索进行智能工具发现。"
---
智能路由是 MCPHub 的智能工具发现系统,它使用向量语义搜索来自动为任何给定任务找到最相关的工具。
### HTTP 端点
- **端点**: `http://localhost:3000/mcp/$smart`
- **方法**: `POST`
### SSE 端点 (已弃用)
- **端点**: `http://localhost:3000/sse/$smart`
- **方法**: `GET`
### 工作原理
1. **工具索引**: 所有 MCP 工具都会自动转换为向量嵌入并存储在带有 pgvector 的 PostgreSQL 中。
2. **语义搜索**: 用户查询被转换为向量,并使用余弦相似度与工具嵌入进行匹配。
3. **智能过滤**: 动态阈值可确保相关结果而无噪音。
4. **精确执行**: 找到的工具可以通过适当的参数验证直接执行。
### 设置要求
- 带有 pgvector 扩展的 PostgreSQL
- OpenAI API 密钥(或兼容的嵌入服务)
- 在 MCPHub 设置中启用智能路由

View File

@@ -0,0 +1,539 @@
---
title: 'Docker 部署'
description: '使用 Docker 和 Docker Compose 部署 MCPHub'
---
# Docker 部署
本指南介绍使用 Docker 部署 MCPHub包括开发和生产配置。
## Docker 快速开始
### 使用预构建镜像
```bash
# 拉取最新镜像
docker pull mcphub/mcphub:latest
# 使用默认配置运行
docker run -d \
--name mcphub \
-p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
mcphub/mcphub:latest
```
### 从源码构建
```bash
# 克隆仓库
git clone https://github.com/your-username/mcphub.git
cd mcphub
# 构建 Docker 镜像
docker build -t mcphub:local .
# 运行容器
docker run -d \
--name mcphub \
-p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
mcphub:local
```
## Docker Compose 设置
### 基本配置
创建 `docker-compose.yml` 文件:
```yaml
version: '3.8'
services:
mcphub:
image: mcphub/mcphub:latest
# 本地开发时使用:
# build: .
container_name: mcphub
ports:
- '3000:3000'
environment:
- NODE_ENV=production
- PORT=3000
- JWT_SECRET=${JWT_SECRET:-your-jwt-secret}
- DATABASE_URL=postgresql://mcphub:password@postgres:5432/mcphub
volumes:
- ./mcp_settings.json:/app/mcp_settings.json:ro
- ./servers.json:/app/servers.json:ro
- mcphub_data:/app/data
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
networks:
- mcphub-network
postgres:
image: postgres:15-alpine
container_name: mcphub-postgres
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql:ro
ports:
- '5432:5432'
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U mcphub -d mcphub']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- mcphub-network
volumes:
postgres_data:
mcphub_data:
networks:
mcphub-network:
driver: bridge
```
### 生产配置(包含 Nginx
```yaml
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: mcphub-nginx
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./ssl:/etc/nginx/ssl:ro
- nginx_logs:/var/log/nginx
depends_on:
- mcphub
restart: unless-stopped
networks:
- mcphub-network
mcphub:
image: mcphub/mcphub:latest
container_name: mcphub-app
expose:
- '3000'
environment:
- NODE_ENV=production
- PORT=3000
- JWT_SECRET=${JWT_SECRET}
- JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-24h}
- DATABASE_URL=postgresql://mcphub:${POSTGRES_PASSWORD}@postgres:5432/mcphub
- OPENAI_API_KEY=${OPENAI_API_KEY}
- REDIS_URL=redis://redis:6379
volumes:
- ./mcp_settings.json:/app/mcp_settings.json:ro
- ./servers.json:/app/servers.json:ro
- mcphub_data:/app/data
- mcphub_logs:/app/logs
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
networks:
- mcphub-network
healthcheck:
test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:3000/health']
interval: 30s
timeout: 10s
retries: 3
postgres:
image: postgres:15-alpine
container_name: mcphub-postgres
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./backups:/backups
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U mcphub -d mcphub']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- mcphub-network
redis:
image: redis:7-alpine
container_name: mcphub-redis
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- mcphub-network
volumes:
postgres_data:
redis_data:
mcphub_data:
mcphub_logs:
nginx_logs:
networks:
mcphub-network:
driver: bridge
```
### 环境变量
为 Docker Compose 创建 `.env` 文件:
```env
# 应用程序
NODE_ENV=production
JWT_SECRET=your-super-secret-jwt-key-change-this
JWT_EXPIRES_IN=24h
# 数据库
POSTGRES_PASSWORD=your-secure-database-password
# Redis
REDIS_PASSWORD=your-secure-redis-password
# 外部 API
OPENAI_API_KEY=your-openai-api-key
# 可选:自定义端口
# PORT=3000
```
## 开发设置
### 开发 Docker Compose
创建 `docker-compose.dev.yml`
```yaml
version: '3.8'
services:
mcphub-dev:
build:
context: .
dockerfile: Dockerfile.dev
container_name: mcphub-dev
ports:
- '3000:3000'
- '5173:5173' # 前端开发服务器
- '9229:9229' # 调试端口
environment:
- NODE_ENV=development
- PORT=3000
- DATABASE_URL=postgresql://mcphub:password@postgres:5432/mcphub
volumes:
- .:/app
- /app/node_modules
- /app/frontend/node_modules
depends_on:
- postgres
command: pnpm dev
networks:
- mcphub-dev
postgres:
image: postgres:15-alpine
container_name: mcphub-postgres-dev
environment:
- POSTGRES_DB=mcphub
- POSTGRES_USER=mcphub
- POSTGRES_PASSWORD=password
ports:
- '5432:5432'
volumes:
- postgres_dev_data:/var/lib/postgresql/data
networks:
- mcphub-dev
volumes:
postgres_dev_data:
networks:
mcphub-dev:
driver: bridge
```
### 开发 Dockerfile
创建 `Dockerfile.dev`
```dockerfile
FROM node:20-alpine
# 安装 pnpm
RUN npm install -g pnpm
# 设置工作目录
WORKDIR /app
# 复制包文件
COPY package.json pnpm-lock.yaml ./
COPY frontend/package.json ./frontend/
# 安装依赖
RUN pnpm install
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3000 5173 9229
# 启动开发服务器
CMD ["pnpm", "dev"]
```
## 运行应用程序
### 开发模式
```bash
# 启动开发环境
docker-compose -f docker-compose.dev.yml up -d
# 查看日志
docker-compose -f docker-compose.dev.yml logs -f mcphub-dev
# 停止开发环境
docker-compose -f docker-compose.dev.yml down
```
### 生产模式
```bash
# 启动生产环境
docker-compose up -d
# 查看日志
docker-compose logs -f mcphub
# 停止生产环境
docker-compose down
```
## 配置管理
### MCP 设置卷挂载
创建您的 `mcp_settings.json`
```json
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
},
"amap": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "your-api-key"
}
}
}
}
```
### 密钥管理
对于生产环境,使用 Docker 密钥:
```yaml
version: '3.8'
services:
mcphub:
image: mcphub/mcphub:latest
environment:
- JWT_SECRET_FILE=/run/secrets/jwt_secret
- DATABASE_PASSWORD_FILE=/run/secrets/db_password
secrets:
- jwt_secret
- db_password
secrets:
jwt_secret:
file: ./secrets/jwt_secret.txt
db_password:
file: ./secrets/db_password.txt
```
## 数据持久化
### 数据库备份
在 `docker-compose.yml` 中添加备份服务:
```yaml
services:
backup:
image: postgres:15-alpine
container_name: mcphub-backup
environment:
- PGPASSWORD=${POSTGRES_PASSWORD}
volumes:
- ./backups:/backups
- ./scripts/backup.sh:/backup.sh:ro
command: /bin/sh -c "chmod +x /backup.sh && /backup.sh"
depends_on:
- postgres
profiles:
- backup
networks:
- mcphub-network
```
创建 `scripts/backup.sh`
```bash
#!/bin/sh
BACKUP_FILE="/backups/mcphub_$(date +%Y%m%d_%H%M%S).sql"
pg_dump -h postgres -U mcphub -d mcphub > "$BACKUP_FILE"
echo "备份已创建:$BACKUP_FILE"
# 只保留最近 7 天的备份
find /backups -name "mcphub_*.sql" -mtime +7 -delete
```
运行备份:
```bash
docker-compose --profile backup run --rm backup
```
## 监控和健康检查
### 健康检查端点
在您的应用程序中添加:
```javascript
// 在您的 Express 应用中
app.get('/health', (req, res) => {
res.json({
status: 'healthy',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
memory: process.memoryUsage(),
version: process.env.npm_package_version,
});
});
```
### Docker 健康检查
```yaml
services:
mcphub:
# ... 其他配置
healthcheck:
test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:3000/health']
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
```
### 使用 Watchtower 监控
添加自动更新:
```yaml
services:
watchtower:
image: containrrr/watchtower
container_name: mcphub-watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=3600
- WATCHTOWER_INCLUDE_STOPPED=true
restart: unless-stopped
```
## 故障排除
### 常见问题
**容器启动失败**:使用 `docker-compose logs mcphub` 检查日志
**数据库连接错误**:确保 PostgreSQL 健康且可访问
**端口冲突**:检查端口 3000/5432 是否已被占用
**卷挂载问题**:验证文件路径和权限
### 调试命令
```bash
# 检查容器状态
docker-compose ps
# 查看日志
docker-compose logs -f [service_name]
# 在容器中执行命令
docker-compose exec mcphub sh
# 检查数据库连接
docker-compose exec postgres psql -U mcphub -d mcphub
# 重启特定服务
docker-compose restart mcphub
# 重新构建并重启
docker-compose up --build -d
```
### 性能优化
```yaml
services:
mcphub:
# ... 其他配置
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
cpus: '0.25'
```
此 Docker 设置为 MCPHub 提供了完整的容器化环境,包含开发和生产配置。

View File

@@ -0,0 +1,104 @@
---
title: '环境变量'
description: '使用环境变量配置 MCPHub'
---
# 环境变量
MCPHub 使用环境变量进行配置。本指南涵盖了所有可用的变量及其用法。
## 核心应用设置
### 服务器配置
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| `PORT` | `3000` | HTTP 服务器的端口号 |
| `INIT_TIMEOUT` | `300000` | 应用程序的初始超时时间 |
| `BASE_PATH` | `''` | 应用程序的基本路径 |
| `READONLY` | `false` | 设置为 `true` 以启用只读模式 |
| `MCPHUB_SETTING_PATH` | | MCPHub 设置文件的路径 |
| `NODE_ENV` | `development` | 应用程序环境 (`development`, `production`, `test`) |
```env
PORT=3000
INIT_TIMEOUT=300000
BASE_PATH=/api
READONLY=true
MCPHUB_SETTING_PATH=/path/to/settings
NODE_ENV=production
```
## 认证与安全
### JWT 配置
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| `JWT_SECRET` | - | 用于 JWT 令牌签名的密钥 (必需) |
```env
JWT_SECRET=your-super-secret-key-change-this-in-production
```
## 配置示例
### 开发环境
```env
# .env.development
NODE_ENV=development
PORT=3000
# 认证
JWT_SECRET=dev-secret-key
```
### 生产环境
```env
# .env.production
NODE_ENV=production
PORT=3000
# 安全
JWT_SECRET=your-super-secure-production-secret
```
### Docker 环境
```env
# .env.docker
NODE_ENV=production
PORT=3000
# 安全
JWT_SECRET_FILE=/run/secrets/jwt_secret
```
## 环境变量加载
MCPHub 按以下顺序加载环境变量:
1. 系统环境变量
2. `.env.local` (被 git 忽略)
3. `.env.{NODE_ENV}` (例如, `.env.production`)
4. `.env`
### 使用 dotenv-expand
MCPHub 支持变量扩展:
```env
BASE_URL=https://api.example.com
API_ENDPOINT=${BASE_URL}/v1
```
## 安全最佳实践
1. **永远不要将密钥提交**到版本控制
2. **为生产环境使用强大、独特的密钥**
3. **定期轮换密钥**
4. **使用特定于环境的文件**
5. **在启动时验证所有环境变量**
6. **为容器部署使用 Docker 密钥**

View File

@@ -0,0 +1,564 @@
---
title: 'MCP 设置配置'
description: '配置 MCPHub 的 MCP 服务器及其设置'
---
# MCP 设置配置
本指南说明如何使用 `mcp_settings.json` 文件和相关配置在 MCPHub 中配置 MCP 服务器。
## 配置文件概述
MCPHub 使用几个配置文件:
- **`mcp_settings.json`**:主要的 MCP 服务器配置
- **`servers.json`**:服务器元数据和分组
- **`.env`**:环境变量和密钥
## 基本 MCP 设置结构
### mcp_settings.json
```json
{
"mcpServers": {
"server-name": {
"command": "command-to-run",
"args": ["arg1", "arg2"],
"env": {
"ENV_VAR": "value"
},
"cwd": "/working/directory",
"timeout": 30000,
"restart": true
}
}
}
```
### 示例配置
```json
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {
"USER_AGENT": "MCPHub/1.0"
}
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"],
"timeout": 60000
},
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
"SLACK_TEAM_ID": "${SLACK_TEAM_ID}"
}
}
}
}
```
## 服务器配置选项
### 必需字段
| 字段 | 类型 | 描述 |
| --------- | ------ | ---------------- |
| `command` | string | 可执行命令或路径 |
| `args` | array | 命令行参数 |
### 可选字段
| 字段 | 类型 | 默认值 | 描述 |
| -------------- | ------- | --------------- | ------------------ |
| `env` | object | `{}` | 环境变量 |
| `cwd` | string | `process.cwd()` | 工作目录 |
| `timeout` | number | `30000` | 启动超时(毫秒) |
| `restart` | boolean | `true` | 失败时自动重启 |
| `maxRestarts` | number | `5` | 最大重启次数 |
| `restartDelay` | number | `5000` | 重启间延迟(毫秒) |
| `stdio` | string | `pipe` | stdio 配置 |
## 常见 MCP 服务器示例
### Web 和 API 服务器
#### Fetch 服务器
```json
{
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {
"USER_AGENT": "MCPHub/1.0",
"MAX_REDIRECTS": "10"
}
}
}
```
#### 使用 Playwright 进行网页抓取
```json
{
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"],
"timeout": 60000,
"env": {
"PLAYWRIGHT_BROWSERS_PATH": "/tmp/browsers"
}
}
}
```
### 文件和系统服务器
#### 文件系统服务器
```json
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"],
"env": {
"ALLOWED_OPERATIONS": "read,write,list"
}
}
}
```
#### SQLite 服务器
```json
{
"sqlite": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "/path/to/database.db"],
"env": {
"SQLITE_READONLY": "false"
}
}
}
```
### 通信服务器
#### Slack 服务器
```json
{
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
"SLACK_TEAM_ID": "${SLACK_TEAM_ID}",
"SLACK_APP_TOKEN": "${SLACK_APP_TOKEN}"
}
}
}
```
#### 邮件服务器
```json
{
"email": {
"command": "python",
"args": ["-m", "mcp_server_email"],
"env": {
"SMTP_HOST": "smtp.gmail.com",
"SMTP_PORT": "587",
"EMAIL_USER": "${EMAIL_USER}",
"EMAIL_PASSWORD": "${EMAIL_PASSWORD}"
}
}
}
```
### 开发和 API 服务器
#### GitHub 服务器
```json
{
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
```
#### Google Drive 服务器
```json
{
"gdrive": {
"command": "npx",
"args": ["-y", "@google/mcp-server-gdrive"],
"env": {
"GOOGLE_CLIENT_ID": "${GOOGLE_CLIENT_ID}",
"GOOGLE_CLIENT_SECRET": "${GOOGLE_CLIENT_SECRET}",
"GOOGLE_REFRESH_TOKEN": "${GOOGLE_REFRESH_TOKEN}"
}
}
}
```
### 地图和位置服务
#### 高德地图服务器
```json
{
"amap": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "${AMAP_API_KEY}",
"AMAP_LANGUAGE": "zh-cn"
}
}
}
```
#### OpenStreetMap 服务器
```json
{
"osm": {
"command": "python",
"args": ["-m", "mcp_server_osm"],
"env": {
"OSM_USER_AGENT": "MCPHub/1.0"
}
}
}
```
## 高级配置
### 环境变量替换
MCPHub 支持使用 `${VAR_NAME}` 语法进行环境变量替换:
```json
{
"mcpServers": {
"api-server": {
"command": "python",
"args": ["-m", "api_server"],
"env": {
"API_KEY": "${API_KEY}",
"API_URL": "${API_BASE_URL}/v1",
"DEBUG": "${NODE_ENV:development}"
}
}
}
}
```
可以使用 `${VAR_NAME:default}` 指定默认值:
```json
{
"timeout": "${MCP_TIMEOUT:30000}",
"maxRestarts": "${MCP_MAX_RESTARTS:5}"
}
```
### 条件配置
根据环境使用不同配置:
```json
{
"mcpServers": {
"database": {
"command": "python",
"args": ["-m", "db_server"],
"env": {
"DB_URL": "${NODE_ENV:development == 'production' ? DATABASE_URL : DEV_DATABASE_URL}"
}
}
}
}
```
### 自定义服务器脚本
#### 本地 Python 服务器
```json
{
"custom-python": {
"command": "python",
"args": ["./servers/custom_server.py"],
"cwd": "/app/custom-servers",
"env": {
"PYTHONPATH": "/app/custom-servers",
"CONFIG_FILE": "./config.json"
}
}
}
```
#### 本地 Node.js 服务器
```json
{
"custom-node": {
"command": "node",
"args": ["./servers/custom-server.js"],
"cwd": "/app/custom-servers",
"env": {
"NODE_ENV": "production"
}
}
}
```
## 服务器元数据配置
### servers.json
使用服务器元数据补充 `mcp_settings.json`
```json
{
"servers": {
"fetch": {
"name": "Fetch 服务器",
"description": "用于网络请求的 HTTP 客户端",
"category": "web",
"tags": ["http", "api", "web"],
"version": "1.0.0",
"author": "MCPHub 团队",
"documentation": "https://docs.mcphub.com/servers/fetch",
"enabled": true
},
"playwright": {
"name": "Playwright 浏览器",
"description": "网页自动化和抓取",
"category": "automation",
"tags": ["browser", "scraping", "automation"],
"version": "2.0.0",
"enabled": true
}
},
"groups": {
"web-tools": {
"name": "网页工具",
"description": "用于网页交互的工具",
"servers": ["fetch", "playwright"],
"access": "public"
},
"admin-tools": {
"name": "管理工具",
"description": "管理实用程序",
"servers": ["filesystem", "database"],
"access": "admin"
}
}
}
```
## 组管理
### 组配置
```json
{
"groups": {
"production": {
"name": "生产工具",
"description": "稳定的生产服务器",
"servers": ["fetch", "slack", "github"],
"access": "authenticated",
"rateLimit": {
"requestsPerMinute": 100,
"burstLimit": 20
}
},
"experimental": {
"name": "实验功能",
"description": "测试版和实验性服务器",
"servers": ["experimental-ai", "beta-search"],
"access": "admin",
"enabled": false
}
}
}
```
### 访问控制
| 访问级别 | 描述 |
| --------------- | ------------------- |
| `public` | 无需认证 |
| `authenticated` | 需要有效的 JWT 令牌 |
| `admin` | 需要管理员角色 |
| `custom` | 自定义权限逻辑 |
## 动态配置
### 热重载
MCPHub 支持配置热重载:
```bash
# 不重启重新加载配置
curl -X POST http://localhost:3000/api/admin/reload-config \
-H "Authorization: Bearer your-admin-token"
```
### 配置验证
MCPHub 在启动和重新加载时验证配置:
```json
{
"validation": {
"strict": true,
"allowUnknownServers": false,
"requireDocumentation": true
}
}
```
## 最佳实践
### 安全
1. **对敏感数据使用环境变量**
```json
{
"env": {
"API_KEY": "${API_KEY}",
"DATABASE_PASSWORD": "${DB_PASSWORD}"
}
}
```
2. **限制服务器权限**
```json
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/restricted/path"],
"env": {
"READONLY": "true"
}
}
}
```
### 性能
1. **设置适当的超时**
```json
{
"timeout": 30000,
"maxRestarts": 3,
"restartDelay": 5000
}
```
2. **资源限制**
```json
{
"env": {
"NODE_OPTIONS": "--max-old-space-size=512",
"MEMORY_LIMIT": "512MB"
}
}
```
### 监控
1. **启用健康检查**
```json
{
"healthCheck": {
"enabled": true,
"interval": 30000,
"timeout": 5000
}
}
```
2. **日志配置**
```json
{
"env": {
"LOG_LEVEL": "info",
"LOG_FORMAT": "json"
}
}
```
## 故障排除
### 常见问题
**服务器无法启动**:检查命令和参数
```bash
# 手动测试命令
uvx mcp-server-fetch
```
**找不到环境变量**:验证 `.env` 文件
```bash
# 检查环境
printenv | grep API_KEY
```
**权限错误**:检查文件权限和路径
```bash
# 验证可执行权限
ls -la /path/to/server
```
### 调试配置
启用调试模式进行详细日志记录:
```json
{
"debug": {
"enabled": true,
"logLevel": "debug",
"includeEnv": false,
"logStartup": true
}
}
```
### 验证错误
常见验证错误和解决方案:
1. **缺少必需字段**:添加 `command` 和 `args`
2. **无效超时**:使用数字,不是字符串
3. **找不到环境变量**:检查 `.env` 文件
4. **找不到命令**:验证安装和 PATH
这个全面的指南涵盖了在 MCPHub 中为各种用例和环境配置 MCP 服务器的所有方面。

View File

@@ -0,0 +1,373 @@
---
title: 'Nginx 配置'
description: '配置 Nginx 作为 MCPHub 的反向代理'
---
# Nginx 配置
本指南说明如何配置 Nginx 作为 MCPHub 的反向代理,包括 SSL 终止、负载均衡和缓存策略。
## 基本反向代理设置
### 配置文件
创建或更新您的 Nginx 配置文件(`/etc/nginx/sites-available/mcphub`
```nginx
server {
listen 80;
server_name your-domain.com;
# 将 HTTP 重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL 配置
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# 主应用程序
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 86400;
}
# API 端点,为 MCP 操作设置更长的超时
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 300;
proxy_connect_timeout 60;
proxy_send_timeout 60;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://127.0.0.1:3000;
proxy_cache_valid 200 1d;
proxy_cache_valid 404 1m;
add_header Cache-Control "public, immutable";
expires 1y;
}
}
```
### 启用配置
```bash
# 创建符号链接启用站点
sudo ln -s /etc/nginx/sites-available/mcphub /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重新加载 Nginx
sudo systemctl reload nginx
```
## 负载均衡配置
对于具有多个 MCPHub 实例的高可用性设置:
```nginx
upstream mcphub_backend {
least_conn;
server 127.0.0.1:3000 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3002 weight=1 max_fails=3 fail_timeout=30s;
# 健康检查Nginx Plus 功能)
# health_check interval=5s fails=3 passes=2;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL 和其他配置...
location / {
proxy_pass http://mcphub_backend;
# 其他代理设置...
}
}
```
## 缓存配置
### 浏览器缓存
```nginx
# 缓存静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://127.0.0.1:3000;
expires 1y;
add_header Cache-Control "public, immutable";
}
# 缓存 API 响应(小心动态内容)
location /api/public/ {
proxy_pass http://127.0.0.1:3000;
proxy_cache mcphub_cache;
proxy_cache_valid 200 5m;
proxy_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
}
```
### Nginx 代理缓存
在 `nginx.conf` 的 `http` 块中添加:
```nginx
http {
# 代理缓存配置
proxy_cache_path /var/cache/nginx/mcphub
levels=1:2
keys_zone=mcphub_cache:10m
max_size=1g
inactive=60m
use_temp_path=off;
# 其他配置...
}
```
## WebSocket 支持
对于实时功能和 SSE服务器发送事件
```nginx
location /api/stream {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 禁用实时响应的缓冲
proxy_buffering off;
proxy_cache off;
# 长连接超时
proxy_read_timeout 24h;
proxy_send_timeout 24h;
}
```
## 安全配置
### 速率限制
```nginx
http {
# 定义速率限制区域
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
# 对 API 端点应用速率限制
location /api/ {
limit_req zone=api burst=20 nodelay;
# 其他配置...
}
# 登录端点的严格速率限制
location /api/auth/login {
limit_req zone=login burst=5;
# 其他配置...
}
}
}
```
### IP 白名单
```nginx
# 为管理端点允许特定 IP
location /api/admin/ {
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
proxy_pass http://127.0.0.1:3000;
# 其他代理设置...
}
```
## 监控和日志
### 访问日志
```nginx
http {
# 自定义日志格式
log_format mcphub_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
server {
# 启用访问日志
access_log /var/log/nginx/mcphub_access.log mcphub_format;
error_log /var/log/nginx/mcphub_error.log;
# 其他配置...
}
}
```
### 状态页面
```nginx
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
```
## Docker 集成
当在 Docker 中运行 MCPHub 时,更新代理配置:
```nginx
upstream mcphub_docker {
server mcphub:3000; # Docker 服务名
}
server {
location / {
proxy_pass http://mcphub_docker;
# 其他代理设置...
}
}
```
## 完整示例配置
使用提供的 `nginx.conf.example` 的生产就绪示例:
```bash
# 复制示例配置
cp nginx.conf.example /etc/nginx/sites-available/mcphub
# 使用您的域名和路径更新配置
sudo nano /etc/nginx/sites-available/mcphub
# 启用站点
sudo ln -s /etc/nginx/sites-available/mcphub /etc/nginx/sites-enabled/
# 测试并重新加载
sudo nginx -t && sudo systemctl reload nginx
```
## 故障排除
### 常见问题
**502 Bad Gateway**:检查 MCPHub 是否正在运行且可访问
**504 Gateway Timeout**:为长时间运行的操作增加 `proxy_read_timeout`
**WebSocket 连接失败**:确保正确的 `Upgrade` 和 `Connection` 头
**缓存问题**:清除代理缓存或在开发中禁用
### 调试命令
```bash
# 测试 Nginx 配置
sudo nginx -t
# 检查 Nginx 状态
sudo systemctl status nginx
# 查看错误日志
sudo tail -f /var/log/nginx/error.log
# 检查 MCPHub 是否响应
curl -I http://localhost:3000
```
## 性能优化
### 工作进程
```nginx
# 在 nginx.conf 中
worker_processes auto;
worker_connections 1024;
```
### 缓冲区大小
```nginx
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
```
### Keep-Alive
```nginx
upstream mcphub_backend {
server 127.0.0.1:3000;
keepalive 32;
}
location / {
proxy_pass http://mcphub_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
```
此配置为在 Nginx 后运行 MCPHub 提供了坚实的基础,具有适当的安全性、性能和可靠性功能。

421
docs/zh/development.mdx Normal file
View File

@@ -0,0 +1,421 @@
---
title: '开发指南'
description: 'MCPHub 本地开发环境搭建和开发工作流指南'
---
## 概述
本指南将帮助您搭建 MCPHub 的本地开发环境,了解项目结构,并掌握开发工作流。
<Info>**前提条件**:请确保已安装 Node.js 18+ 和 Git。</Info>
## 环境准备
### 系统要求
在开始开发之前,请确保您的系统满足以下要求:
<CardGroup cols={2}>
<Card title="软件依赖" icon="download">
- **Node.js**: 18.0+ 版本 - **npm**: 8.0+ 版本 - **Git**: 最新版本 - **Docker**:
可选,用于容器化开发
</Card>
<Card title="推荐工具" icon="toolbox">
- **VS Code**: 推荐的代码编辑器 - **Postman**: API 测试工具 - **TablePlus**: 数据库管理工具 -
**Docker Desktop**: 容器管理
</Card>
</CardGroup>
### 验证环境
```bash
# 检查 Node.js 版本
node --version # 应该 >= 18.0.0
# 检查 npm 版本
npm --version # 应该 >= 8.0.0
# 检查 Git 版本
git --version
# 检查 Docker可选
docker --version
```
## 克隆项目
### 获取源代码
```bash
# 克隆主仓库
git clone https://github.com/mcphub/mcphub.git
cd mcphub
# 或者克隆您的 fork
git clone https://github.com/YOUR_USERNAME/mcphub.git
cd mcphub
```
### 项目结构
```
mcphub/
├── src/ # 源代码目录
│ ├── controllers/ # 控制器层
│ ├── middleware/ # 中间件
│ ├── models/ # 数据模型
│ ├── routes/ # 路由定义
│ ├── services/ # 业务逻辑层
│ ├── utils/ # 工具函数
│ └── index.ts # 应用入口
├── tests/ # 测试文件
├── docs/ # 文档源码
├── docker/ # Docker 配置
├── scripts/ # 构建脚本
├── prisma/ # 数据库模式
├── package.json # 项目依赖
├── tsconfig.json # TypeScript 配置
├── .env.example # 环境变量示例
└── README.md # 项目说明
```
## 安装依赖
### 安装项目依赖
```bash
# 安装生产和开发依赖
npm install
# 仅安装生产依赖
npm ci --only=production
```
### 全局工具安装
```bash
# 安装 TypeScript 编译器
npm install -g typescript
# 安装开发工具
npm install -g tsx nodemon prisma
# 安装 MCPHub CLI可选
npm install -g @mcphub/cli
```
## 配置开发环境
### 环境变量配置
```bash
# 复制环境变量模板
cp .env.example .env
# 编辑环境变量
nano .env
```
开发环境的 `.env` 配置示例:
```bash title=".env"
# 应用配置
NODE_ENV=development
PORT=3000
HOST=localhost
# 数据库配置
DATABASE_URL=sqlite:./data/dev.db
# JWT 配置
JWT_SECRET=dev-jwt-secret-key
JWT_EXPIRES_IN=7d
# 日志配置
LOG_LEVEL=debug
LOG_FORMAT=dev
# CORS 配置
CORS_ORIGIN=http://localhost:3000,http://localhost:3001
# 管理员账户
ADMIN_EMAIL=dev@mcphub.io
ADMIN_PASSWORD=dev123
# 开发功能开关
ENABLE_DEBUG_ROUTES=true
ENABLE_SWAGGER=true
ENABLE_HOT_RELOAD=true
```
### 数据库初始化
```bash
# 生成 Prisma 客户端
npx prisma generate
# 运行数据库迁移
npx prisma migrate dev --name init
# 填充测试数据
npm run db:seed
```
## 启动开发服务器
### 开发模式启动
```bash
# 启动开发服务器(带热重载)
npm run dev
# 或者使用 tsx 直接运行
npx tsx watch src/index.ts
```
### 后台模式启动
```bash
# 使用 PM2 启动(需要先安装 PM2
npm install -g pm2
npm run dev:pm2
# 查看进程状态
pm2 status
# 查看日志
pm2 logs mcphub-dev
```
### 验证启动
访问以下 URL 验证服务是否正常启动:
- **主页**: http://localhost:3000
- **健康检查**: http://localhost:3000/health
- **API 文档**: http://localhost:3000/api/docs
- **管理界面**: http://localhost:3000/admin
## 开发工作流
### 1. 功能开发流程
```bash
# 1. 创建功能分支
git checkout -b feature/your-feature-name
# 2. 进行开发...
# 3. 运行测试
npm test
# 4. 代码格式化
npm run lint:fix
# 5. 提交代码
git add .
git commit -m "feat: add your feature description"
# 6. 推送分支
git push origin feature/your-feature-name
# 7. 创建 Pull Request
```
### 2. 代码规范
MCPHub 项目使用以下代码规范工具:
```bash
# 代码检查
npm run lint
# 自动修复
npm run lint:fix
# 格式化代码
npm run format
# 类型检查
npm run type-check
```
### 3. 测试开发
```bash
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 运行测试并生成覆盖率报告
npm run test:coverage
# 监听模式运行测试
npm run test:watch
```
## 调试技巧
### 1. VS Code 调试配置
创建 `.vscode/launch.json` 文件:
```json title=".vscode/launch.json"
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug MCPHub",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/index.ts",
"runtimeArgs": ["-r", "tsx/cjs"],
"env": {
"NODE_ENV": "development"
},
"console": "integratedTerminal",
"skipFiles": ["<node_internals>/**"]
}
]
}
```
### 2. 日志调试
使用内置的日志系统进行调试:
```typescript
import { logger } from '@/utils/logger';
// 不同级别的日志
logger.debug('调试信息', { data });
logger.info('信息日志', { userId });
logger.warn('警告信息', { error });
logger.error('错误信息', { error, stack });
```
### 3. 数据库调试
```bash
# 查看数据库内容
npx prisma studio
# 重置数据库
npx prisma migrate reset
# 查看迁移状态
npx prisma migrate status
```
## 常用开发命令
### 项目管理
```bash
# 安装新依赖
npm install package-name
npm install -D package-name # 开发依赖
# 更新依赖
npm update
# 清理缓存
npm cache clean --force
# 重新安装依赖
rm -rf node_modules package-lock.json
npm install
```
### 构建和部署
```bash
# 构建项目
npm run build
# 预览构建结果
npm run preview
# 构建 Docker 镜像
npm run docker:build
# 运行 Docker 容器
npm run docker:run
```
### 数据库操作
```bash
# 创建新迁移
npx prisma migrate dev --name your-migration-name
# 重置数据库
npx prisma migrate reset
# 推送模式变更
npx prisma db push
# 生成客户端
npx prisma generate
```
## 常见问题
<AccordionGroup>
<Accordion icon="question" title="端口被占用">
**错误信息**: `Error: listen EADDRINUSE :::3000`
**解决方案**:
```bash
# 查找占用端口的进程
lsof -i :3000
# 杀死进程
kill -9 PID
# 或者使用不同端口
PORT=3001 npm run dev
```
</Accordion>
<Accordion icon="question" title="数据库连接失败">
**可能原因**: 数据库文件权限或路径问题 **解决方案**: ```bash # 检查数据库文件 ls -la data/ #
重新初始化数据库 rm data/dev.db npx prisma migrate dev ```
</Accordion>
<Accordion icon="question" title="TypeScript 编译错误">
**解决方案**:
```bash
# 清理构建缓存
npm run clean
# 重新安装类型定义
npm install @types/node @types/express
# 重新生成 Prisma 客户端
npx prisma generate
```
</Accordion>
</AccordionGroup>
## 进阶主题
<CardGroup cols={2}>
<Card title="架构设计" icon="building" href="/zh/development/architecture">
了解 MCPHub 的整体架构和设计模式
</Card>
<Card title="API 开发" icon="code" href="/zh/development/api-development">
学习如何开发和设计 RESTful API
</Card>
<Card title="性能优化" icon="rocket" href="/zh/development/performance">
掌握性能分析和优化技巧
</Card>
<Card title="部署指南" icon="cloud" href="/zh/deployment/production">
了解生产环境部署的最佳实践
</Card>
</CardGroup>

View File

@@ -0,0 +1,244 @@
---
title: '开发环境搭建'
description: '学习如何为 MCPHub 搭建开发环境'
---
# 开发环境搭建
本指南将帮助您搭建 MCPHub 的开发环境,为项目贡献代码。
## 先决条件
在开始之前,请确保您已安装以下软件:
- **Node.js**(版本 18 或更高)
- **pnpm**(推荐的包管理器)
- **Git**
- **Docker**(可选,用于容器化开发)
## 搭建开发环境
### 1. 克隆仓库
```bash
git clone https://github.com/your-username/mcphub.git
cd mcphub
```
### 2. 安装依赖
```bash
pnpm install
```
### 3. 环境配置
在根目录创建 `.env` 文件:
```bash
cp .env.example .env
```
配置以下环境变量:
```env
# 服务器配置
PORT=3000
NODE_ENV=development
# 数据库配置
DATABASE_URL=postgresql://username:password@localhost:5432/mcphub
# JWT 配置
JWT_SECRET=your-secret-key
JWT_EXPIRES_IN=24h
# OpenAI 配置(用于智能路由)
OPENAI_API_KEY=your-openai-api-key
```
### 4. 数据库设置
如果使用 PostgreSQL创建数据库
```bash
createdb mcphub
```
### 5. MCP 服务器配置
创建或修改 `mcp_settings.json`
```json
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
}
```
## 开发工作流
### 运行开发服务器
同时启动后端和前端开发模式:
```bash
pnpm dev
```
这将启动:
- 后端服务器:`http://localhost:3000`
- 前端开发服务器:`http://localhost:5173`
### 仅运行后端
```bash
pnpm backend:dev
```
### 仅运行前端
```bash
pnpm frontend:dev
```
### 构建项目
构建后端和前端:
```bash
pnpm build
```
## 项目结构
```
mcphub/
├── src/ # 后端源代码
│ ├── controllers/ # Express 控制器
│ ├── routes/ # API 路由
│ ├── services/ # 业务逻辑
│ ├── models/ # 数据库模型
│ └── utils/ # 工具函数
├── frontend/ # 前端 React 应用
│ ├── src/
│ │ ├── components/ # React 组件
│ │ ├── pages/ # 页面组件
│ │ ├── services/ # API 服务
│ │ └── utils/ # 前端工具
├── docs/ # 文档
├── bin/ # CLI 脚本
└── scripts/ # 构建和工具脚本
```
## 开发工具
### 代码检查和格式化
```bash
# 运行 ESLint
pnpm lint
# 使用 Prettier 格式化代码
pnpm format
```
### 测试
```bash
# 运行测试
pnpm test
# 监视模式运行测试
pnpm test --watch
```
### 调试
使用 Node.js 检查器调试后端:
```bash
pnpm backend:debug
```
然后将调试器连接到 `http://localhost:9229`。
## 进行修改
### 后端开发
1. **控制器**:处理 HTTP 请求和响应
2. **服务**:实现业务逻辑
3. **模型**:定义数据库架构
4. **路由**:定义 API 端点
### 前端开发
1. **组件**:可重用的 React 组件
2. **页面**:特定路由的组件
3. **服务**API 通信
4. **钩子**:自定义 React 钩子
### 添加新的 MCP 服务器
1. 使用新的服务器配置更新 `mcp_settings.json`
2. 测试服务器集成
3. 必要时更新文档
## 常见开发任务
### 添加新的 API 端点
1. 在 `src/controllers/` 中创建控制器
2. 在 `src/routes/` 中定义路由
3. 添加必要的中间件
4. 为新端点编写测试
### 添加新的前端功能
1. 在 `frontend/src/components/` 中创建组件
2. 根据需要添加路由
3. 实现 API 集成
4. 使用 Tailwind CSS 进行样式设计
### 数据库迁移
修改数据库架构时:
1. 更新 `src/models/` 中的模型
2. 如果使用 TypeORM创建迁移脚本
3. 在本地测试迁移
## 故障排除
### 常见问题
**端口冲突**:确保端口 3000 和 5173 可用
**数据库连接**:验证 PostgreSQL 正在运行且凭据正确
**MCP 服务器启动**:检查 `mcp_settings.json` 中的服务器配置
**权限问题**:确保 MCP 服务器具有必要的权限
### 获取帮助
- 查看[贡献指南](/zh/development/contributing)
- 阅读[架构文档](/zh/development/architecture)
- 在 GitHub 上提交问题报告 bug
- 加入我们的社区讨论
## 下一步
- 阅读[架构概述](/zh/development/architecture)
- 了解[贡献指南](/zh/development/contributing)
- 探索[配置选项](/zh/configuration/environment-variables)

892
docs/zh/essentials/code.mdx Normal file
View File

@@ -0,0 +1,892 @@
---
title: '代码块'
description: 'MCPHub 文档中代码块的编写和展示指南'
---
## 内联代码
在 MCPHub 文档中使用内联代码来标记命令、配置键、文件名或短代码片段:
```md
使用 `mcphub start` 命令启动服务器,配置 `MCPHUB_PORT` 环境变量。
```
使用 `mcphub start` 命令启动服务器,配置 `MCPHUB_PORT` 环境变量。
## 代码块语法
### 基本代码块
MCPHub 支持多种编程语言的语法高亮:
````md
```javascript
// JavaScript 示例
const mcpClient = new MCPClient({
endpoint: process.env.MCPHUB_ENDPOINT,
apiKey: process.env.MCPHUB_API_KEY,
});
```
````
```javascript
// JavaScript 示例
const mcpClient = new MCPClient({
endpoint: process.env.MCPHUB_ENDPOINT,
apiKey: process.env.MCPHUB_API_KEY,
});
```
### TypeScript 代码
````md
```typescript
interface MCPServerConfig {
id: string;
name: string;
endpoint: string;
capabilities: string[];
metadata?: Record<string, any>;
}
class MCPServer implements MCPServerConfig {
constructor(
public id: string,
public name: string,
public endpoint: string,
public capabilities: string[],
) {}
}
```
````
```typescript
interface MCPServerConfig {
id: string;
name: string;
endpoint: string;
capabilities: string[];
metadata?: Record<string, any>;
}
class MCPServer implements MCPServerConfig {
constructor(
public id: string,
public name: string,
public endpoint: string,
public capabilities: string[],
) {}
}
```
### Python 代码
````md
```python
import requests
from typing import Dict, List, Optional
class MCPHubClient:
def __init__(self, endpoint: str, api_key: str):
self.endpoint = endpoint
self.api_key = api_key
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
def create_server(self, config: Dict) -> Dict:
response = requests.post(
f'{self.endpoint}/api/servers',
json=config,
headers=self.headers
)
return response.json()
```
````
```python
import requests
from typing import Dict, List, Optional
class MCPHubClient:
def __init__(self, endpoint: str, api_key: str):
self.endpoint = endpoint
self.api_key = api_key
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
def create_server(self, config: Dict) -> Dict:
response = requests.post(
f'{self.endpoint}/api/servers',
json=config,
headers=self.headers
)
return response.json()
```
## 配置文件
### YAML 配置
````md
```yaml title="mcphub.yml"
server:
port: 3000
host: 0.0.0.0
database:
type: postgresql
host: localhost
port: 5432
database: mcphub
username: mcphub_user
password: secure_password
mcp:
servers:
- id: ai-assistant
name: AI Assistant Server
endpoint: https://ai.example.com
capabilities:
- chat
- completion
- id: data-processor
name: Data Processing Server
endpoint: https://data.example.com
capabilities:
- analysis
- transformation
routing:
strategy: round_robin
health_check:
enabled: true
interval: 30s
timeout: 5s
logging:
level: info
format: json
file: /var/log/mcphub/app.log
```
````
```yaml title="mcphub.yml"
server:
port: 3000
host: 0.0.0.0
database:
type: postgresql
host: localhost
port: 5432
database: mcphub
username: mcphub_user
password: secure_password
mcp:
servers:
- id: ai-assistant
name: AI Assistant Server
endpoint: https://ai.example.com
capabilities:
- chat
- completion
- id: data-processor
name: Data Processing Server
endpoint: https://data.example.com
capabilities:
- analysis
- transformation
routing:
strategy: round_robin
health_check:
enabled: true
interval: 30s
timeout: 5s
logging:
level: info
format: json
file: /var/log/mcphub/app.log
```
### JSON 配置
````md
```json title="package.json"
{
"name": "@mcphub/server",
"version": "2.1.0",
"description": "Model Context Protocol Hub Server",
"main": "dist/index.js",
"scripts": {
"start": "node dist/index.js",
"dev": "tsx watch src/index.ts",
"build": "tsc",
"test": "jest",
"test:watch": "jest --watch",
"lint": "eslint src/**/*.ts",
"migrate": "prisma migrate deploy"
},
"dependencies": {
"@prisma/client": "^5.7.0",
"express": "^4.18.2",
"helmet": "^7.1.0",
"cors": "^2.8.5",
"jsonwebtoken": "^9.0.2",
"bcryptjs": "^2.4.3",
"winston": "^3.11.0"
},
"devDependencies": {
"@types/node": "^20.10.0",
"@types/express": "^4.17.21",
"typescript": "^5.3.0",
"tsx": "^4.6.0",
"jest": "^29.7.0",
"eslint": "^8.55.0"
}
}
```
````
```json title="package.json"
{
"name": "@mcphub/server",
"version": "2.1.0",
"description": "Model Context Protocol Hub Server",
"main": "dist/index.js",
"scripts": {
"start": "node dist/index.js",
"dev": "tsx watch src/index.ts",
"build": "tsc",
"test": "jest",
"test:watch": "jest --watch",
"lint": "eslint src/**/*.ts",
"migrate": "prisma migrate deploy"
},
"dependencies": {
"@prisma/client": "^5.7.0",
"express": "^4.18.2",
"helmet": "^7.1.0",
"cors": "^2.8.5",
"jsonwebtoken": "^9.0.2",
"bcryptjs": "^2.4.3",
"winston": "^3.11.0"
},
"devDependencies": {
"@types/node": "^20.10.0",
"@types/express": "^4.17.21",
"typescript": "^5.3.0",
"tsx": "^4.6.0",
"jest": "^29.7.0",
"eslint": "^8.55.0"
}
}
```
### Docker 配置
````md
```dockerfile title="Dockerfile"
FROM node:18-alpine AS builder
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
COPY tsconfig.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源码
COPY src/ ./src/
# 构建应用
RUN npm run build
# 生产环境镜像
FROM node:18-alpine AS production
WORKDIR /app
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S mcphub -u 1001
# 复制构建产物
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
# 设置权限
USER mcphub
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node dist/health-check.js
EXPOSE 3000
CMD ["node", "dist/index.js"]
```
````
```dockerfile title="Dockerfile"
FROM node:18-alpine AS builder
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
COPY tsconfig.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源码
COPY src/ ./src/
# 构建应用
RUN npm run build
# 生产环境镜像
FROM node:18-alpine AS production
WORKDIR /app
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S mcphub -u 1001
# 复制构建产物
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
# 设置权限
USER mcphub
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node dist/health-check.js
EXPOSE 3000
CMD ["node", "dist/index.js"]
```
## 终端命令
### Bash/Shell 命令
````md
```bash
# 克隆 MCPHub 仓库
git clone https://github.com/mcphub/mcphub.git
cd mcphub
# 安装依赖
npm install
# 复制环境变量文件
cp .env.example .env
# 设置数据库
npm run db:setup
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 启动生产服务器
npm start
```
````
```bash
# 克隆 MCPHub 仓库
git clone https://github.com/mcphub/mcphub.git
cd mcphub
# 安装依赖
npm install
# 复制环境变量文件
cp .env.example .env
# 设置数据库
npm run db:setup
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 启动生产服务器
npm start
```
### PowerShell 命令
````md
```powershell
# Windows PowerShell 安装步骤
# 克隆仓库
git clone https://github.com/mcphub/mcphub.git
Set-Location mcphub
# 安装 Node.js 依赖
npm install
# 复制环境变量文件
Copy-Item .env.example .env
# 启动开发服务器
npm run dev
```
````
```powershell
# Windows PowerShell 安装步骤
# 克隆仓库
git clone https://github.com/mcphub/mcphub.git
Set-Location mcphub
# 安装 Node.js 依赖
npm install
# 复制环境变量文件
Copy-Item .env.example .env
# 启动开发服务器
npm run dev
```
### Docker 命令
````md
```bash
# 使用 Docker 运行 MCPHub
docker run -d \
--name mcphub \
-p 3000:3000 \
-e NODE_ENV=production \
-e DATABASE_URL=postgresql://user:pass@host:5432/mcphub \
-e JWT_SECRET=your-secret-key \
mcphub/server:latest
# 查看日志
docker logs mcphub
# 进入容器
docker exec -it mcphub sh
# 停止容器
docker stop mcphub
# 使用 Docker Compose
docker-compose up -d
```
````
```bash
# 使用 Docker 运行 MCPHub
docker run -d \
--name mcphub \
-p 3000:3000 \
-e NODE_ENV=production \
-e DATABASE_URL=postgresql://user:pass@host:5432/mcphub \
-e JWT_SECRET=your-secret-key \
mcphub/server:latest
# 查看日志
docker logs mcphub
# 进入容器
docker exec -it mcphub sh
# 停止容器
docker stop mcphub
# 使用 Docker Compose
docker-compose up -d
```
## API 请求示例
### cURL 命令
````md
```bash
# 创建新的 MCP 服务器
curl -X POST https://api.mcphub.io/api/servers \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "AI Assistant Server",
"endpoint": "https://ai.example.com",
"capabilities": ["chat", "completion"],
"groupId": "production"
}'
# 获取服务器列表
curl -X GET "https://api.mcphub.io/api/servers?limit=10&active=true" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# 更新服务器配置
curl -X PUT https://api.mcphub.io/api/servers/server-123 \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated AI Assistant",
"active": true
}'
# 删除服务器
curl -X DELETE https://api.mcphub.io/api/servers/server-123 \
-H "Authorization: Bearer YOUR_API_TOKEN"
```
````
```bash
# 创建新的 MCP 服务器
curl -X POST https://api.mcphub.io/api/servers \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "AI Assistant Server",
"endpoint": "https://ai.example.com",
"capabilities": ["chat", "completion"],
"groupId": "production"
}'
# 获取服务器列表
curl -X GET "https://api.mcphub.io/api/servers?limit=10&active=true" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# 更新服务器配置
curl -X PUT https://api.mcphub.io/api/servers/server-123 \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated AI Assistant",
"active": true
}'
# 删除服务器
curl -X DELETE https://api.mcphub.io/api/servers/server-123 \
-H "Authorization: Bearer YOUR_API_TOKEN"
```
### HTTP 请求示例
````md
```http
POST /api/servers HTTP/1.1
Host: api.mcphub.io
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"name": "AI Assistant Server",
"endpoint": "https://ai.example.com",
"capabilities": ["chat", "completion"],
"groupId": "production"
}
```
````
```http
POST /api/servers HTTP/1.1
Host: api.mcphub.io
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"name": "AI Assistant Server",
"endpoint": "https://ai.example.com",
"capabilities": ["chat", "completion"],
"groupId": "production"
}
```
## 数据库查询
### SQL 查询
````md
```sql
-- 查询活跃的 MCP 服务器
SELECT
id,
name,
endpoint,
status,
created_at
FROM mcp_servers
WHERE status = 'active'
ORDER BY created_at DESC;
-- 统计每个组的服务器数量
SELECT
g.name as group_name,
COUNT(s.id) as server_count
FROM server_groups g
LEFT JOIN mcp_servers s ON g.id = s.group_id
GROUP BY g.id, g.name
ORDER BY server_count DESC;
-- 查询最近的错误日志
SELECT
timestamp,
level,
message,
metadata
FROM logs
WHERE level = 'error'
AND timestamp >= NOW() - INTERVAL '1 hour'
ORDER BY timestamp DESC
LIMIT 50;
```
````
```sql
-- 查询活跃的 MCP 服务器
SELECT
id,
name,
endpoint,
status,
created_at
FROM mcp_servers
WHERE status = 'active'
ORDER BY created_at DESC;
-- 统计每个组的服务器数量
SELECT
g.name as group_name,
COUNT(s.id) as server_count
FROM server_groups g
LEFT JOIN mcp_servers s ON g.id = s.group_id
GROUP BY g.id, g.name
ORDER BY server_count DESC;
-- 查询最近的错误日志
SELECT
timestamp,
level,
message,
metadata
FROM logs
WHERE level = 'error'
AND timestamp >= NOW() - INTERVAL '1 hour'
ORDER BY timestamp DESC
LIMIT 50;
```
## 代码块最佳实践
### 1. 语言标识
始终为代码块指定正确的语言:
````md
````javascript // ✅ 正确
```js // ✅ 也可以
```; // ❌ 避免无语言标识
````
````
### 2. 文件名标题
为配置文件和示例添加文件名:
````md
```yaml title="docker-compose.yml"
version: '3.8'
services:
mcphub:
image: mcphub/server:latest
```
````
### 3. 突出显示重要行
使用行号高亮重要代码:
````md
```javascript {3,7-9}
const express = require('express');
const app = express();
const port = process.env.PORT || 3000; // 重要:端口配置
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
app.listen(port, () => {
// 重要:服务器启动
console.log(`Server running on port ${port}`);
}); // 重要:结束
```
````
### 4. 代码注释
添加有意义的中文注释:
```javascript
// 初始化 MCPHub 客户端
const client = new MCPHubClient({
endpoint: 'https://api.mcphub.io',
apiKey: process.env.API_KEY,
timeout: 30000, // 30 秒超时
retries: 3, // 重试 3 次
});
// 配置路由策略
client.setRoutingStrategy({
type: 'weighted', // 加权轮询
healthCheck: true, // 启用健康检查
fallback: 'round_robin', // 降级策略
});
```
### 5. 错误处理示例
展示完整的错误处理:
```javascript
try {
const server = await mcpClient.createServer({
name: 'AI Assistant',
endpoint: 'https://ai.example.com',
});
console.log('服务器创建成功:', server.id);
} catch (error) {
if (error.code === 'DUPLICATE_SERVER') {
console.log('服务器已存在,跳过创建');
} else if (error.code === 'INVALID_ENDPOINT') {
console.error('无效的端点地址:', error.message);
} else {
console.error('创建失败:', error.message);
throw error; // 重新抛出未知错误
}
}
```
## 支持的语言
MCPHub 文档支持以下编程语言的语法高亮:
- **JavaScript/TypeScript**: `javascript`, `js`, `typescript`, `ts`
- **Python**: `python`, `py`
- **Shell/Bash**: `bash`, `shell`, `sh`
- **PowerShell**: `powershell`, `ps1`
- **SQL**: `sql`, `postgresql`, `mysql`
- **YAML**: `yaml`, `yml`
- **JSON**: `json`
- **XML**: `xml`
- **HTML**: `html`
- **CSS**: `css`
- **Dockerfile**: `dockerfile`
- **Go**: `go`
- **Rust**: `rust`
- **Java**: `java`
- **C#**: `csharp`, `cs`
- **PHP**: `php`
- **Ruby**: `ruby`
- **HTTP**: `http`
- **Markdown**: `markdown`, `md`
`````
### 使用三个反引号
````md
```javascript
console.log('Hello World');
`````
`````
### 语法高亮
我们使用 [Prism](https://prismjs.com/) 来语法高亮显示。Prism 支持 [各种编程语言](https://prismjs.com/#supported-languages)。
要添加语法高亮显示,请在代码块的第一行指定语言。
````md
```python
def hello():
print("Hello World")
```
`````
```python
def hello():
print("Hello World")
```
## 代码组
<CodeGroup>
```bash npm
npm i mintlify
```
```bash yarn
yarn add mintlify
```
```bash pnpm
pnpm add mintlify
```
</CodeGroup>
`CodeGroup` 允许您将多个代码块组合在一起,并为它们提供选项卡。
````md
<CodeGroup>
```bash npm
npm i mintlify
```
```bash yarn
yarn add mintlify
```
```bash pnpm
pnpm add mintlify
```
</CodeGroup>
````
### 代码标题
您也可以为代码块设置标题:
```javascript hello.js
const hello = 'world';
console.log(hello);
```
````md
```javascript hello.js
const hello = 'world';
console.log(hello);
```
````

View File

@@ -0,0 +1,134 @@
---
title: '图片和视频'
description: '在您的文档中添加图片和视频'
---
## 图片
### 使用 Markdown
您可以使用标准的 Markdown 语法添加图片:
![描述](/images/hero-light.png)
```md
![描述](/images/hero-light.png)
```
### 使用 HTML
您也可以使用原始 HTML 获得更多自定义选项:
<img height="200" src="/images/hero-light.png" />
```html
<img height="200" src="/images/hero-light.png" />
```
### 图片组件
使用内置的 `<img>` 组件来显示响应式的明暗主题图片:
<img className="block dark:hidden" src="/images/hero-light.png" alt="Hero Light" />
<img className="hidden dark:block" src="/images/hero-dark.png" alt="Hero Dark" />
```jsx
<img
className="block dark:hidden"
src="/images/hero-light.png"
alt="Hero Light"
/>
<img
className="hidden dark:block"
src="/images/hero-dark.png"
alt="Hero Dark"
/>
```
## 图片缩放
您可以使图片在点击时可缩放(类似于中等缩放)使用 `zoom` 属性。
<img src="/images/hero-light.png" alt="可缩放" zoom />
```jsx
<img src="/images/hero-light.png" alt="可缩放" zoom />
```
## 嵌入视频
### YouTube
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/4KzFe50RQkQ"
title="YouTube 视频播放器"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
```html
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/4KzFe50RQkQ"
title="YouTube 视频播放器"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
```
### Loom
<iframe
src="https://www.loom.com/embed/9019ef5b27ae417798d65b41749227ac"
frameborder="0"
webkitallowfullscreen
mozallowfullscreen
allowfullscreen
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
}}
></iframe>
```html
<iframe
src="https://www.loom.com/embed/9019ef5b27ae417798d65b41749227ac"
frameborder="0"
webkitallowfullscreen
mozallowfullscreen
allowfullscreen
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
}}
></iframe>
```
## 图片最佳实践
### 大小优化
- 保持图片尺寸在合理范围内(通常不超过 1000px 宽度)
- 使用适当的图片格式PNG 用于图标JPG 用于照片)
- 考虑使用现代格式如 WebP 来减少文件大小
### 无障碍性
- 始终包含描述性的 `alt` 文本
- 确保图片在各种屏幕尺寸下都能正常显示
### 组织
- 将图片存储在 `/images` 或 `/assets` 文件夹中
- 使用描述性的文件名

View File

@@ -0,0 +1,412 @@
---
title: 'Markdown 语法'
description: 'MCPHub 文档的 Markdown 编写指南和最佳实践'
---
## 标题
在 MCPHub 文档中,每个页面应该只使用一个 `#` 标题,它会自动成为页面标题。
```md
# MCP 服务器配置指南
## 快速开始
### 安装依赖
#### 系统要求
##### Node.js 版本
###### 推荐版本
```
<ResponseExample>
# 标题 1
## 标题 2
### 标题 3
#### 标题 4
##### 标题 5
###### 标题 6
</ResponseExample>
## 文本格式
### 基本格式
MCPHub 文档支持标准的 Markdown 文本格式:
```md
**粗体文本** - 用于强调重要概念
_斜体文本_ - 用于强调或引用
`行内代码` - 用于命令、配置键或代码片段
~~删除线~~ - 用于标记过时的内容
```
**粗体文本** - 用于强调重要概念
_斜体文本_ - 用于强调或引用
`行内代码` - 用于命令、配置键或代码片段
~~删除线~~ - 用于标记过时的内容
### 链接
#### 内部链接
链接到其他文档页面:
```md
查看 [服务器配置指南](/zh/configuration/mcp-settings) 获取详细信息。
```
查看 [服务器配置指南](/zh/configuration/mcp-settings) 获取详细信息。
#### 外部链接
```md
访问 [Model Context Protocol 官网](https://modelcontextprotocol.io) 了解更多。
```
访问 [Model Context Protocol 官网](https://modelcontextprotocol.io) 了解更多。
## 列表
### 无序列表
适用于功能列表、要求等:
```md
MCPHub 主要功能:
- 智能路由分发
- 服务器组管理
- 实时监控
- 身份认证
- JWT 令牌
- API 密钥
- OAuth 2.0
```
MCPHub 主要功能:
- 智能路由分发
- 服务器组管理
- 实时监控
- 身份认证
- JWT 令牌
- API 密钥
- OAuth 2.0
### 有序列表
适用于步骤说明、安装指南等:
```md
快速部署步骤:
1. 克隆仓库
2. 安装依赖
3. 配置环境变量
4. 启动服务
5. 验证部署
```
快速部署步骤:
1. 克隆仓库
2. 安装依赖
3. 配置环境变量
4. 启动服务
5. 验证部署
## 代码块
### 基本代码块
````md
```javascript
// MCPHub 客户端初始化
const mcpClient = new MCPClient({
endpoint: 'https://api.mcphub.io',
apiKey: process.env.MCPHUB_API_KEY,
});
```
````
```javascript
// MCPHub 客户端初始化
const mcpClient = new MCPClient({
endpoint: 'https://api.mcphub.io',
apiKey: process.env.MCPHUB_API_KEY,
});
```
### 配置文件示例
````md
```yaml title="docker-compose.yml"
version: '3.8'
services:
mcphub:
image: mcphub/server:latest
ports:
- '3000:3000'
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mcphub
```
````
```yaml title="docker-compose.yml"
version: '3.8'
services:
mcphub:
image: mcphub/server:latest
ports:
- '3000:3000'
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mcphub
```
### 终端命令
````md
```bash
# 安装 MCPHub CLI
npm install -g @mcphub/cli
# 初始化项目
mcphub init my-project
# 启动开发服务器
mcphub dev
```
````
```bash
# 安装 MCPHub CLI
npm install -g @mcphub/cli
# 初始化项目
mcphub init my-project
# 启动开发服务器
mcphub dev
```
## 表格
### 基本表格
```md
| 功能 | 开源版 | 企业版 |
| ------------ | ------ | ------ |
| 基础路由 | ✅ | ✅ |
| 智能负载均衡 | ❌ | ✅ |
| 高级监控 | ❌ | ✅ |
| 24/7 支持 | ❌ | ✅ |
```
| 功能 | 开源版 | 企业版 |
| ------------ | ------ | ------ |
| 基础路由 | ✅ | ✅ |
| 智能负载均衡 | ❌ | ✅ |
| 高级监控 | ❌ | ✅ |
| 24/7 支持 | ❌ | ✅ |
### API 参数表格
```md
| 参数名 | 类型 | 必需 | 描述 |
| ---------- | ------- | ---- | ---------------------- |
| `serverId` | string | 是 | 服务器唯一标识符 |
| `groupId` | string | 否 | 服务器组 ID |
| `active` | boolean | 否 | 是否激活默认true |
```
| 参数名 | 类型 | 必需 | 描述 |
| ---------- | ------- | ---- | ---------------------- |
| `serverId` | string | 是 | 服务器唯一标识符 |
| `groupId` | string | 否 | 服务器组 ID |
| `active` | boolean | 否 | 是否激活默认true |
## 引用块
### 信息提示
```md
> 📝 **提示**
> 在生产环境中部署前,请确保已正确配置所有环境变量。
```
> 📝 **提示**
> 在生产环境中部署前,请确保已正确配置所有环境变量。
### 警告信息
```md
> ⚠️ **警告**
> 修改核心配置可能会影响系统稳定性,请谨慎操作。
```
> ⚠️ **警告**
> 修改核心配置可能会影响系统稳定性,请谨慎操作。
## 任务列表
```md
- [x] 完成服务器配置
- [x] 设置数据库连接
- [ ] 配置负载均衡
- [ ] 设置监控告警
- [ ] 编写单元测试
```
- [x] 完成服务器配置
- [x] 设置数据库连接
- [ ] 配置负载均衡
- [ ] 设置监控告警
- [ ] 编写单元测试
## 水平分割线
用于分隔不同的内容部分:
```md
## 第一部分
内容...
---
## 第二部分
更多内容...
```
---
## 转义字符
当需要显示 Markdown 特殊字符时:
```md
\*这不是斜体\*
\`这不是代码\`
\[这不是链接\]
```
\*这不是斜体\*
\`这不是代码\`
\[这不是链接\]
## MCPHub 文档特定约定
### 配置项格式
环境变量和配置项使用特定格式:
```md
设置 `MCPHUB_PORT` 环境变量为 `3000`。
```
设置 `MCPHUB_PORT` 环境变量为 `3000`。
### API 端点格式
```md
`GET /api/servers/{id}` - 获取服务器详情
```
`GET /api/servers/{id}` - 获取服务器详情
### 版本标记
```md
该功能在 v2.1.0+ 版本中可用。
```
该功能在 v2.1.0+ 版本中可用。
## 最佳实践
1. **标题层级**:保持清晰的标题层级结构
2. **代码示例**:为所有代码块指定语言
3. **链接检查**:确保所有内部链接有效
4. **图片描述**:为图片添加有意义的 alt 文本
5. **一致性**:在整个文档中保持术语和格式一致
### 文档模板示例
````md
---
title: '功能名称'
description: '简短的功能描述'
---
## 概述
简要介绍该功能的用途和重要性。
## 快速开始
### 前提条件
- 系统要求
- 依赖软件
### 安装步骤
1. 第一步
2. 第二步
3. 第三步
```bash
# 示例命令
npm install example
```
## 配置
### 基本配置
| 配置项 | 类型 | 描述 |
| --------- | ------ | -------- |
| `option1` | string | 选项描述 |
### 高级配置
详细的配置说明...
## 示例
### 基本用法
```javascript
// 代码示例
const example = new Example();
```
### 高级用法
更复杂的使用场景...
## 故障排除
### 常见问题
**问题**:描述问题
**解决方案**:解决步骤
## 参考资料
- [相关文档链接](/link)
- [外部资源](https://example.com)
````

View File

@@ -0,0 +1,596 @@
---
title: '导航配置'
description: 'MCPHub 文档的导航结构配置指南'
---
## 基础导航
MCPHub 文档的导航在 `docs.json` 文件中配置。基本导航结构包含组和页面:
```json title="docs.json"
{
"navigation": [
{
"group": "快速开始",
"pages": ["zh/index", "zh/quickstart"]
},
{
"group": "开发指南",
"pages": [
"zh/development/getting-started",
"zh/development/api-integration",
"zh/development/testing"
]
},
{
"group": "配置管理",
"pages": [
"zh/configuration/environment-variables",
"zh/configuration/mcp-settings",
"zh/configuration/docker-setup",
"zh/configuration/nginx"
]
}
]
}
```
## 标签导航
当您的文档有多个主要部分时,可以使用标签来组织内容。
```json docs.json
{
"navigation": {
"tabs": [
{
"tab": "指南",
"groups": [
{
"group": "基础",
"pages": ["basics/introduction"]
}
]
},
{
"tab": "API 参考",
"groups": [
{
"group": "端点",
"pages": ["api/users", "api/products"]
}
]
}
]
}
}
```
## 页面引用
### 文件路径引用
最常见的方式是通过文件路径引用页面(不包含 `.mdx` 扩展名):
```json
{
"pages": ["quickstart", "advanced/configuration"]
}
```
### 外部链接
您也可以在导航中包含外部链接:
```json
{
"pages": [
"introduction",
{
"page": "GitHub",
"href": "https://github.com"
}
]
}
```
## 分组
### 基本分组
每个组都有一个名称和页面列表:
```json
{
"group": "API 基础",
"pages": ["api/authentication", "api/errors", "api/rate-limits"]
}
```
### 分组版本控制
您可以为组指定版本:
```json
{
"group": "API v2",
"version": "v2.0",
"pages": ["api/v2/users"]
}
```
## 全局导航元素
### 锚点
在所有页面上显示的持久链接:
```json docs.json
{
"navigation": {
"global": {
"anchors": [
{
"anchor": "API 参考",
"href": "/api-reference",
"icon": "square-terminal"
},
{
"anchor": "社区",
"href": "https://community.example.com",
"icon": "discord"
}
]
}
}
}
```
### 导航栏
配置顶部导航栏的链接:
```json docs.json
{
"navbar": {
"links": [
{
"label": "支持",
"href": "mailto:support@example.com"
}
],
"primary": {
"type": "button",
"label": "仪表板",
"href": "https://dashboard.example.com"
}
}
}
```
## 分层导航结构
### 多级导航
MCPHub 文档支持多级分层导航:
```json title="docs.json"
{
"navigation": [
{
"group": "核心功能",
"pages": [
{
"group": "服务器管理",
"pages": [
"zh/features/server-management",
"zh/features/server-health",
"zh/features/server-scaling"
]
},
{
"group": "智能路由",
"pages": [
"zh/features/smart-routing",
"zh/features/load-balancing",
"zh/features/failover"
]
}
]
}
]
}
```
### 条件导航
根据用户权限或版本显示不同的导航项:
```json title="docs.json"
{
"navigation": [
{
"group": "API 参考",
"pages": [
"zh/api-reference/introduction",
"zh/api-reference/authentication",
{
"group": "端点",
"pages": [
"zh/api-reference/endpoint/get",
"zh/api-reference/endpoint/create",
"zh/api-reference/endpoint/delete",
"zh/api-reference/endpoint/webhook"
]
}
]
},
{
"group": "企业功能",
"icon": "crown",
"version": "enterprise",
"pages": ["zh/enterprise/sso", "zh/enterprise/audit-logs", "zh/enterprise/compliance"]
}
]
}
```
## 标签导航
对于多产品或多语言文档,使用标签组织内容:
```json title="docs.json"
{
"tabs": [
{
"name": "文档",
"url": "https://docs.mcphub.io"
},
{
"name": "API",
"url": "https://api.mcphub.io"
},
{
"name": "SDK",
"url": "https://sdk.mcphub.io"
}
],
"navigation": {
"文档": [
{
"group": "开始使用",
"pages": ["zh/index", "zh/quickstart"]
}
],
"API": [
{
"group": "API 参考",
"pages": ["zh/api-reference/introduction", "zh/api-reference/authentication"]
}
]
}
}
```
## 导航图标
为导航项添加图标以提高可读性:
```json title="docs.json"
{
"navigation": [
{
"group": "快速开始",
"icon": "rocket",
"pages": ["zh/index", "zh/quickstart"]
},
{
"group": "配置",
"icon": "gear",
"pages": ["zh/configuration/environment-variables", "zh/configuration/mcp-settings"]
},
{
"group": "监控",
"icon": "chart-line",
"pages": ["zh/features/monitoring", "zh/features/analytics"]
}
]
}
```
### 支持的图标
MCPHub 文档支持以下图标库的图标:
- **Heroicons**: `hero-icon-name`
- **Font Awesome**: `fa-icon-name`
- **Feather**: `feather-icon-name`
- **Lucide**: `lucide-icon-name`
常用图标示例:
| 功能 | 图标 | 代码 |
| ---- | ---- | ------------- |
| 首页 | 🏠 | `"home"` |
| 设置 | ⚙️ | `"gear"` |
| API | 🔌 | `"plug"` |
| 安全 | 🔒 | `"lock"` |
| 监控 | 📊 | `"chart-bar"` |
| 文档 | 📖 | `"book"` |
| 开发 | 💻 | `"code"` |
## 外部链接
在导航中包含外部资源链接:
```json title="docs.json"
{
"navigation": [
{
"group": "资源",
"pages": [
{
"name": "GitHub 仓库",
"url": "https://github.com/mcphub/mcphub",
"icon": "github"
},
{
"name": "Discord 社区",
"url": "https://discord.gg/mcphub",
"icon": "discord"
},
{
"name": "状态页面",
"url": "https://status.mcphub.io",
"icon": "status"
}
]
}
]
}
```
## 导航排序
### 自动排序
默认情况下,导航项按字母顺序排列。可以通过文件名前缀控制排序:
```
zh/
├── 01-index.mdx
├── 02-quickstart.mdx
├── development/
│ ├── 01-getting-started.mdx
│ ├── 02-api-integration.mdx
│ └── 03-testing.mdx
└── configuration/
├── 01-environment-variables.mdx
├── 02-mcp-settings.mdx
└── 03-docker-setup.mdx
```
### 手动排序
在 `docs.json` 中明确指定顺序:
```json title="docs.json"
{
"navigation": [
{
"group": "核心概念",
"pages": [
"zh/concepts/introduction",
"zh/concepts/architecture",
"zh/concepts/mcp-protocol",
"zh/concepts/routing"
]
}
]
}
```
## 隐藏导航项
### 草稿页面
使用 `draft: true` 隐藏未完成的页面:
```yaml title="draft-page.mdx"
---
title: '开发中的功能'
description: '此功能正在开发中'
draft: true
---
```
### 条件显示
根据用户角色或环境显示导航:
```json title="docs.json"
{
"navigation": [
{
"group": "管理功能",
"hidden": "user",
"pages": ["zh/admin/user-management", "zh/admin/system-settings"]
}
]
}
```
## 导航元数据
### 页面元数据
在页面头部添加导航相关的元数据:
```yaml title="page.mdx"
---
title: '服务器管理'
description: 'MCPHub 服务器管理功能详解'
icon: 'server'
order: 1
hidden: false
version: '2.0+'
tags: ['管理', '服务器', '配置']
---
```
### 组元数据
为导航组添加描述和图标:
```json title="docs.json"
{
"navigation": [
{
"group": "API 参考",
"icon": "api",
"description": "完整的 API 接口文档",
"version": "v2",
"pages": ["zh/api-reference/introduction"]
}
]
}
```
## 搜索优化
### 搜索关键词
为页面添加搜索关键词:
```yaml title="page.mdx"
---
title: 'Docker 部署'
description: '使用 Docker 部署 MCPHub'
keywords: ['docker', '部署', '容器', '生产环境']
searchable: true
---
```
### 搜索权重
控制页面在搜索结果中的权重:
```yaml title="important-page.mdx"
---
title: '快速开始'
description: '5 分钟快速部署 MCPHub'
searchWeight: 10
featured: true
---
```
## 面包屑导航
自动生成面包屑导航:
```json title="docs.json"
{
"breadcrumbs": {
"enabled": true,
"separator": "",
"home": "首页"
},
"navigation": [
{
"group": "配置管理",
"pages": ["zh/configuration/environment-variables"]
}
]
}
```
显示效果:`首页 配置管理 环境变量`
## 导航最佳实践
### 1. 逻辑分组
按功能和用户需求逻辑分组:
```json
{
"navigation": [
{
"group": "新手指南",
"pages": ["introduction", "quickstart", "first-server"]
},
{
"group": "进阶配置",
"pages": ["advanced-routing", "scaling", "monitoring"]
},
{
"group": "参考文档",
"pages": ["api-reference", "cli-reference", "troubleshooting"]
}
]
}
```
### 2. 渐进式学习路径
设计符合学习曲线的导航结构:
1. **入门** → 快速开始、基础概念
2. **实践** → 配置、部署、集成
3. **进阶** → 优化、监控、故障排除
4. **参考** → API 文档、CLI 手册
### 3. 移动端友好
确保导航在移动设备上的可用性:
```json title="docs.json"
{
"navigation": [
{
"group": "快速开始",
"collapsed": false,
"pages": ["zh/index", "zh/quickstart"]
},
{
"group": "详细文档",
"collapsed": true,
"pages": ["zh/advanced/..."]
}
]
}
```
### 4. 国际化支持
为多语言文档配置导航:
```json title="docs.json"
{
"i18n": {
"defaultLocale": "zh",
"locales": ["zh", "en"]
},
"navigation": {
"zh": [
{
"group": "快速开始",
"pages": ["zh/index", "zh/quickstart"]
}
],
"en": [
{
"group": "Getting Started",
"pages": ["en/index", "en/quickstart"]
}
]
}
}
```
### 5. 性能优化
- 使用懒加载减少初始加载时间
- 合理设置导航深度(建议不超过 3 层)
- 避免过多的外部链接
- 定期清理无效的导航项

View File

@@ -0,0 +1,144 @@
---
title: '可重用代码片段'
description: '学习如何创建和使用代码片段来保持文档的一致性'
---
## 什么是代码片段?
代码片段允许您在文档的多个位置重用内容块。这有助于保持一致性并减少重复内容的维护工作。
## 创建代码片段
代码片段存储在 `snippets/` 文件夹中,使用 `.mdx` 扩展名。
### 基本代码片段
创建 `snippets/api-key-setup.mdx`
```md
获取您的 API 密钥:
1. 登录到您的仪表板
2. 导航到 **设置** > **API 密钥**
3. 点击 **生成新密钥**
4. 复制密钥并安全地存储
```
### 带参数的代码片段
您可以创建接受参数的动态代码片段。创建 `snippets/code-example.mdx`
````jsx
<CodeGroup>
```bash {props.packageManager}
{props.packageManager} install {props.packageName}
````
</CodeGroup>
```
## 使用代码片段
### 基本使用
使用 `<Snippet>` 组件来包含代码片段:
```jsx
<Snippet file="api-key-setup.mdx" />
```
<Snippet file="snippet-intro.mdx" />
### 带参数使用
```jsx
<Snippet file="code-example.mdx" packageManager="npm" packageName="mintlify" />
```
## 代码片段最佳实践
### 文件组织
```
snippets/
├── setup/
│ ├── installation.mdx
│ └── configuration.mdx
├── examples/
│ ├── basic-usage.mdx
│ └── advanced-usage.mdx
└── common/
├── prerequisites.mdx
└── troubleshooting.mdx
```
### 命名约定
- 使用描述性文件名
- 使用连字符分隔单词
- 按主题分组到子文件夹
### 内容指导原则
1. **保持简洁** - 代码片段应该是独立的内容块
2. **避免硬编码** - 对可变内容使用参数
3. **文档化参数** - 在代码片段中注释必需的参数
### 参数文档
在代码片段文件的顶部记录所需参数:
```md
<!--
参数:
- packageManager: 包管理器名称npm, yarn, pnpm
- packageName: 要安装的包名称
-->
安装说明...
```
## 高级代码片段
### 条件内容
您可以使用条件逻辑来根据参数显示不同的内容:
```jsx
{
props.framework === 'react' && <div>React 特定的内容...</div>;
}
{
props.framework === 'vue' && <div>Vue 特定的内容...</div>;
}
```
### 嵌套代码片段
代码片段可以包含其他代码片段:
```jsx
<Snippet file="common/prerequisites.mdx" />
## 安装步骤
<Snippet file="setup/installation.mdx" framework={props.framework} />
```
## 维护代码片段
### 版本控制
当更新代码片段时:
1. 考虑向后兼容性
2. 更新所有使用该代码片段的页面
3. 测试更改在所有上下文中的效果
### 重构检查清单
- [ ] 确认所有参数仍然有效
- [ ] 验证代码片段在所有使用位置正确渲染
- [ ] 更新相关文档

View File

@@ -0,0 +1,172 @@
---
title: '设置'
description: '了解如何配置您的文档'
---
## 全局配置
所有的全局配置都在项目根目录的 `docs.json` 文件中设置。
### 名称
在配置的顶层设置文档的名称。
```json docs.json
{
"name": "Mintlify 文档"
}
```
### Logo
您可以显示浅色和深色模式的 logo。
```json docs.json
{
"logo": {
"light": "/logo/light.svg",
"dark": "/logo/dark.svg"
}
}
```
### Favicon
```json docs.json
{
"favicon": "/favicon.ico"
}
```
### 颜色
自定义文档的主色调以匹配您的品牌。
```json docs.json
{
"colors": {
"primary": "#9563FF",
"light": "#AE87FF",
"dark": "#9563FF"
}
}
```
<Tip>设置一种颜色系统,通过仅更改主色调来协调您文档的配色方案。</Tip>
### 导航
您的侧边栏导航在 `navigation` 字段中设置。文档页面必须嵌套在组下,组必须嵌套在导航下。
```json docs.json
{
"navigation": [
{
"group": "开始使用",
"pages": ["introduction", "quickstart", "development"]
}
]
}
```
#### 标签
您可以将页面分组为不同的标签。当您想要将概念或 API 参考组织到不同的部分时,这很有用。
```json docs.json
{
"navigation": {
"tabs": [
{
"tab": "主要",
"groups": [
{
"group": "开始使用",
"pages": ["introduction"]
}
]
},
{
"tab": "API 参考",
"groups": [
{
"group": "端点",
"pages": ["api-reference/users"]
}
]
}
]
}
}
```
### 页脚
您可以在 `footer` 字段中配置页脚链接。
```json docs.json
{
"footer": {
"socials": {
"website": "https://mintlify.com",
"github": "https://github.com/mintlify",
"slack": "https://mintlify.com/community"
}
}
}
```
### 搜索
您可以通过多种方式配置搜索,包括替换默认搜索或添加搜索锚点。
```json docs.json
{
"search": {
"prompt": "搜索..."
}
}
```
## 页面配置
页面配置在每个 MDX 文件顶部的 frontmatter 中设置。
### 标题和描述
```md
---
title: '介绍'
description: '欢迎来到我们的产品!'
---
```
### 侧边栏标题
```md
---
sidebarTitle: '主页'
---
```
设置不同于页面标题的侧边栏标题。
### 图标
```md
---
icon: 'star'
---
```
为侧边栏中的页面设置 [FontAwesome](https://fontawesome.com/search?s=solid&m=free) 图标。
### 模式
```md
---
mode: 'wide'
---
```
设置页面的显示模式。选项包括 `"default"` 和 `"wide"`。

View File

@@ -0,0 +1,330 @@
---
title: '身份认证与安全'
description: '为 MCPHub 配置身份认证和安全设置'
---
## 概述
MCPHub 提供灵活的身份认证机制来保护您的 MCP 服务器管理平台。系统支持多种身份认证方法和基于角色的访问控制。
## 身份认证方法
### 基于环境变量的认证
使用环境变量配置基础认证:
```bash
# 基础认证凭据
AUTH_USERNAME=admin
AUTH_PASSWORD=your-secure-password
# JWT 设置
JWT_SECRET=your-jwt-secret-key
JWT_EXPIRES_IN=24h
```
### 数据库认证
对于生产环境部署,启用基于数据库的用户管理:
```json
{
"auth": {
"provider": "database",
"database": {
"url": "postgresql://user:pass@localhost:5432/mcphub",
"userTable": "users"
}
}
}
```
## 用户管理
### 创建用户
通过管理界面或 API 创建用户:
```bash
# 通过 API
curl -X POST http://localhost:3000/api/auth/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-d '{
"username": "newuser",
"email": "user@example.com",
"password": "securepassword",
"role": "user"
}'
```
### 用户角色
MCPHub 支持基于角色的访问控制:
- **管理员**: 完整系统访问权限、用户管理、服务器配置
- **管理者**: 服务器管理、组管理、监控
- **用户**: 在分配组内的基本服务器访问权限
- **查看者**: 对分配资源的只读访问权限
## 基于组的访问控制
### 将用户分配到组
```bash
# 添加用户到组
curl -X POST http://localhost:3000/api/groups/{groupId}/users \
-H "Authorization: Bearer $TOKEN" \
-d '{"userId": "user123"}'
```
### 组权限
配置组级别权限:
```json
{
"groupId": "dev-team",
"permissions": {
"servers": ["read", "write", "execute"],
"tools": ["read", "execute"],
"logs": ["read"],
"config": ["read"]
}
}
```
## API 认证
### JWT 令牌认证
```javascript
// 获取认证令牌
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'your-username',
password: 'your-password',
}),
});
const { token } = await response.json();
// 在后续请求中使用令牌
const protectedResponse = await fetch('/api/servers', {
headers: {
Authorization: `Bearer ${token}`,
},
});
```
### API 密钥认证
为系统集成生成 API 密钥:
```bash
# 生成新的 API 密钥
curl -X POST http://localhost:3000/api/auth/api-keys \
-H "Authorization: Bearer $TOKEN" \
-d '{
"name": "Integration Key",
"permissions": ["servers:read", "servers:write"],
"expiresAt": "2024-12-31T23:59:59.000Z"
}'
```
## 安全设置
### HTTPS 配置
为生产环境启用 HTTPS
```nginx
server {
listen 443 ssl http2;
server_name mcphub.example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
### 会话安全
配置安全的会话设置:
```javascript
// 会话配置
{
"session": {
"secret": "your-session-secret",
"secure": true, // 生产环境中需要 HTTPS
"httpOnly": true,
"maxAge": 86400000, // 24 小时
"sameSite": "strict"
}
}
```
### 速率限制
实施 API 速率限制:
```javascript
{
"rateLimit": {
"windowMs": 900000, // 15 分钟
"max": 100, // 每个 IP 限制 100 个请求
"message": "请求过于频繁,请稍后再试",
"standardHeaders": true,
"legacyHeaders": false
}
}
```
## 多因素认证 (MFA)
### 启用 TOTP
为管理员帐户启用基于时间的一次性密码:
```bash
# 启用 MFA
curl -X POST http://localhost:3000/api/auth/mfa/enable \
-H "Authorization: Bearer $TOKEN" \
-d '{
"type": "totp",
"appName": "MCPHub"
}'
```
### 验证 MFA 代码
```javascript
// 登录时验证 MFA
const loginResponse = await fetch('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'admin',
password: 'password',
mfaCode: '123456', // 来自认证器应用的 6 位数字
}),
});
```
## 审计日志
### 启用审计日志
跟踪所有认证和授权事件:
```json
{
"audit": {
"enabled": true,
"logLevel": "info",
"events": [
"login",
"logout",
"password_change",
"role_change",
"permission_change",
"server_access",
"config_change"
],
"storage": {
"type": "database",
"retention": "90d"
}
}
}
```
### 查看审计日志
```bash
# 获取审计日志
curl -X GET "http://localhost:3000/api/audit/logs?startDate=2024-01-01&endDate=2024-01-31" \
-H "Authorization: Bearer $TOKEN"
```
## 密码策略
### 配置密码要求
```json
{
"passwordPolicy": {
"minLength": 12,
"requireUppercase": true,
"requireLowercase": true,
"requireNumbers": true,
"requireSpecialChars": true,
"preventCommonPasswords": true,
"preventReuse": 5, // 防止重复使用最近 5 个密码
"maxAge": 7776000 // 90 天后过期
}
}
```
## 故障排除
### 常见认证问题
1. **JWT 令牌过期**
```bash
# 检查令牌有效期
curl -X GET http://localhost:3000/api/auth/verify \
-H "Authorization: Bearer $TOKEN"
```
2. **权限被拒绝**
```bash
# 检查用户权限
curl -X GET http://localhost:3000/api/auth/permissions \
-H "Authorization: Bearer $TOKEN"
```
3. **会话问题**
- 清除浏览器 cookies
- 检查会话配置
- 验证服务器时间同步
### 调试认证流程
启用调试日志:
```bash
# 设置环境变量
export DEBUG=auth:*
export LOG_LEVEL=debug
# 启动服务器
npm start
```
## 安全最佳实践
1. **定期更新凭据**: 定期轮换 JWT 密钥和 API 密钥
2. **最小权限原则**: 只授予用户执行其任务所需的最小权限
3. **监控异常活动**: 设置警报以检测可疑的登录模式
4. **备份配置**: 定期备份认证配置和用户数据
5. **安全更新**: 保持 MCPHub 和依赖项的最新状态
更多安全配置选项,请参阅 [环境变量配置](/zh/configuration/environment-variables) 和 [Docker 设置](/zh/configuration/docker-setup) 文档。

View File

@@ -0,0 +1,573 @@
---
title: '分组管理'
description: '将服务器组织成逻辑组以简化访问控制'
---
## 概述
MCPHub 的分组管理功能允许您根据功能、用例或访问要求将 MCP 服务器组织成逻辑集合。这使您能够对不同的 AI 客户端和用户可用的工具进行精细控制。
## 核心概念
### 什么是分组?
分组是可通过专用端点访问的 MCP 服务器的命名集合。AI 客户端可以连接到特定分组以仅访问相关工具,而不是一次性连接到所有服务器。
### 分组的优势
- **聚焦工具访问**: AI 客户端只看到与其用例相关的工具
- **更好的性能**: 减少工具发现开销
- **增强安全性**: 限制对敏感工具的访问
- **改进组织**: 功能的逻辑分离
- **简化管理**: 更容易一起管理相关服务器
## 创建分组
### 通过仪表板
1. **导航到分组部分**: 在主导航中点击"分组"
2. **点击"创建分组"**: 开始分组创建流程
3. **填写分组详细信息**:
- **名称**: 分组的唯一标识符
4. **添加服务器**: 选择要包含在分组中的服务器
### 通过 API
以编程方式创建分组:
```bash
curl -X POST http://localhost:3000/api/groups \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "web-automation",
"servers": ["playwright", "fetch"]
}'
```
{/* ### 通过配置文件
在您的 `mcp_settings.json` 中定义分组:
```json
{
"mcpServers": {
"fetch": { "command": "uvx", "args": ["mcp-server-fetch"] },
"playwright": { "command": "npx", "args": ["@playwright/mcp@latest"] },
"slack": { "command": "npx", "args": ["@modelcontextprotocol/server-slack"] }
},
"groups": {
"web-tools": {
"name": "web",
"servers": ["fetch", "playwright"],
},
"communication": {
"name": "communication",
"servers": ["slack"],
}
}
}
``` */}
## 分组类型和用例
<AccordionGroup>
<Accordion title="Web 自动化分组">
**用途**: 浏览器自动化和网页抓取
**服务器**:
- `playwright`: 浏览器自动化
- `fetch`: HTTP 请求和网页抓取
- `selenium`: 替代浏览器自动化
**用例**:
- 自动化测试
- 数据收集
- 网页监控
- 内容分析
**端点**: `http://localhost:3000/mcp/web-automation`
</Accordion>
<Accordion title="数据处理分组">
**用途**: 数据操作和分析
**服务器**:
- `sqlite`: 数据库操作
- `filesystem`: 文件操作
- `spreadsheet`: Excel/CSV 处理
**用例**:
- 数据分析
- 报告生成
- 文件处理
- 数据库查询
**端点**: `http://localhost:3000/mcp/data-processing`
</Accordion>
<Accordion title="通信分组">
**用途**: 消息传递和协作
**服务器**:
- `slack`: Slack 集成
- `discord`: Discord 机器人
- `email`: 邮件发送
- `sms`: 短信通知
**用例**:
- 团队通知
- 客户沟通
- 警报系统
- 社交媒体管理
**端点**: `http://localhost:3000/mcp/communication`
</Accordion>
<Accordion title="开发分组">
**用途**: 软件开发工具
**服务器**:
- `github`: GitHub 操作
- `gitlab`: GitLab 集成
- `docker`: 容器管理
- `kubernetes`: K8s 操作
**用例**:
- 代码部署
- 仓库管理
- CI/CD 操作
- 基础设施管理
**端点**: `http://localhost:3000/mcp/development`
</Accordion>
<Accordion title="AI/ML 分组">
**用途**: 机器学习和 AI 工具
**服务器**:
- `openai`: OpenAI API 集成
- `huggingface`: Hugging Face 模型
- `vector-db`: 向量数据库操作
**用例**:
- 模型推理
- 数据嵌入
- 自然语言处理
- 计算机视觉
**端点**: `http://localhost:3000/mcp/ai-ml`
</Accordion>
</AccordionGroup>
{/* ## 分组访问控制
### 访问级别
<Tabs>
<Tab title="公开">
**公开分组**:
- 所有认证用户都可访问
- 无需额外权限
- 在分组列表中可见
- 默认访问级别
```json
{
"name": "public-tools",
"accessLevel": "public",
"servers": ["fetch", "calculator"]
}
```
</Tab>
<Tab title="私有">
**私有分组**:
- 仅对分组成员可见
- 需要明确的用户分配
- 在公开列表中隐藏
- 管理员控制成员身份
```json
{
"name": "internal-tools",
"accessLevel": "private",
"members": ["user1", "user2"],
"servers": ["internal-api", "database"]
}
```
</Tab>
<Tab title="受限">
**受限分组**:
- 基于角色的访问控制
- 需要特定权限
- 启用审计日志
- 限时访问
```json
{
"name": "admin-tools",
"accessLevel": "restricted",
"requiredRoles": ["admin", "operator"],
"servers": ["system-control", "user-management"]
}
```
</Tab>
</Tabs>
### 用户管理
将用户分配给分组:
```bash
# 添加用户到分组
curl -X POST http://localhost:3000/api/groups/web-tools/members \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{"userId": "user123"}'
# 从分组中移除用户
curl -X DELETE http://localhost:3000/api/groups/web-tools/members/user123 \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# 列出分组成员
curl http://localhost:3000/api/groups/web-tools/members \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
``` */}
## 分组端点
### 访问分组
每个分组都有自己的 MCP 端点:
<Tabs>
<Tab title="HTTP MCP">
```
http://localhost:3000/mcp/{group-name}
```
示例:
- `http://localhost:3000/mcp/web-tools`
- `http://localhost:3000/mcp/data-processing`
- `http://localhost:3000/mcp/communication`
</Tab>
<Tab title="SSE (旧版)">
```
http://localhost:3000/sse/{group-name}
```
示例:
- `http://localhost:3000/sse/web-tools`
- `http://localhost:3000/sse/data-processing`
- `http://localhost:3000/sse/communication`
</Tab>
</Tabs>
### 分组工具发现
当连接到分组端点时AI 客户端将只看到该分组内服务器的工具:
```bash
# 列出 web-tools 分组中的工具
curl -X POST http://localhost:3000/mcp/web-tools \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
```
响应将只包含来自 `fetch` 和 `playwright` 服务器的工具。
## 动态分组管理
### 向分组添加服务器
<Tabs>
<Tab title="仪表板">
1. 在仪表板中导航到分组
2. 点击"管理服务器"
3. 选择要添加的其他服务器
4. 点击"保存更改"
</Tab>
<Tab title="API">
```bash
curl -X POST http://localhost:3000/api/groups/web-tools/servers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{"serverId": "new-server"}'
```
</Tab>
</Tabs>
### 从分组中移除服务器
<Tabs>
<Tab title="仪表板">
1. 在仪表板中导航到分组
2. 点击"管理服务器"
3. 取消选择要移除的服务器
4. 点击"保存更改"
</Tab>
<Tab title="API">
```bash
curl -X DELETE http://localhost:3000/api/groups/web-tools/servers/server-name \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
</Tab>
</Tabs>
{/* ### 批量服务器更新
一次更新多个服务器:
```bash
curl -X PUT http://localhost:3000/api/groups/web-tools/servers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"servers": ["fetch", "playwright", "selenium"]
}'
``` */}
{/* ## 分组监控
### 分组状态
监控分组健康状况和活动:
```bash
# 获取分组状态
curl http://localhost:3000/api/groups/web-tools/status \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
响应包括:
- 活跃服务器数量
- 工具数量
- 活跃连接
- 最近活动
### 分组分析
跟踪分组使用情况:
```bash
# 获取分组分析
curl http://localhost:3000/api/groups/web-tools/analytics \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
指标包括:
- 按工具分类的请求计数
- 响应时间
- 错误率
- 用户活动 */}
{/* ## 高级分组功能
### 嵌套分组
创建层次化分组结构:
```json
{
"groups": {
"development": {
"displayName": "开发工具",
"subGroups": ["frontend-dev", "backend-dev", "devops"]
},
"frontend-dev": {
"displayName": "前端开发",
"servers": ["playwright", "webpack-server"],
"parent": "development"
},
"backend-dev": {
"displayName": "后端开发",
"servers": ["database", "api-server"],
"parent": "development"
}
}
}
```
### 分组模板
使用模板快速创建分组:
```json
{
"groupTemplates": {
"web-project": {
"description": "标准 Web 项目工具集",
"servers": ["fetch", "playwright", "filesystem"],
"accessLevel": "public"
},
"data-science": {
"description": "数据科学和 ML 工具",
"servers": ["python-tools", "jupyter", "vector-db"],
"accessLevel": "private"
}
}
}
```
应用模板:
```bash
curl -X POST http://localhost:3000/api/groups/from-template \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "my-web-project",
"template": "web-project",
"displayName": "我的 Web 项目工具"
}'
```
### 分组策略
定义分组行为策略:
```json
{
"groupPolicies": {
"web-tools": {
"maxConcurrentConnections": 10,
"requestTimeout": 30000,
"rateLimiting": {
"requestsPerMinute": 100,
"burstLimit": 20
},
"allowedOrigins": ["localhost", "myapp.com"]
}
}
}
``` */}
## 最佳实践
### 分组组织
<Tip>
**按用例组织**: 根据用户想要完成的任务来组织服务器分组,而不仅仅是技术相似性。
</Tip>
<Tip>
**保持分组聚焦**: 避免创建包含太多不同工具的分组。更小、更聚焦的分组更有用。
</Tip>
<Tip>
**使用描述性名称**: 选择能清楚表明分组目的和内容的名称。
</Tip>
{/* ### 安全考虑
<Warning>
**最小权限原则**: 只给用户访问他们实际需要的分组。
</Warning>
<Warning>
**敏感工具隔离**: 将敏感工具保存在具有适当访问控制的受限分组中。
</Warning>
<Warning>
**定期访问审查**: 定期审查分组成员身份并移除不必要的访问权限。
</Warning> */}
### 性能优化
<Info>
**平衡分组大小**: 非常大的分组可能导致工具发现较慢。考虑拆分为更小的分组。
</Info>
<Info>
**监控使用情况**: 使用分析来识别哪些分组被大量使用并相应优化。
</Info>
## 故障排除
<AccordionGroup>
<Accordion title="分组无法访问">
**检查:**
- 用户具有适当权限
- 分组存在且处于活跃状态
- 分组中的服务器正在运行
- 网络连接
**解决方案:**
1. 验证用户分组成员身份
2. 检查分组配置
3. 测试单个服务器连接
4. 查看访问日志
</Accordion>
<Accordion title="分组中缺少工具">
**可能原因:**
- 服务器未正确添加到分组
- 服务器未运行
- 工具发现失败
- 缓存问题
**调试步骤:**
1. 验证服务器在分组配置中
2. 检查服务器状态
3. 强制刷新工具发现
4. 清除分组缓存
</Accordion>
<Accordion title="分组性能问题">
**常见问题:**
- 分组中服务器过多
- 服务器响应慢
- 网络延迟
- 资源约束
**优化方案:**
1. 拆分大型分组
2. 监控服务器性能
3. 实施请求缓存
4. 使用连接池
</Accordion>
</AccordionGroup>
## 下一步
<CardGroup cols={2}>
<Card title="智能路由" icon="route" href="/zh/features/smart-routing">
跨分组的 AI 驱动工具发现
</Card>
<Card title="身份认证" icon="shield" href="/zh/features/authentication">
用户管理和访问控制
</Card>
<Card title="API 参考" icon="code" href="/zh/api-reference/groups">
完整的分组管理 API
</Card>
<Card title="配置" icon="cog" href="/zh/configuration/mcp-settings">
高级分组配置选项
</Card>
</CardGroup>

View File

@@ -0,0 +1,613 @@
---
title: '监控与分析'
description: '全面监控 MCP 服务器性能、健康状况和使用情况'
---
## 概述
MCPHub 提供全面的监控和分析功能,帮助您跟踪 MCP 服务器的性能、健康状况和使用模式。系统提供实时指标、历史分析和智能警报。
## 实时监控
### 仪表板概览
主监控仪表板显示关键指标:
```bash
# 访问监控仪表板
curl -X GET http://localhost:3000/api/monitoring/dashboard \
-H "Authorization: Bearer $TOKEN"
```
响应示例:
```json
{
"overview": {
"totalServers": 12,
"activeServers": 10,
"totalRequests": 15420,
"avgResponseTime": "245ms",
"errorRate": "0.3%",
"uptime": "99.9%"
},
"realtime": {
"requestsPerMinute": 85,
"activeConnections": 156,
"memoryUsage": "68%",
"cpuUsage": "42%"
}
}
```
### 服务器健康状态
```bash
# 获取所有服务器状态
curl -X GET http://localhost:3000/api/monitoring/servers/health \
-H "Authorization: Bearer $TOKEN"
```
## 性能指标
### 响应时间监控
```json
{
"responseTime": {
"metrics": [
{
"serverId": "server-1",
"average": "180ms",
"p50": "150ms",
"p95": "300ms",
"p99": "500ms"
}
],
"alerts": {
"slowResponse": {
"threshold": "1s",
"current": "180ms",
"status": "normal"
}
}
}
}
```
### 吞吐量分析
```bash
# 获取吞吐量统计
curl -X GET http://localhost:3000/api/monitoring/throughput \
-H "Authorization: Bearer $TOKEN" \
-G -d "timeRange=1h" -d "granularity=5m"
```
响应示例:
```json
{
"timeRange": "1h",
"granularity": "5m",
"data": [
{
"timestamp": "2024-01-01T12:00:00Z",
"totalRequests": 450,
"successfulRequests": 448,
"failedRequests": 2,
"avgResponseTime": "230ms"
}
],
"summary": {
"peakThroughput": 520,
"averageThroughput": 412,
"totalRequests": 4944
}
}
```
### 资源使用监控
```json
{
"resources": {
"cpu": {
"usage": "42%",
"cores": 8,
"processes": [
{ "name": "mcp-server-1", "cpu": "15%" },
{ "name": "mcp-server-2", "cpu": "12%" }
]
},
"memory": {
"total": "32GB",
"used": "21.6GB",
"available": "10.4GB",
"byProcess": [
{ "name": "mcp-server-1", "memory": "2.1GB" },
{ "name": "mcp-server-2", "memory": "1.8GB" }
]
},
"network": {
"bytesIn": "1.2GB",
"bytesOut": "890MB",
"packetsIn": 1250000,
"packetsOut": 980000
},
"disk": {
"total": "1TB",
"used": "340GB",
"available": "660GB",
"iops": 1200
}
}
}
```
## 日志管理
### 集中化日志收集
配置日志聚合:
```json
{
"logging": {
"centralized": true,
"storage": {
"type": "elasticsearch",
"config": {
"hosts": ["localhost:9200"],
"index": "mcphub-logs",
"retention": "30d"
}
},
"levels": ["error", "warn", "info", "debug"],
"sources": ["application", "mcp-servers", "nginx", "system"]
}
}
```
### 实时日志查看
```bash
# 获取实时日志流
curl -X GET http://localhost:3000/api/monitoring/logs/stream \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: text/event-stream"
# 过滤日志
curl -X GET http://localhost:3000/api/monitoring/logs \
-H "Authorization: Bearer $TOKEN" \
-G -d "level=error" -d "server=server-1" -d "limit=100"
```
### 日志分析
```bash
# 错误模式分析
curl -X GET http://localhost:3000/api/monitoring/logs/analysis \
-H "Authorization: Bearer $TOKEN" \
-G -d "type=error-patterns" -d "timeRange=24h"
```
响应示例:
```json
{
"analysis": {
"errorPatterns": [
{
"pattern": "Connection timeout",
"occurrences": 45,
"trend": "increasing",
"affectedServers": ["server-2", "server-3"]
},
{
"pattern": "Memory allocation failed",
"occurrences": 12,
"trend": "stable",
"affectedServers": ["server-1"]
}
],
"recommendations": ["检查服务器网络连接", "增加内存限制配置"]
}
}
```
## 警报系统
### 配置警报规则
```json
{
"alerts": [
{
"name": "high-response-time",
"description": "响应时间过高警报",
"condition": "avg(response_time) > 1000ms over 5m",
"severity": "warning",
"notifications": {
"email": ["admin@company.com"],
"slack": "#alerts",
"webhook": "https://hooks.company.com/alerts"
}
},
{
"name": "server-down",
"description": "服务器宕机警报",
"condition": "server_status == 'down'",
"severity": "critical",
"notifications": {
"email": ["oncall@company.com"],
"sms": ["+1234567890"],
"pagerduty": "service-key"
}
},
{
"name": "high-error-rate",
"description": "错误率过高",
"condition": "error_rate > 5% over 10m",
"severity": "error",
"notifications": {
"slack": "#dev-team"
}
}
]
}
```
### 警报通知
```bash
# 测试警报通知
curl -X POST http://localhost:3000/api/monitoring/alerts/test \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"alertName": "high-response-time",
"channel": "email"
}'
```
### 警报历史
```bash
# 获取警报历史
curl -X GET http://localhost:3000/api/monitoring/alerts/history \
-H "Authorization: Bearer $TOKEN" \
-G -d "timeRange=7d" -d "severity=critical"
```
## 用户活动监控
### 用户会话跟踪
```json
{
"userActivity": {
"activeSessions": 156,
"totalUsers": 89,
"sessionsByUser": [
{
"userId": "user123",
"sessions": 3,
"lastActivity": "2024-01-01T12:30:00Z",
"totalRequests": 245
}
],
"topUsers": [
{ "userId": "power-user", "requests": 1250 },
{ "userId": "regular-user", "requests": 890 }
]
}
}
```
### 使用模式分析
```bash
# 获取使用模式分析
curl -X GET http://localhost:3000/api/monitoring/usage-patterns \
-H "Authorization: Bearer $TOKEN" \
-G -d "timeRange=30d"
```
响应示例:
```json
{
"patterns": {
"peakHours": [9, 10, 14, 15, 16],
"peakDays": ["tuesday", "wednesday", "thursday"],
"toolUsage": [
{"tool": "filesystem", "usage": 45%},
{"tool": "web-search", "usage": 30%},
{"tool": "database", "usage": 25%}
],
"userBehavior": {
"avgSessionDuration": "45m",
"avgRequestsPerSession": 23,
"returnRate": "78%"
}
}
}
```
## 容量规划
### 资源预测
```json
{
"capacityPlanning": {
"currentCapacity": {
"cpu": "42%",
"memory": "68%",
"network": "35%",
"storage": "34%"
},
"predictions": {
"timeHorizon": "30d",
"cpuForecast": [
{ "date": "2024-01-07", "usage": "48%" },
{ "date": "2024-01-14", "usage": "52%" },
{ "date": "2024-01-21", "usage": "56%" },
{ "date": "2024-01-28", "usage": "61%" }
],
"recommendations": [
"考虑在第3周增加CPU资源",
"内存使用稳定,暂不需要扩容",
"建议监控网络带宽趋势"
]
}
}
}
```
### 自动扩缩容
```json
{
"autoScaling": {
"enabled": true,
"policies": [
{
"metric": "cpu_usage",
"scaleUp": {
"threshold": "80%",
"duration": "5m",
"action": "add_instance"
},
"scaleDown": {
"threshold": "30%",
"duration": "15m",
"action": "remove_instance"
}
},
{
"metric": "request_queue_length",
"scaleUp": {
"threshold": 100,
"duration": "2m",
"action": "add_instance"
}
}
]
}
}
```
## 性能分析报告
### 生成性能报告
```bash
# 生成周报
curl -X POST http://localhost:3000/api/monitoring/reports \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"type": "performance",
"timeRange": "7d",
"format": "pdf",
"sections": [
"overview",
"response_times",
"error_analysis",
"resource_usage",
"recommendations"
],
"recipients": ["manager@company.com"]
}'
```
### 自定义报告
```json
{
"customReport": {
"name": "monthly-summary",
"schedule": "0 0 1 * *",
"template": "executive-summary",
"data": {
"kpis": ["uptime", "avg_response_time", "total_requests", "error_rate", "user_satisfaction"],
"comparisons": {
"previousMonth": true,
"yearOverYear": true
}
},
"distribution": {
"email": ["executives@company.com"],
"dashboard": true,
"archive": true
}
}
}
```
## 监控 API
### 指标查询
```bash
# 查询自定义指标
curl -X POST http://localhost:3000/api/monitoring/query \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"query": "avg(response_time) by (server_id)",
"timeRange": "1h",
"step": "5m"
}'
```
### 事件跟踪
```bash
# 记录自定义事件
curl -X POST http://localhost:3000/api/monitoring/events \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"type": "deployment",
"title": "服务器更新",
"description": "部署新版本 v2.1.0",
"tags": ["deployment", "version-2.1.0"],
"metadata": {
"version": "2.1.0",
"servers": ["server-1", "server-2"]
}
}'
```
## 第三方集成
### Prometheus 集成
```yaml
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'mcphub'
static_configs:
- targets: ['localhost:3000']
metrics_path: '/api/monitoring/prometheus'
scrape_interval: 30s
```
### Grafana 仪表板
```json
{
"dashboard": {
"title": "MCPHub 监控",
"panels": [
{
"title": "请求率",
"type": "graph",
"targets": [
{
"expr": "rate(mcphub_requests_total[5m])",
"legendFormat": "{{server_id}}"
}
]
},
{
"title": "响应时间",
"type": "graph",
"targets": [
{
"expr": "histogram_quantile(0.95, mcphub_response_time_histogram)",
"legendFormat": "95th percentile"
}
]
}
]
}
}
```
### ELK Stack 集成
```json
{
"logstash": {
"input": {
"beats": {
"port": 5044
}
},
"filter": {
"if": "[fields][service] == 'mcphub'",
"json": {
"source": "message"
},
"date": {
"match": ["timestamp", "ISO8601"]
}
},
"output": {
"elasticsearch": {
"hosts": ["localhost:9200"],
"index": "mcphub-logs-%{+YYYY.MM.dd}"
}
}
}
}
```
## 故障排除
### 监控问题诊断
```bash
# 检查监控服务状态
curl -X GET http://localhost:3000/api/monitoring/health \
-H "Authorization: Bearer $TOKEN"
# 验证指标收集
curl -X GET http://localhost:3000/api/monitoring/metrics/validation \
-H "Authorization: Bearer $TOKEN"
```
### 性能问题分析
```bash
# 性能瓶颈分析
curl -X GET http://localhost:3000/api/monitoring/performance/bottlenecks \
-H "Authorization: Bearer $TOKEN" \
-G -d "timeRange=1h"
```
### 常见监控问题
1. **指标丢失**
- 检查收集器配置
- 验证网络连接
- 检查存储空间
2. **警报不触发**
- 验证警报规则语法
- 检查通知配置
- 测试通知渠道
3. **仪表板加载缓慢**
- 优化查询时间范围
- 增加数据聚合
- 检查数据库性能
## 最佳实践
1. **监控层次化**: 建立应用、基础设施和业务三层监控
2. **合理的警报**: 避免警报疲劳,设置合适的阈值
3. **数据保留**: 根据业务需求设置适当的数据保留期
4. **安全监控**: 监控安全相关的指标和事件
5. **持续优化**: 定期审查和优化监控配置
有关更多信息,请参阅 [智能路由](/zh/features/smart-routing) 和 [服务器管理](/zh/features/server-management) 文档。

View File

@@ -0,0 +1,417 @@
---
title: '服务器管理'
description: '通过热插拔配置集中管理多个 MCP 服务器'
---
## 概述
MCPHub 的服务器管理系统允许您从单个仪表板集中配置、监控和控制多个 MCP模型上下文协议服务器。所有更改都会实时应用无需重启服务器。
## 添加 MCP 服务器
### 通过仪表板
1. **访问仪表板**: 导航到 `http://localhost:3000` 并登录
2. **点击"添加服务器"**: 位于服务器部分
3. **填写服务器详细信息**:
- **名称**: 服务器的唯一标识符
- **命令**: 可执行命令(例如 `npx`、`uvx`、`python`
- **参数**: 命令参数数组
- **环境变量**: 环境设置的键值对
- **工作目录**: 命令的可选工作目录
### 通过配置文件
编辑您的 `mcp_settings.json` 文件:
```json
{
"mcpServers": {
"server-name": {
"command": "command-to-run",
"args": ["arg1", "arg2"],
"env": {
"API_KEY": "your-api-key",
"CONFIG_VALUE": "some-value"
},
"cwd": "/optional/working/directory"
}
}
}
```
### 通过 API
使用 REST API 以编程方式添加服务器:
```bash
curl -X POST http://localhost:3000/api/servers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "fetch-server",
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {}
}'
```
## 流行的 MCP 服务器示例
<AccordionGroup>
<Accordion title="Web 抓取服务器">
提供网页抓取和 HTTP 请求功能:
```json
{
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
```
**可用工具:**
- `fetch`: 发起 HTTP 请求
- `fetch_html`: 抓取网页
- `fetch_json`: 从 API 获取 JSON 数据
</Accordion>
<Accordion title="Playwright 浏览器自动化">
用于网页交互的浏览器自动化:
```json
{
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
```
**可用工具:**
- `playwright_navigate`: 导航到网页
- `playwright_screenshot`: 截取屏幕截图
- `playwright_click`: 点击元素
- `playwright_fill`: 填写表单
</Accordion>
<Accordion title="文件系统操作">
文件和目录管理:
```json
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
}
}
```
**可用工具:**
- `read_file`: 读取文件内容
- `write_file`: 写入文件
- `create_directory`: 创建目录
- `list_directory`: 列出目录内容
</Accordion>
<Accordion title="SQLite 数据库">
数据库操作:
```json
{
"sqlite": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite", "/path/to/database.db"]
}
}
```
**可用工具:**
- `execute_query`: 执行 SQL 查询
- `describe_tables`: 获取表结构
- `create_table`: 创建新表
</Accordion>
<Accordion title="Slack 集成">
Slack 工作空间集成:
```json
{
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-bot-token",
"SLACK_TEAM_ID": "T1234567890"
}
}
}
```
**可用工具:**
- `send_slack_message`: 发送消息到频道
- `list_slack_channels`: 列出可用频道
- `get_slack_thread`: 获取线程消息
</Accordion>
<Accordion title="GitHub 集成">
GitHub 仓库操作:
```json
{
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_your_token"
}
}
}
```
**可用工具:**
- `create_or_update_file`: 创建/更新仓库文件
- `search_repositories`: 搜索 GitHub 仓库
- `create_issue`: 创建问题
- `create_pull_request`: 创建拉取请求
</Accordion>
<Accordion title="Google Drive">
Google Drive 文件操作:
```json
{
"gdrive": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-gdrive"],
"env": {
"GDRIVE_CLIENT_ID": "your-client-id",
"GDRIVE_CLIENT_SECRET": "your-client-secret",
"GDRIVE_REDIRECT_URI": "your-redirect-uri"
}
}
}
```
**可用工具:**
- `gdrive_search`: 搜索文件和文件夹
- `gdrive_read`: 读取文件内容
- `gdrive_create`: 创建新文件
</Accordion>
<Accordion title="高德地图(中国)">
中国地图和位置服务:
```json
{
"amap": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "your-api-key"
}
}
}
```
**可用工具:**
- `search_location`: 搜索位置
- `get_directions`: 获取路线指引
- `reverse_geocode`: 将坐标转换为地址
</Accordion>
</AccordionGroup>
## 服务器生命周期管理
### 启动服务器
服务器会在以下情况下自动启动:
- MCPHub 启动时
- 通过仪表板或 API 添加服务器时
- 服务器配置更新时
- 手动重启已停止的服务器时
### 停止服务器
您可以通过以下方式停止服务器:
- **通过仪表板**: 切换服务器状态开关
- **通过 API**: 发送 POST 请求到 `/api/servers/{name}/toggle`
- **自动停止**: 服务器崩溃或遇到错误时会自动停止
### 重启服务器
服务器会在以下情况下自动重启:
- 配置更改时
- 环境变量更新后
- 通过仪表板或 API 手动触发时
## 服务器状态监控
### 状态指示器
每个服务器都显示状态指示器:
- 🟢 **运行中**: 服务器处于活动状态并响应
- 🟡 **启动中**: 服务器正在初始化
- 🔴 **已停止**: 服务器未运行
- ⚠️ **错误**: 服务器遇到错误
### 实时日志
实时查看服务器日志:
1. **仪表板日志**: 点击服务器查看其日志
2. **API 日志**: 通过 `/api/logs` 端点访问日志
3. **流式日志**: 通过 WebSocket 订阅日志流
### 健康检查
MCPHub 自动执行健康检查:
- **初始化检查**: 验证服务器成功启动
- **工具发现**: 确认检测到可用工具
- **响应检查**: 测试服务器响应性
- **资源监控**: 跟踪 CPU 和内存使用情况
## 配置管理
### 环境变量
服务器可以使用环境变量进行配置:
```json
{
"server-name": {
"command": "python",
"args": ["server.py"],
"env": {
"API_KEY": "${YOUR_API_KEY}",
"DEBUG": "true",
"MAX_CONNECTIONS": "10"
}
}
}
```
**环境变量展开:**
- `${VAR_NAME}`: 展开为环境变量值
- `${VAR_NAME:-default}`: 如果变量未设置则使用默认值
- `${VAR_NAME:+value}`: 如果变量已设置则使用指定值
### 命令变体
指定服务器命令的不同方式:
<Tabs>
<Tab title="npm/npx">
```json
{
"npm-server": {
"command": "npx",
"args": ["-y", "package-name", "--option", "value"]
}
}
```
</Tab>
<Tab title="Python/uvx">
```json
{
"python-server": {
"command": "uvx",
"args": ["package-name", "--config", "config.json"]
}
}
```
</Tab>
</Tabs>
## 高级功能
### 热重载
MCPHub 支持服务器配置的热重载:
1. **仪表板更新**: 立即应用通过 Web 界面进行的更改
2. **API 更新**: 通过 REST API 调用进行实时更新
3. **零停机时间**: 优雅的服务器重启,不影响其他服务器
## 故障排除
<AccordionGroup>
<Accordion title="服务器无法启动">
**检查以下项目:**
- 命令在 PATH 中可用
- 已设置所有必需的环境变量
- 工作目录存在且可访问
- 网络端口未被阻塞
- 依赖项已安装
**调试步骤:**
1. 在仪表板中检查服务器日志
2. 在终端中手动测试命令
3. 验证环境变量展开
4. 检查文件权限
</Accordion>
<Accordion title="服务器持续崩溃">
**常见原因:**
- 无效的配置参数
- 缺少 API 密钥或凭据
- 超出资源限制
- 依赖项冲突
**解决方案:**
1. 查看服务器日志中的错误消息
2. 使用最小配置进行测试
3. 验证所有凭据和 API 密钥
4. 检查系统资源可用性
</Accordion>
<Accordion title="工具未显示">
**可能的问题:**
- 服务器未完全初始化
- 工具发现超时
- 通信协议不匹配
- 服务器报告错误
**调试步骤:**
1. 等待服务器初始化完成
2. 检查服务器日志中的工具注册消息
3. 测试与服务器的直接通信
4. 验证 MCP 协议兼容性
</Accordion>
</AccordionGroup>
## 下一步
<CardGroup cols={2}>
<Card title="分组管理" icon="users" href="/zh/features/group-management">
将服务器组织成逻辑分组
</Card>
<Card title="智能路由" icon="route" href="/zh/features/smart-routing">
设置 AI 驱动的工具发现
</Card>
<Card title="API 参考" icon="code" href="/zh/api-reference/servers">
服务器管理 API 文档
</Card>
<Card title="配置指南" icon="cog" href="/zh/configuration/mcp-settings">
详细配置选项
</Card>
</CardGroup>

View File

@@ -0,0 +1,367 @@
---
title: '智能路由'
description: '使用向量语义搜索的 AI 工具发现系统'
---
## 概述
智能路由是 MCPHub 的智能工具发现系统它使用向量语义搜索来自动找到与任何给定任务最相关的工具。AI 客户端无需手动指定使用哪些工具,只需描述他们想要完成的任务,智能路由就会识别并提供对最合适工具的访问。
## 智能路由的工作原理
### 1. 工具索引
当服务器启动时,智能路由会自动:
- 从 MCP 服务器发现所有可用工具
- 提取工具元数据(名称、描述、参数)
- 将工具信息转换为向量嵌入
- 使用 pgvector 将嵌入存储在 PostgreSQL 中
### 2. 语义搜索
当进行查询时:
- 用户查询被转换为向量嵌入
- 相似性搜索使用余弦相似度找到匹配的工具
- 动态阈值过滤掉不相关的结果
- 结果按相关性得分排序
### 3. 智能过滤
智能路由应用多个过滤器:
- **相关性阈值**:只返回高于相似性阈值的工具
- **上下文感知**:考虑对话上下文
- **工具可用性**:确保工具当前可访问
- **权限过滤**:尊重用户访问权限
### 4. 工具执行
找到的工具可以直接执行:
- 参数验证确保正确的工具使用
- 错误处理提供有用的反馈
- 响应格式保持一致性
- 日志记录跟踪工具使用情况进行分析
## 前置条件
智能路由需要比基础 MCPHub 使用更多的设置:
### 必需组件
1. **带有 pgvector 的 PostgreSQL**:用于嵌入存储的向量数据库
2. **嵌入服务**OpenAI API 或兼容服务
3. **环境配置**:正确的配置变量
## 使用智能路由
### 智能路由端点
通过特殊的 `$smart` 端点访问智能路由:
<Tabs>
<Tab title="HTTP MCP">
```
http://localhost:3000/mcp/$smart
```
</Tab>
<Tab title="SSE (Legacy)">
```
http://localhost:3000/sse/$smart
```
</Tab>
</Tabs>
{/* ## 性能优化
### 嵌入缓存
智能路由缓存嵌入以提高性能:
```bash
# 配置缓存设置
EMBEDDING_CACHE_TTL=3600 # 缓存 1 小时
EMBEDDING_CACHE_SIZE=10000 # 最多缓存 10k 个嵌入
EMBEDDING_CACHE_CLEANUP=300 # 每 5 分钟清理一次
```
### 批处理
工具批量索引以提高效率:
```bash
# 嵌入生成的批大小
EMBEDDING_BATCH_SIZE=100
# 并发嵌入请求
EMBEDDING_CONCURRENCY=5
# 索引更新频率
INDEX_UPDATE_INTERVAL=3600 # 每小时重新索引
```
### 数据库优化
为向量操作优化 PostgreSQL
```sql
-- 创建索引以获得更好的性能
CREATE INDEX ON tool_embeddings USING hnsw (embedding vector_cosine_ops);
-- 调整 PostgreSQL 设置
ALTER SYSTEM SET shared_preload_libraries = 'vector';
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
```
## 监控和分析
### 智能路由指标
监控智能路由性能:
```bash
# 获取智能路由统计信息
curl http://localhost:3000/api/smart-routing/stats \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
响应包括:
- 查询计数和频率
- 平均响应时间
- 嵌入缓存命中率
- 最受欢迎的工具
- 查询模式
### 工具使用分析
跟踪哪些工具被发现和使用:
```bash
# 获取工具使用分析
curl http://localhost:3000/api/smart-routing/analytics \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
指标包括:
- 工具发现率
- 执行成功率
- 用户满意度评分
- 查询到执行的转换率
### 性能监控
监控系统性能:
```bash
# 数据库性能
curl http://localhost:3000/api/smart-routing/db-stats \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# 嵌入服务状态
curl http://localhost:3000/api/smart-routing/embedding-stats \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
## 高级功能
### 自定义嵌入
使用自定义嵌入模型:
```bash
# Hugging Face 模型
EMBEDDING_SERVICE=huggingface
HUGGINGFACE_MODEL=sentence-transformers/all-MiniLM-L6-v2
HUGGINGFACE_API_KEY=your_api_key
# 本地嵌入服务
EMBEDDING_SERVICE=local
EMBEDDING_SERVICE_URL=http://localhost:8080/embeddings
```
### 查询增强
增强查询以获得更好的结果:
```json
{
"queryEnhancement": {
"enabled": true,
"expandAcronyms": true,
"addSynonyms": true,
"contextualExpansion": true
}
}
```
### 结果过滤
基于条件过滤结果:
```json
{
"resultFiltering": {
"minRelevanceScore": 0.7,
"maxResults": 10,
"preferredServers": ["fetch", "playwright"],
"excludeServers": ["deprecated-server"]
}
}
```
### 反馈学习
基于用户反馈改进结果:
```bash
# 对搜索结果提供反馈
curl -X POST http://localhost:3000/api/smart-routing/feedback \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"queryId": "search-123",
"toolName": "fetch_html",
"rating": 5,
"successful": true,
"comments": "完美适合这个任务的工具"
}'
``` */}
## 故障排除
<AccordionGroup>
<Accordion title="数据库连接问题">
**症状:**
- 智能路由不可用
- 数据库连接错误
- 嵌入存储失败
**解决方案:**
1. 验证 PostgreSQL 是否正在运行
2. 检查 DATABASE_URL 格式
3. 确保安装了 pgvector 扩展
4. 手动测试连接:
```bash
psql $DATABASE_URL -c "SELECT 1;"
```
</Accordion>
<Accordion title="嵌入服务问题">
**症状:**
- 工具索引失败
- 查询处理错误
- API 速率限制错误
**解决方案:**
1. 验证 API 密钥有效性
2. 检查网络连接
3. 监控速率限制
4. 测试嵌入服务:
```bash
curl -X POST https://api.openai.com/v1/embeddings \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": "test", "model": "text-embedding-3-small"}'
```
</Accordion>
<Accordion title="搜索结果不佳">
**症状:**
- 返回不相关的工具
- 相关性得分低
- 缺少预期的工具
**解决方案:**
1. 调整相似性阈值
2. 使用更好的描述重新索引工具
3. 使用更具体的查询
4. 检查工具元数据质量
```bash
# 重新索引所有工具
curl -X POST http://localhost:3000/api/smart-routing/reindex \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
</Accordion>
<Accordion title="性能问题">
**症状:**
- 查询响应缓慢
- 数据库负载高
- 内存使用激增
**解决方案:**
1. 优化数据库配置
2. 增加缓存大小
3. 减少批处理大小
4. 监控系统资源
```bash
# 检查系统性能
curl http://localhost:3000/api/smart-routing/performance \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
```
</Accordion>
</AccordionGroup>
## 最佳实践
### 查询编写
<Tip>
**要具体描述**:在查询中使用具体、描述性的语言以获得更好的工具匹配。
</Tip>
<Tip>
**包含上下文**:提供有关您的任务或领域的相关上下文以获得更准确的结果。
</Tip>
<Tip>**使用自然语言**:像向人类描述任务一样编写查询。</Tip>
### 工具描述
<Warning>
**质量元数据**:确保 MCP 服务器提供高质量的工具描述和元数据。
</Warning>
<Warning>**定期更新**:随着功能的发展保持工具描述的最新状态。</Warning>
<Warning>
**一致的命名**:在工具和服务器中使用一致的命名约定。
</Warning>
### 系统维护
<Info>**定期重新索引**:定期重新索引工具以确保嵌入质量。</Info>
<Info>**监控性能**:跟踪查询模式并根据使用情况进行优化。</Info>
<Info>
**更新模型**:随着新嵌入模型的出现,考虑更新到更新的模型。
</Info>
## 下一步
<CardGroup cols={2}>
<Card title="身份验证" icon="shield" href="/zh/features/authentication">
用户管理和访问控制
</Card>
<Card title="监控" icon="chart-line" href="/zh/features/monitoring">
系统监控和分析
</Card>
<Card title="API 参考" icon="code" href="/zh/api-reference/smart-routing">
完整的智能路由 API 文档
</Card>
<Card title="配置" icon="cog" href="/zh/configuration/environment-variables">
高级配置选项
</Card>
</CardGroup>

95
docs/zh/index.mdx Normal file
View File

@@ -0,0 +1,95 @@
---
title: '欢迎使用'
description: 'MCPHub 是一个强大的 Model Context Protocol (MCP) 服务器管理平台,提供分组管理、智能路由和实时监控等功能'
---
{/* <img className="block dark:hidden" src="/images/hero-light.png" alt="MCPHub Hero Light" />
<img className="hidden dark:block" src="/images/hero-dark.png" alt="MCPHub Hero Dark" /> */}
## 什么是 MCPHub
MCPHub 是一个现代化的 Model Context Protocol (MCP) 服务器管理平台,旨在简化 AI 模型服务的部署、管理和监控。通过分组管理和智能路由技术MCPHub 帮助您构建高可用、可扩展的 AI 服务架构。
### 核心功能
- **🏗️ 分组管理** - 灵活的服务器分组和配置管理
- **🚀 智能路由** - 基于语义检索的智能路由分发
- **📊 实时监控** - 全面的性能指标和健康检查
- **🔐 安全认证** - 身份认证和访问控制
## 快速开始
立即开始使用 MCPHub只需几分钟即可部署您的第一个 MCP 服务器。
<CardGroup cols={2}>
<Card title="5 分钟快速部署" icon="rocket" href="/zh/quickstart">
跟随我们的快速开始指南5 分钟内部署 MCPHub 并连接您的第一个 MCP 服务器
</Card>
<Card title="开发环境搭建" icon="code" href="/zh/development/getting-started">
设置本地开发环境,了解 MCPHub 的架构和开发工作流
</Card>
</CardGroup>
## 核心概念
了解 MCPHub 的核心概念,为深入使用做好准备。
<CardGroup cols={2}>
<Card title="MCP 协议介绍" icon="network-wired" href="/zh/concepts/mcp-protocol">
深入了解 Model Context Protocol 的工作原理和最佳实践
</Card>
<Card title="智能路由机制" icon="route" href="/zh/features/smart-routing">
学习 MCPHub 的智能路由算法和配置策略
</Card>
<Card title="服务器管理" icon="server" href="/zh/features/server-management">
掌握 MCP 服务器的添加、配置和管理技巧
</Card>
<Card title="监控与分析" icon="chart-line" href="/zh/features/monitoring">
使用内置的监控工具跟踪性能和识别问题
</Card>
</CardGroup>
## 部署选项
MCPHub 支持多种部署方式,满足不同规模和场景的需求。
<CardGroup cols={3}>
<Card title="Docker 部署" icon="docker" href="/zh/configuration/docker-setup">
使用 Docker 容器快速部署,支持单机和集群模式
</Card>
<Card title="云服务部署" icon="cloud" href="/zh/deployment/cloud">
在 AWS、GCP、Azure 等云平台上部署 MCPHub
</Card>
<Card title="Kubernetes" icon="dharmachakra" href="/zh/deployment/kubernetes">
在 Kubernetes 集群中部署高可用的 MCPHub 服务
</Card>
</CardGroup>
## API 和集成
MCPHub 提供完整的 RESTful API 和多语言 SDK方便与现有系统集成。
<CardGroup cols={2}>
<Card title="API 参考文档" icon="code" href="/zh/api-reference/introduction">
完整的 API 接口文档,包含详细的请求示例和响应格式
</Card>
<Card title="SDK 和工具" icon="toolbox" href="/zh/sdk">
官方 SDK 和命令行工具,加速开发集成
</Card>
</CardGroup>
## 社区和支持
加入 MCPHub 社区,获取帮助和分享经验。
<CardGroup cols={2}>
<Card title="GitHub 仓库" icon="github" href="https://github.com/mcphub/mcphub">
查看源代码、提交问题和贡献代码
</Card>
<Card title="Discord 社区" icon="discord" href="https://discord.gg/mcphub">
与其他开发者交流,获取实时帮助
</Card>
<Card title="Sponsor" icon="heart" href="https://ko-fi.com/samanhappy">
支持 MCPHub 的开发和维护,帮助我们持续改进
</Card>
</CardGroup>

570
docs/zh/installation.mdx Normal file
View File

@@ -0,0 +1,570 @@
---
title: '安装指南'
description: '各种平台的详细安装说明'
---
## 先决条件
在安装 MCPHub 之前,请确保您具备以下先决条件:
- **Node.js** 18+ (用于本地开发)
- **Docker** (推荐用于生产环境)
- **pnpm** (用于本地开发)
智能路由的可选要求:
- **PostgreSQL** 带 pgvector 扩展
- **OpenAI API Key** 或兼容的嵌入服务
## 安装方法
<Tabs>
<Tab title="Docker (推荐)">
### Docker 安装
Docker 是在生产环境中部署 MCPHub 的推荐方式。
#### 1. 基础安装
```bash
# 拉取最新镜像
docker pull samanhappy/mcphub:latest
# 使用默认设置运行
docker run -d \
--name mcphub \
-p 3000:3000 \
samanhappy/mcphub:latest
```
#### 2. 使用自定义配置
```bash
# 创建您的配置文件
cat > mcp_settings.json << 'EOF'
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
}
EOF
# 使用挂载的配置运行
docker run -d \
--name mcphub \
-p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
samanhappy/mcphub:latest
```
#### 3. 使用环境变量
```bash
docker run -d \
--name mcphub \
-p 3000:3000 \
-e PORT=3000 \
-e BASE_PATH="" \
samanhappy/mcphub:latest
```
#### 4. Docker Compose
创建 `docker-compose.yml` 文件:
```yaml
version: '3.8'
services:
mcphub:
image: samanhappy/mcphub:latest
ports:
- "3000:3000"
volumes:
- ./mcp_settings.json:/app/mcp_settings.json
environment:
- PORT=3000
- BASE_PATH=""
- REQUEST_TIMEOUT=60000
restart: unless-stopped
# 可选:用于智能路由的 PostgreSQL
postgres:
image: pgvector/pgvector:pg16
environment:
POSTGRES_DB: mcphub
POSTGRES_USER: mcphub
POSTGRES_PASSWORD: mcphub_password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
```
运行命令:
```bash
docker-compose up -d
```
</Tab>
<Tab title="npm 包">
### npm 包安装
将 MCPHub 安装为全局 npm 包:
#### 1. 全局安装
```bash
# 全局安装
npm install -g @samanhappy/mcphub
# 或使用 yarn
yarn global add @samanhappy/mcphub
# 或使用 pnpm
pnpm add -g @samanhappy/mcphub
```
#### 2. 运行 MCPHub
```bash
# 使用默认设置运行
mcphub
# 使用自定义端口运行
PORT=8080 mcphub
```
{/* #### 3. 本地安装
您也可以在项目中本地安装 MCPHub
```bash
# 创建新目录
mkdir my-mcphub
cd my-mcphub
# 初始化 package.json
npm init -y
# 本地安装 MCPHub
npm install @samanhappy/mcphub
# 创建启动脚本
echo '#!/bin/bash\nnpx mcphub' > start.sh
chmod +x start.sh
# 运行 MCPHub
./start.sh
``` */}
</Tab>
<Tab title="本地开发">
### 本地开发环境设置
用于开发、自定义或贡献:
#### 1. 克隆仓库
```bash
# 克隆仓库
git clone https://github.com/samanhappy/mcphub.git
cd mcphub
```
#### 2. 安装依赖
```bash
# 使用 pnpm 安装依赖(推荐)
pnpm install
# 或使用 npm
npm install
# 或使用 yarn
yarn install
```
#### 3. 开发模式
```bash
# 在开发模式下同时启动后端和前端
pnpm dev
# 这将启动:
# - 后端在 http://localhost:3001
# - 前端在 http://localhost:5173
# - 前端代理 API 调用到后端
```
#### 4. 生产构建
```bash
# 构建后端和前端
pnpm build
# 启动生产服务器
pnpm start
```
#### 5. 开发脚本
```bash
# 仅后端(用于 API 开发)
pnpm backend:dev
# 仅前端(当后端单独运行时)
pnpm frontend:dev
# 运行测试
pnpm test
# 代码检查
pnpm lint
# 代码格式化
pnpm format
```
<Note>
在 Windows 上,您可能需要分别运行后端和前端:
```bash
# 终端 1后端
pnpm backend:dev
# 终端 2前端
pnpm frontend:dev
```
</Note>
</Tab>
<Tab title="Kubernetes">
### Kubernetes 部署
使用这些清单在 Kubernetes 上部署 MCPHub
#### 1. 设置的 ConfigMap
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mcphub-config
data:
mcp_settings.json: |
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
}
}
```
#### 2. 部署
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcphub
spec:
replicas: 1
selector:
matchLabels:
app: mcphub
template:
metadata:
labels:
app: mcphub
spec:
containers:
- name: mcphub
image: samanhappy/mcphub:latest
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
volumeMounts:
- name: config
mountPath: /app/mcp_settings.json
subPath: mcp_settings.json
volumes:
- name: config
configMap:
name: mcphub-config
```
#### 3. 服务
```yaml
apiVersion: v1
kind: Service
metadata:
name: mcphub-service
spec:
selector:
app: mcphub
ports:
- port: 80
targetPort: 3000
type: ClusterIP
```
#### 4. Ingress (可选)
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mcphub-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-buffering: "off"
spec:
rules:
- host: mcphub.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mcphub-service
port:
number: 80
```
部署命令:
```bash
kubectl apply -f mcphub-configmap.yaml
kubectl apply -f mcphub-deployment.yaml
kubectl apply -f mcphub-service.yaml
kubectl apply -f mcphub-ingress.yaml
```
</Tab>
</Tabs>
## 智能路由设置 (可选)
智能路由使用向量语义搜索提供 AI 驱动的工具发现。
### 先决条件
1. **PostgreSQL 带 pgvector 扩展**
2. **OpenAI API Key** (或兼容的嵌入服务)
### 数据库设置
<Tabs>
<Tab title="Docker PostgreSQL">
```bash
# 运行带 pgvector 的 PostgreSQL
docker run -d \
--name mcphub-postgres \
-e POSTGRES_DB=mcphub \
-e POSTGRES_USER=mcphub \
-e POSTGRES_PASSWORD=your_password \
-p 5432:5432 \
pgvector/pgvector:pg16
```
</Tab>
<Tab title="现有 PostgreSQL">
如果您有现有的 PostgreSQL 实例:
```sql
-- 连接到您的 PostgreSQL 实例
-- 创建数据库
CREATE DATABASE mcphub;
-- 连接到 mcphub 数据库
\c mcphub;
-- 启用 pgvector 扩展
CREATE EXTENSION IF NOT EXISTS vector;
```
</Tab>
<Tab title="云 PostgreSQL">
对于云提供商AWS RDS、Google Cloud SQL 等):
1. 在您的云提供商控制台中启用 pgvector 扩展
2. 创建名为 `mcphub` 的数据库
3. 记下连接详细信息
</Tab>
</Tabs>
{/* ### 环境配置
设置以下环境变量:
```bash
# 数据库连接
DATABASE_URL=postgresql://mcphub:your_password@localhost:5432/mcphub
# 用于嵌入的 OpenAI API
OPENAI_API_KEY=your_openai_api_key
# 可选:自定义嵌入模型
EMBEDDING_MODEL=text-embedding-3-small
# 可选:启用智能路由
ENABLE_SMART_ROUTING=true
``` */}
## 验证
安装后,验证 MCPHub 是否正常工作:
{/* ### 1. 健康检查
```bash
curl http://localhost:3000/api/health
```
预期响应:
```json
{
"status": "ok",
"version": "x.x.x",
"uptime": 123
}
``` */}
### 控制台访问
打开浏览器并导航到:
```
http://localhost:3000
```
{/* ### 3. API 测试
```bash
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'
``` */}
## 故障排除
<AccordionGroup>
<Accordion title="Docker 问题">
**端口已被使用:**
```bash
# 检查是什么在使用端口 3000
lsof -i :3000
# 使用不同的端口
docker run -p 8080:3000 samanhappy/mcphub
```
**容器无法启动:**
```bash
# 检查容器日志
docker logs mcphub
# 交互式运行以进行调试
docker run -it --rm samanhappy/mcphub /bin/bash
```
</Accordion>
<Accordion title="npm 安装问题">
**权限错误:**
```bash
# 使用 npx 而不是全局安装
npx @samanhappy/mcphub
# 或修复 npm 权限
npm config set prefix ~/.npm-global
export PATH=~/.npm-global/bin:$PATH
```
**Node 版本问题:**
```bash
# 检查 Node 版本
node --version
# 使用 nvm 安装 Node 18+
nvm install 18
nvm use 18
```
</Accordion>
<Accordion title="网络问题">
**无法访问控制台:**
- 检查 MCPHub 是否在运行:`ps aux | grep mcphub`
- 验证端口绑定:`netstat -tlnp | grep 3000`
- 检查防火墙设置
- 尝试通过 `127.0.0.1:3000` 而不是 `localhost:3000` 访问
**AI 客户端无法连接:**
- 确保端点 URL 正确
- 检查 MCPHub 是否在代理后面
- 验证 Kubernetes/Docker 环境中的网络策略
</Accordion>
<Accordion title="智能路由问题">
**数据库连接失败:**
```bash
# 测试数据库连接
psql $DATABASE_URL -c "SELECT 1;"
# 检查是否安装了 pgvector
psql $DATABASE_URL -c "CREATE EXTENSION IF NOT EXISTS vector;"
```
**嵌入服务错误:**
- 验证 OpenAI API 密钥是否有效
- 检查互联网连接
- 监控速率限制
</Accordion>
</AccordionGroup>
## 下一步
<CardGroup cols={2}>
<Card title="配置" icon="cog" href="/zh/configuration/mcp-settings">
配置您的 MCP 服务器和设置
</Card>
<Card title="快速开始" icon="rocket" href="/zh/quickstart">
5分钟内启动并运行
</Card>
<Card title="服务器管理" icon="server" href="/zh/features/server-management">
了解如何管理您的 MCP 服务器
</Card>
<Card title="API 参考" icon="code" href="/zh/api-reference/introduction">
探索完整的 API 文档
</Card>
</CardGroup>

212
docs/zh/quickstart.mdx Normal file
View File

@@ -0,0 +1,212 @@
---
title: '快速开始指南'
description: '5 分钟内运行 MCPHub'
---
## 安装
<Tabs>
<Tab title="Docker推荐">
使用 Docker 是最快的开始方式:
```bash
# 使用默认配置运行
docker run -p 3000:3000 samanhappy/mcphub
```
或者挂载自定义配置:
```bash
# 使用自定义 MCP 设置运行
docker run -p 3000:3000 \
-v $(pwd)/mcp_settings.json:/app/mcp_settings.json \
samanhappy/mcphub
```
</Tab>
<Tab title="本地开发">
用于开发或自定义:
```bash
# 克隆仓库
git clone https://github.com/samanhappy/mcphub.git
cd mcphub
# 安装依赖
pnpm install
# 启动开发服务器
pnpm dev
```
这会同时启动后端(端口 3001和前端端口 5173的开发模式。
</Tab>
<Tab title="npm 包">
将 MCPHub 安装为全局包:
```bash
# 全局安装
npm install -g @samanhappy/mcphub
# 运行 MCPHub
mcphub
```
</Tab>
</Tabs>
## 初始设置
### 1. 访问控制面板
打开浏览器并导航到:
```
http://localhost:3000
```
### 2. 登录
使用默认凭据:
- **用户名**: `admin`
- **密码**: `admin123`
<Warning>为了安全起见,请在首次登录后立即更改这些默认凭据。</Warning>
### 3. 配置您的第一个 MCP 服务器
1. 在控制面板中点击 **"添加服务器"**
2. 输入服务器详细信息:
- **名称**: 唯一标识符(例如 `fetch`
- **命令**: 可执行命令(`uvx`
- **参数**: 命令参数(`["mcp-server-fetch"]`
- **环境**: 任何所需的环境变量
fetch 服务器的示例配置:
```json
{
"name": "fetch",
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {}
}
```
## 基本使用
### 连接 AI 客户端
一旦配置了服务器,使用 MCPHub 端点连接您的 AI 客户端:
<Tabs>
<Tab title="所有服务器">
访问所有已配置的 MCP 服务器:``` http://localhost:3000/mcp ```
</Tab>
<Tab title="特定组">
访问特定组中的服务器:``` http://localhost:3000/mcp/{groupName} ```
</Tab>
<Tab title="单个服务器">
访问单个服务器:``` http://localhost:3000/mcp/{serverName} ```
</Tab>
<Tab title="智能路由">
使用 AI 驱动的工具发现:``` http://localhost:3000/mcp/$smart ```
<Info>智能路由需要使用 pgvector 的 PostgreSQL 和 OpenAI API 密钥。</Info>
</Tab>
</Tabs>
### 示例:添加热门 MCP 服务器
以下是一些您可以添加的热门 MCP 服务器:
<AccordionGroup>
<Accordion title="Web Fetch 服务器">
```json
{
"name": "fetch",
"command": "uvx",
"args": ["mcp-server-fetch"]
}
```
</Accordion>
<Accordion title="Playwright 浏览器自动化">
```json
{
"name": "playwright",
"command": "npx",
"args": ["@playwright/mcp@latest", "--headless"]
}
```
</Accordion>
<Accordion title="高德地图(需要 API 密钥)">
```json
{
"name": "amap",
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "your-api-key-here"
}
}
```
</Accordion>
<Accordion title="Slack 集成">
```json
{
"name": "slack",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "your-bot-token",
"SLACK_TEAM_ID": "your-team-id"
}
}
```
</Accordion>
</AccordionGroup>
## 后续步骤
<CardGroup cols={2}>
<Card title="服务器管理" icon="server" href="/zh/features/server-management">
学习高级服务器配置和管理
</Card>
<Card title="组管理" icon="users" href="/zh/features/group-management">
将服务器组织成逻辑组
</Card>
<Card title="智能路由" icon="route" href="/zh/features/smart-routing">
设置 AI 驱动的工具发现
</Card>
<Card title="API 参考" icon="code" href="/zh/api-reference/introduction">
探索完整的 API 文档
</Card>
</CardGroup>
## 故障排除
<AccordionGroup>
<Accordion title="服务器无法启动">
- 检查 MCP 服务器命令是否在您的 PATH 中可访问
- 验证环境变量是否正确设置
- 检查 MCPHub 日志以获取详细错误信息
</Accordion>
<Accordion title="无法从 AI 客户端连接">
- 确保 MCPHub 在正确的端口上运行
- 检查防火墙设置
- 验证端点 URL 格式
</Accordion>
<Accordion title="身份验证问题">
- 验证凭据是否正确
- 检查 JWT 令牌是否有效
- 尝试清除浏览器缓存和 cookie
</Accordion>
</AccordionGroup>
需要更多帮助?加入我们的 [Discord 社区](https://discord.gg/qMKNsn5Q) 获取支持!

View File

@@ -0,0 +1,256 @@
{
"mcpServers": {
"example-api-url": {
"type": "openapi",
"openapi": {
"url": "https://api.example.com/openapi.json",
"version": "3.1.0",
"security": {
"type": "apiKey",
"apiKey": {
"name": "X-API-Key",
"in": "header",
"value": "your-api-key-here"
}
}
},
"headers": {
"User-Agent": "MCPHub/1.0"
},
"enabled": true
},
"example-api-schema": {
"type": "openapi",
"openapi": {
"schema": {
"openapi": "3.1.0",
"info": {
"title": "Example API",
"version": "1.0.0",
"description": "A sample API for demonstration"
},
"servers": [
{
"url": "https://api.example.com",
"description": "Production server"
}
],
"paths": {
"/users": {
"get": {
"operationId": "listUsers",
"summary": "List all users",
"description": "Retrieve a list of all users in the system",
"parameters": [
{
"name": "limit",
"in": "query",
"description": "Maximum number of users to return",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 10
}
},
{
"name": "offset",
"in": "query",
"description": "Number of users to skip",
"required": false,
"schema": {
"type": "integer",
"minimum": 0,
"default": 0
}
}
],
"responses": {
"200": {
"description": "List of users",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"users": {
"type": "array",
"items": {
"$ref": "#/components/schemas/User"
}
},
"total": {
"type": "integer",
"description": "Total number of users"
}
}
}
}
}
}
}
},
"post": {
"operationId": "createUser",
"summary": "Create a new user",
"description": "Create a new user in the system",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateUserRequest"
}
}
}
},
"responses": {
"201": {
"description": "User created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/User"
}
}
}
}
}
}
},
"/users/{userId}": {
"get": {
"operationId": "getUserById",
"summary": "Get user by ID",
"description": "Retrieve a specific user by their ID",
"parameters": [
{
"name": "userId",
"in": "path",
"required": true,
"description": "ID of the user to retrieve",
"schema": {
"type": "integer",
"minimum": 1
}
}
],
"responses": {
"200": {
"description": "User details",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/User"
}
}
}
},
"404": {
"description": "User not found"
}
}
}
}
},
"components": {
"schemas": {
"User": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Unique identifier for the user"
},
"name": {
"type": "string",
"description": "Full name of the user"
},
"email": {
"type": "string",
"format": "email",
"description": "Email address of the user"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "Timestamp when the user was created"
},
"status": {
"type": "string",
"enum": [
"active",
"inactive",
"suspended"
],
"description": "Current status of the user"
}
},
"required": [
"id",
"name",
"email"
]
},
"CreateUserRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Full name of the user"
},
"email": {
"type": "string",
"format": "email",
"description": "Email address of the user"
},
"status": {
"type": "string",
"enum": [
"active",
"inactive"
],
"default": "active",
"description": "Initial status of the user"
}
},
"required": [
"name",
"email"
]
}
},
"securitySchemes": {
"ApiKeyAuth": {
"type": "apiKey",
"in": "header",
"name": "X-API-Key"
}
}
},
"security": [
{
"ApiKeyAuth": []
}
]
},
"version": "3.1.0",
"security": {
"type": "apiKey",
"apiKey": {
"name": "X-API-Key",
"in": "header",
"value": "your-api-key-here"
}
}
},
"headers": {
"User-Agent": "MCPHub/1.0"
},
"enabled": true
}
}
}

BIN
frontend/favicon.ico Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -1,13 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MCP Hub Dashboard</title>
<title>MCPHub Dashboard</title>
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body class="bg-gray-100">
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

View File

@@ -1,46 +1,65 @@
import React from 'react';
import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom';
import { BrowserRouter as Router, Route, Routes, Navigate, useParams } from 'react-router-dom';
import { AuthProvider } from './contexts/AuthContext';
import { ToastProvider } from './contexts/ToastContext';
import { ThemeProvider } from './contexts/ThemeContext';
import { ServerProvider } from './contexts/ServerContext';
import MainLayout from './layouts/MainLayout';
import ProtectedRoute from './components/ProtectedRoute';
import LoginPage from './pages/LoginPage';
import DashboardPage from './pages/Dashboard';
import ServersPage from './pages/ServersPage';
import GroupsPage from './pages/GroupsPage';
import UsersPage from './pages/UsersPage';
import SettingsPage from './pages/SettingsPage';
import MarketPage from './pages/MarketPage';
import LogsPage from './pages/LogsPage';
import { getBasePath } from './utils/runtime';
// Helper component to redirect cloud server routes to market
const CloudRedirect: React.FC = () => {
const { serverName } = useParams<{ serverName: string }>();
return <Navigate to={`/market/${serverName}?tab=cloud`} replace />;
};
function App() {
const basename = getBasePath();
return (
<ThemeProvider>
<AuthProvider>
<ServerProvider>
<ToastProvider>
<Router>
<Router basename={basename}>
<Routes>
{/* 公共路由 */}
<Route path="/login" element={<LoginPage />} />
{/* 受保护的路由,使用 MainLayout 作为布局容器 */}
<Route element={<ProtectedRoute />}>
<Route element={<MainLayout />}>
<Route path="/" element={<DashboardPage />} />
<Route path="/servers" element={<ServersPage />} />
<Route path="/groups" element={<GroupsPage />} />
<Route path="/users" element={<UsersPage />} />
<Route path="/market" element={<MarketPage />} />
<Route path="/market/:serverName" element={<MarketPage />} />
{/* Legacy cloud routes redirect to market with cloud tab */}
<Route path="/cloud" element={<Navigate to="/market?tab=cloud" replace />} />
<Route
path="/cloud/:serverName"
element={<CloudRedirect />}
/>
<Route path="/logs" element={<LogsPage />} />
<Route path="/settings" element={<SettingsPage />} />
</Route>
</Route>
{/* 未匹配的路由重定向到首页 */}
<Route path="*" element={<Navigate to="/" />} />
</Routes>
</Router>
</ToastProvider>
</ServerProvider>
</AuthProvider>
</ThemeProvider>
);

View File

@@ -2,8 +2,8 @@ import { useState, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
import { useGroupData } from '@/hooks/useGroupData'
import { useServerData } from '@/hooks/useServerData'
import { GroupFormData, Server } from '@/types'
import { ToggleGroup } from './ui/ToggleGroup'
import { GroupFormData, Server, IGroupServerConfig } from '@/types'
import { ServerToolConfig } from './ServerToolConfig'
interface AddGroupFormProps {
onAdd: () => void
@@ -21,7 +21,7 @@ const AddGroupForm = ({ onAdd, onCancel }: AddGroupFormProps) => {
const [formData, setFormData] = useState<GroupFormData>({
name: '',
description: '',
servers: []
servers: [] as IGroupServerConfig[]
})
useEffect(() => {
@@ -50,9 +50,8 @@ const AddGroupForm = ({ onAdd, onCancel }: AddGroupFormProps) => {
}
const result = await createGroup(formData.name, formData.description, formData.servers)
if (!result) {
setError(t('groups.createError'))
if (!result || !result.success) {
setError(result?.message || t('groups.createError'))
setIsSubmitting(false)
return
}
@@ -66,64 +65,68 @@ const AddGroupForm = ({ onAdd, onCancel }: AddGroupFormProps) => {
return (
<div className="fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4">
<div className="bg-white rounded-lg shadow-lg max-w-md w-full">
<div className="p-6">
<div className="bg-white rounded-lg shadow-lg max-w-2xl w-full max-h-[90vh] flex flex-col">
<div className="p-6 flex-shrink-0">
<h2 className="text-xl font-semibold text-gray-800 mb-4">{t('groups.addNew')}</h2>
{error && (
<div className="mb-4 p-3 bg-red-100 text-red-700 rounded">
<div className="mb-4 p-3 bg-red-100 text-red-700 rounded-md border border-gray-200">
{error}
</div>
)}
<form onSubmit={handleSubmit}>
<div className="mb-4">
<label className="block text-gray-700 text-sm font-bold mb-2" htmlFor="name">
{t('groups.name')} *
</label>
<input
type="text"
id="name"
name="name"
value={formData.name}
onChange={handleChange}
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
placeholder={t('groups.namePlaceholder')}
required
/>
</div>
<ToggleGroup
className="mb-6"
label={t('groups.servers')}
noOptionsText={t('groups.noServerOptions')}
values={formData.servers}
options={availableServers.map(server => ({
value: server.name,
label: server.name
}))}
onChange={(servers) => setFormData(prev => ({ ...prev, servers }))}
/>
<div className="flex justify-end space-x-3">
<button
type="button"
onClick={onCancel}
className="px-4 py-2 text-gray-600 hover:text-gray-800"
disabled={isSubmitting}
>
{t('common.cancel')}
</button>
<button
type="submit"
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 disabled:opacity-50"
disabled={isSubmitting}
>
{isSubmitting ? t('common.submitting') : t('common.create')}
</button>
</div>
</form>
</div>
<form onSubmit={handleSubmit} className="flex flex-col flex-1 min-h-0">
<div className="flex-1 overflow-y-auto px-6">
<div className="space-y-4">
<div>
<label className="block text-gray-700 text-sm font-bold mb-2" htmlFor="name">
{t('groups.name')} *
</label>
<input
type="text"
id="name"
name="name"
value={formData.name}
onChange={handleChange}
className="w-full border border-gray-300 rounded-md px-3 py-2 text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
placeholder={t('groups.namePlaceholder')}
required
/>
</div>
<div>
<label className="block text-gray-700 text-sm font-bold mb-2">
{t('groups.configureTools')}
</label>
<ServerToolConfig
servers={availableServers}
value={formData.servers as IGroupServerConfig[]}
onChange={(servers) => setFormData(prev => ({ ...prev, servers }))}
className="border border-gray-200 rounded-lg p-4 bg-gray-50"
/>
</div>
</div>
</div>
<div className="flex justify-end space-x-3 p-6 pt-4 border-t border-gray-200 flex-shrink-0">
<button
type="button"
onClick={onCancel}
className="px-4 py-2 text-gray-600 hover:text-gray-800 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"
disabled={isSubmitting}
>
{t('common.cancel')}
</button>
<button
type="submit"
className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 disabled:opacity-50 transition-colors"
disabled={isSubmitting}
>
{isSubmitting ? t('common.submitting') : t('common.create')}
</button>
</div>
</form>
</div>
</div>
)

Some files were not shown because too many files have changed in this diff Show More