@wener/mcps 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.mjs +15 -0
  3. package/dist/mcps-cli.mjs +174727 -0
  4. package/lib/chat/agent.js +187 -0
  5. package/lib/chat/agent.js.map +1 -0
  6. package/lib/chat/audit.js +238 -0
  7. package/lib/chat/audit.js.map +1 -0
  8. package/lib/chat/converters.js +467 -0
  9. package/lib/chat/converters.js.map +1 -0
  10. package/lib/chat/handler.js +1068 -0
  11. package/lib/chat/handler.js.map +1 -0
  12. package/lib/chat/index.js +12 -0
  13. package/lib/chat/index.js.map +1 -0
  14. package/lib/chat/types.js +35 -0
  15. package/lib/chat/types.js.map +1 -0
  16. package/lib/contracts/AuditContract.js +85 -0
  17. package/lib/contracts/AuditContract.js.map +1 -0
  18. package/lib/contracts/McpsContract.js +113 -0
  19. package/lib/contracts/McpsContract.js.map +1 -0
  20. package/lib/contracts/index.js +3 -0
  21. package/lib/contracts/index.js.map +1 -0
  22. package/lib/dev.server.js +7 -0
  23. package/lib/dev.server.js.map +1 -0
  24. package/lib/entities/ChatRequestEntity.js +318 -0
  25. package/lib/entities/ChatRequestEntity.js.map +1 -0
  26. package/lib/entities/McpRequestEntity.js +271 -0
  27. package/lib/entities/McpRequestEntity.js.map +1 -0
  28. package/lib/entities/RequestLogEntity.js +177 -0
  29. package/lib/entities/RequestLogEntity.js.map +1 -0
  30. package/lib/entities/ResponseEntity.js +150 -0
  31. package/lib/entities/ResponseEntity.js.map +1 -0
  32. package/lib/entities/index.js +11 -0
  33. package/lib/entities/index.js.map +1 -0
  34. package/lib/entities/types.js +11 -0
  35. package/lib/entities/types.js.map +1 -0
  36. package/lib/index.js +3 -0
  37. package/lib/index.js.map +1 -0
  38. package/lib/mcps-cli.js +44 -0
  39. package/lib/mcps-cli.js.map +1 -0
  40. package/lib/providers/McpServerHandlerDef.js +40 -0
  41. package/lib/providers/McpServerHandlerDef.js.map +1 -0
  42. package/lib/providers/findMcpServerDef.js +26 -0
  43. package/lib/providers/findMcpServerDef.js.map +1 -0
  44. package/lib/providers/prometheus/def.js +24 -0
  45. package/lib/providers/prometheus/def.js.map +1 -0
  46. package/lib/providers/prometheus/index.js +2 -0
  47. package/lib/providers/prometheus/index.js.map +1 -0
  48. package/lib/providers/relay/def.js +32 -0
  49. package/lib/providers/relay/def.js.map +1 -0
  50. package/lib/providers/relay/index.js +2 -0
  51. package/lib/providers/relay/index.js.map +1 -0
  52. package/lib/providers/sql/def.js +31 -0
  53. package/lib/providers/sql/def.js.map +1 -0
  54. package/lib/providers/sql/index.js +2 -0
  55. package/lib/providers/sql/index.js.map +1 -0
  56. package/lib/providers/tencent-cls/def.js +44 -0
  57. package/lib/providers/tencent-cls/def.js.map +1 -0
  58. package/lib/providers/tencent-cls/index.js +2 -0
  59. package/lib/providers/tencent-cls/index.js.map +1 -0
  60. package/lib/scripts/bundle.js +90 -0
  61. package/lib/scripts/bundle.js.map +1 -0
  62. package/lib/server/api-routes.js +96 -0
  63. package/lib/server/api-routes.js.map +1 -0
  64. package/lib/server/audit.js +274 -0
  65. package/lib/server/audit.js.map +1 -0
  66. package/lib/server/chat-routes.js +82 -0
  67. package/lib/server/chat-routes.js.map +1 -0
  68. package/lib/server/config.js +223 -0
  69. package/lib/server/config.js.map +1 -0
  70. package/lib/server/db.js +97 -0
  71. package/lib/server/db.js.map +1 -0
  72. package/lib/server/index.js +2 -0
  73. package/lib/server/index.js.map +1 -0
  74. package/lib/server/mcp-handler.js +167 -0
  75. package/lib/server/mcp-handler.js.map +1 -0
  76. package/lib/server/mcp-routes.js +112 -0
  77. package/lib/server/mcp-routes.js.map +1 -0
  78. package/lib/server/mcps-router.js +119 -0
  79. package/lib/server/mcps-router.js.map +1 -0
  80. package/lib/server/schema.js +129 -0
  81. package/lib/server/schema.js.map +1 -0
  82. package/lib/server/server.js +166 -0
  83. package/lib/server/server.js.map +1 -0
  84. package/lib/web/ChatPage.js +827 -0
  85. package/lib/web/ChatPage.js.map +1 -0
  86. package/lib/web/McpInspectorPage.js +214 -0
  87. package/lib/web/McpInspectorPage.js.map +1 -0
  88. package/lib/web/ServersPage.js +93 -0
  89. package/lib/web/ServersPage.js.map +1 -0
  90. package/lib/web/main.js +541 -0
  91. package/lib/web/main.js.map +1 -0
  92. package/package.json +83 -0
  93. package/src/chat/agent.ts +240 -0
  94. package/src/chat/audit.ts +377 -0
  95. package/src/chat/converters.test.ts +325 -0
  96. package/src/chat/converters.ts +459 -0
  97. package/src/chat/handler.test.ts +137 -0
  98. package/src/chat/handler.ts +1233 -0
  99. package/src/chat/index.ts +16 -0
  100. package/src/chat/types.ts +72 -0
  101. package/src/contracts/AuditContract.ts +93 -0
  102. package/src/contracts/McpsContract.ts +141 -0
  103. package/src/contracts/index.ts +18 -0
  104. package/src/dev.server.ts +7 -0
  105. package/src/entities/ChatRequestEntity.ts +157 -0
  106. package/src/entities/McpRequestEntity.ts +149 -0
  107. package/src/entities/RequestLogEntity.ts +78 -0
  108. package/src/entities/ResponseEntity.ts +75 -0
  109. package/src/entities/index.ts +12 -0
  110. package/src/entities/types.ts +188 -0
  111. package/src/index.ts +1 -0
  112. package/src/mcps-cli.ts +59 -0
  113. package/src/providers/McpServerHandlerDef.ts +105 -0
  114. package/src/providers/findMcpServerDef.ts +31 -0
  115. package/src/providers/prometheus/def.ts +21 -0
  116. package/src/providers/prometheus/index.ts +1 -0
  117. package/src/providers/relay/def.ts +31 -0
  118. package/src/providers/relay/index.ts +1 -0
  119. package/src/providers/relay/relay.test.ts +47 -0
  120. package/src/providers/sql/def.ts +33 -0
  121. package/src/providers/sql/index.ts +1 -0
  122. package/src/providers/tencent-cls/def.ts +38 -0
  123. package/src/providers/tencent-cls/index.ts +1 -0
  124. package/src/scripts/bundle.ts +82 -0
  125. package/src/server/api-routes.ts +98 -0
  126. package/src/server/audit.ts +310 -0
  127. package/src/server/chat-routes.ts +95 -0
  128. package/src/server/config.test.ts +162 -0
  129. package/src/server/config.ts +198 -0
  130. package/src/server/db.ts +115 -0
  131. package/src/server/index.ts +1 -0
  132. package/src/server/mcp-handler.ts +209 -0
  133. package/src/server/mcp-routes.ts +133 -0
  134. package/src/server/mcps-router.ts +133 -0
  135. package/src/server/schema.ts +175 -0
  136. package/src/server/server.ts +163 -0
  137. package/src/web/ChatPage.tsx +1005 -0
  138. package/src/web/McpInspectorPage.tsx +254 -0
  139. package/src/web/ServersPage.tsx +139 -0
  140. package/src/web/main.tsx +600 -0
  141. package/src/web/styles.css +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/server.ts"],"sourcesContent":["import consola from 'consola';\nimport { Hono } from 'hono';\nimport { logger } from 'hono/logger';\nimport { LRUCache } from 'lru-cache';\nimport { isDevelopment } from 'std-env';\nimport type { McpServerInstance } from '@wener/ai/mcp';\nimport { findMcpServerDef } from '../providers/findMcpServerDef';\nimport { registerApiRoutes } from './api-routes';\nimport { auditMiddleware, configureAudit } from './audit';\nimport { registerChatRoutes } from './chat-routes';\nimport { loadConfig, loadEnvFiles, substituteEnvVars } from './config';\nimport { registerMcpRoutes } from './mcp-routes';\n\nconst log = consola.withTag('mcps');\n\nexport interface CreateServerOptions {\n\tcwd?: string;\n\tport?: number;\n\t/** Enable server config discovery endpoints (default: false) */\n\tdiscoveryConfig?: boolean;\n}\n\nexport function createServer(options: CreateServerOptions = {}) {\n\tconst { cwd = process.cwd(), discoveryConfig: discoveryConfigOption } = options;\n\n\tconst app = new Hono();\n\n\t// Request logging\n\tapp.use(\n\t\tlogger((v) => {\n\t\t\tlog.debug(v);\n\t\t}),\n\t);\n\n\t// Audit middleware\n\tapp.use(auditMiddleware());\n\n\t// Load .env files first\n\tloadEnvFiles(cwd);\n\n\t// Load config (with env var substitution)\n\tconst config = substituteEnvVars(loadConfig(cwd));\n\t// discoveryConfig: CLI option overrides config file, defaults to false\n\tconst discoveryConfig = discoveryConfigOption ?? config.discoveryConfig ?? false;\n\n\t// Log available server types from registry\n\tconst serverDefs = findMcpServerDef();\n\tlog.info(`Available server types: ${serverDefs.map((d) => d.name).join(', ')}`);\n\tlog.info(`Loaded ${Object.keys(config.servers).length} servers from config (discoveryConfig: ${discoveryConfig})`);\n\n\t// Configure audit with lazy DB initialization\n\t// DB will only be initialized when the first audit event needs persistence\n\tconfigureAudit(config.audit, config.db);\n\tconst auditEnabled = config.audit?.enabled !== false;\n\tconst auditDbPath = config.audit?.db?.path ?? config.db?.path ?? '.mcps.db';\n\tlog.info(`Audit configured: enabled=${auditEnabled}, db=${auditDbPath} (lazy init)`);\n\n\t// Unified cache for all MCP servers (both pre-configured and dynamic)\n\t// Keyed by cache key from def.getCacheKey() or `config::${name}` for pre-configured\n\tconst serverCache = new LRUCache<string, McpServerInstance>({\n\t\tmax: 100,\n\t\tdispose: (value, key) => {\n\t\t\tlog.info(`Closing expired MCP server: ${key}`);\n\t\t\tvalue.close?.().catch((e: unknown) => log.error('Failed to close server', e));\n\t\t},\n\t});\n\n\t// =========================================================================\n\t// Register MCP routes (pre-configured and dynamic endpoints)\n\t// =========================================================================\n\tregisterMcpRoutes({ app, config, serverCache });\n\n\t// =========================================================================\n\t// Register Chat/LLM Gateway routes\n\t// =========================================================================\n\tregisterChatRoutes({ app, config });\n\n\t// =========================================================================\n\t// Health and info endpoints\n\t// =========================================================================\n\tapp.get('/health', (c) => c.json({ status: 'ok' }));\n\n\tapp.get('/', (c) => {\n\t\treturn c.json({ message: 'hello' });\n\t});\n\n\t// Server info - only available in dev mode or when discoveryConfig is enabled\n\tif (isDevelopment || discoveryConfig) {\n\t\tapp.get('/info', (c) => {\n\t\t\t// Dynamically get routes from Hono app\n\t\t\tconst routes = app.routes\n\t\t\t\t.map((r) => ({ method: r.method, path: r.path }))\n\t\t\t\t.filter((r) => r.method !== 'ALL' || r.path.startsWith('/mcp/'))\n\t\t\t\t.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n\n\t\t\t// Group routes by category\n\t\t\tconst mcpRoutes = routes.filter((r) => r.path.startsWith('/mcp/')).map((r) => r.path);\n\t\t\tconst apiRoutes = routes.filter((r) => r.path.startsWith('/api/')).map((r) => `${r.method} ${r.path}`);\n\t\t\tconst chatRoutes = routes.filter((r) => r.path.startsWith('/v1/')).map((r) => `${r.method} ${r.path}`);\n\n\t\t\t// Get unique MCP paths\n\t\t\tconst uniqueMcpPaths = [...new Set(mcpRoutes)];\n\n\t\t\treturn c.json({\n\t\t\t\tname: '@wener/mcps',\n\t\t\t\tversion: '0.1.0',\n\t\t\t\tservers: Object.keys(config.servers),\n\t\t\t\tserverTypes: findMcpServerDef().map((d) => d.name),\n\t\t\t\tmodels: config.models ? config.models.map((m) => m.name) : [],\n\t\t\t\tendpoints: {\n\t\t\t\t\tmcp: uniqueMcpPaths,\n\t\t\t\t\tapi: [...new Set(apiRoutes)],\n\t\t\t\t\tchat: [...new Set(chatRoutes)],\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\t// =========================================================================\n\t// Register oRPC API routes\n\t// =========================================================================\n\tregisterApiRoutes({ app, config });\n\n\t/**\n\t * Print available endpoints grouped by category\n\t */\n\tconst printEndpoints = () => {\n\t\tconst routes = app.routes;\n\t\tconst mcpPaths = new Set<string>();\n\t\tconst apiPaths = new Set<string>();\n\t\tconst chatPaths = new Set<string>();\n\t\tconst otherPaths = new Set<string>();\n\n\t\tfor (const route of routes) {\n\t\t\tconst path = route.path;\n\t\t\tif (path.startsWith('/mcp/')) {\n\t\t\t\tmcpPaths.add(path);\n\t\t\t} else if (path.startsWith('/api/')) {\n\t\t\t\tapiPaths.add(`${route.method} ${path}`);\n\t\t\t} else if (path.startsWith('/v1/')) {\n\t\t\t\tchatPaths.add(`${route.method} ${path}`);\n\t\t\t} else if (route.method !== 'ALL') {\n\t\t\t\totherPaths.add(`${route.method} ${path}`);\n\t\t\t}\n\t\t}\n\n\t\tlog.info('Available endpoints:');\n\t\tif (mcpPaths.size > 0) {\n\t\t\tlog.info(` MCP: ${[...mcpPaths].sort().join(', ')}`);\n\t\t}\n\t\tif (chatPaths.size > 0) {\n\t\t\tlog.info(` Chat: ${[...chatPaths].sort().join(', ')}`);\n\t\t}\n\t\tif (apiPaths.size > 0) {\n\t\t\tlog.info(` API: ${[...apiPaths].sort().join(', ')}`);\n\t\t}\n\t\tif (otherPaths.size > 0) {\n\t\t\tlog.info(` Other: ${[...otherPaths].sort().join(', ')}`);\n\t\t}\n\t};\n\n\treturn { app, config, serverCache, printEndpoints };\n}\n"],"names":["consola","Hono","logger","LRUCache","isDevelopment","findMcpServerDef","registerApiRoutes","auditMiddleware","configureAudit","registerChatRoutes","loadConfig","loadEnvFiles","substituteEnvVars","registerMcpRoutes","log","withTag","createServer","options","cwd","process","discoveryConfig","discoveryConfigOption","app","use","v","debug","config","serverDefs","info","map","d","name","join","Object","keys","servers","length","audit","db","auditEnabled","enabled","auditDbPath","path","serverCache","max","dispose","value","key","close","catch","e","error","get","c","json","status","message","routes","r","method","filter","startsWith","sort","a","b","localeCompare","mcpRoutes","apiRoutes","chatRoutes","uniqueMcpPaths","Set","version","serverTypes","models","m","endpoints","mcp","api","chat","printEndpoints","mcpPaths","apiPaths","chatPaths","otherPaths","route","add","size"],"mappings":"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"}