@shipit-ai/cli 1.173.1 → 1.174.0
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.
- package/dist/packages/core/src/application/ports/output/services/mcp-server-browser.interface.d.ts +9 -1
- package/dist/packages/core/src/application/ports/output/services/mcp-server-browser.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/mcp-servers/fetch-mcp-server-tools.use-case.d.ts +7 -3
- package/dist/packages/core/src/application/use-cases/mcp-servers/fetch-mcp-server-tools.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/mcp-servers/fetch-mcp-server-tools.use-case.js +6 -5
- package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.js +4 -0
- package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.schema.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.schema.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.schema.js +11 -1
- package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.service.d.ts +10 -2
- package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.service.js +96 -14
- package/dist/src/presentation/web/app/actions/fetch-mcp-server-tools.d.ts +1 -1
- package/dist/src/presentation/web/app/actions/fetch-mcp-server-tools.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/fetch-mcp-server-tools.js +2 -2
- package/dist/src/presentation/web/app/mcp-servers/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/mcp-servers/page.js +3 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.d.ts +19 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.js +106 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.stories.d.ts +11 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.stories.js +18 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-card.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-card.js +2 -8
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.d.ts +2 -2
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.js +26 -9
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.stories.js +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-icon.d.ts +45 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-icon.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-icon.js +138 -0
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.d.ts +2 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.js +8 -8
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.stories.js +2 -2
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.d.ts +17 -13
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.js +21 -34
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.js +7 -8
- package/dist/src/presentation/web/components/features/mcp-servers/vendor-brand-icons.d.ts +29 -0
- package/dist/src/presentation/web/components/features/mcp-servers/vendor-brand-icons.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/mcp-servers/vendor-brand-icons.js +25 -0
- package/dist/translations/ar/web.json +8 -2
- package/dist/translations/de/web.json +8 -2
- package/dist/translations/en/web.json +8 -2
- package/dist/translations/es/web.json +8 -2
- package/dist/translations/fr/web.json +8 -2
- package/dist/translations/he/web.json +8 -2
- package/dist/translations/pt/web.json +8 -2
- package/dist/translations/ru/web.json +8 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +3 -3
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/mcp-servers/page/server-reference-manifest.json +13 -13
- package/web/.next/server/app/mcp-servers/page.js.nft.json +1 -1
- package/web/.next/server/app/mcp-servers/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/plugins/page/server-reference-manifest.json +15 -15
- package/web/.next/server/app/plugins/page.js.nft.json +1 -1
- package/web/.next/server/app/plugins/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +12 -12
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js +10 -0
- package/web/.next/server/chunks/ssr/0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js.map +1 -0
- package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
- package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
- package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
- package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0mwao26._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0mwao26._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13pshs0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13pshs0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
- package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
- package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1031n_-._.js → _083k45~._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1031n_-._.js.map → _083k45~._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_12i_bjl._.js → _087x~el._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_12i_bjl._.js.map → _087x~el._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
- package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
- package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0xn_dfh._.js → _0bknjp-._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0xn_dfh._.js.map → _0bknjp-._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
- package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0fswe4r._.js +3 -0
- package/web/.next/server/chunks/ssr/_0fswe4r._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_0z6p8yi._.js → _0glox21._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0z6p8yi._.js.map → _0glox21._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
- package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
- package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
- package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_096x3u~._.js → _0vq0c0x._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_096x3u~._.js.map → _0vq0c0x._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
- package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
- package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
- package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
- package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0~g5-.e._.js +3 -0
- package/web/.next/server/chunks/ssr/_0~g5-.e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
- package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_mcp-servers_page_actions_0d.r4q..js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_mcp-servers_page_actions_0d.r4q..js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +57 -57
- package/web/.next/static/chunks/{07c0dde.-8.3e.js → 030tqac1cx-fj.js} +1 -1
- package/web/.next/static/chunks/{0242vp5_56bjp.js → 093...bdsa2vi.js} +1 -1
- package/web/.next/static/chunks/0a~-dbzk6tkpw.css +1 -0
- package/web/.next/static/chunks/{0j~279np0vu13.js → 0c.5-5ohi38wu.js} +1 -1
- package/web/.next/static/chunks/{0k3fxd~lsx6h_.js → 0djvgyu139qht.js} +1 -1
- package/web/.next/static/chunks/{084nyl7us-xbo.js → 0etn4uwpbu0p..js} +1 -1
- package/web/.next/static/chunks/0fzx4yzxqtc6v.js +1 -0
- package/web/.next/static/chunks/{0sgbbtfp4hspl.js → 0gz0lgz7pvrb5.js} +1 -1
- package/web/.next/static/chunks/0iey6w_th4w6t.js +1 -0
- package/web/.next/static/chunks/{15lkkh2eg.w0h.js → 0mukkm1m79wpt.js} +1 -1
- package/web/.next/static/chunks/{0cgfywkcky60_.js → 0ou6vmrmvv4.f.js} +1 -1
- package/web/.next/static/chunks/{15zjq.s38l64~.js → 0q1rh6cwq8q~e.js} +1 -1
- package/web/.next/static/chunks/{0xjj0-wsaziot.js → 0w9~abfpfmxwe.js} +1 -1
- package/web/.next/static/chunks/{0vscxcwhltksg.js → 0zwhmf.myybu0.js} +3 -3
- package/web/.next/static/chunks/{10j-adknfho63.js → 10rtagfoabp3b.js} +1 -1
- package/web/.next/static/chunks/{11rfk7fre_6t2.js → 113fyg.4c74k~.js} +1 -1
- package/web/.next/static/chunks/{16nbcfv~__pas.js → 11n8b8mq7xbv9.js} +1 -1
- package/web/.next/static/chunks/11v7w0zh-u9s8.js +8 -0
- package/web/.next/static/chunks/{0kv2-9owuv51~.js → 164.6ma3h~kkp.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0b~nfa6._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0b~nfa6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0ia4o6_._.js +0 -3
- package/web/.next/server/chunks/ssr/_0ia4o6_._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0o.xc6x._.js +0 -3
- package/web/.next/server/chunks/ssr/_0o.xc6x._.js.map +0 -1
- package/web/.next/static/chunks/00h433i5-1v_-.css +0 -1
- package/web/.next/static/chunks/0jl9-2_wjbofj.js +0 -1
- package/web/.next/static/chunks/0r9cddoy0xkhk.js +0 -1
- package/web/.next/static/chunks/123j391jw_zg4.js +0 -1
- /package/web/.next/static/{soqWMnDMQRLxRyIj13kVU → G6UvAet1r3tmTZHz91Byx}/_buildManifest.js +0 -0
- /package/web/.next/static/{soqWMnDMQRLxRyIj13kVU → G6UvAet1r3tmTZHz91Byx}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{soqWMnDMQRLxRyIj13kVU → G6UvAet1r3tmTZHz91Byx}/_ssgManifest.js +0 -0
|
@@ -3,20 +3,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import { Card } from '../../ui/card.js';
|
|
5
5
|
import { Badge } from '../../ui/badge.js';
|
|
6
|
-
import {
|
|
7
|
-
const TRANSPORT_ICONS = {
|
|
8
|
-
http: Server,
|
|
9
|
-
sse: Wifi,
|
|
10
|
-
stdio: Terminal,
|
|
11
|
-
};
|
|
6
|
+
import { McpServerIcon } from './mcp-server-icon.js';
|
|
12
7
|
export function McpServerCard({ server, onSelect }) {
|
|
13
8
|
const { t } = useTranslation('web');
|
|
14
|
-
const TransportIcon = TRANSPORT_ICONS[server.transport] ?? Server;
|
|
15
9
|
const description = server.mcp_info?.description ?? '';
|
|
16
10
|
return (_jsxs(Card, { className: "cursor-pointer p-5 transition-all duration-300 hover:scale-[1.02] hover:shadow-md hover:ring-slate-300 dark:hover:ring-slate-600", role: "button", tabIndex: 0, onClick: () => onSelect(server), onKeyDown: (e) => {
|
|
17
11
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
18
12
|
e.preventDefault();
|
|
19
13
|
onSelect(server);
|
|
20
14
|
}
|
|
21
|
-
}, children: [_jsxs("div", { className: "flex items-start
|
|
15
|
+
}, "data-testid": `mcp-server-card-${server.server_name}`, children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "flex size-11 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50", children: _jsx(McpServerIcon, { serverName: server.server_name, url: server.url, transport: server.transport, size: "md" }) }), _jsx("h3", { className: "text-foreground mt-2 min-w-0 flex-1 truncate text-sm leading-tight font-bold tracking-tight", children: server.name })] }), description ? (_jsx("p", { className: "text-muted-foreground mt-3 line-clamp-2 text-xs leading-relaxed", children: description })) : null, _jsxs("div", { className: "mt-4 flex flex-wrap items-center gap-1.5", children: [_jsx(Badge, { variant: "outline", children: t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase()) }), server.auth_type && server.auth_type !== 'none' ? (_jsx(Badge, { variant: "secondary", children: t(`mcpServers.authType.${server.auth_type}`, server.auth_type) })) : null] })] }));
|
|
22
16
|
}
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { McpServerInfo } from '../../../../../../packages/core/src/application/ports/output/services/mcp-server-browser.interface.js';
|
|
2
2
|
interface McpServerDetailDrawerProps {
|
|
3
3
|
server: McpServerInfo | null;
|
|
4
|
-
|
|
4
|
+
proxyBaseUrl: string;
|
|
5
5
|
open: boolean;
|
|
6
6
|
onClose: () => void;
|
|
7
7
|
}
|
|
8
|
-
export declare function McpServerDetailDrawer({ server,
|
|
8
|
+
export declare function McpServerDetailDrawer({ server, proxyBaseUrl, open, onClose, }: McpServerDetailDrawerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=mcp-server-detail-drawer.d.ts.map
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-detail-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-server-detail-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,gFAAgF,CAAC;AAExF,UAAU,0BAA0B;IAClC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAYD,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,OAAO,GACR,EAAE,0BAA0B,kDA2J5B"}
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useState, useCallback } from 'react';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
import { BaseDrawer } from '../../common/base-drawer/index.js';
|
|
6
6
|
import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
|
|
7
7
|
import { Separator } from '../../ui/separator.js';
|
|
8
8
|
import { Badge } from '../../ui/badge.js';
|
|
9
|
+
import { Button } from '../../ui/button.js';
|
|
10
|
+
import { RefreshCw } from 'lucide-react';
|
|
9
11
|
import { McpToolList } from './mcp-tool-list.js';
|
|
12
|
+
import { McpConnectInstructions } from './mcp-connect-instructions.js';
|
|
13
|
+
import { McpServerIcon } from './mcp-server-icon.js';
|
|
10
14
|
import { fetchMcpServerToolsAction } from '../../../app/actions/fetch-mcp-server-tools.js';
|
|
11
15
|
function isValidDisplayUrl(url) {
|
|
12
16
|
if (!url)
|
|
@@ -19,19 +23,21 @@ function isValidDisplayUrl(url) {
|
|
|
19
23
|
return false;
|
|
20
24
|
}
|
|
21
25
|
}
|
|
22
|
-
export function McpServerDetailDrawer({ server,
|
|
26
|
+
export function McpServerDetailDrawer({ server, proxyBaseUrl, open, onClose, }) {
|
|
23
27
|
const { t } = useTranslation('web');
|
|
24
28
|
const [tools, setTools] = useState([]);
|
|
25
29
|
const [loadingTools, setLoadingTools] = useState(false);
|
|
26
30
|
const [toolError, setToolError] = useState(null);
|
|
27
|
-
const
|
|
31
|
+
const [loadedServerName, setLoadedServerName] = useState(null);
|
|
32
|
+
const loadTools = useCallback(async (serverName) => {
|
|
28
33
|
setLoadingTools(true);
|
|
29
34
|
setToolError(null);
|
|
30
35
|
try {
|
|
31
|
-
const result = await fetchMcpServerToolsAction();
|
|
36
|
+
const result = await fetchMcpServerToolsAction(serverName);
|
|
32
37
|
setTools(result.tools);
|
|
33
38
|
if (result.error)
|
|
34
39
|
setToolError(result.error);
|
|
40
|
+
setLoadedServerName(serverName);
|
|
35
41
|
}
|
|
36
42
|
catch {
|
|
37
43
|
setToolError('Failed to load tools');
|
|
@@ -41,12 +47,23 @@ export function McpServerDetailDrawer({ server, serverNames, open, onClose, }) {
|
|
|
41
47
|
}
|
|
42
48
|
}, []);
|
|
43
49
|
useEffect(() => {
|
|
44
|
-
if (open
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
if (!open || !server)
|
|
51
|
+
return;
|
|
52
|
+
// Re-fetch whenever the drawer opens for a different server.
|
|
53
|
+
if (loadedServerName === server.server_name)
|
|
54
|
+
return;
|
|
55
|
+
loadTools(server.server_name);
|
|
56
|
+
}, [open, server, loadedServerName, loadTools]);
|
|
57
|
+
const handleRefresh = useCallback(() => {
|
|
58
|
+
if (!server)
|
|
59
|
+
return;
|
|
60
|
+
// Clear the cached server name to force a re-fetch and call loadTools
|
|
61
|
+
// directly for immediate feedback.
|
|
62
|
+
setLoadedServerName(null);
|
|
63
|
+
loadTools(server.server_name);
|
|
64
|
+
}, [server, loadTools]);
|
|
48
65
|
if (!server)
|
|
49
66
|
return null;
|
|
50
67
|
const description = server.mcp_info?.description ?? '';
|
|
51
|
-
return (
|
|
68
|
+
return (_jsx(BaseDrawer, { open: open, onClose: onClose, "data-testid": "mcp-server-detail-drawer", children: _jsxs("div", { className: "flex flex-col gap-6 overflow-y-auto p-6", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs("span", { className: "text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase", children: [t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase()), " \u00B7 MCP Server"] }), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "flex size-12 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50", children: _jsx(McpServerIcon, { serverName: server.server_name, url: server.url, transport: server.transport, size: "lg" }) }), _jsx(DrawerTitle, { className: "text-foreground mt-2 text-lg font-bold tracking-tight", children: server.name })] }), description ? (_jsx(DrawerDescription, { className: "text-muted-foreground text-sm leading-relaxed", children: description })) : null] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: t('mcpServers.detail.serverName') }), _jsx("span", { className: "font-mono text-xs", children: server.server_name })] }), isValidDisplayUrl(server.url) ? (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("span", { className: "text-muted-foreground shrink-0 text-xs font-medium", children: t('mcpServers.detail.url') }), _jsx("span", { className: "truncate font-mono text-xs", title: server.url, children: server.url })] })) : null, _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: t('mcpServers.detail.transport') }), _jsx(Badge, { variant: "outline", children: t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase()) })] }), server.auth_type && server.auth_type !== 'none' ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: t('mcpServers.detail.authType') }), _jsx(Badge, { variant: "secondary", children: t(`mcpServers.authType.${server.auth_type}`, server.auth_type) })] })) : null] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h3", { className: "text-foreground text-sm font-bold tracking-tight", children: t('mcpServers.tools.title') }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-7", onClick: handleRefresh, disabled: loadingTools, "aria-label": t('mcpServers.tools.refresh'), "data-testid": "mcp-tools-refresh", children: _jsx(RefreshCw, { className: `size-3.5 ${loadingTools ? 'animate-spin' : ''}` }) })] }), loadingTools ? (_jsxs("p", { className: "text-muted-foreground text-sm", children: [t('accessibility.loading'), "..."] })) : toolError ? (_jsx("p", { className: "text-destructive text-sm", children: toolError })) : (_jsx(McpToolList, { tools: tools, serverName: server.server_name }))] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-foreground text-sm font-bold tracking-tight", children: t('mcpServers.connect.title') }), _jsx(McpConnectInstructions, { proxyBaseUrl: proxyBaseUrl, serverName: server.server_name })] })] }) }));
|
|
52
69
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type ComponentType } from 'react';
|
|
2
|
+
interface McpServerIconProps {
|
|
3
|
+
serverName: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
transport: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
}
|
|
9
|
+
type BrandIconComponent = ComponentType<{
|
|
10
|
+
className?: string;
|
|
11
|
+
size?: number;
|
|
12
|
+
}>;
|
|
13
|
+
export type VendorResolution = {
|
|
14
|
+
kind: 'inline';
|
|
15
|
+
component: BrandIconComponent;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'simpleicons';
|
|
18
|
+
slug: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'none';
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a vendor icon for an MCP server by matching name and URL against
|
|
24
|
+
* the VENDOR_MAP patterns. Returns an inline component, a SimpleIcons slug,
|
|
25
|
+
* or 'none' (caller falls back to transport icon).
|
|
26
|
+
*
|
|
27
|
+
* Exported for unit testing.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveVendorMapping(serverName: string, url?: string): VendorResolution;
|
|
30
|
+
/**
|
|
31
|
+
* Renders an MCP server's brand icon when recognizable, falling back to the
|
|
32
|
+
* transport-type icon otherwise.
|
|
33
|
+
*
|
|
34
|
+
* Resolution order:
|
|
35
|
+
* 1. Inline brand SVG (Microsoft, Azure, DeepWiki, Firecrawl, AWS)
|
|
36
|
+
* 2. SimpleIcons CDN image (GitHub, Stripe, Postgres, etc.)
|
|
37
|
+
* 3. Transport fallback (Server/Wifi/Terminal from lucide-react)
|
|
38
|
+
*
|
|
39
|
+
* For SimpleIcons images, we handle `onError` by swapping to the transport
|
|
40
|
+
* fallback — this protects against SimpleIcons slug changes without breaking
|
|
41
|
+
* the UI.
|
|
42
|
+
*/
|
|
43
|
+
export declare function McpServerIcon({ serverName, url, transport, className, size, }: McpServerIconProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=mcp-server-icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-icon.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-icon.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAYrD,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED,KAAK,kBAAkB,GAAG,aAAa,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA4F/E,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB,CASvF;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,GAAG,EACH,SAAS,EACT,SAAS,EACT,IAAW,GACZ,EAAE,kBAAkB,2CA6BpB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Server, Wifi, Terminal } from 'lucide-react';
|
|
5
|
+
import { MicrosoftIcon, MicrosoftLearnIcon, AzureIcon, FirecrawlIcon, DeepWikiIcon, AwsIcon, } from './vendor-brand-icons.js';
|
|
6
|
+
/**
|
|
7
|
+
* Vendor icon resolution map.
|
|
8
|
+
*
|
|
9
|
+
* Priority rules:
|
|
10
|
+
* 1. More-specific patterns FIRST (e.g. `microsoft_learn` before `microsoft`,
|
|
11
|
+
* `github_copilot` before plain `github`).
|
|
12
|
+
* 2. Inline SVG brand icons take priority over SimpleIcons when both are
|
|
13
|
+
* available — inline icons are guaranteed to render and have no CDN
|
|
14
|
+
* dependency.
|
|
15
|
+
* 3. Verified slugs only. Every SimpleIcons slug in this file must return
|
|
16
|
+
* HTTP 200 from https://cdn.simpleicons.org/{slug} as of the last audit.
|
|
17
|
+
*
|
|
18
|
+
* When no vendor matches, the `McpServerIcon` component falls back to the
|
|
19
|
+
* transport-type Lucide icon (Server/Wifi/Terminal).
|
|
20
|
+
*
|
|
21
|
+
* Exported `resolveVendorMapping` is the source of truth for tests.
|
|
22
|
+
*/
|
|
23
|
+
const VENDOR_MAP = [
|
|
24
|
+
// Microsoft (SimpleIcons removed all MS icons for legal reasons — use inline)
|
|
25
|
+
{ match: /microsoft[_-]?learn|learn\.microsoft/, inlineIcon: MicrosoftLearnIcon },
|
|
26
|
+
{ match: /foundry|ai\.azure|azure[_-]?foundry|bedrock[_-]?agentcore/, inlineIcon: AzureIcon },
|
|
27
|
+
{ match: /\bazure\b/, inlineIcon: AzureIcon },
|
|
28
|
+
{ match: /microsoft|\.microsoft\./, inlineIcon: MicrosoftIcon },
|
|
29
|
+
// GitHub / Copilot (SimpleIcons has these)
|
|
30
|
+
{ match: /github[_-]?copilot|\bcopilot\b/, simpleIconSlug: 'githubcopilot' },
|
|
31
|
+
{ match: /github|api\.github/, simpleIconSlug: 'github' },
|
|
32
|
+
{ match: /gitlab/, simpleIconSlug: 'gitlab' },
|
|
33
|
+
{ match: /bitbucket/, simpleIconSlug: 'bitbucket' },
|
|
34
|
+
// AI / LLM vendors
|
|
35
|
+
{ match: /anthropic|\bclaude\b/, simpleIconSlug: 'anthropic' },
|
|
36
|
+
{ match: /gemini|google[_-]?ai/, simpleIconSlug: 'googlegemini' },
|
|
37
|
+
{ match: /perplexity/, simpleIconSlug: 'perplexity' },
|
|
38
|
+
// Documentation / knowledge (DeepWiki gets its own distinct mark)
|
|
39
|
+
{ match: /deepwiki|deep[_-]?wiki/, inlineIcon: DeepWikiIcon },
|
|
40
|
+
{ match: /notion/, simpleIconSlug: 'notion' },
|
|
41
|
+
{ match: /confluence/, simpleIconSlug: 'confluence' },
|
|
42
|
+
{ match: /readthedocs/, simpleIconSlug: 'readthedocs' },
|
|
43
|
+
{ match: /mintlify/, simpleIconSlug: 'mintlify' },
|
|
44
|
+
// Web scraping / crawling (inline for Firecrawl — no SimpleIcons)
|
|
45
|
+
{ match: /firecrawl/, inlineIcon: FirecrawlIcon },
|
|
46
|
+
// Cloud / infra
|
|
47
|
+
{ match: /\baws\b|amazon[_-]?web|bedrock/, inlineIcon: AwsIcon },
|
|
48
|
+
{ match: /cloudflare/, simpleIconSlug: 'cloudflare' },
|
|
49
|
+
{ match: /vercel/, simpleIconSlug: 'vercel' },
|
|
50
|
+
{ match: /netlify/, simpleIconSlug: 'netlify' },
|
|
51
|
+
{ match: /digitalocean/, simpleIconSlug: 'digitalocean' },
|
|
52
|
+
{ match: /railway/, simpleIconSlug: 'railway' },
|
|
53
|
+
// Databases
|
|
54
|
+
{ match: /postgres/, simpleIconSlug: 'postgresql' },
|
|
55
|
+
{ match: /mongodb/, simpleIconSlug: 'mongodb' },
|
|
56
|
+
{ match: /\bredis\b/, simpleIconSlug: 'redis' },
|
|
57
|
+
{ match: /mysql/, simpleIconSlug: 'mysql' },
|
|
58
|
+
{ match: /sqlite/, simpleIconSlug: 'sqlite' },
|
|
59
|
+
{ match: /supabase/, simpleIconSlug: 'supabase' },
|
|
60
|
+
{ match: /planetscale/, simpleIconSlug: 'planetscale' },
|
|
61
|
+
// Productivity / collaboration
|
|
62
|
+
{ match: /slack/, simpleIconSlug: 'slack' },
|
|
63
|
+
{ match: /discord/, simpleIconSlug: 'discord' },
|
|
64
|
+
{ match: /linear/, simpleIconSlug: 'linear' },
|
|
65
|
+
{ match: /jira|atlassian/, simpleIconSlug: 'jira' },
|
|
66
|
+
{ match: /asana/, simpleIconSlug: 'asana' },
|
|
67
|
+
{ match: /zapier/, simpleIconSlug: 'zapier' },
|
|
68
|
+
// Observability
|
|
69
|
+
{ match: /datadog/, simpleIconSlug: 'datadog' },
|
|
70
|
+
{ match: /sentry/, simpleIconSlug: 'sentry' },
|
|
71
|
+
{ match: /grafana/, simpleIconSlug: 'grafana' },
|
|
72
|
+
{ match: /newrelic/, simpleIconSlug: 'newrelic' },
|
|
73
|
+
// Payments / commerce
|
|
74
|
+
{ match: /stripe/, simpleIconSlug: 'stripe' },
|
|
75
|
+
{ match: /shopify/, simpleIconSlug: 'shopify' },
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* Resolve a vendor icon for an MCP server by matching name and URL against
|
|
79
|
+
* the VENDOR_MAP patterns. Returns an inline component, a SimpleIcons slug,
|
|
80
|
+
* or 'none' (caller falls back to transport icon).
|
|
81
|
+
*
|
|
82
|
+
* Exported for unit testing.
|
|
83
|
+
*/
|
|
84
|
+
export function resolveVendorMapping(serverName, url) {
|
|
85
|
+
const haystack = `${serverName} ${url ?? ''}`.toLowerCase();
|
|
86
|
+
for (const entry of VENDOR_MAP) {
|
|
87
|
+
if (entry.match.test(haystack)) {
|
|
88
|
+
if (entry.inlineIcon)
|
|
89
|
+
return { kind: 'inline', component: entry.inlineIcon };
|
|
90
|
+
if (entry.simpleIconSlug)
|
|
91
|
+
return { kind: 'simpleicons', slug: entry.simpleIconSlug };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { kind: 'none' };
|
|
95
|
+
}
|
|
96
|
+
const TRANSPORT_FALLBACKS = {
|
|
97
|
+
http: Server,
|
|
98
|
+
sse: Wifi,
|
|
99
|
+
stdio: Terminal,
|
|
100
|
+
};
|
|
101
|
+
const SIZE_CLASSES = {
|
|
102
|
+
sm: 'size-4',
|
|
103
|
+
md: 'size-5',
|
|
104
|
+
lg: 'size-6',
|
|
105
|
+
};
|
|
106
|
+
const SIZE_PIXELS = {
|
|
107
|
+
sm: 16,
|
|
108
|
+
md: 20,
|
|
109
|
+
lg: 24,
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Renders an MCP server's brand icon when recognizable, falling back to the
|
|
113
|
+
* transport-type icon otherwise.
|
|
114
|
+
*
|
|
115
|
+
* Resolution order:
|
|
116
|
+
* 1. Inline brand SVG (Microsoft, Azure, DeepWiki, Firecrawl, AWS)
|
|
117
|
+
* 2. SimpleIcons CDN image (GitHub, Stripe, Postgres, etc.)
|
|
118
|
+
* 3. Transport fallback (Server/Wifi/Terminal from lucide-react)
|
|
119
|
+
*
|
|
120
|
+
* For SimpleIcons images, we handle `onError` by swapping to the transport
|
|
121
|
+
* fallback — this protects against SimpleIcons slug changes without breaking
|
|
122
|
+
* the UI.
|
|
123
|
+
*/
|
|
124
|
+
export function McpServerIcon({ serverName, url, transport, className, size = 'sm', }) {
|
|
125
|
+
const [imageFailed, setImageFailed] = useState(false);
|
|
126
|
+
const resolution = resolveVendorMapping(serverName, url);
|
|
127
|
+
const FallbackIcon = TRANSPORT_FALLBACKS[transport] ?? Server;
|
|
128
|
+
const sizeClass = SIZE_CLASSES[size];
|
|
129
|
+
const sizePx = SIZE_PIXELS[size];
|
|
130
|
+
if (resolution.kind === 'inline') {
|
|
131
|
+
const Brand = resolution.component;
|
|
132
|
+
return _jsx(Brand, { className: `${sizeClass} shrink-0 ${className ?? ''}`, size: sizePx });
|
|
133
|
+
}
|
|
134
|
+
if (resolution.kind === 'simpleicons' && !imageFailed) {
|
|
135
|
+
return (_jsx("img", { src: `https://cdn.simpleicons.org/${resolution.slug}`, alt: "", width: sizePx, height: sizePx, className: `${sizeClass} shrink-0 ${className ?? ''}`, onError: () => setImageFailed(true) }));
|
|
136
|
+
}
|
|
137
|
+
return (_jsx(FallbackIcon, { className: `text-muted-foreground ${sizeClass} shrink-0 ${className ?? ''}` }));
|
|
138
|
+
}
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
interface McpServersPageClientProps {
|
|
2
2
|
proxyConfigured: boolean;
|
|
3
|
+
proxyBaseUrl: string;
|
|
3
4
|
}
|
|
4
|
-
export declare function McpServersPageClient({ proxyConfigured }: McpServersPageClientProps): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function McpServersPageClient({ proxyConfigured, proxyBaseUrl }: McpServersPageClientProps): import("react/jsx-runtime").JSX.Element;
|
|
5
6
|
export {};
|
|
6
7
|
//# sourceMappingURL=mcp-servers-page-client.d.ts.map
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-servers-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-servers-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.tsx"],"names":[],"mappings":"AAcA,UAAU,yBAAyB;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,oBAAoB,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,yBAAyB,2CA2IhG"}
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.js
CHANGED
|
@@ -4,13 +4,14 @@ import { useState, useEffect, useMemo } from 'react';
|
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
import { AlertCircle, Search, Server } from 'lucide-react';
|
|
6
6
|
import { Input } from '../../ui/input.js';
|
|
7
|
-
import {
|
|
7
|
+
import { Button } from '../../ui/button.js';
|
|
8
8
|
import { EmptyState } from '../../common/empty-state/index.js';
|
|
9
|
+
import { PageHeader } from '../../common/page-header/index.js';
|
|
9
10
|
import { McpServerCard } from './mcp-server-card.js';
|
|
10
11
|
import { McpServerDetailDrawer } from './mcp-server-detail-drawer.js';
|
|
11
12
|
import { fetchMcpServersAction } from '../../../app/actions/fetch-mcp-servers.js';
|
|
12
13
|
const TRANSPORT_FILTERS = ['all', 'http', 'sse', 'stdio'];
|
|
13
|
-
export function McpServersPageClient({ proxyConfigured }) {
|
|
14
|
+
export function McpServersPageClient({ proxyConfigured, proxyBaseUrl }) {
|
|
14
15
|
const { t } = useTranslation('web');
|
|
15
16
|
const [searchQuery, setSearchQuery] = useState('');
|
|
16
17
|
const [transportFilter, setTransportFilter] = useState('all');
|
|
@@ -36,7 +37,6 @@ export function McpServersPageClient({ proxyConfigured }) {
|
|
|
36
37
|
setLoading(false);
|
|
37
38
|
});
|
|
38
39
|
}, [proxyConfigured, t]);
|
|
39
|
-
const serverNames = useMemo(() => servers.map((s) => s.server_name), [servers]);
|
|
40
40
|
const filtered = useMemo(() => {
|
|
41
41
|
return servers.filter((server) => {
|
|
42
42
|
const query = searchQuery.toLowerCase();
|
|
@@ -48,12 +48,12 @@ export function McpServersPageClient({ proxyConfigured }) {
|
|
|
48
48
|
});
|
|
49
49
|
}, [servers, searchQuery, transportFilter]);
|
|
50
50
|
if (!proxyConfigured) {
|
|
51
|
-
return (
|
|
51
|
+
return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: t('mcpServers.title'), description: t('mcpServers.subtitle') }), _jsx(EmptyState, { icon: _jsx(AlertCircle, { className: "size-10" }), title: t('mcpServers.noProxy') })] }));
|
|
52
52
|
}
|
|
53
53
|
if (loading) {
|
|
54
|
-
return (
|
|
54
|
+
return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: t('mcpServers.title'), description: t('mcpServers.subtitle') }), _jsxs("div", { className: "text-muted-foreground text-center text-sm", children: [t('accessibility.loading'), "..."] })] }));
|
|
55
55
|
}
|
|
56
|
-
return (_jsxs("div", { className: "
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: t('mcpServers.title'), description: t('mcpServers.subtitle') }), error ? (_jsxs("div", { role: "alert", className: "border-destructive/40 bg-destructive/10 editorial-shadow flex items-center gap-2 rounded-xl border px-4 py-3", children: [_jsx(AlertCircle, { className: "text-destructive size-4 shrink-0" }), _jsx("p", { className: "text-destructive text-sm font-medium", children: error })] })) : null, _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: t('mcpServers.searchPlaceholder'), value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9", "data-testid": "mcp-servers-search" })] }), _jsx("div", { className: "flex flex-wrap gap-2", children: TRANSPORT_FILTERS.map((filter) => (_jsx(Button, { variant: transportFilter === filter ? 'default' : 'outline', size: "sm", onClick: () => setTransportFilter(filter), "data-testid": `mcp-servers-filter-${filter}`, children: filter === 'all'
|
|
57
|
+
? t('mcpServers.filter.all')
|
|
58
|
+
: t(`mcpServers.transport.${filter}`, filter.toUpperCase()) }, filter))) }), filtered.length === 0 ? (_jsx(EmptyState, { icon: servers.length === 0 ? _jsx(Server, { className: "size-10" }) : _jsx(Search, { className: "size-10" }), title: servers.length === 0 ? t('mcpServers.noServers') : t('mcpServers.noResults') })) : (_jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: filtered.map((server) => (_jsx(McpServerCard, { server: server, onSelect: setSelectedServer }, server.server_id))) })), _jsx(McpServerDetailDrawer, { server: selectedServer, proxyBaseUrl: proxyBaseUrl, open: !!selectedServer, onClose: () => setSelectedServer(null) })] }));
|
|
59
59
|
}
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.stories.js
CHANGED
|
@@ -5,8 +5,8 @@ const meta = {
|
|
|
5
5
|
};
|
|
6
6
|
export default meta;
|
|
7
7
|
export const Default = {
|
|
8
|
-
args: { proxyConfigured: true },
|
|
8
|
+
args: { proxyConfigured: true, proxyBaseUrl: 'http://localhost:4000' },
|
|
9
9
|
};
|
|
10
10
|
export const NoProxy = {
|
|
11
|
-
args: { proxyConfigured: false },
|
|
11
|
+
args: { proxyConfigured: false, proxyBaseUrl: '' },
|
|
12
12
|
};
|
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
import type { McpToolInfo } from '../../../../../../packages/core/src/application/ports/output/services/mcp-server-browser.interface.js';
|
|
2
2
|
interface McpToolListProps {
|
|
3
3
|
tools: McpToolInfo[];
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The server name that these tools belong to. Used to strip the
|
|
6
|
+
* `{serverName}-` prefix from tool names for nicer display.
|
|
7
|
+
*/
|
|
7
8
|
serverName: string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
}
|
|
10
|
+
interface DisplayTool {
|
|
11
|
+
displayName: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
key: string;
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
|
-
*
|
|
16
|
+
* Normalize tools by stripping the `{serverName}-` prefix if present.
|
|
17
|
+
*
|
|
18
|
+
* LiteLLM sometimes prefixes tool names with the server alias (e.g.,
|
|
19
|
+
* `github_mcp-list_issues`). When we're displaying tools for a single
|
|
20
|
+
* known server, the prefix is redundant — strip it for cleaner UI.
|
|
15
21
|
*
|
|
16
|
-
*
|
|
17
|
-
* We match each tool's name against known server names and strip the prefix for display.
|
|
18
|
-
* Tools with no matching prefix go in an "Other" group.
|
|
22
|
+
* Exported for unit testing.
|
|
19
23
|
*/
|
|
20
|
-
export declare function
|
|
21
|
-
export declare function McpToolList({ tools,
|
|
24
|
+
export declare function stripServerPrefix(tools: McpToolInfo[], serverName: string): DisplayTool[];
|
|
25
|
+
export declare function McpToolList({ tools, serverName }: McpToolListProps): import("react/jsx-runtime").JSX.Element;
|
|
22
26
|
export {};
|
|
23
27
|
//# sourceMappingURL=mcp-tool-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-list.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-tool-list.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gFAAgF,CAAC;AAElH,UAAU,gBAAgB;IACxB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"mcp-tool-list.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-tool-list.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gFAAgF,CAAC;AAElH,UAAU,gBAAgB;IACxB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CAYzF;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,gBAAgB,2CAwBlE"}
|
|
@@ -4,45 +4,32 @@ import { useMemo } from 'react';
|
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
import { Badge } from '../../ui/badge.js';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Normalize tools by stripping the `{serverName}-` prefix if present.
|
|
8
8
|
*
|
|
9
|
-
* LiteLLM prefixes tool names with
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* LiteLLM sometimes prefixes tool names with the server alias (e.g.,
|
|
10
|
+
* `github_mcp-list_issues`). When we're displaying tools for a single
|
|
11
|
+
* known server, the prefix is redundant — strip it for cleaner UI.
|
|
12
|
+
*
|
|
13
|
+
* Exported for unit testing.
|
|
12
14
|
*/
|
|
13
|
-
export function
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
if (!matched) {
|
|
29
|
-
if (!groups.has('other'))
|
|
30
|
-
groups.set('other', []);
|
|
31
|
-
groups.get('other').push({ displayName: tool.name, description: tool.description });
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return Array.from(groups.entries())
|
|
35
|
-
.sort(([a], [b]) => a.localeCompare(b))
|
|
36
|
-
.map(([serverName, tools]) => ({
|
|
37
|
-
serverName,
|
|
38
|
-
tools: tools.sort((a, b) => a.displayName.localeCompare(b.displayName)),
|
|
39
|
-
}));
|
|
15
|
+
export function stripServerPrefix(tools, serverName) {
|
|
16
|
+
const prefix = `${serverName}-`;
|
|
17
|
+
return tools
|
|
18
|
+
.map((tool) => {
|
|
19
|
+
const displayName = tool.name.startsWith(prefix) ? tool.name.slice(prefix.length) : tool.name;
|
|
20
|
+
return {
|
|
21
|
+
displayName,
|
|
22
|
+
description: tool.description,
|
|
23
|
+
key: tool.name,
|
|
24
|
+
};
|
|
25
|
+
})
|
|
26
|
+
.sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
40
27
|
}
|
|
41
|
-
export function McpToolList({ tools,
|
|
28
|
+
export function McpToolList({ tools, serverName }) {
|
|
42
29
|
const { t } = useTranslation('web');
|
|
43
|
-
const
|
|
30
|
+
const displayTools = useMemo(() => stripServerPrefix(tools, serverName), [tools, serverName]);
|
|
44
31
|
if (tools.length === 0) {
|
|
45
32
|
return _jsx("p", { className: "text-muted-foreground text-sm", children: t('mcpServers.tools.noTools') });
|
|
46
33
|
}
|
|
47
|
-
return (_jsx("div", { className: "space-y-
|
|
34
|
+
return (_jsx("div", { className: "space-y-2", children: displayTools.map((tool) => (_jsxs("div", { className: "rounded-md border p-2", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx(Badge, { variant: "outline", className: "font-mono text-xs", children: tool.displayName }) }), tool.description ? (_jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: tool.description })) : null] }, tool.key))) }));
|
|
48
35
|
}
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ export default meta;
|
|
|
8
8
|
type Story = StoryObj<typeof meta>;
|
|
9
9
|
export declare const WithTools: Story;
|
|
10
10
|
export declare const NoTools: Story;
|
|
11
|
-
export declare const
|
|
11
|
+
export declare const UnprefixedTools: Story;
|
|
12
12
|
//# sourceMappingURL=mcp-tool-list.stories.d.ts.map
|
package/dist/src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-list.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,QAAA,MAAM,IAAI;;;CAG0B,CAAC;AAErC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-tool-list.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-tool-list.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,QAAA,MAAM,IAAI;;;CAG0B,CAAC;AAErC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,SAAS,EAAE,KASvB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAQ7B,CAAC"}
|
|
@@ -6,27 +6,26 @@ const meta = {
|
|
|
6
6
|
export default meta;
|
|
7
7
|
export const WithTools = {
|
|
8
8
|
args: {
|
|
9
|
-
|
|
9
|
+
serverName: 'deepwiki-mcp',
|
|
10
10
|
tools: [
|
|
11
11
|
{ name: 'deepwiki-mcp-read_wiki', description: 'Read wiki contents' },
|
|
12
12
|
{ name: 'deepwiki-mcp-search', description: 'Search documentation' },
|
|
13
|
-
{ name: '
|
|
14
|
-
{ name: 'github_mcp-create_issue', description: 'Create a new issue' },
|
|
13
|
+
{ name: 'deepwiki-mcp-list_repos', description: 'List indexed repositories' },
|
|
15
14
|
],
|
|
16
15
|
},
|
|
17
16
|
};
|
|
18
17
|
export const NoTools = {
|
|
19
18
|
args: {
|
|
20
|
-
|
|
19
|
+
serverName: 'empty_server',
|
|
21
20
|
tools: [],
|
|
22
21
|
},
|
|
23
22
|
};
|
|
24
|
-
export const
|
|
23
|
+
export const UnprefixedTools = {
|
|
25
24
|
args: {
|
|
26
|
-
|
|
25
|
+
serverName: 'my_server',
|
|
27
26
|
tools: [
|
|
28
|
-
{ name: '
|
|
29
|
-
{ name: '
|
|
27
|
+
{ name: 'query', description: 'Execute a query' },
|
|
28
|
+
{ name: 'list_tables', description: 'List all tables' },
|
|
30
29
|
],
|
|
31
30
|
},
|
|
32
31
|
};
|